From aaca513e23b67c8b260d580060d33e67d47e7e10 Mon Sep 17 00:00:00 2001 From: viljarb Date: Sun, 26 Jul 2026 10:07:10 +0200 Subject: [PATCH] moving repository to gitea --- .dockerignore | 7 + .gitlab-ci.yml | 54 + Makefile | 13 + docker-compose.yml | 81 + k8s/argocd/install.yaml | 28057 ++++++++++++++++ k8s/argocd/kustomization.yaml | 27 + k8s/production/base/deploy.yaml | 49 + k8s/production/base/kustomization.yaml | 4 + k8s/production/kustomization.yaml | 7 + k8s/production/namespace.yaml | 4 + k8s/secret/.gitignore | 2 + k8s/shared/kustomization.yaml | 8 + k8s/shared/postgres-deployment.yaml | 35 + k8s/shared/postgres-pvc.yaml | 10 + k8s/shared/postgres-secret.yaml | 9 + k8s/shared/postgres-service.yaml | 15 + k8s/shared/regcred.yaml | 7 + k8s/staging/base/deploy.yaml | 49 + k8s/staging/base/kustomization.yaml | 4 + k8s/staging/kustomization.yaml | 7 + k8s/staging/namespace.yaml | 4 + k8s/webapp/base/deploy.yaml | 42 + k8s/webapp/base/kustomization.yaml | 3 + k8s/webapp/kustomization.yaml | 5 + k8s/webapp/webapp-app.yaml | 22 + kubeconfig | 19 + talosconfig | 12 + webapp/.coverage | Bin 0 -> 53248 bytes webapp/.coveragerc | 9 + webapp/Dockerfile | 32 + webapp/app.py | 204 + webapp/config.py | 16 + webapp/coverage.xml | 325 + webapp/database.py | 288 + webapp/database_file/images.db | Bin 0 -> 12288 bytes webapp/database_file/notes.db | Bin 0 -> 12288 bytes webapp/database_file/users.db | Bin 0 -> 12288 bytes ...6d8229ca1936b9760e1c56-made-with-flask.png | Bin 0 -> 2196 bytes ...8e9ae56d722fc3966bb78da4ce48f9a6-flask.png | Bin 0 -> 213488 bytes ...7cc3dcc4fc5ff70b8266998b-flask-project.png | Bin 0 -> 2223 bytes webapp/requirements.txt | 12 + webapp/static/css/bootstrap.min.css | 6 + webapp/static/css/bootstrap.min.united.css | 7 + webapp/static/img/flask-powered.png | Bin 0 -> 4890 bytes webapp/static/img/public.jpg | Bin 0 -> 84715 bytes webapp/static/js/bootstrap.min.js | 7 + webapp/static/js/jquery.min.js | 4 + webapp/templates/admin.html | 68 + webapp/templates/index.html | 21 + webapp/templates/layout.html | 87 + webapp/templates/page_401.html | 6 + webapp/templates/page_403.html | 6 + webapp/templates/page_404.html | 6 + webapp/templates/page_405.html | 6 + webapp/templates/page_413.html | 6 + webapp/templates/private_page.html | 76 + webapp/templates/public_page.html | 7 + webapp/tests/db_test.py | 10 + webapp/tests/test_app.py | 19 + 59 files changed, 29784 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitlab-ci.yml create mode 100644 Makefile create mode 100644 docker-compose.yml create mode 100644 k8s/argocd/install.yaml create mode 100644 k8s/argocd/kustomization.yaml create mode 100644 k8s/production/base/deploy.yaml create mode 100644 k8s/production/base/kustomization.yaml create mode 100644 k8s/production/kustomization.yaml create mode 100644 k8s/production/namespace.yaml create mode 100644 k8s/secret/.gitignore create mode 100644 k8s/shared/kustomization.yaml create mode 100644 k8s/shared/postgres-deployment.yaml create mode 100644 k8s/shared/postgres-pvc.yaml create mode 100644 k8s/shared/postgres-secret.yaml create mode 100644 k8s/shared/postgres-service.yaml create mode 100644 k8s/shared/regcred.yaml create mode 100644 k8s/staging/base/deploy.yaml create mode 100644 k8s/staging/base/kustomization.yaml create mode 100644 k8s/staging/kustomization.yaml create mode 100644 k8s/staging/namespace.yaml create mode 100644 k8s/webapp/base/deploy.yaml create mode 100644 k8s/webapp/base/kustomization.yaml create mode 100644 k8s/webapp/kustomization.yaml create mode 100644 k8s/webapp/webapp-app.yaml create mode 100644 kubeconfig create mode 100644 talosconfig create mode 100644 webapp/.coverage create mode 100644 webapp/.coveragerc create mode 100755 webapp/Dockerfile create mode 100644 webapp/app.py create mode 100644 webapp/config.py create mode 100644 webapp/coverage.xml create mode 100644 webapp/database.py create mode 100644 webapp/database_file/images.db create mode 100644 webapp/database_file/notes.db create mode 100644 webapp/database_file/users.db create mode 100644 webapp/image_pool/3afadaa2a3cbc1fffc6d8229ca1936b9760e1c56-made-with-flask.png create mode 100644 webapp/image_pool/cbebc37b8e9ae56d722fc3966bb78da4ce48f9a6-flask.png create mode 100644 webapp/image_pool/f739cc0a8bc1c3d17cc3dcc4fc5ff70b8266998b-flask-project.png create mode 100644 webapp/requirements.txt create mode 100644 webapp/static/css/bootstrap.min.css create mode 100644 webapp/static/css/bootstrap.min.united.css create mode 100644 webapp/static/img/flask-powered.png create mode 100644 webapp/static/img/public.jpg create mode 100644 webapp/static/js/bootstrap.min.js create mode 100644 webapp/static/js/jquery.min.js create mode 100644 webapp/templates/admin.html create mode 100644 webapp/templates/index.html create mode 100644 webapp/templates/layout.html create mode 100644 webapp/templates/page_401.html create mode 100644 webapp/templates/page_403.html create mode 100644 webapp/templates/page_404.html create mode 100644 webapp/templates/page_405.html create mode 100644 webapp/templates/page_413.html create mode 100644 webapp/templates/private_page.html create mode 100644 webapp/templates/public_page.html create mode 100644 webapp/tests/db_test.py create mode 100644 webapp/tests/test_app.py diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..6f8e670 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +venv/ +__pycache__/ +*.pyc +.git/ +.gitignore +.env +README.md diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..f894aa2 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,54 @@ +# CI/CD Pipeline for project + +# what the pipeline should do: build, test, deploy +stages: + - test + - build + +#global variables that is used in the pipeline +variables: + IMAGE_VERSION: "$CI_COMMIT_SHORT_SHA" + +# 1. test the image (prøver å bruke dind istedenfor python image) +test: + stage: test + image: python:3.10 + before_script: + - cd webapp + - pip install -r requirements.txt + - pip install pytest pytest-cov + script: + # run pytest with junit + coverage reports from within the webapp directory + - python -m pytest tests/ --junitxml=report.xml --cov=. --cov-report=term-missing --cov-report=xml:coverage.xml + coverage: '/TOTAL.*\s+(\d+%)$/' + artifacts: + when: always + reports: + junit: webapp/report.xml + coverage_report: + coverage_format: cobertura + path: webapp/coverage.xml + paths: + - webapp/report.xml + - webapp/coverage.xml + rules: + - exists: + - webapp/requirements.txt + +# 2. build docker image and push it +build: + stage: build + + # use kaniko to build and push the image to the registry + image: + name: gcr.io/kaniko-project/executor:debug + entrypoint: [""] + script: + - /kaniko/executor --context "$CI_PROJECT_DIR/webapp" + --dockerfile "$CI_PROJECT_DIR/webapp/Dockerfile" + --destination "$CI_REGISTRY_IMAGE:$IMAGE_VERSION" + --destination "$CI_REGISTRY_IMAGE:latest" + + + + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e7e7042 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ + +dev: + FLASK_ENV=development docker compose --profile development up + +staging: + FLASK_ENV=staging docker compose --profile staging up + +prod: + FLASK_ENV=production docker compose --profile production up + +down: + docker compose down + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..49750ff --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,81 @@ + +volumes: + postgres_data: + +networks: + frontend: + driver: bridge + name: frontend + backend: + ipam: + driver: default + config: + - subnet: "172.16.240.0/24" + +services: + + web: + build: + context: ./webapp + ports: + - "8000:8000" + environment: + - FLASK_APP=app.py + - ENVIRONMENT=development + - DATABASE_URL= + networks: + - frontend + - backend + profiles: + - development + + web-staging: + build: + context: ./webapp + ports: + - "8000:8000" + environment: + - FLASK_APP=app.py + - ENVIRONMENT=staging + - DATABASE_URL=postgresql://postgres:postgres@db:5432/postgres + depends_on: + - db + networks: + - frontend + - backend + profiles: + - staging + + web-production: + build: + context: ./webapp + ports: + - "8000:8000" + environment: + - FLASK_APP=app.py + - ENVIRONMENT=production + - DATABASE_URL=postgresql://postgres:postgres@db:5432/postgres + depends_on: + - db + networks: + - frontend + - backend + profiles: + - production + + db: + image: postgres:14 + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=postgres + networks: + backend: + ipv4_address: 172.16.240.10 + profiles: + - production + - staging diff --git a/k8s/argocd/install.yaml b/k8s/argocd/install.yaml new file mode 100644 index 0000000..6a95849 --- /dev/null +++ b/k8s/argocd/install.yaml @@ -0,0 +1,28057 @@ +# This is an auto-generated file. DO NOT EDIT +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + labels: + app.kubernetes.io/name: applications.argoproj.io + app.kubernetes.io/part-of: argocd + name: applications.argoproj.io +spec: + group: argoproj.io + names: + kind: Application + listKind: ApplicationList + plural: applications + shortNames: + - app + - apps + singular: application + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.sync.status + name: Sync Status + type: string + - jsonPath: .status.health.status + name: Health Status + type: string + - jsonPath: .status.sync.revision + name: Revision + priority: 10 + type: string + - jsonPath: .spec.project + name: Project + priority: 10 + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: Application is a definition of Application resource. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + operation: + description: Operation contains information about a requested or running + operation + properties: + info: + description: Info is a list of informational items for this operation + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + initiatedBy: + description: InitiatedBy contains information about who initiated + the operations + properties: + automated: + description: Automated is set to true if operation was initiated + automatically by the application controller. + type: boolean + username: + description: Username contains the name of a user who started + operation + type: string + type: object + retry: + description: Retry controls the strategy to apply if a sync fails + properties: + backoff: + description: Backoff controls how to backoff on subsequent retries + of failed syncs + properties: + duration: + description: Duration is the amount to back off. Default unit + is seconds, but could also be a duration (e.g. "2m", "1h") + type: string + factor: + description: Factor is a factor to multiply the base duration + after each failed retry + format: int64 + type: integer + maxDuration: + description: MaxDuration is the maximum amount of time allowed + for the backoff strategy + type: string + type: object + limit: + description: Limit is the maximum number of attempts for retrying + a failed sync. If set to 0, no retries will be performed. + format: int64 + type: integer + type: object + sync: + description: Sync contains parameters for the operation + properties: + autoHealAttemptsCount: + description: SelfHealAttemptsCount contains the number of auto-heal + attempts + format: int64 + type: integer + dryRun: + description: DryRun specifies to perform a `kubectl apply --dry-run` + without actually performing the sync + type: boolean + manifests: + description: Manifests is an optional field that overrides sync + source with a local directory for development + items: + type: string + type: array + prune: + description: Prune specifies to delete resources from the cluster + that are no longer tracked in git + type: boolean + resources: + description: Resources describes which resources shall be part + of the sync + items: + description: SyncOperationResource contains resources to sync. + properties: + group: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object + type: array + revision: + description: |- + Revision is the revision (Git) or chart version (Helm) which to sync the application to + If omitted, will use the revision specified in app spec. + type: string + revisions: + description: |- + Revisions is the list of revision (Git) or chart version (Helm) which to sync each source in sources field for the application to + If omitted, will use the revision specified in app spec. + items: + type: string + type: array + source: + description: |- + Source overrides the source definition set in the application. + This is typically set in a Rollback operation and is nil during a Sync operation + properties: + chart: + description: Chart is a Helm chart name, and must be specified + for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific options + properties: + exclude: + description: Exclude contains a glob pattern to match + paths against that should be explicitly excluded from + being used during manifest generation + type: string + include: + description: Include contains a glob pattern to match + paths against that should be explicitly included during + manifest generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External + Variables + items: + description: JsonnetVar represents a variable to + be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level Arguments + items: + description: JsonnetVar represents a variable to + be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + fileParameters: + description: FileParameters are file parameters to the + helm template + items: + description: HelmFileParameter is a file parameter that's + passed to helm template during manifest generation + properties: + name: + description: Name is the name of the Helm parameter + type: string + path: + description: Path is the path to the file containing + the values for the Helm parameter + type: string + type: object + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally by + not appending them to helm template --values + type: boolean + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + namespace: + description: Namespace is an optional namespace to template + with. If left empty, defaults to the app's destination + namespace. + type: string + parameters: + description: Parameters is a list of Helm parameters which + are passed to the helm template command upon manifest + generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether to tell + Helm to interpret booleans and numbers as strings + type: boolean + name: + description: Name is the name of the Helm parameter + type: string + value: + description: Value is the value for the Helm parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials to all domains + (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to use. + If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + skipSchemaValidation: + description: SkipSchemaValidation skips JSON schema validation + (Helm's --skip-schema-validation) + type: boolean + skipTests: + description: SkipTests skips test manifest installation + step (Helm's --skip-tests). + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files + to use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. + type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map. This takes + precedence over Values. + type: object + x-kubernetes-preserve-unknown-fields: true + version: + description: Version is the Helm version to use for templating + ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonAnnotationsEnvsubst: + description: CommonAnnotationsEnvsubst specifies whether + to apply env variables substitution for annotation values + type: boolean + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional labels + to add to rendered manifests + type: object + components: + description: Components specifies a list of kustomize + components to add to the kustomization before building + items: + type: string + type: array + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether + to force applying common annotations to resources for + Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to force + applying common labels to resources for Kustomize apps + type: boolean + ignoreMissingComponents: + description: IgnoreMissingComponents prevents kustomize + from failing when components do not exist locally by + not appending them to kustomization file + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize image + definition in the format [old_image_name=]: + type: string + type: array + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + labelIncludeTemplates: + description: LabelIncludeTemplates specifies whether to + apply common labels to resource templates or not + type: boolean + labelWithoutSelector: + description: LabelWithoutSelector specifies whether to + apply common labels to resource selectors or not + type: boolean + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + namespace: + description: Namespace sets the namespace that Kustomize + adds to all resources + type: string + patches: + description: Patches is a list of Kustomize patches + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + description: Replicas is a list of Kustomize Replicas + override specifications + items: + properties: + count: + anyOf: + - type: integer + - type: string + description: Number of replicas + x-kubernetes-int-or-string: true + name: + description: Name of Deployment or StatefulSet + type: string + required: + - count + - name + type: object + type: array + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + name: + description: Name is used to refer to a source and is displayed + in the UI. It is used in multi-source Applications. + type: string + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment + properties: + name: + description: Name is the name of the variable, usually + expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type + parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string type + parameter. + type: string + type: object + type: array + type: object + ref: + description: Ref is reference to another source within sources + field. This field will not be used if used with a `source` + tag. + type: string + repoURL: + description: RepoURL is the URL to the repository (Git or + Helm) that contains the application manifests + type: string + targetRevision: + description: |- + TargetRevision defines the revision of the source to sync the application to. + In case of Git, this can be commit, tag, or branch. If omitted, will equal to HEAD. + In case of Helm, this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + sources: + description: |- + Sources overrides the source definition set in the application. + This is typically set in a Rollback operation and is nil during a Sync operation + items: + description: ApplicationSource contains all required information + about the source of an application + properties: + chart: + description: Chart is a Helm chart name, and must be specified + for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific options + properties: + exclude: + description: Exclude contains a glob pattern to match + paths against that should be explicitly excluded from + being used during manifest generation + type: string + include: + description: Include contains a glob pattern to match + paths against that should be explicitly included during + manifest generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External + Variables + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level + Arguments + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + fileParameters: + description: FileParameters are file parameters to the + helm template + items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest generation + properties: + name: + description: Name is the name of the Helm parameter + type: string + path: + description: Path is the path to the file containing + the values for the Helm parameter + type: string + type: object + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally + by not appending them to helm template --values + type: boolean + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + namespace: + description: Namespace is an optional namespace to template + with. If left empty, defaults to the app's destination + namespace. + type: string + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command upon + manifest generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether to + tell Helm to interpret booleans and numbers + as strings + type: boolean + name: + description: Name is the name of the Helm parameter + type: string + value: + description: Value is the value for the Helm parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials to all + domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to + use. If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + skipSchemaValidation: + description: SkipSchemaValidation skips JSON schema + validation (Helm's --skip-schema-validation) + type: boolean + skipTests: + description: SkipTests skips test manifest installation + step (Helm's --skip-tests). + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files + to use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. + type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map. This takes + precedence over Values. + type: object + x-kubernetes-preserve-unknown-fields: true + version: + description: Version is the Helm version to use for + templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonAnnotationsEnvsubst: + description: CommonAnnotationsEnvsubst specifies whether + to apply env variables substitution for annotation + values + type: boolean + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional labels + to add to rendered manifests + type: object + components: + description: Components specifies a list of kustomize + components to add to the kustomization before building + items: + type: string + type: array + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether + to force applying common annotations to resources + for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to + force applying common labels to resources for Kustomize + apps + type: boolean + ignoreMissingComponents: + description: IgnoreMissingComponents prevents kustomize + from failing when components do not exist locally + by not appending them to kustomization file + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: + type: string + type: array + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + labelIncludeTemplates: + description: LabelIncludeTemplates specifies whether + to apply common labels to resource templates or not + type: boolean + labelWithoutSelector: + description: LabelWithoutSelector specifies whether + to apply common labels to resource selectors or not + type: boolean + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + namespace: + description: Namespace sets the namespace that Kustomize + adds to all resources + type: string + patches: + description: Patches is a list of Kustomize patches + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + description: Replicas is a list of Kustomize Replicas + override specifications + items: + properties: + count: + anyOf: + - type: integer + - type: string + description: Number of replicas + x-kubernetes-int-or-string: true + name: + description: Name of Deployment or StatefulSet + type: string + required: + - count + - name + type: object + type: array + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + name: + description: Name is used to refer to a source and is displayed + in the UI. It is used in multi-source Applications. + type: string + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type + parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array + type: object + ref: + description: Ref is reference to another source within sources + field. This field will not be used if used with a `source` + tag. + type: string + repoURL: + description: RepoURL is the URL to the repository (Git or + Helm) that contains the application manifests + type: string + targetRevision: + description: |- + TargetRevision defines the revision of the source to sync the application to. + In case of Git, this can be commit, tag, or branch. If omitted, will equal to HEAD. + In case of Helm, this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + type: array + syncOptions: + description: SyncOptions provide per-sync sync-options, e.g. Validate=false + items: + type: string + type: array + syncStrategy: + description: SyncStrategy describes how to perform the sync + properties: + apply: + description: Apply will perform a `kubectl apply` to perform + the sync. + properties: + force: + description: |- + Force indicates whether or not to supply the --force flag to `kubectl apply`. + The --force flag deletes and re-create the resource, when PATCH encounters conflict and has + retried for 5 times. + type: boolean + type: object + hook: + description: Hook will submit any referenced resources to + perform the sync. This is the default strategy + properties: + force: + description: |- + Force indicates whether or not to supply the --force flag to `kubectl apply`. + The --force flag deletes and re-create the resource, when PATCH encounters conflict and has + retried for 5 times. + type: boolean + type: object + type: object + type: object + type: object + spec: + description: ApplicationSpec represents desired application state. Contains + link to repository with application definition and additional parameters + link definition revision. + properties: + destination: + description: Destination is a reference to the target Kubernetes server + and namespace + properties: + name: + description: Name is an alternate way of specifying the target + cluster by its symbolic name. This must be set if Server is + not set. + type: string + namespace: + description: |- + Namespace specifies the target namespace for the application's resources. + The namespace will only be set for namespace-scoped resources that have not set a value for .metadata.namespace + type: string + server: + description: Server specifies the URL of the target cluster's + Kubernetes control plane API. This must be set if Name is not + set. + type: string + type: object + ignoreDifferences: + description: IgnoreDifferences is a list of resources and their fields + which should be ignored during comparison + items: + description: ResourceIgnoreDifferences contains resource filter + and list of json paths which should be ignored during comparison + with live state. + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + description: |- + ManagedFieldsManagers is a list of trusted managers. Fields mutated by those managers will take precedence over the + desired state defined in the SCM and won't be displayed in diffs + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + description: Info contains a list of information (URLs, email addresses, + and plain text) that relates to the application + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + description: |- + Project is a reference to the project this application belongs to. + The empty string means that application belongs to the 'default' project. + type: string + revisionHistoryLimit: + description: |- + RevisionHistoryLimit limits the number of items kept in the application's revision history, which is used for informational purposes as well as for rollbacks to previous versions. + This should only be changed in exceptional circumstances. + Setting to zero will store no history. This will reduce storage used. + Increasing will increase the space used to store the history, so we do not recommend increasing it. + Default is 10. + format: int64 + type: integer + source: + description: Source is a reference to the location of the application's + manifests or chart + properties: + chart: + description: Chart is a Helm chart name, and must be specified + for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific options + properties: + exclude: + description: Exclude contains a glob pattern to match paths + against that should be explicitly excluded from being used + during manifest generation + type: string + include: + description: Include contains a glob pattern to match paths + against that should be explicitly included during manifest + generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External Variables + items: + description: JsonnetVar represents a variable to be + passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level Arguments + items: + description: JsonnetVar represents a variable to be + passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + fileParameters: + description: FileParameters are file parameters to the helm + template + items: + description: HelmFileParameter is a file parameter that's + passed to helm template during manifest generation + properties: + name: + description: Name is the name of the Helm parameter + type: string + path: + description: Path is the path to the file containing + the values for the Helm parameter + type: string + type: object + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally by not + appending them to helm template --values + type: boolean + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + namespace: + description: Namespace is an optional namespace to template + with. If left empty, defaults to the app's destination namespace. + type: string + parameters: + description: Parameters is a list of Helm parameters which + are passed to the helm template command upon manifest generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether to tell + Helm to interpret booleans and numbers as strings + type: boolean + name: + description: Name is the name of the Helm parameter + type: string + value: + description: Value is the value for the Helm parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials to all domains + (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to use. + If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition installation + step (Helm's --skip-crds) + type: boolean + skipSchemaValidation: + description: SkipSchemaValidation skips JSON schema validation + (Helm's --skip-schema-validation) + type: boolean + skipTests: + description: SkipTests skips test manifest installation step + (Helm's --skip-tests). + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files to + use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be passed to + helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. + type: string + valuesObject: + description: ValuesObject specifies Helm values to be passed + to helm template, defined as a map. This takes precedence + over Values. + type: object + x-kubernetes-preserve-unknown-fields: true + version: + description: Version is the Helm version to use for templating + ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional annotations + to add to rendered manifests + type: object + commonAnnotationsEnvsubst: + description: CommonAnnotationsEnvsubst specifies whether to + apply env variables substitution for annotation values + type: boolean + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional labels to + add to rendered manifests + type: object + components: + description: Components specifies a list of kustomize components + to add to the kustomization before building + items: + type: string + type: array + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether to force + applying common annotations to resources for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to force + applying common labels to resources for Kustomize apps + type: boolean + ignoreMissingComponents: + description: IgnoreMissingComponents prevents kustomize from + failing when components do not exist locally by not appending + them to kustomization file + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize image + definition in the format [old_image_name=]: + type: string + type: array + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + labelIncludeTemplates: + description: LabelIncludeTemplates specifies whether to apply + common labels to resource templates or not + type: boolean + labelWithoutSelector: + description: LabelWithoutSelector specifies whether to apply + common labels to resource selectors or not + type: boolean + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + namespace: + description: Namespace sets the namespace that Kustomize adds + to all resources + type: string + patches: + description: Patches is a list of Kustomize patches + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + description: Replicas is a list of Kustomize Replicas override + specifications + items: + properties: + count: + anyOf: + - type: integer + - type: string + description: Number of replicas + x-kubernetes-int-or-string: true + name: + description: Name of Deployment or StatefulSet + type: string + required: + - count + - name + type: object + type: array + version: + description: Version controls which version of Kustomize to + use for rendering manifests + type: string + type: object + name: + description: Name is used to refer to a source and is displayed + in the UI. It is used in multi-source Applications. + type: string + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment + properties: + name: + description: Name is the name of the variable, usually + expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string type parameter. + type: string + type: object + type: array + type: object + ref: + description: Ref is reference to another source within sources + field. This field will not be used if used with a `source` tag. + type: string + repoURL: + description: RepoURL is the URL to the repository (Git or Helm) + that contains the application manifests + type: string + targetRevision: + description: |- + TargetRevision defines the revision of the source to sync the application to. + In case of Git, this can be commit, tag, or branch. If omitted, will equal to HEAD. + In case of Helm, this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + sourceHydrator: + description: SourceHydrator provides a way to push hydrated manifests + back to git before syncing them to the cluster. + properties: + drySource: + description: DrySource specifies where the dry "don't repeat yourself" + manifest source lives. + properties: + path: + description: Path is a directory path within the Git repository + where the manifests are located + type: string + repoURL: + description: RepoURL is the URL to the git repository that + contains the application manifests + type: string + targetRevision: + description: TargetRevision defines the revision of the source + to hydrate + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + description: |- + HydrateTo specifies an optional "staging" location to push hydrated manifests to. An external system would then + have to move manifests to the SyncSource, e.g. by pull request. + properties: + targetBranch: + description: TargetBranch is the branch to which hydrated + manifests should be committed + type: string + required: + - targetBranch + type: object + syncSource: + description: SyncSource specifies where to sync hydrated manifests + from. + properties: + path: + description: |- + Path is a directory path within the git repository where hydrated manifests should be committed to and synced + from. If hydrateTo is set, this is just the path from which hydrated manifests will be synced. + type: string + targetBranch: + description: TargetBranch is the branch to which hydrated + manifests should be committed + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + description: Sources is a reference to the location of the application's + manifests or chart + items: + description: ApplicationSource contains all required information + about the source of an application + properties: + chart: + description: Chart is a Helm chart name, and must be specified + for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific options + properties: + exclude: + description: Exclude contains a glob pattern to match paths + against that should be explicitly excluded from being + used during manifest generation + type: string + include: + description: Include contains a glob pattern to match paths + against that should be explicitly included during manifest + generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External Variables + items: + description: JsonnetVar represents a variable to be + passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level Arguments + items: + description: JsonnetVar represents a variable to be + passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + fileParameters: + description: FileParameters are file parameters to the helm + template + items: + description: HelmFileParameter is a file parameter that's + passed to helm template during manifest generation + properties: + name: + description: Name is the name of the Helm parameter + type: string + path: + description: Path is the path to the file containing + the values for the Helm parameter + type: string + type: object + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally by not + appending them to helm template --values + type: boolean + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + namespace: + description: Namespace is an optional namespace to template + with. If left empty, defaults to the app's destination + namespace. + type: string + parameters: + description: Parameters is a list of Helm parameters which + are passed to the helm template command upon manifest + generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether to tell + Helm to interpret booleans and numbers as strings + type: boolean + name: + description: Name is the name of the Helm parameter + type: string + value: + description: Value is the value for the Helm parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials to all domains + (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to use. + If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition installation + step (Helm's --skip-crds) + type: boolean + skipSchemaValidation: + description: SkipSchemaValidation skips JSON schema validation + (Helm's --skip-schema-validation) + type: boolean + skipTests: + description: SkipTests skips test manifest installation + step (Helm's --skip-tests). + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files to + use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be passed to + helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. + type: string + valuesObject: + description: ValuesObject specifies Helm values to be passed + to helm template, defined as a map. This takes precedence + over Values. + type: object + x-kubernetes-preserve-unknown-fields: true + version: + description: Version is the Helm version to use for templating + ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional annotations + to add to rendered manifests + type: object + commonAnnotationsEnvsubst: + description: CommonAnnotationsEnvsubst specifies whether + to apply env variables substitution for annotation values + type: boolean + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional labels + to add to rendered manifests + type: object + components: + description: Components specifies a list of kustomize components + to add to the kustomization before building + items: + type: string + type: array + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether to + force applying common annotations to resources for Kustomize + apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to force + applying common labels to resources for Kustomize apps + type: boolean + ignoreMissingComponents: + description: IgnoreMissingComponents prevents kustomize + from failing when components do not exist locally by not + appending them to kustomization file + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize image + definition in the format [old_image_name=]: + type: string + type: array + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + labelIncludeTemplates: + description: LabelIncludeTemplates specifies whether to + apply common labels to resource templates or not + type: boolean + labelWithoutSelector: + description: LabelWithoutSelector specifies whether to apply + common labels to resource selectors or not + type: boolean + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + namespace: + description: Namespace sets the namespace that Kustomize + adds to all resources + type: string + patches: + description: Patches is a list of Kustomize patches + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + description: Replicas is a list of Kustomize Replicas override + specifications + items: + properties: + count: + anyOf: + - type: integer + - type: string + description: Number of replicas + x-kubernetes-int-or-string: true + name: + description: Name of Deployment or StatefulSet + type: string + required: + - count + - name + type: object + type: array + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + name: + description: Name is used to refer to a source and is displayed + in the UI. It is used in multi-source Applications. + type: string + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment + properties: + name: + description: Name is the name of the variable, usually + expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string type + parameter. + type: string + type: object + type: array + type: object + ref: + description: Ref is reference to another source within sources + field. This field will not be used if used with a `source` + tag. + type: string + repoURL: + description: RepoURL is the URL to the repository (Git or Helm) + that contains the application manifests + type: string + targetRevision: + description: |- + TargetRevision defines the revision of the source to sync the application to. + In case of Git, this can be commit, tag, or branch. If omitted, will equal to HEAD. + In case of Helm, this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + description: SyncPolicy controls when and how a sync will be performed + properties: + automated: + description: Automated will keep an application synced to the + target revision + properties: + allowEmpty: + description: 'AllowEmpty allows apps have zero live resources + (default: false)' + type: boolean + enabled: + description: Enable allows apps to explicitly control automated + sync + type: boolean + prune: + description: 'Prune specifies whether to delete resources + from the cluster that are not found in the sources anymore + as part of automated sync (default: false)' + type: boolean + selfHeal: + description: 'SelfHeal specifies whether to revert resources + back to their desired state upon modification in the cluster + (default: false)' + type: boolean + type: object + managedNamespaceMetadata: + description: ManagedNamespaceMetadata controls metadata in the + given namespace (if CreateNamespace=true) + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + description: Retry controls failed sync retry behavior + properties: + backoff: + description: Backoff controls how to backoff on subsequent + retries of failed syncs + properties: + duration: + description: Duration is the amount to back off. Default + unit is seconds, but could also be a duration (e.g. + "2m", "1h") + type: string + factor: + description: Factor is a factor to multiply the base duration + after each failed retry + format: int64 + type: integer + maxDuration: + description: MaxDuration is the maximum amount of time + allowed for the backoff strategy + type: string + type: object + limit: + description: Limit is the maximum number of attempts for retrying + a failed sync. If set to 0, no retries will be performed. + format: int64 + type: integer + type: object + syncOptions: + description: Options allow you to specify whole app sync-options + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + status: + description: ApplicationStatus contains status information for the application + properties: + conditions: + description: Conditions is a list of currently observed application + conditions + items: + description: ApplicationCondition contains details about an application + condition, which is usually an error or warning + properties: + lastTransitionTime: + description: LastTransitionTime is the time the condition was + last observed + format: date-time + type: string + message: + description: Message contains human-readable message indicating + details about condition + type: string + type: + description: Type is an application condition type + type: string + required: + - message + - type + type: object + type: array + controllerNamespace: + description: ControllerNamespace indicates the namespace in which + the application controller is located + type: string + health: + description: Health contains information about the application's current + health status + properties: + lastTransitionTime: + description: LastTransitionTime is the time the HealthStatus was + set or updated + format: date-time + type: string + message: + description: |- + Message is a human-readable informational message describing the health status + + Deprecated: this field is not used and will be removed in a future release. + type: string + status: + description: Status holds the status code of the application + type: string + type: object + history: + description: History contains information about the application's + sync history + items: + description: RevisionHistory contains history information about + a previous sync + properties: + deployStartedAt: + description: DeployStartedAt holds the time the sync operation + started + format: date-time + type: string + deployedAt: + description: DeployedAt holds the time the sync operation completed + format: date-time + type: string + id: + description: ID is an auto incrementing identifier of the RevisionHistory + format: int64 + type: integer + initiatedBy: + description: InitiatedBy contains information about who initiated + the operations + properties: + automated: + description: Automated is set to true if operation was initiated + automatically by the application controller. + type: boolean + username: + description: Username contains the name of a user who started + operation + type: string + type: object + revision: + description: Revision holds the revision the sync was performed + against + type: string + revisions: + description: Revisions holds the revision of each source in + sources field the sync was performed against + items: + type: string + type: array + source: + description: Source is a reference to the application source + used for the sync operation + properties: + chart: + description: Chart is a Helm chart name, and must be specified + for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific options + properties: + exclude: + description: Exclude contains a glob pattern to match + paths against that should be explicitly excluded from + being used during manifest generation + type: string + include: + description: Include contains a glob pattern to match + paths against that should be explicitly included during + manifest generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External + Variables + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level + Arguments + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + fileParameters: + description: FileParameters are file parameters to the + helm template + items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest generation + properties: + name: + description: Name is the name of the Helm parameter + type: string + path: + description: Path is the path to the file containing + the values for the Helm parameter + type: string + type: object + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm template + from failing when valueFiles do not exist locally + by not appending them to helm template --values + type: boolean + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + namespace: + description: Namespace is an optional namespace to template + with. If left empty, defaults to the app's destination + namespace. + type: string + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command upon + manifest generation + items: + description: HelmParameter is a parameter that's passed + to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether to + tell Helm to interpret booleans and numbers + as strings + type: boolean + name: + description: Name is the name of the Helm parameter + type: string + value: + description: Value is the value for the Helm parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials to all + domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name to + use. If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + skipSchemaValidation: + description: SkipSchemaValidation skips JSON schema + validation (Helm's --skip-schema-validation) + type: boolean + skipTests: + description: SkipTests skips test manifest installation + step (Helm's --skip-tests). + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files + to use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. ValuesObject + takes precedence over Values, so use one or the other. + type: string + valuesObject: + description: ValuesObject specifies Helm values to be + passed to helm template, defined as a map. This takes + precedence over Values. + type: object + x-kubernetes-preserve-unknown-fields: true + version: + description: Version is the Helm version to use for + templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonAnnotationsEnvsubst: + description: CommonAnnotationsEnvsubst specifies whether + to apply env variables substitution for annotation + values + type: boolean + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional labels + to add to rendered manifests + type: object + components: + description: Components specifies a list of kustomize + components to add to the kustomization before building + items: + type: string + type: array + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether + to force applying common annotations to resources + for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to + force applying common labels to resources for Kustomize + apps + type: boolean + ignoreMissingComponents: + description: IgnoreMissingComponents prevents kustomize + from failing when components do not exist locally + by not appending them to kustomization file + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: + type: string + type: array + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + labelIncludeTemplates: + description: LabelIncludeTemplates specifies whether + to apply common labels to resource templates or not + type: boolean + labelWithoutSelector: + description: LabelWithoutSelector specifies whether + to apply common labels to resource selectors or not + type: boolean + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + namespace: + description: Namespace sets the namespace that Kustomize + adds to all resources + type: string + patches: + description: Patches is a list of Kustomize patches + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + description: Replicas is a list of Kustomize Replicas + override specifications + items: + properties: + count: + anyOf: + - type: integer + - type: string + description: Number of replicas + x-kubernetes-int-or-string: true + name: + description: Name of Deployment or StatefulSet + type: string + required: + - count + - name + type: object + type: array + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + name: + description: Name is used to refer to a source and is displayed + in the UI. It is used in multi-source Applications. + type: string + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable entries + items: + description: EnvEntry represents an entry in the application's + environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + description: Array is the value of an array type + parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type parameter. + type: object + name: + description: Name is the name identifying a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array + type: object + ref: + description: Ref is reference to another source within sources + field. This field will not be used if used with a `source` + tag. + type: string + repoURL: + description: RepoURL is the URL to the repository (Git or + Helm) that contains the application manifests + type: string + targetRevision: + description: |- + TargetRevision defines the revision of the source to sync the application to. + In case of Git, this can be commit, tag, or branch. If omitted, will equal to HEAD. + In case of Helm, this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + sources: + description: Sources is a reference to the application sources + used for the sync operation + items: + description: ApplicationSource contains all required information + about the source of an application + properties: + chart: + description: Chart is a Helm chart name, and must be specified + for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific options + properties: + exclude: + description: Exclude contains a glob pattern to match + paths against that should be explicitly excluded + from being used during manifest generation + type: string + include: + description: Include contains a glob pattern to match + paths against that should be explicitly included + during manifest generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External + Variables + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level + Arguments + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + fileParameters: + description: FileParameters are file parameters to + the helm template + items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest + generation + properties: + name: + description: Name is the name of the Helm parameter + type: string + path: + description: Path is the path to the file containing + the values for the Helm parameter + type: string + type: object + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm + template from failing when valueFiles do not exist + locally by not appending them to helm template --values + type: boolean + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + namespace: + description: Namespace is an optional namespace to + template with. If left empty, defaults to the app's + destination namespace. + type: string + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command upon + manifest generation + items: + description: HelmParameter is a parameter that's + passed to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether + to tell Helm to interpret booleans and numbers + as strings + type: boolean + name: + description: Name is the name of the Helm parameter + type: string + value: + description: Value is the value for the Helm + parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials to all + domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name + to use. If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + skipSchemaValidation: + description: SkipSchemaValidation skips JSON schema + validation (Helm's --skip-schema-validation) + type: boolean + skipTests: + description: SkipTests skips test manifest installation + step (Helm's --skip-tests). + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files + to use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. + type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map. This + takes precedence over Values. + type: object + x-kubernetes-preserve-unknown-fields: true + version: + description: Version is the Helm version to use for + templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonAnnotationsEnvsubst: + description: CommonAnnotationsEnvsubst specifies whether + to apply env variables substitution for annotation + values + type: boolean + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional + labels to add to rendered manifests + type: object + components: + description: Components specifies a list of kustomize + components to add to the kustomization before building + items: + type: string + type: array + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether + to force applying common annotations to resources + for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to + force applying common labels to resources for Kustomize + apps + type: boolean + ignoreMissingComponents: + description: IgnoreMissingComponents prevents kustomize + from failing when components do not exist locally + by not appending them to kustomization file + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: + type: string + type: array + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + labelIncludeTemplates: + description: LabelIncludeTemplates specifies whether + to apply common labels to resource templates or + not + type: boolean + labelWithoutSelector: + description: LabelWithoutSelector specifies whether + to apply common labels to resource selectors or + not + type: boolean + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + namespace: + description: Namespace sets the namespace that Kustomize + adds to all resources + type: string + patches: + description: Patches is a list of Kustomize patches + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + description: Replicas is a list of Kustomize Replicas + override specifications + items: + properties: + count: + anyOf: + - type: integer + - type: string + description: Number of replicas + x-kubernetes-int-or-string: true + name: + description: Name of Deployment or StatefulSet + type: string + required: + - count + - name + type: object + type: array + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + name: + description: Name is used to refer to a source and is + displayed in the UI. It is used in multi-source Applications. + type: string + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable + entries + items: + description: EnvEntry represents an entry in the + application's environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying a + parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array + type: object + ref: + description: Ref is reference to another source within + sources field. This field will not be used if used with + a `source` tag. + type: string + repoURL: + description: RepoURL is the URL to the repository (Git + or Helm) that contains the application manifests + type: string + targetRevision: + description: |- + TargetRevision defines the revision of the source to sync the application to. + In case of Git, this can be commit, tag, or branch. If omitted, will equal to HEAD. + In case of Helm, this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + type: array + required: + - deployedAt + - id + type: object + type: array + observedAt: + description: |- + ObservedAt indicates when the application state was updated without querying latest git state + Deprecated: controller no longer updates ObservedAt field + format: date-time + type: string + operationState: + description: OperationState contains information about any ongoing + operations, such as a sync + properties: + finishedAt: + description: FinishedAt contains time of operation completion + format: date-time + type: string + message: + description: Message holds any pertinent messages when attempting + to perform operation (typically errors). + type: string + operation: + description: Operation is the original requested operation + properties: + info: + description: Info is a list of informational items for this + operation + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + initiatedBy: + description: InitiatedBy contains information about who initiated + the operations + properties: + automated: + description: Automated is set to true if operation was + initiated automatically by the application controller. + type: boolean + username: + description: Username contains the name of a user who + started operation + type: string + type: object + retry: + description: Retry controls the strategy to apply if a sync + fails + properties: + backoff: + description: Backoff controls how to backoff on subsequent + retries of failed syncs + properties: + duration: + description: Duration is the amount to back off. Default + unit is seconds, but could also be a duration (e.g. + "2m", "1h") + type: string + factor: + description: Factor is a factor to multiply the base + duration after each failed retry + format: int64 + type: integer + maxDuration: + description: MaxDuration is the maximum amount of + time allowed for the backoff strategy + type: string + type: object + limit: + description: Limit is the maximum number of attempts for + retrying a failed sync. If set to 0, no retries will + be performed. + format: int64 + type: integer + type: object + sync: + description: Sync contains parameters for the operation + properties: + autoHealAttemptsCount: + description: SelfHealAttemptsCount contains the number + of auto-heal attempts + format: int64 + type: integer + dryRun: + description: DryRun specifies to perform a `kubectl apply + --dry-run` without actually performing the sync + type: boolean + manifests: + description: Manifests is an optional field that overrides + sync source with a local directory for development + items: + type: string + type: array + prune: + description: Prune specifies to delete resources from + the cluster that are no longer tracked in git + type: boolean + resources: + description: Resources describes which resources shall + be part of the sync + items: + description: SyncOperationResource contains resources + to sync. + properties: + group: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object + type: array + revision: + description: |- + Revision is the revision (Git) or chart version (Helm) which to sync the application to + If omitted, will use the revision specified in app spec. + type: string + revisions: + description: |- + Revisions is the list of revision (Git) or chart version (Helm) which to sync each source in sources field for the application to + If omitted, will use the revision specified in app spec. + items: + type: string + type: array + source: + description: |- + Source overrides the source definition set in the application. + This is typically set in a Rollback operation and is nil during a Sync operation + properties: + chart: + description: Chart is a Helm chart name, and must + be specified for applications sourced from a Helm + repo. + type: string + directory: + description: Directory holds path/directory specific + options + properties: + exclude: + description: Exclude contains a glob pattern to + match paths against that should be explicitly + excluded from being used during manifest generation + type: string + include: + description: Include contains a glob pattern to + match paths against that should be explicitly + included during manifest generation + type: string + jsonnet: + description: Jsonnet holds options specific to + Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet + External Variables + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest + generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level + Arguments + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest + generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan + a directory recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + fileParameters: + description: FileParameters are file parameters + to the helm template + items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest + generation + properties: + name: + description: Name is the name of the Helm + parameter + type: string + path: + description: Path is the path to the file + containing the values for the Helm parameter + type: string + type: object + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents + helm template from failing when valueFiles do + not exist locally by not appending them to helm + template --values + type: boolean + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + namespace: + description: Namespace is an optional namespace + to template with. If left empty, defaults to + the app's destination namespace. + type: string + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command + upon manifest generation + items: + description: HelmParameter is a parameter that's + passed to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether + to tell Helm to interpret booleans and + numbers as strings + type: boolean + name: + description: Name is the name of the Helm + parameter + type: string + value: + description: Value is the value for the + Helm parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials + to all domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name + to use. If omitted it will use the application + name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + skipSchemaValidation: + description: SkipSchemaValidation skips JSON schema + validation (Helm's --skip-schema-validation) + type: boolean + skipTests: + description: SkipTests skips test manifest installation + step (Helm's --skip-tests). + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value + files to use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be + passed to helm template, typically defined as + a block. ValuesObject takes precedence over + Values, so use one or the other. + type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a + map. This takes precedence over Values. + type: object + x-kubernetes-preserve-unknown-fields: true + version: + description: Version is the Helm version to use + for templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonAnnotationsEnvsubst: + description: CommonAnnotationsEnvsubst specifies + whether to apply env variables substitution + for annotation values + type: boolean + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional + labels to add to rendered manifests + type: object + components: + description: Components specifies a list of kustomize + components to add to the kustomization before + building + items: + type: string + type: array + forceCommonAnnotations: + description: ForceCommonAnnotations specifies + whether to force applying common annotations + to resources for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether + to force applying common labels to resources + for Kustomize apps + type: boolean + ignoreMissingComponents: + description: IgnoreMissingComponents prevents + kustomize from failing when components do not + exist locally by not appending them to kustomization + file + type: boolean + images: + description: Images is a list of Kustomize image + override specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: + type: string + type: array + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + labelIncludeTemplates: + description: LabelIncludeTemplates specifies whether + to apply common labels to resource templates + or not + type: boolean + labelWithoutSelector: + description: LabelWithoutSelector specifies whether + to apply common labels to resource selectors + or not + type: boolean + namePrefix: + description: NamePrefix is a prefix appended to + resources for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to + resources for Kustomize apps + type: string + namespace: + description: Namespace sets the namespace that + Kustomize adds to all resources + type: string + patches: + description: Patches is a list of Kustomize patches + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + description: Replicas is a list of Kustomize Replicas + override specifications + items: + properties: + count: + anyOf: + - type: integer + - type: string + description: Number of replicas + x-kubernetes-int-or-string: true + name: + description: Name of Deployment or StatefulSet + type: string + required: + - count + - name + type: object + type: array + version: + description: Version controls which version of + Kustomize to use for rendering manifests + type: string + type: object + name: + description: Name is used to refer to a source and + is displayed in the UI. It is used in multi-source + Applications. + type: string + path: + description: Path is a directory path within the Git + repository, and is only valid for applications sourced + from Git. + type: string + plugin: + description: Plugin holds config management plugin + specific options + properties: + env: + description: Env is a list of environment variable + entries + items: + description: EnvEntry represents an entry in + the application's environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying + a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array + type: object + ref: + description: Ref is reference to another source within + sources field. This field will not be used if used + with a `source` tag. + type: string + repoURL: + description: RepoURL is the URL to the repository + (Git or Helm) that contains the application manifests + type: string + targetRevision: + description: |- + TargetRevision defines the revision of the source to sync the application to. + In case of Git, this can be commit, tag, or branch. If omitted, will equal to HEAD. + In case of Helm, this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + sources: + description: |- + Sources overrides the source definition set in the application. + This is typically set in a Rollback operation and is nil during a Sync operation + items: + description: ApplicationSource contains all required + information about the source of an application + properties: + chart: + description: Chart is a Helm chart name, and must + be specified for applications sourced from a Helm + repo. + type: string + directory: + description: Directory holds path/directory specific + options + properties: + exclude: + description: Exclude contains a glob pattern + to match paths against that should be explicitly + excluded from being used during manifest generation + type: string + include: + description: Include contains a glob pattern + to match paths against that should be explicitly + included during manifest generation + type: string + jsonnet: + description: Jsonnet holds options specific + to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet + External Variables + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest + generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level + Arguments + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest + generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan + a directory recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + fileParameters: + description: FileParameters are file parameters + to the helm template + items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest + generation + properties: + name: + description: Name is the name of the Helm + parameter + type: string + path: + description: Path is the path to the file + containing the values for the Helm parameter + type: string + type: object + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents + helm template from failing when valueFiles + do not exist locally by not appending them + to helm template --values + type: boolean + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + namespace: + description: Namespace is an optional namespace + to template with. If left empty, defaults + to the app's destination namespace. + type: string + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command + upon manifest generation + items: + description: HelmParameter is a parameter + that's passed to helm template during manifest + generation + properties: + forceString: + description: ForceString determines whether + to tell Helm to interpret booleans and + numbers as strings + type: boolean + name: + description: Name is the name of the Helm + parameter + type: string + value: + description: Value is the value for the + Helm parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials + to all domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release + name to use. If omitted it will use the application + name + type: string + skipCrds: + description: SkipCrds skips custom resource + definition installation step (Helm's --skip-crds) + type: boolean + skipSchemaValidation: + description: SkipSchemaValidation skips JSON + schema validation (Helm's --skip-schema-validation) + type: boolean + skipTests: + description: SkipTests skips test manifest installation + step (Helm's --skip-tests). + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value + files to use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to + be passed to helm template, typically defined + as a block. ValuesObject takes precedence + over Values, so use one or the other. + type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as + a map. This takes precedence over Values. + type: object + x-kubernetes-preserve-unknown-fields: true + version: + description: Version is the Helm version to + use for templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific + options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of + additional annotations to add to rendered + manifests + type: object + commonAnnotationsEnvsubst: + description: CommonAnnotationsEnvsubst specifies + whether to apply env variables substitution + for annotation values + type: boolean + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional + labels to add to rendered manifests + type: object + components: + description: Components specifies a list of + kustomize components to add to the kustomization + before building + items: + type: string + type: array + forceCommonAnnotations: + description: ForceCommonAnnotations specifies + whether to force applying common annotations + to resources for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether + to force applying common labels to resources + for Kustomize apps + type: boolean + ignoreMissingComponents: + description: IgnoreMissingComponents prevents + kustomize from failing when components do + not exist locally by not appending them to + kustomization file + type: boolean + images: + description: Images is a list of Kustomize image + override specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: + type: string + type: array + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + labelIncludeTemplates: + description: LabelIncludeTemplates specifies + whether to apply common labels to resource + templates or not + type: boolean + labelWithoutSelector: + description: LabelWithoutSelector specifies + whether to apply common labels to resource + selectors or not + type: boolean + namePrefix: + description: NamePrefix is a prefix appended + to resources for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended + to resources for Kustomize apps + type: string + namespace: + description: Namespace sets the namespace that + Kustomize adds to all resources + type: string + patches: + description: Patches is a list of Kustomize + patches + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + description: Replicas is a list of Kustomize + Replicas override specifications + items: + properties: + count: + anyOf: + - type: integer + - type: string + description: Number of replicas + x-kubernetes-int-or-string: true + name: + description: Name of Deployment or StatefulSet + type: string + required: + - count + - name + type: object + type: array + version: + description: Version controls which version + of Kustomize to use for rendering manifests + type: string + type: object + name: + description: Name is used to refer to a source and + is displayed in the UI. It is used in multi-source + Applications. + type: string + path: + description: Path is a directory path within the + Git repository, and is only valid for applications + sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin + specific options + properties: + env: + description: Env is a list of environment variable + entries + items: + description: EnvEntry represents an entry + in the application's environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the + variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + description: Array is the value of an + array type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map + type parameter. + type: object + name: + description: Name is the name identifying + a parameter. + type: string + string: + description: String_ is the value of a + string type parameter. + type: string + type: object + type: array + type: object + ref: + description: Ref is reference to another source + within sources field. This field will not be used + if used with a `source` tag. + type: string + repoURL: + description: RepoURL is the URL to the repository + (Git or Helm) that contains the application manifests + type: string + targetRevision: + description: |- + TargetRevision defines the revision of the source to sync the application to. + In case of Git, this can be commit, tag, or branch. If omitted, will equal to HEAD. + In case of Helm, this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + type: array + syncOptions: + description: SyncOptions provide per-sync sync-options, + e.g. Validate=false + items: + type: string + type: array + syncStrategy: + description: SyncStrategy describes how to perform the + sync + properties: + apply: + description: Apply will perform a `kubectl apply` + to perform the sync. + properties: + force: + description: |- + Force indicates whether or not to supply the --force flag to `kubectl apply`. + The --force flag deletes and re-create the resource, when PATCH encounters conflict and has + retried for 5 times. + type: boolean + type: object + hook: + description: Hook will submit any referenced resources + to perform the sync. This is the default strategy + properties: + force: + description: |- + Force indicates whether or not to supply the --force flag to `kubectl apply`. + The --force flag deletes and re-create the resource, when PATCH encounters conflict and has + retried for 5 times. + type: boolean + type: object + type: object + type: object + type: object + phase: + description: Phase is the current phase of the operation + type: string + retryCount: + description: RetryCount contains time of operation retries + format: int64 + type: integer + startedAt: + description: StartedAt contains time of operation start + format: date-time + type: string + syncResult: + description: SyncResult is the result of a Sync operation + properties: + managedNamespaceMetadata: + description: ManagedNamespaceMetadata contains the current + sync state of managed namespace metadata + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + resources: + description: Resources contains a list of sync result items + for each individual resource in a sync operation + items: + description: ResourceResult holds the operation result details + of a specific resource + properties: + group: + description: Group specifies the API group of the resource + type: string + hookPhase: + description: |- + HookPhase contains the state of any operation associated with this resource OR hook + This can also contain values for non-hook resources. + type: string + hookType: + description: HookType specifies the type of the hook. + Empty for non-hook resources + type: string + images: + description: Images contains the images related to the + ResourceResult + items: + type: string + type: array + kind: + description: Kind specifies the API kind of the resource + type: string + message: + description: Message contains an informational or error + message for the last sync OR operation + type: string + name: + description: Name specifies the name of the resource + type: string + namespace: + description: Namespace specifies the target namespace + of the resource + type: string + status: + description: Status holds the final result of the sync. + Will be empty if the resources is yet to be applied/pruned + and is always zero-value for hooks + type: string + syncPhase: + description: SyncPhase indicates the particular phase + of the sync that this result was acquired in + type: string + version: + description: Version specifies the API version of the + resource + type: string + required: + - group + - kind + - name + - namespace + - version + type: object + type: array + revision: + description: Revision holds the revision this sync operation + was performed to + type: string + revisions: + description: Revisions holds the revision this sync operation + was performed for respective indexed source in sources field + items: + type: string + type: array + source: + description: Source records the application source information + of the sync, used for comparing auto-sync + properties: + chart: + description: Chart is a Helm chart name, and must be specified + for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific options + properties: + exclude: + description: Exclude contains a glob pattern to match + paths against that should be explicitly excluded + from being used during manifest generation + type: string + include: + description: Include contains a glob pattern to match + paths against that should be explicitly included + during manifest generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External + Variables + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level + Arguments + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + fileParameters: + description: FileParameters are file parameters to + the helm template + items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest + generation + properties: + name: + description: Name is the name of the Helm parameter + type: string + path: + description: Path is the path to the file containing + the values for the Helm parameter + type: string + type: object + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm + template from failing when valueFiles do not exist + locally by not appending them to helm template --values + type: boolean + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + namespace: + description: Namespace is an optional namespace to + template with. If left empty, defaults to the app's + destination namespace. + type: string + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command upon + manifest generation + items: + description: HelmParameter is a parameter that's + passed to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether + to tell Helm to interpret booleans and numbers + as strings + type: boolean + name: + description: Name is the name of the Helm parameter + type: string + value: + description: Value is the value for the Helm + parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials to all + domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name + to use. If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + skipSchemaValidation: + description: SkipSchemaValidation skips JSON schema + validation (Helm's --skip-schema-validation) + type: boolean + skipTests: + description: SkipTests skips test manifest installation + step (Helm's --skip-tests). + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files + to use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. + type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map. This + takes precedence over Values. + type: object + x-kubernetes-preserve-unknown-fields: true + version: + description: Version is the Helm version to use for + templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonAnnotationsEnvsubst: + description: CommonAnnotationsEnvsubst specifies whether + to apply env variables substitution for annotation + values + type: boolean + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional + labels to add to rendered manifests + type: object + components: + description: Components specifies a list of kustomize + components to add to the kustomization before building + items: + type: string + type: array + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether + to force applying common annotations to resources + for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to + force applying common labels to resources for Kustomize + apps + type: boolean + ignoreMissingComponents: + description: IgnoreMissingComponents prevents kustomize + from failing when components do not exist locally + by not appending them to kustomization file + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: + type: string + type: array + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + labelIncludeTemplates: + description: LabelIncludeTemplates specifies whether + to apply common labels to resource templates or + not + type: boolean + labelWithoutSelector: + description: LabelWithoutSelector specifies whether + to apply common labels to resource selectors or + not + type: boolean + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + namespace: + description: Namespace sets the namespace that Kustomize + adds to all resources + type: string + patches: + description: Patches is a list of Kustomize patches + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + description: Replicas is a list of Kustomize Replicas + override specifications + items: + properties: + count: + anyOf: + - type: integer + - type: string + description: Number of replicas + x-kubernetes-int-or-string: true + name: + description: Name of Deployment or StatefulSet + type: string + required: + - count + - name + type: object + type: array + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + name: + description: Name is used to refer to a source and is + displayed in the UI. It is used in multi-source Applications. + type: string + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable + entries + items: + description: EnvEntry represents an entry in the + application's environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying a + parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array + type: object + ref: + description: Ref is reference to another source within + sources field. This field will not be used if used with + a `source` tag. + type: string + repoURL: + description: RepoURL is the URL to the repository (Git + or Helm) that contains the application manifests + type: string + targetRevision: + description: |- + TargetRevision defines the revision of the source to sync the application to. + In case of Git, this can be commit, tag, or branch. If omitted, will equal to HEAD. + In case of Helm, this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + sources: + description: Source records the application source information + of the sync, used for comparing auto-sync + items: + description: ApplicationSource contains all required information + about the source of an application + properties: + chart: + description: Chart is a Helm chart name, and must be + specified for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific + options + properties: + exclude: + description: Exclude contains a glob pattern to + match paths against that should be explicitly + excluded from being used during manifest generation + type: string + include: + description: Include contains a glob pattern to + match paths against that should be explicitly + included during manifest generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External + Variables + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest + generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level + Arguments + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest + generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a + directory recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + fileParameters: + description: FileParameters are file parameters + to the helm template + items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest + generation + properties: + name: + description: Name is the name of the Helm + parameter + type: string + path: + description: Path is the path to the file + containing the values for the Helm parameter + type: string + type: object + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm + template from failing when valueFiles do not exist + locally by not appending them to helm template + --values + type: boolean + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + namespace: + description: Namespace is an optional namespace + to template with. If left empty, defaults to the + app's destination namespace. + type: string + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command + upon manifest generation + items: + description: HelmParameter is a parameter that's + passed to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether + to tell Helm to interpret booleans and numbers + as strings + type: boolean + name: + description: Name is the name of the Helm + parameter + type: string + value: + description: Value is the value for the Helm + parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials to + all domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name + to use. If omitted it will use the application + name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + skipSchemaValidation: + description: SkipSchemaValidation skips JSON schema + validation (Helm's --skip-schema-validation) + type: boolean + skipTests: + description: SkipTests skips test manifest installation + step (Helm's --skip-tests). + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value + files to use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be + passed to helm template, typically defined as + a block. ValuesObject takes precedence over Values, + so use one or the other. + type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a map. + This takes precedence over Values. + type: object + x-kubernetes-preserve-unknown-fields: true + version: + description: Version is the Helm version to use + for templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonAnnotationsEnvsubst: + description: CommonAnnotationsEnvsubst specifies + whether to apply env variables substitution for + annotation values + type: boolean + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional + labels to add to rendered manifests + type: object + components: + description: Components specifies a list of kustomize + components to add to the kustomization before + building + items: + type: string + type: array + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether + to force applying common annotations to resources + for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether + to force applying common labels to resources for + Kustomize apps + type: boolean + ignoreMissingComponents: + description: IgnoreMissingComponents prevents kustomize + from failing when components do not exist locally + by not appending them to kustomization file + type: boolean + images: + description: Images is a list of Kustomize image + override specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: + type: string + type: array + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + labelIncludeTemplates: + description: LabelIncludeTemplates specifies whether + to apply common labels to resource templates or + not + type: boolean + labelWithoutSelector: + description: LabelWithoutSelector specifies whether + to apply common labels to resource selectors or + not + type: boolean + namePrefix: + description: NamePrefix is a prefix appended to + resources for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to + resources for Kustomize apps + type: string + namespace: + description: Namespace sets the namespace that Kustomize + adds to all resources + type: string + patches: + description: Patches is a list of Kustomize patches + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + description: Replicas is a list of Kustomize Replicas + override specifications + items: + properties: + count: + anyOf: + - type: integer + - type: string + description: Number of replicas + x-kubernetes-int-or-string: true + name: + description: Name of Deployment or StatefulSet + type: string + required: + - count + - name + type: object + type: array + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + name: + description: Name is used to refer to a source and is + displayed in the UI. It is used in multi-source Applications. + type: string + path: + description: Path is a directory path within the Git + repository, and is only valid for applications sourced + from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable + entries + items: + description: EnvEntry represents an entry in the + application's environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying + a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array + type: object + ref: + description: Ref is reference to another source within + sources field. This field will not be used if used + with a `source` tag. + type: string + repoURL: + description: RepoURL is the URL to the repository (Git + or Helm) that contains the application manifests + type: string + targetRevision: + description: |- + TargetRevision defines the revision of the source to sync the application to. + In case of Git, this can be commit, tag, or branch. If omitted, will equal to HEAD. + In case of Helm, this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + type: array + required: + - revision + type: object + required: + - operation + - phase + - startedAt + type: object + reconciledAt: + description: ReconciledAt indicates when the application state was + reconciled using the latest git version + format: date-time + type: string + resourceHealthSource: + description: 'ResourceHealthSource indicates where the resource health + status is stored: inline if not set or appTree' + type: string + resources: + description: Resources is a list of Kubernetes resources managed by + this application + items: + description: ResourceStatus holds the current synchronization and + health status of a Kubernetes resource. + properties: + group: + description: Group represents the API group of the resource + (e.g., "apps" for Deployments). + type: string + health: + description: Health indicates the health status of the resource + (e.g., Healthy, Degraded, Progressing). + properties: + lastTransitionTime: + description: |- + LastTransitionTime is the time the HealthStatus was set or updated + + Deprecated: this field is not used and will be removed in a future release. + format: date-time + type: string + message: + description: Message is a human-readable informational message + describing the health status + type: string + status: + description: Status holds the status code of the resource + type: string + type: object + hook: + description: Hook is true if the resource is used as a lifecycle + hook in an Argo CD application. + type: boolean + kind: + description: Kind specifies the type of the resource (e.g., + "Deployment", "Service"). + type: string + name: + description: Name is the unique name of the resource within + the namespace. + type: string + namespace: + description: Namespace defines the Kubernetes namespace where + the resource is located. + type: string + requiresDeletionConfirmation: + description: RequiresDeletionConfirmation is true if the resource + requires explicit user confirmation before deletion. + type: boolean + requiresPruning: + description: RequiresPruning is true if the resource needs to + be pruned (deleted) as part of synchronization. + type: boolean + status: + description: Status represents the synchronization state of + the resource (e.g., Synced, OutOfSync). + type: string + syncWave: + description: |- + SyncWave determines the order in which resources are applied during a sync operation. + Lower values are applied first. + format: int64 + type: integer + version: + description: Version indicates the API version of the resource + (e.g., "v1", "v1beta1"). + type: string + type: object + type: array + sourceHydrator: + description: SourceHydrator stores information about the current state + of source hydration + properties: + currentOperation: + description: CurrentOperation holds the status of the hydrate + operation + properties: + drySHA: + description: DrySHA holds the resolved revision (sha) of the + dry source as of the most recent reconciliation + type: string + finishedAt: + description: FinishedAt indicates when the hydrate operation + finished + format: date-time + type: string + hydratedSHA: + description: HydratedSHA holds the resolved revision (sha) + of the hydrated source as of the most recent reconciliation + type: string + message: + description: Message contains a message describing the current + status of the hydrate operation + type: string + phase: + description: Phase indicates the status of the hydrate operation + enum: + - Hydrating + - Failed + - Hydrated + type: string + sourceHydrator: + description: SourceHydrator holds the hydrator config used + for the hydrate operation + properties: + drySource: + description: DrySource specifies where the dry "don't + repeat yourself" manifest source lives. + properties: + path: + description: Path is a directory path within the Git + repository where the manifests are located + type: string + repoURL: + description: RepoURL is the URL to the git repository + that contains the application manifests + type: string + targetRevision: + description: TargetRevision defines the revision of + the source to hydrate + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + description: |- + HydrateTo specifies an optional "staging" location to push hydrated manifests to. An external system would then + have to move manifests to the SyncSource, e.g. by pull request. + properties: + targetBranch: + description: TargetBranch is the branch to which hydrated + manifests should be committed + type: string + required: + - targetBranch + type: object + syncSource: + description: SyncSource specifies where to sync hydrated + manifests from. + properties: + path: + description: |- + Path is a directory path within the git repository where hydrated manifests should be committed to and synced + from. If hydrateTo is set, this is just the path from which hydrated manifests will be synced. + type: string + targetBranch: + description: TargetBranch is the branch to which hydrated + manifests should be committed + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + startedAt: + description: StartedAt indicates when the hydrate operation + started + format: date-time + type: string + required: + - message + - phase + type: object + lastSuccessfulOperation: + description: LastSuccessfulOperation holds info about the most + recent successful hydration + properties: + drySHA: + description: DrySHA holds the resolved revision (sha) of the + dry source as of the most recent reconciliation + type: string + hydratedSHA: + description: HydratedSHA holds the resolved revision (sha) + of the hydrated source as of the most recent reconciliation + type: string + sourceHydrator: + description: SourceHydrator holds the hydrator config used + for the hydrate operation + properties: + drySource: + description: DrySource specifies where the dry "don't + repeat yourself" manifest source lives. + properties: + path: + description: Path is a directory path within the Git + repository where the manifests are located + type: string + repoURL: + description: RepoURL is the URL to the git repository + that contains the application manifests + type: string + targetRevision: + description: TargetRevision defines the revision of + the source to hydrate + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + description: |- + HydrateTo specifies an optional "staging" location to push hydrated manifests to. An external system would then + have to move manifests to the SyncSource, e.g. by pull request. + properties: + targetBranch: + description: TargetBranch is the branch to which hydrated + manifests should be committed + type: string + required: + - targetBranch + type: object + syncSource: + description: SyncSource specifies where to sync hydrated + manifests from. + properties: + path: + description: |- + Path is a directory path within the git repository where hydrated manifests should be committed to and synced + from. If hydrateTo is set, this is just the path from which hydrated manifests will be synced. + type: string + targetBranch: + description: TargetBranch is the branch to which hydrated + manifests should be committed + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + type: object + type: object + sourceType: + description: SourceType specifies the type of this application + type: string + sourceTypes: + description: SourceTypes specifies the type of the sources included + in the application + items: + description: ApplicationSourceType specifies the type of the application's + source + type: string + type: array + summary: + description: Summary contains a list of URLs and container images + used by this application + properties: + externalURLs: + description: ExternalURLs holds all external URLs of application + child resources. + items: + type: string + type: array + images: + description: Images holds all images of application child resources. + items: + type: string + type: array + type: object + sync: + description: Sync contains information about the application's current + sync status + properties: + comparedTo: + description: ComparedTo contains information about what has been + compared + properties: + destination: + description: Destination is a reference to the application's + destination used for comparison + properties: + name: + description: Name is an alternate way of specifying the + target cluster by its symbolic name. This must be set + if Server is not set. + type: string + namespace: + description: |- + Namespace specifies the target namespace for the application's resources. + The namespace will only be set for namespace-scoped resources that have not set a value for .metadata.namespace + type: string + server: + description: Server specifies the URL of the target cluster's + Kubernetes control plane API. This must be set if Name + is not set. + type: string + type: object + ignoreDifferences: + description: IgnoreDifferences is a reference to the application's + ignored differences used for comparison + items: + description: ResourceIgnoreDifferences contains resource + filter and list of json paths which should be ignored + during comparison with live state. + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + description: |- + ManagedFieldsManagers is a list of trusted managers. Fields mutated by those managers will take precedence over the + desired state defined in the SCM and won't be displayed in diffs + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + source: + description: Source is a reference to the application's source + used for comparison + properties: + chart: + description: Chart is a Helm chart name, and must be specified + for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific options + properties: + exclude: + description: Exclude contains a glob pattern to match + paths against that should be explicitly excluded + from being used during manifest generation + type: string + include: + description: Include contains a glob pattern to match + paths against that should be explicitly included + during manifest generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External + Variables + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level + Arguments + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a directory + recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + fileParameters: + description: FileParameters are file parameters to + the helm template + items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest + generation + properties: + name: + description: Name is the name of the Helm parameter + type: string + path: + description: Path is the path to the file containing + the values for the Helm parameter + type: string + type: object + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm + template from failing when valueFiles do not exist + locally by not appending them to helm template --values + type: boolean + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + namespace: + description: Namespace is an optional namespace to + template with. If left empty, defaults to the app's + destination namespace. + type: string + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command upon + manifest generation + items: + description: HelmParameter is a parameter that's + passed to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether + to tell Helm to interpret booleans and numbers + as strings + type: boolean + name: + description: Name is the name of the Helm parameter + type: string + value: + description: Value is the value for the Helm + parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials to all + domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name + to use. If omitted it will use the application name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + skipSchemaValidation: + description: SkipSchemaValidation skips JSON schema + validation (Helm's --skip-schema-validation) + type: boolean + skipTests: + description: SkipTests skips test manifest installation + step (Helm's --skip-tests). + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value files + to use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be passed + to helm template, typically defined as a block. + ValuesObject takes precedence over Values, so use + one or the other. + type: string + valuesObject: + description: ValuesObject specifies Helm values to + be passed to helm template, defined as a map. This + takes precedence over Values. + type: object + x-kubernetes-preserve-unknown-fields: true + version: + description: Version is the Helm version to use for + templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonAnnotationsEnvsubst: + description: CommonAnnotationsEnvsubst specifies whether + to apply env variables substitution for annotation + values + type: boolean + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional + labels to add to rendered manifests + type: object + components: + description: Components specifies a list of kustomize + components to add to the kustomization before building + items: + type: string + type: array + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether + to force applying common annotations to resources + for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether to + force applying common labels to resources for Kustomize + apps + type: boolean + ignoreMissingComponents: + description: IgnoreMissingComponents prevents kustomize + from failing when components do not exist locally + by not appending them to kustomization file + type: boolean + images: + description: Images is a list of Kustomize image override + specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: + type: string + type: array + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + labelIncludeTemplates: + description: LabelIncludeTemplates specifies whether + to apply common labels to resource templates or + not + type: boolean + labelWithoutSelector: + description: LabelWithoutSelector specifies whether + to apply common labels to resource selectors or + not + type: boolean + namePrefix: + description: NamePrefix is a prefix appended to resources + for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to resources + for Kustomize apps + type: string + namespace: + description: Namespace sets the namespace that Kustomize + adds to all resources + type: string + patches: + description: Patches is a list of Kustomize patches + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + description: Replicas is a list of Kustomize Replicas + override specifications + items: + properties: + count: + anyOf: + - type: integer + - type: string + description: Number of replicas + x-kubernetes-int-or-string: true + name: + description: Name of Deployment or StatefulSet + type: string + required: + - count + - name + type: object + type: array + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + name: + description: Name is used to refer to a source and is + displayed in the UI. It is used in multi-source Applications. + type: string + path: + description: Path is a directory path within the Git repository, + and is only valid for applications sourced from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable + entries + items: + description: EnvEntry represents an entry in the + application's environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying a + parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array + type: object + ref: + description: Ref is reference to another source within + sources field. This field will not be used if used with + a `source` tag. + type: string + repoURL: + description: RepoURL is the URL to the repository (Git + or Helm) that contains the application manifests + type: string + targetRevision: + description: |- + TargetRevision defines the revision of the source to sync the application to. + In case of Git, this can be commit, tag, or branch. If omitted, will equal to HEAD. + In case of Helm, this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + sources: + description: Sources is a reference to the application's multiple + sources used for comparison + items: + description: ApplicationSource contains all required information + about the source of an application + properties: + chart: + description: Chart is a Helm chart name, and must be + specified for applications sourced from a Helm repo. + type: string + directory: + description: Directory holds path/directory specific + options + properties: + exclude: + description: Exclude contains a glob pattern to + match paths against that should be explicitly + excluded from being used during manifest generation + type: string + include: + description: Include contains a glob pattern to + match paths against that should be explicitly + included during manifest generation + type: string + jsonnet: + description: Jsonnet holds options specific to Jsonnet + properties: + extVars: + description: ExtVars is a list of Jsonnet External + Variables + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest + generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + description: Additional library search dirs + items: + type: string + type: array + tlas: + description: TLAS is a list of Jsonnet Top-level + Arguments + items: + description: JsonnetVar represents a variable + to be passed to jsonnet during manifest + generation + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + description: Recurse specifies whether to scan a + directory recursively for manifests + type: boolean + type: object + helm: + description: Helm holds helm specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + fileParameters: + description: FileParameters are file parameters + to the helm template + items: + description: HelmFileParameter is a file parameter + that's passed to helm template during manifest + generation + properties: + name: + description: Name is the name of the Helm + parameter + type: string + path: + description: Path is the path to the file + containing the values for the Helm parameter + type: string + type: object + type: array + ignoreMissingValueFiles: + description: IgnoreMissingValueFiles prevents helm + template from failing when valueFiles do not exist + locally by not appending them to helm template + --values + type: boolean + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + namespace: + description: Namespace is an optional namespace + to template with. If left empty, defaults to the + app's destination namespace. + type: string + parameters: + description: Parameters is a list of Helm parameters + which are passed to the helm template command + upon manifest generation + items: + description: HelmParameter is a parameter that's + passed to helm template during manifest generation + properties: + forceString: + description: ForceString determines whether + to tell Helm to interpret booleans and numbers + as strings + type: boolean + name: + description: Name is the name of the Helm + parameter + type: string + value: + description: Value is the value for the Helm + parameter + type: string + type: object + type: array + passCredentials: + description: PassCredentials pass credentials to + all domains (Helm's --pass-credentials) + type: boolean + releaseName: + description: ReleaseName is the Helm release name + to use. If omitted it will use the application + name + type: string + skipCrds: + description: SkipCrds skips custom resource definition + installation step (Helm's --skip-crds) + type: boolean + skipSchemaValidation: + description: SkipSchemaValidation skips JSON schema + validation (Helm's --skip-schema-validation) + type: boolean + skipTests: + description: SkipTests skips test manifest installation + step (Helm's --skip-tests). + type: boolean + valueFiles: + description: ValuesFiles is a list of Helm value + files to use when generating a template + items: + type: string + type: array + values: + description: Values specifies Helm values to be + passed to helm template, typically defined as + a block. ValuesObject takes precedence over Values, + so use one or the other. + type: string + valuesObject: + description: ValuesObject specifies Helm values + to be passed to helm template, defined as a map. + This takes precedence over Values. + type: object + x-kubernetes-preserve-unknown-fields: true + version: + description: Version is the Helm version to use + for templating ("3") + type: string + type: object + kustomize: + description: Kustomize holds kustomize specific options + properties: + apiVersions: + description: |- + APIVersions specifies the Kubernetes resource API versions to pass to Helm when templating manifests. By default, + Argo CD uses the API versions of the target cluster. The format is [group/]version/kind. + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + description: CommonAnnotations is a list of additional + annotations to add to rendered manifests + type: object + commonAnnotationsEnvsubst: + description: CommonAnnotationsEnvsubst specifies + whether to apply env variables substitution for + annotation values + type: boolean + commonLabels: + additionalProperties: + type: string + description: CommonLabels is a list of additional + labels to add to rendered manifests + type: object + components: + description: Components specifies a list of kustomize + components to add to the kustomization before + building + items: + type: string + type: array + forceCommonAnnotations: + description: ForceCommonAnnotations specifies whether + to force applying common annotations to resources + for Kustomize apps + type: boolean + forceCommonLabels: + description: ForceCommonLabels specifies whether + to force applying common labels to resources for + Kustomize apps + type: boolean + ignoreMissingComponents: + description: IgnoreMissingComponents prevents kustomize + from failing when components do not exist locally + by not appending them to kustomization file + type: boolean + images: + description: Images is a list of Kustomize image + override specifications + items: + description: KustomizeImage represents a Kustomize + image definition in the format [old_image_name=]: + type: string + type: array + kubeVersion: + description: |- + KubeVersion specifies the Kubernetes API version to pass to Helm when templating manifests. By default, Argo CD + uses the Kubernetes version of the target cluster. + type: string + labelIncludeTemplates: + description: LabelIncludeTemplates specifies whether + to apply common labels to resource templates or + not + type: boolean + labelWithoutSelector: + description: LabelWithoutSelector specifies whether + to apply common labels to resource selectors or + not + type: boolean + namePrefix: + description: NamePrefix is a prefix appended to + resources for Kustomize apps + type: string + nameSuffix: + description: NameSuffix is a suffix appended to + resources for Kustomize apps + type: string + namespace: + description: Namespace sets the namespace that Kustomize + adds to all resources + type: string + patches: + description: Patches is a list of Kustomize patches + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + description: Replicas is a list of Kustomize Replicas + override specifications + items: + properties: + count: + anyOf: + - type: integer + - type: string + description: Number of replicas + x-kubernetes-int-or-string: true + name: + description: Name of Deployment or StatefulSet + type: string + required: + - count + - name + type: object + type: array + version: + description: Version controls which version of Kustomize + to use for rendering manifests + type: string + type: object + name: + description: Name is used to refer to a source and is + displayed in the UI. It is used in multi-source Applications. + type: string + path: + description: Path is a directory path within the Git + repository, and is only valid for applications sourced + from Git. + type: string + plugin: + description: Plugin holds config management plugin specific + options + properties: + env: + description: Env is a list of environment variable + entries + items: + description: EnvEntry represents an entry in the + application's environment + properties: + name: + description: Name is the name of the variable, + usually expressed in uppercase + type: string + value: + description: Value is the value of the variable + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + description: Array is the value of an array + type parameter. + items: + type: string + type: array + map: + additionalProperties: + type: string + description: Map is the value of a map type + parameter. + type: object + name: + description: Name is the name identifying + a parameter. + type: string + string: + description: String_ is the value of a string + type parameter. + type: string + type: object + type: array + type: object + ref: + description: Ref is reference to another source within + sources field. This field will not be used if used + with a `source` tag. + type: string + repoURL: + description: RepoURL is the URL to the repository (Git + or Helm) that contains the application manifests + type: string + targetRevision: + description: |- + TargetRevision defines the revision of the source to sync the application to. + In case of Git, this can be commit, tag, or branch. If omitted, will equal to HEAD. + In case of Helm, this is a semver tag for the Chart's version. + type: string + required: + - repoURL + type: object + type: array + required: + - destination + type: object + revision: + description: Revision contains information about the revision + the comparison has been performed to + type: string + revisions: + description: Revisions contains information about the revisions + of multiple sources the comparison has been performed to + items: + type: string + type: array + status: + description: Status is the sync state of the comparison + type: string + required: + - status + type: object + type: object + required: + - metadata + - spec + type: object + served: true + storage: true + subresources: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + labels: + app.kubernetes.io/name: applicationsets.argoproj.io + app.kubernetes.io/part-of: argocd + name: applicationsets.argoproj.io +spec: + group: argoproj.io + names: + kind: ApplicationSet + listKind: ApplicationSetList + plural: applicationsets + shortNames: + - appset + - appsets + singular: applicationset + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + applyNestedSelectors: + type: boolean + generators: + items: + properties: + clusterDecisionResource: + properties: + configMapRef: + type: string + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + name: + type: string + requeueAfterSeconds: + format: int64 + type: integer + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + required: + - configMapRef + type: object + clusters: + properties: + flatList: + type: boolean + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + type: object + git: + properties: + directories: + items: + properties: + exclude: + type: boolean + path: + type: string + required: + - path + type: object + type: array + files: + items: + properties: + exclude: + type: boolean + path: + type: string + required: + - path + type: object + type: array + pathParamPrefix: + type: string + repoURL: + type: string + requeueAfterSeconds: + format: int64 + type: integer + revision: + type: string + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + required: + - repoURL + - revision + type: object + list: + properties: + elements: + items: + x-kubernetes-preserve-unknown-fields: true + type: array + elementsYaml: + type: string + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + type: object + matrix: + properties: + generators: + items: + properties: + clusterDecisionResource: + properties: + configMapRef: + type: string + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + name: + type: string + requeueAfterSeconds: + format: int64 + type: integer + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + required: + - configMapRef + type: object + clusters: + properties: + flatList: + type: boolean + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + type: object + git: + properties: + directories: + items: + properties: + exclude: + type: boolean + path: + type: string + required: + - path + type: object + type: array + files: + items: + properties: + exclude: + type: boolean + path: + type: string + required: + - path + type: object + type: array + pathParamPrefix: + type: string + repoURL: + type: string + requeueAfterSeconds: + format: int64 + type: integer + revision: + type: string + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + required: + - repoURL + - revision + type: object + list: + properties: + elements: + items: + x-kubernetes-preserve-unknown-fields: true + type: array + elementsYaml: + type: string + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + type: object + matrix: + x-kubernetes-preserve-unknown-fields: true + merge: + x-kubernetes-preserve-unknown-fields: true + plugin: + properties: + configMapRef: + properties: + name: + type: string + required: + - name + type: object + input: + properties: + parameters: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + type: object + type: object + requeueAfterSeconds: + format: int64 + type: integer + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + required: + - configMapRef + type: object + pullRequest: + properties: + azuredevops: + properties: + api: + type: string + labels: + items: + type: string + type: array + organization: + type: string + project: + type: string + repo: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - organization + - project + - repo + type: object + bitbucket: + properties: + api: + type: string + basicAuth: + properties: + passwordRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + username: + type: string + required: + - passwordRef + - username + type: object + bearerToken: + properties: + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - tokenRef + type: object + owner: + type: string + repo: + type: string + required: + - owner + - repo + type: object + bitbucketServer: + properties: + api: + type: string + basicAuth: + properties: + passwordRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + username: + type: string + required: + - passwordRef + - username + type: object + bearerToken: + properties: + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - tokenRef + type: object + caRef: + properties: + configMapName: + type: string + key: + type: string + required: + - configMapName + - key + type: object + insecure: + type: boolean + project: + type: string + repo: + type: string + required: + - api + - project + - repo + type: object + filters: + items: + properties: + branchMatch: + type: string + targetBranchMatch: + type: string + type: object + type: array + gitea: + properties: + api: + type: string + insecure: + type: boolean + labels: + items: + type: string + type: array + owner: + type: string + repo: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - api + - owner + - repo + type: object + github: + properties: + api: + type: string + appSecretName: + type: string + labels: + items: + type: string + type: array + owner: + type: string + repo: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - owner + - repo + type: object + gitlab: + properties: + api: + type: string + caRef: + properties: + configMapName: + type: string + key: + type: string + required: + - configMapName + - key + type: object + insecure: + type: boolean + labels: + items: + type: string + type: array + project: + type: string + pullRequestState: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - project + type: object + requeueAfterSeconds: + format: int64 + type: integer + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + type: object + scmProvider: + properties: + awsCodeCommit: + properties: + allBranches: + type: boolean + region: + type: string + role: + type: string + tagFilters: + items: + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array + type: object + azureDevOps: + properties: + accessTokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + allBranches: + type: boolean + api: + type: string + organization: + type: string + teamProject: + type: string + required: + - accessTokenRef + - organization + - teamProject + type: object + bitbucket: + properties: + allBranches: + type: boolean + appPasswordRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + owner: + type: string + user: + type: string + required: + - appPasswordRef + - owner + - user + type: object + bitbucketServer: + properties: + allBranches: + type: boolean + api: + type: string + basicAuth: + properties: + passwordRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + username: + type: string + required: + - passwordRef + - username + type: object + bearerToken: + properties: + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - tokenRef + type: object + caRef: + properties: + configMapName: + type: string + key: + type: string + required: + - configMapName + - key + type: object + insecure: + type: boolean + project: + type: string + required: + - api + - project + type: object + cloneProtocol: + type: string + filters: + items: + properties: + branchMatch: + type: string + labelMatch: + type: string + pathsDoNotExist: + items: + type: string + type: array + pathsExist: + items: + type: string + type: array + repositoryMatch: + type: string + type: object + type: array + gitea: + properties: + allBranches: + type: boolean + api: + type: string + insecure: + type: boolean + owner: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - api + - owner + type: object + github: + properties: + allBranches: + type: boolean + api: + type: string + appSecretName: + type: string + organization: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - organization + type: object + gitlab: + properties: + allBranches: + type: boolean + api: + type: string + caRef: + properties: + configMapName: + type: string + key: + type: string + required: + - configMapName + - key + type: object + group: + type: string + includeSharedProjects: + type: boolean + includeSubgroups: + type: boolean + insecure: + type: boolean + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + topic: + type: string + required: + - group + type: object + requeueAfterSeconds: + format: int64 + type: integer + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + type: object + type: array + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + required: + - generators + type: object + merge: + properties: + generators: + items: + properties: + clusterDecisionResource: + properties: + configMapRef: + type: string + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + name: + type: string + requeueAfterSeconds: + format: int64 + type: integer + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + required: + - configMapRef + type: object + clusters: + properties: + flatList: + type: boolean + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + type: object + git: + properties: + directories: + items: + properties: + exclude: + type: boolean + path: + type: string + required: + - path + type: object + type: array + files: + items: + properties: + exclude: + type: boolean + path: + type: string + required: + - path + type: object + type: array + pathParamPrefix: + type: string + repoURL: + type: string + requeueAfterSeconds: + format: int64 + type: integer + revision: + type: string + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + required: + - repoURL + - revision + type: object + list: + properties: + elements: + items: + x-kubernetes-preserve-unknown-fields: true + type: array + elementsYaml: + type: string + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + type: object + matrix: + x-kubernetes-preserve-unknown-fields: true + merge: + x-kubernetes-preserve-unknown-fields: true + plugin: + properties: + configMapRef: + properties: + name: + type: string + required: + - name + type: object + input: + properties: + parameters: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + type: object + type: object + requeueAfterSeconds: + format: int64 + type: integer + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + required: + - configMapRef + type: object + pullRequest: + properties: + azuredevops: + properties: + api: + type: string + labels: + items: + type: string + type: array + organization: + type: string + project: + type: string + repo: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - organization + - project + - repo + type: object + bitbucket: + properties: + api: + type: string + basicAuth: + properties: + passwordRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + username: + type: string + required: + - passwordRef + - username + type: object + bearerToken: + properties: + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - tokenRef + type: object + owner: + type: string + repo: + type: string + required: + - owner + - repo + type: object + bitbucketServer: + properties: + api: + type: string + basicAuth: + properties: + passwordRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + username: + type: string + required: + - passwordRef + - username + type: object + bearerToken: + properties: + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - tokenRef + type: object + caRef: + properties: + configMapName: + type: string + key: + type: string + required: + - configMapName + - key + type: object + insecure: + type: boolean + project: + type: string + repo: + type: string + required: + - api + - project + - repo + type: object + filters: + items: + properties: + branchMatch: + type: string + targetBranchMatch: + type: string + type: object + type: array + gitea: + properties: + api: + type: string + insecure: + type: boolean + labels: + items: + type: string + type: array + owner: + type: string + repo: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - api + - owner + - repo + type: object + github: + properties: + api: + type: string + appSecretName: + type: string + labels: + items: + type: string + type: array + owner: + type: string + repo: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - owner + - repo + type: object + gitlab: + properties: + api: + type: string + caRef: + properties: + configMapName: + type: string + key: + type: string + required: + - configMapName + - key + type: object + insecure: + type: boolean + labels: + items: + type: string + type: array + project: + type: string + pullRequestState: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - project + type: object + requeueAfterSeconds: + format: int64 + type: integer + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + type: object + scmProvider: + properties: + awsCodeCommit: + properties: + allBranches: + type: boolean + region: + type: string + role: + type: string + tagFilters: + items: + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array + type: object + azureDevOps: + properties: + accessTokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + allBranches: + type: boolean + api: + type: string + organization: + type: string + teamProject: + type: string + required: + - accessTokenRef + - organization + - teamProject + type: object + bitbucket: + properties: + allBranches: + type: boolean + appPasswordRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + owner: + type: string + user: + type: string + required: + - appPasswordRef + - owner + - user + type: object + bitbucketServer: + properties: + allBranches: + type: boolean + api: + type: string + basicAuth: + properties: + passwordRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + username: + type: string + required: + - passwordRef + - username + type: object + bearerToken: + properties: + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - tokenRef + type: object + caRef: + properties: + configMapName: + type: string + key: + type: string + required: + - configMapName + - key + type: object + insecure: + type: boolean + project: + type: string + required: + - api + - project + type: object + cloneProtocol: + type: string + filters: + items: + properties: + branchMatch: + type: string + labelMatch: + type: string + pathsDoNotExist: + items: + type: string + type: array + pathsExist: + items: + type: string + type: array + repositoryMatch: + type: string + type: object + type: array + gitea: + properties: + allBranches: + type: boolean + api: + type: string + insecure: + type: boolean + owner: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - api + - owner + type: object + github: + properties: + allBranches: + type: boolean + api: + type: string + appSecretName: + type: string + organization: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - organization + type: object + gitlab: + properties: + allBranches: + type: boolean + api: + type: string + caRef: + properties: + configMapName: + type: string + key: + type: string + required: + - configMapName + - key + type: object + group: + type: string + includeSharedProjects: + type: boolean + includeSubgroups: + type: boolean + insecure: + type: boolean + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + topic: + type: string + required: + - group + type: object + requeueAfterSeconds: + format: int64 + type: integer + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + type: object + type: array + mergeKeys: + items: + type: string + type: array + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + required: + - generators + - mergeKeys + type: object + plugin: + properties: + configMapRef: + properties: + name: + type: string + required: + - name + type: object + input: + properties: + parameters: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + type: object + type: object + requeueAfterSeconds: + format: int64 + type: integer + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + required: + - configMapRef + type: object + pullRequest: + properties: + azuredevops: + properties: + api: + type: string + labels: + items: + type: string + type: array + organization: + type: string + project: + type: string + repo: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - organization + - project + - repo + type: object + bitbucket: + properties: + api: + type: string + basicAuth: + properties: + passwordRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + username: + type: string + required: + - passwordRef + - username + type: object + bearerToken: + properties: + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - tokenRef + type: object + owner: + type: string + repo: + type: string + required: + - owner + - repo + type: object + bitbucketServer: + properties: + api: + type: string + basicAuth: + properties: + passwordRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + username: + type: string + required: + - passwordRef + - username + type: object + bearerToken: + properties: + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - tokenRef + type: object + caRef: + properties: + configMapName: + type: string + key: + type: string + required: + - configMapName + - key + type: object + insecure: + type: boolean + project: + type: string + repo: + type: string + required: + - api + - project + - repo + type: object + filters: + items: + properties: + branchMatch: + type: string + targetBranchMatch: + type: string + type: object + type: array + gitea: + properties: + api: + type: string + insecure: + type: boolean + labels: + items: + type: string + type: array + owner: + type: string + repo: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - api + - owner + - repo + type: object + github: + properties: + api: + type: string + appSecretName: + type: string + labels: + items: + type: string + type: array + owner: + type: string + repo: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - owner + - repo + type: object + gitlab: + properties: + api: + type: string + caRef: + properties: + configMapName: + type: string + key: + type: string + required: + - configMapName + - key + type: object + insecure: + type: boolean + labels: + items: + type: string + type: array + project: + type: string + pullRequestState: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - project + type: object + requeueAfterSeconds: + format: int64 + type: integer + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + type: object + scmProvider: + properties: + awsCodeCommit: + properties: + allBranches: + type: boolean + region: + type: string + role: + type: string + tagFilters: + items: + properties: + key: + type: string + value: + type: string + required: + - key + type: object + type: array + type: object + azureDevOps: + properties: + accessTokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + allBranches: + type: boolean + api: + type: string + organization: + type: string + teamProject: + type: string + required: + - accessTokenRef + - organization + - teamProject + type: object + bitbucket: + properties: + allBranches: + type: boolean + appPasswordRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + owner: + type: string + user: + type: string + required: + - appPasswordRef + - owner + - user + type: object + bitbucketServer: + properties: + allBranches: + type: boolean + api: + type: string + basicAuth: + properties: + passwordRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + username: + type: string + required: + - passwordRef + - username + type: object + bearerToken: + properties: + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - tokenRef + type: object + caRef: + properties: + configMapName: + type: string + key: + type: string + required: + - configMapName + - key + type: object + insecure: + type: boolean + project: + type: string + required: + - api + - project + type: object + cloneProtocol: + type: string + filters: + items: + properties: + branchMatch: + type: string + labelMatch: + type: string + pathsDoNotExist: + items: + type: string + type: array + pathsExist: + items: + type: string + type: array + repositoryMatch: + type: string + type: object + type: array + gitea: + properties: + allBranches: + type: boolean + api: + type: string + insecure: + type: boolean + owner: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - api + - owner + type: object + github: + properties: + allBranches: + type: boolean + api: + type: string + appSecretName: + type: string + organization: + type: string + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + required: + - organization + type: object + gitlab: + properties: + allBranches: + type: boolean + api: + type: string + caRef: + properties: + configMapName: + type: string + key: + type: string + required: + - configMapName + - key + type: object + group: + type: string + includeSharedProjects: + type: boolean + includeSubgroups: + type: boolean + insecure: + type: boolean + tokenRef: + properties: + key: + type: string + secretName: + type: string + required: + - key + - secretName + type: object + topic: + type: string + required: + - group + type: object + requeueAfterSeconds: + format: int64 + type: integer + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + values: + additionalProperties: + type: string + type: object + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + type: object + type: array + goTemplate: + type: boolean + goTemplateOptions: + items: + type: string + type: array + ignoreApplicationDifferences: + items: + properties: + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + name: + type: string + type: object + type: array + preservedFields: + properties: + annotations: + items: + type: string + type: array + labels: + items: + type: string + type: array + type: object + strategy: + properties: + rollingSync: + properties: + steps: + items: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + type: object + type: array + maxUpdate: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + type: object + type: array + type: object + type: + type: string + type: object + syncPolicy: + properties: + applicationsSync: + enum: + - create-only + - create-update + - create-delete + - sync + type: string + preserveResourcesOnDeletion: + type: boolean + type: object + template: + properties: + metadata: + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + properties: + destination: + properties: + name: + type: string + namespace: + type: string + server: + type: string + type: object + ignoreDifferences: + items: + properties: + group: + type: string + jqPathExpressions: + items: + type: string + type: array + jsonPointers: + items: + type: string + type: array + kind: + type: string + managedFieldsManagers: + items: + type: string + type: array + name: + type: string + namespace: + type: string + required: + - kind + type: object + type: array + info: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + project: + type: string + revisionHistoryLimit: + format: int64 + type: integer + source: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + sourceHydrator: + properties: + drySource: + properties: + path: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - path + - repoURL + - targetRevision + type: object + hydrateTo: + properties: + targetBranch: + type: string + required: + - targetBranch + type: object + syncSource: + properties: + path: + type: string + targetBranch: + type: string + required: + - path + - targetBranch + type: object + required: + - drySource + - syncSource + type: object + sources: + items: + properties: + chart: + type: string + directory: + properties: + exclude: + type: string + include: + type: string + jsonnet: + properties: + extVars: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + libs: + items: + type: string + type: array + tlas: + items: + properties: + code: + type: boolean + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + type: object + recurse: + type: boolean + type: object + helm: + properties: + apiVersions: + items: + type: string + type: array + fileParameters: + items: + properties: + name: + type: string + path: + type: string + type: object + type: array + ignoreMissingValueFiles: + type: boolean + kubeVersion: + type: string + namespace: + type: string + parameters: + items: + properties: + forceString: + type: boolean + name: + type: string + value: + type: string + type: object + type: array + passCredentials: + type: boolean + releaseName: + type: string + skipCrds: + type: boolean + skipSchemaValidation: + type: boolean + skipTests: + type: boolean + valueFiles: + items: + type: string + type: array + values: + type: string + valuesObject: + type: object + x-kubernetes-preserve-unknown-fields: true + version: + type: string + type: object + kustomize: + properties: + apiVersions: + items: + type: string + type: array + commonAnnotations: + additionalProperties: + type: string + type: object + commonAnnotationsEnvsubst: + type: boolean + commonLabels: + additionalProperties: + type: string + type: object + components: + items: + type: string + type: array + forceCommonAnnotations: + type: boolean + forceCommonLabels: + type: boolean + ignoreMissingComponents: + type: boolean + images: + items: + type: string + type: array + kubeVersion: + type: string + labelIncludeTemplates: + type: boolean + labelWithoutSelector: + type: boolean + namePrefix: + type: string + nameSuffix: + type: string + namespace: + type: string + patches: + items: + properties: + options: + additionalProperties: + type: boolean + type: object + patch: + type: string + path: + type: string + target: + properties: + annotationSelector: + type: string + group: + type: string + kind: + type: string + labelSelector: + type: string + name: + type: string + namespace: + type: string + version: + type: string + type: object + type: object + type: array + replicas: + items: + properties: + count: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + name: + type: string + required: + - count + - name + type: object + type: array + version: + type: string + type: object + name: + type: string + path: + type: string + plugin: + properties: + env: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + name: + type: string + parameters: + items: + properties: + array: + items: + type: string + type: array + map: + additionalProperties: + type: string + type: object + name: + type: string + string: + type: string + type: object + type: array + type: object + ref: + type: string + repoURL: + type: string + targetRevision: + type: string + required: + - repoURL + type: object + type: array + syncPolicy: + properties: + automated: + properties: + allowEmpty: + type: boolean + enabled: + type: boolean + prune: + type: boolean + selfHeal: + type: boolean + type: object + managedNamespaceMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + retry: + properties: + backoff: + properties: + duration: + type: string + factor: + format: int64 + type: integer + maxDuration: + type: string + type: object + limit: + format: int64 + type: integer + type: object + syncOptions: + items: + type: string + type: array + type: object + required: + - destination + - project + type: object + required: + - metadata + - spec + type: object + templatePatch: + type: string + required: + - generators + - template + type: object + status: + properties: + applicationStatus: + items: + properties: + application: + type: string + lastTransitionTime: + format: date-time + type: string + message: + type: string + status: + type: string + step: + type: string + targetRevisions: + items: + type: string + type: array + required: + - application + - message + - status + - step + - targetRevisions + type: object + type: array + conditions: + items: + properties: + lastTransitionTime: + format: date-time + type: string + message: + type: string + reason: + type: string + status: + type: string + type: + type: string + required: + - message + - reason + - status + - type + type: object + type: array + resources: + items: + properties: + group: + type: string + health: + properties: + lastTransitionTime: + format: date-time + type: string + message: + type: string + status: + type: string + type: object + hook: + type: boolean + kind: + type: string + name: + type: string + namespace: + type: string + requiresDeletionConfirmation: + type: boolean + requiresPruning: + type: boolean + status: + type: string + syncWave: + format: int64 + type: integer + version: + type: string + type: object + type: array + type: object + required: + - metadata + - spec + type: object + served: true + storage: true + subresources: + status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + labels: + app.kubernetes.io/name: appprojects.argoproj.io + app.kubernetes.io/part-of: argocd + name: appprojects.argoproj.io +spec: + group: argoproj.io + names: + kind: AppProject + listKind: AppProjectList + plural: appprojects + shortNames: + - appproj + - appprojs + singular: appproject + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: |- + AppProject provides a logical grouping of applications, providing controls for: + * where the apps may deploy to (cluster whitelist) + * what may be deployed (repository whitelist, resource whitelist/blacklist) + * who can access these applications (roles, OIDC group claims bindings) + * and what they can do (RBAC policies) + * automation access to these roles (JWT tokens) + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: AppProjectSpec is the specification of an AppProject + properties: + clusterResourceBlacklist: + description: ClusterResourceBlacklist contains list of blacklisted + cluster level resources + items: + description: |- + GroupKind specifies a Group and a Kind, but does not force a version. This is useful for identifying + concepts during lookup stages without having partially valid types + properties: + group: + type: string + kind: + type: string + required: + - group + - kind + type: object + type: array + clusterResourceWhitelist: + description: ClusterResourceWhitelist contains list of whitelisted + cluster level resources + items: + description: |- + GroupKind specifies a Group and a Kind, but does not force a version. This is useful for identifying + concepts during lookup stages without having partially valid types + properties: + group: + type: string + kind: + type: string + required: + - group + - kind + type: object + type: array + description: + description: Description contains optional project description + maxLength: 255 + type: string + destinationServiceAccounts: + description: DestinationServiceAccounts holds information about the + service accounts to be impersonated for the application sync operation + for each destination. + items: + description: ApplicationDestinationServiceAccount holds information + about the service account to be impersonated for the application + sync operation. + properties: + defaultServiceAccount: + description: DefaultServiceAccount to be used for impersonation + during the sync operation + type: string + namespace: + description: Namespace specifies the target namespace for the + application's resources. + type: string + server: + description: Server specifies the URL of the target cluster's + Kubernetes control plane API. + type: string + required: + - defaultServiceAccount + - server + type: object + type: array + destinations: + description: Destinations contains list of destinations available + for deployment + items: + description: ApplicationDestination holds information about the + application's destination + properties: + name: + description: Name is an alternate way of specifying the target + cluster by its symbolic name. This must be set if Server is + not set. + type: string + namespace: + description: |- + Namespace specifies the target namespace for the application's resources. + The namespace will only be set for namespace-scoped resources that have not set a value for .metadata.namespace + type: string + server: + description: Server specifies the URL of the target cluster's + Kubernetes control plane API. This must be set if Name is + not set. + type: string + type: object + type: array + namespaceResourceBlacklist: + description: NamespaceResourceBlacklist contains list of blacklisted + namespace level resources + items: + description: |- + GroupKind specifies a Group and a Kind, but does not force a version. This is useful for identifying + concepts during lookup stages without having partially valid types + properties: + group: + type: string + kind: + type: string + required: + - group + - kind + type: object + type: array + namespaceResourceWhitelist: + description: NamespaceResourceWhitelist contains list of whitelisted + namespace level resources + items: + description: |- + GroupKind specifies a Group and a Kind, but does not force a version. This is useful for identifying + concepts during lookup stages without having partially valid types + properties: + group: + type: string + kind: + type: string + required: + - group + - kind + type: object + type: array + orphanedResources: + description: OrphanedResources specifies if controller should monitor + orphaned resources of apps in this project + properties: + ignore: + description: Ignore contains a list of resources that are to be + excluded from orphaned resources monitoring + items: + description: OrphanedResourceKey is a reference to a resource + to be ignored from + properties: + group: + type: string + kind: + type: string + name: + type: string + type: object + type: array + warn: + description: Warn indicates if warning condition should be created + for apps which have orphaned resources + type: boolean + type: object + permitOnlyProjectScopedClusters: + description: PermitOnlyProjectScopedClusters determines whether destinations + can only reference clusters which are project-scoped + type: boolean + roles: + description: Roles are user defined RBAC roles associated with this + project + items: + description: ProjectRole represents a role that has access to a + project + properties: + description: + description: Description is a description of the role + type: string + groups: + description: Groups are a list of OIDC group claims bound to + this role + items: + type: string + type: array + jwtTokens: + description: JWTTokens are a list of generated JWT tokens bound + to this role + items: + description: JWTToken holds the issuedAt and expiresAt values + of a token + properties: + exp: + format: int64 + type: integer + iat: + format: int64 + type: integer + id: + type: string + required: + - iat + type: object + type: array + name: + description: Name is a name for this role + type: string + policies: + description: Policies Stores a list of casbin formatted strings + that define access policies for the role in the project + items: + type: string + type: array + required: + - name + type: object + type: array + signatureKeys: + description: SignatureKeys contains a list of PGP key IDs that commits + in Git must be signed with in order to be allowed for sync + items: + description: SignatureKey is the specification of a key required + to verify commit signatures with + properties: + keyID: + description: The ID of the key in hexadecimal notation + type: string + required: + - keyID + type: object + type: array + sourceNamespaces: + description: SourceNamespaces defines the namespaces application resources + are allowed to be created in + items: + type: string + type: array + sourceRepos: + description: SourceRepos contains list of repository URLs which can + be used for deployment + items: + type: string + type: array + syncWindows: + description: SyncWindows controls when syncs can be run for apps in + this project + items: + description: SyncWindow contains the kind, time, duration and attributes + that are used to assign the syncWindows to apps + properties: + andOperator: + description: UseAndOperator use AND operator for matching applications, + namespaces and clusters instead of the default OR operator + type: boolean + applications: + description: Applications contains a list of applications that + the window will apply to + items: + type: string + type: array + clusters: + description: Clusters contains a list of clusters that the window + will apply to + items: + type: string + type: array + description: + description: Description of the sync that will be applied to + the schedule, can be used to add any information such as a + ticket number for example + type: string + duration: + description: Duration is the amount of time the sync window + will be open + type: string + kind: + description: Kind defines if the window allows or blocks syncs + type: string + manualSync: + description: ManualSync enables manual syncs when they would + otherwise be blocked + type: boolean + namespaces: + description: Namespaces contains a list of namespaces that the + window will apply to + items: + type: string + type: array + schedule: + description: Schedule is the time the window will begin, specified + in cron format + type: string + timeZone: + description: TimeZone of the sync that will be applied to the + schedule + type: string + type: object + type: array + type: object + status: + description: AppProjectStatus contains status information for AppProject + CRs + properties: + jwtTokensByRole: + additionalProperties: + description: JWTTokens represents a list of JWT tokens + properties: + items: + items: + description: JWTToken holds the issuedAt and expiresAt values + of a token + properties: + exp: + format: int64 + type: integer + iat: + format: int64 + type: integer + id: + type: string + required: + - iat + type: object + type: array + type: object + description: JWTTokensByRole contains a list of JWT tokens issued + for a given role + type: object + type: object + required: + - metadata + - spec + type: object + served: true + storage: true +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: application-controller + app.kubernetes.io/name: argocd-application-controller + app.kubernetes.io/part-of: argocd + name: argocd-application-controller +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: applicationset-controller + app.kubernetes.io/name: argocd-applicationset-controller + app.kubernetes.io/part-of: argocd + name: argocd-applicationset-controller +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: dex-server + app.kubernetes.io/name: argocd-dex-server + app.kubernetes.io/part-of: argocd + name: argocd-dex-server +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: notifications-controller + app.kubernetes.io/name: argocd-notifications-controller + app.kubernetes.io/part-of: argocd + name: argocd-notifications-controller +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha +secrets: +- name: argocd-redis +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha-haproxy + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-haproxy +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: repo-server + app.kubernetes.io/name: argocd-repo-server + app.kubernetes.io/part-of: argocd + name: argocd-repo-server +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: argocd-server + app.kubernetes.io/part-of: argocd + name: argocd-server +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/component: application-controller + app.kubernetes.io/name: argocd-application-controller + app.kubernetes.io/part-of: argocd + name: argocd-application-controller +rules: +- apiGroups: + - "" + resources: + - secrets + - configmaps + verbs: + - get + - list + - watch +- apiGroups: + - argoproj.io + resources: + - applications + - applicationsets + - appprojects + verbs: + - create + - get + - list + - watch + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create + - list +- apiGroups: + - apps + resources: + - deployments + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/component: applicationset-controller + app.kubernetes.io/name: argocd-applicationset-controller + app.kubernetes.io/part-of: argocd + name: argocd-applicationset-controller +rules: +- apiGroups: + - argoproj.io + resources: + - applications + - applicationsets + - applicationsets/finalizers + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - argoproj.io + resources: + - appprojects + verbs: + - get + - list + - watch +- apiGroups: + - argoproj.io + resources: + - applicationsets/status + verbs: + - get + - patch + - update +- apiGroups: + - "" + resources: + - events + verbs: + - create + - get + - list + - patch + - watch +- apiGroups: + - "" + resources: + - secrets + - configmaps + verbs: + - get + - list + - watch +- apiGroups: + - apps + - extensions + resources: + - deployments + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/component: dex-server + app.kubernetes.io/name: argocd-dex-server + app.kubernetes.io/part-of: argocd + name: argocd-dex-server +rules: +- apiGroups: + - "" + resources: + - secrets + - configmaps + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/component: notifications-controller + app.kubernetes.io/name: argocd-notifications-controller + app.kubernetes.io/part-of: argocd + name: argocd-notifications-controller +rules: +- apiGroups: + - argoproj.io + resources: + - applications + - appprojects + verbs: + - get + - list + - watch + - update + - patch +- apiGroups: + - "" + resources: + - configmaps + - secrets + verbs: + - list + - watch +- apiGroups: + - "" + resourceNames: + - argocd-notifications-cm + resources: + - configmaps + verbs: + - get +- apiGroups: + - "" + resourceNames: + - argocd-notifications-secret + resources: + - secrets + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha +rules: +- apiGroups: + - "" + resources: + - endpoints + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-haproxy +rules: +- apiGroups: + - "" + resources: + - secrets + verbs: + - create +- apiGroups: + - "" + resourceNames: + - argocd-redis + resources: + - secrets + verbs: + - get +- apiGroups: + - "" + resources: + - endpoints + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: argocd-server + app.kubernetes.io/part-of: argocd + name: argocd-server +rules: +- apiGroups: + - "" + resources: + - secrets + - configmaps + verbs: + - create + - get + - list + - watch + - update + - patch + - delete +- apiGroups: + - argoproj.io + resources: + - applications + - appprojects + - applicationsets + verbs: + - create + - get + - list + - watch + - update + - delete + - patch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - list +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/component: application-controller + app.kubernetes.io/name: argocd-application-controller + app.kubernetes.io/part-of: argocd + name: argocd-application-controller +rules: +- apiGroups: + - '*' + resources: + - '*' + verbs: + - '*' +- nonResourceURLs: + - '*' + verbs: + - '*' +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/component: applicationset-controller + app.kubernetes.io/name: argocd-applicationset-controller + app.kubernetes.io/part-of: argocd + name: argocd-applicationset-controller +rules: +- apiGroups: + - argoproj.io + resources: + - applications + - applicationsets + - applicationsets/finalizers + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - argoproj.io + resources: + - applicationsets/status + verbs: + - get + - patch + - update +- apiGroups: + - argoproj.io + resources: + - appprojects + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - get + - list + - patch + - watch +- apiGroups: + - "" + resources: + - configmaps + verbs: + - create + - update + - delete + - get + - list + - patch + - watch +- apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + - watch +- apiGroups: + - apps + - extensions + resources: + - deployments + verbs: + - get + - list + - watch +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: argocd-server + app.kubernetes.io/part-of: argocd + name: argocd-server +rules: +- apiGroups: + - '*' + resources: + - '*' + verbs: + - delete + - get + - patch +- apiGroups: + - "" + resources: + - events + verbs: + - list +- apiGroups: + - "" + resources: + - pods + - pods/log + verbs: + - get +- apiGroups: + - argoproj.io + resources: + - applications + - applicationsets + verbs: + - get + - list + - watch +- apiGroups: + - batch + resources: + - jobs + verbs: + - create +- apiGroups: + - argoproj.io + resources: + - workflows + verbs: + - create +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/component: application-controller + app.kubernetes.io/name: argocd-application-controller + app.kubernetes.io/part-of: argocd + name: argocd-application-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: argocd-application-controller +subjects: +- kind: ServiceAccount + name: argocd-application-controller +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/component: applicationset-controller + app.kubernetes.io/name: argocd-applicationset-controller + app.kubernetes.io/part-of: argocd + name: argocd-applicationset-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: argocd-applicationset-controller +subjects: +- kind: ServiceAccount + name: argocd-applicationset-controller +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/component: dex-server + app.kubernetes.io/name: argocd-dex-server + app.kubernetes.io/part-of: argocd + name: argocd-dex-server +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: argocd-dex-server +subjects: +- kind: ServiceAccount + name: argocd-dex-server +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/component: notifications-controller + app.kubernetes.io/name: argocd-notifications-controller + app.kubernetes.io/part-of: argocd + name: argocd-notifications-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: argocd-notifications-controller +subjects: +- kind: ServiceAccount + name: argocd-notifications-controller +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: argocd-redis-ha +subjects: +- kind: ServiceAccount + name: argocd-redis-ha +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-haproxy +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: argocd-redis-ha-haproxy +subjects: +- kind: ServiceAccount + name: argocd-redis-ha-haproxy +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: argocd-server + app.kubernetes.io/part-of: argocd + name: argocd-server +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: argocd-server +subjects: +- kind: ServiceAccount + name: argocd-server +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/component: application-controller + app.kubernetes.io/name: argocd-application-controller + app.kubernetes.io/part-of: argocd + name: argocd-application-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: argocd-application-controller +subjects: +- kind: ServiceAccount + name: argocd-application-controller + namespace: argocd +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/component: applicationset-controller + app.kubernetes.io/name: argocd-applicationset-controller + app.kubernetes.io/part-of: argocd + name: argocd-applicationset-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: argocd-applicationset-controller +subjects: +- kind: ServiceAccount + name: argocd-applicationset-controller + namespace: argocd +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: argocd-server + app.kubernetes.io/part-of: argocd + name: argocd-server +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: argocd-server +subjects: +- kind: ServiceAccount + name: argocd-server + namespace: argocd +--- +apiVersion: v1 +data: + resource.customizations.ignoreResourceUpdates.ConfigMap: | + jqPathExpressions: + # Ignore the cluster-autoscaler status + - '.metadata.annotations."cluster-autoscaler.kubernetes.io/last-updated"' + # Ignore the annotation of the legacy Leases election + - '.metadata.annotations."control-plane.alpha.kubernetes.io/leader"' + resource.customizations.ignoreResourceUpdates.Endpoints: | + jsonPointers: + - /metadata + - /subsets + resource.customizations.ignoreResourceUpdates.all: | + jsonPointers: + - /status + resource.customizations.ignoreResourceUpdates.apps_ReplicaSet: | + jqPathExpressions: + - '.metadata.annotations."deployment.kubernetes.io/desired-replicas"' + - '.metadata.annotations."deployment.kubernetes.io/max-replicas"' + - '.metadata.annotations."rollout.argoproj.io/desired-replicas"' + resource.customizations.ignoreResourceUpdates.argoproj.io_Application: | + jqPathExpressions: + - '.metadata.annotations."notified.notifications.argoproj.io"' + - '.metadata.annotations."argocd.argoproj.io/refresh"' + - '.metadata.annotations."argocd.argoproj.io/hydrate"' + - '.operation' + resource.customizations.ignoreResourceUpdates.argoproj.io_Rollout: | + jqPathExpressions: + - '.metadata.annotations."notified.notifications.argoproj.io"' + resource.customizations.ignoreResourceUpdates.autoscaling_HorizontalPodAutoscaler: | + jqPathExpressions: + - '.metadata.annotations."autoscaling.alpha.kubernetes.io/behavior"' + - '.metadata.annotations."autoscaling.alpha.kubernetes.io/conditions"' + - '.metadata.annotations."autoscaling.alpha.kubernetes.io/metrics"' + - '.metadata.annotations."autoscaling.alpha.kubernetes.io/current-metrics"' + resource.customizations.ignoreResourceUpdates.discovery.k8s.io_EndpointSlice: | + jsonPointers: + - /metadata + - /endpoints + - /ports + resource.exclusions: | + ### Network resources created by the Kubernetes control plane and excluded to reduce the number of watched events and UI clutter + - apiGroups: + - '' + - discovery.k8s.io + kinds: + - Endpoints + - EndpointSlice + ### Internal Kubernetes resources excluded reduce the number of watched events + - apiGroups: + - coordination.k8s.io + kinds: + - Lease + ### Internal Kubernetes Authz/Authn resources excluded reduce the number of watched events + - apiGroups: + - authentication.k8s.io + - authorization.k8s.io + kinds: + - SelfSubjectReview + - TokenReview + - LocalSubjectAccessReview + - SelfSubjectAccessReview + - SelfSubjectRulesReview + - SubjectAccessReview + ### Intermediate Certificate Request excluded reduce the number of watched events + - apiGroups: + - certificates.k8s.io + kinds: + - CertificateSigningRequest + - apiGroups: + - cert-manager.io + kinds: + - CertificateRequest + ### Cilium internal resources excluded reduce the number of watched events and UI Clutter + - apiGroups: + - cilium.io + kinds: + - CiliumIdentity + - CiliumEndpoint + - CiliumEndpointSlice + ### Kyverno intermediate and reporting resources excluded reduce the number of watched events and improve performance + - apiGroups: + - kyverno.io + - reports.kyverno.io + - wgpolicyk8s.io + kinds: + - PolicyReport + - ClusterPolicyReport + - EphemeralReport + - ClusterEphemeralReport + - AdmissionReport + - ClusterAdmissionReport + - BackgroundScanReport + - ClusterBackgroundScanReport + - UpdateRequest +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/name: argocd-cm + app.kubernetes.io/part-of: argocd + name: argocd-cm +--- +apiVersion: v1 +data: + redis.server: argocd-redis-ha-haproxy:6379 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/name: argocd-cmd-params-cm + app.kubernetes.io/part-of: argocd + name: argocd-cmd-params-cm +--- +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/name: argocd-gpg-keys-cm + app.kubernetes.io/part-of: argocd + name: argocd-gpg-keys-cm +--- +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/component: notifications-controller + app.kubernetes.io/name: argocd-notifications-controller + app.kubernetes.io/part-of: argocd + name: argocd-notifications-cm +--- +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/name: argocd-rbac-cm + app.kubernetes.io/part-of: argocd + name: argocd-rbac-cm +--- +apiVersion: v1 +data: + fix-split-brain.sh: | + HOSTNAME="$(hostname)" + INDEX="${HOSTNAME##*-}" + SENTINEL_PORT=26379 + ANNOUNCE_IP='' + MASTER='' + MASTER_GROUP="argocd" + QUORUM="2" + REDIS_CONF=/data/conf/redis.conf + REDIS_PORT=6379 + REDIS_TLS_PORT= + SENTINEL_CONF=/data/conf/sentinel.conf + SENTINEL_TLS_PORT= + SERVICE=argocd-redis-ha + SENTINEL_TLS_REPLICATION_ENABLED=false + REDIS_TLS_REPLICATION_ENABLED=false + + ROLE='' + REDIS_MASTER='' + + set -eu + sentinel_get_master() { + set +e + if [ "$SENTINEL_PORT" -eq 0 ]; then + redis-cli -h "${SERVICE}" -p "${SENTINEL_TLS_PORT}" --tls --cacert /tls-certs/ca.crt --cert /tls-certs/redis.crt --key /tls-certs/redis.key sentinel get-master-addr-by-name "${MASTER_GROUP}" |\ + grep -E '((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?s*$))' + else + redis-cli -h "${SERVICE}" -p "${SENTINEL_PORT}" sentinel get-master-addr-by-name "${MASTER_GROUP}" |\ + grep -E '((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?s*$))' + fi + set -e + } + + sentinel_get_master_retry() { + master='' + retry=${1} + sleep=3 + for i in $(seq 1 "${retry}"); do + master=$(sentinel_get_master) + if [ -n "${master}" ]; then + break + fi + sleep $((sleep + i)) + done + echo "${master}" + } + + identify_master() { + echo "Identifying redis master (get-master-addr-by-name).." + echo " using sentinel (argocd-redis-ha), sentinel group name (argocd)" + MASTER="$(sentinel_get_master_retry 3)" + if [ -n "${MASTER}" ]; then + echo " $(date) Found redis master (${MASTER})" + else + echo " $(date) Did not find redis master (${MASTER})" + fi + } + + sentinel_update() { + echo "Updating sentinel config.." + echo " evaluating sentinel id (\${SENTINEL_ID_${INDEX}})" + eval MY_SENTINEL_ID="\$SENTINEL_ID_${INDEX}" + echo " sentinel id (${MY_SENTINEL_ID}), sentinel grp (${MASTER_GROUP}), quorum (${QUORUM})" + sed -i "1s/^/sentinel myid ${MY_SENTINEL_ID}\\n/" "${SENTINEL_CONF}" + if [ "$SENTINEL_TLS_REPLICATION_ENABLED" = true ]; then + echo " redis master (${1}:${REDIS_TLS_PORT})" + sed -i "2s/^/sentinel monitor ${MASTER_GROUP} ${1} ${REDIS_TLS_PORT} ${QUORUM} \\n/" "${SENTINEL_CONF}" + else + echo " redis master (${1}:${REDIS_PORT})" + sed -i "2s/^/sentinel monitor ${MASTER_GROUP} ${1} ${REDIS_PORT} ${QUORUM} \\n/" "${SENTINEL_CONF}" + fi + echo "sentinel announce-ip ${ANNOUNCE_IP}" >> ${SENTINEL_CONF} + if [ "$SENTINEL_PORT" -eq 0 ]; then + echo " announce (${ANNOUNCE_IP}:${SENTINEL_TLS_PORT})" + echo "sentinel announce-port ${SENTINEL_TLS_PORT}" >> ${SENTINEL_CONF} + else + echo " announce (${ANNOUNCE_IP}:${SENTINEL_PORT})" + echo "sentinel announce-port ${SENTINEL_PORT}" >> ${SENTINEL_CONF} + fi + } + + redis_update() { + echo "Updating redis config.." + if [ "$REDIS_TLS_REPLICATION_ENABLED" = true ]; then + echo " we are slave of redis master (${1}:${REDIS_TLS_PORT})" + echo "slaveof ${1} ${REDIS_TLS_PORT}" >> "${REDIS_CONF}" + echo "slave-announce-port ${REDIS_TLS_PORT}" >> ${REDIS_CONF} + else + echo " we are slave of redis master (${1}:${REDIS_PORT})" + echo "slaveof ${1} ${REDIS_PORT}" >> "${REDIS_CONF}" + echo "slave-announce-port ${REDIS_PORT}" >> ${REDIS_CONF} + fi + echo "slave-announce-ip ${ANNOUNCE_IP}" >> ${REDIS_CONF} + } + + copy_config() { + echo "Copying default redis config.." + echo " to '${REDIS_CONF}'" + cp /readonly-config/redis.conf "${REDIS_CONF}" + echo "Copying default sentinel config.." + echo " to '${SENTINEL_CONF}'" + cp /readonly-config/sentinel.conf "${SENTINEL_CONF}" + } + + setup_defaults() { + echo "Setting up defaults.." + echo " using statefulset index (${INDEX})" + if [ "${INDEX}" = "0" ]; then + echo "Setting this pod as master for redis and sentinel.." + echo " using announce (${ANNOUNCE_IP})" + redis_update "${ANNOUNCE_IP}" + sentinel_update "${ANNOUNCE_IP}" + echo " make sure ${ANNOUNCE_IP} is not a slave (slaveof no one)" + sed -i "s/^.*slaveof.*//" "${REDIS_CONF}" + else + echo "Getting redis master ip.." + echo " blindly assuming (${SERVICE}-announce-0) or (${SERVICE}-server-0) are master" + DEFAULT_MASTER="$(getent_hosts 0 | awk '{ print $1 }')" + if [ -z "${DEFAULT_MASTER}" ]; then + echo "Error: Unable to resolve redis master (getent hosts)." + exit 1 + fi + echo " identified redis (may be redis master) ip (${DEFAULT_MASTER})" + echo "Setting default slave config for redis and sentinel.." + echo " using master ip (${DEFAULT_MASTER})" + redis_update "${DEFAULT_MASTER}" + sentinel_update "${DEFAULT_MASTER}" + fi + } + + redis_ping() { + set +e + if [ "$REDIS_PORT" -eq 0 ]; then + redis-cli -h "${MASTER}" -a "${AUTH}" --no-auth-warning -p "${REDIS_TLS_PORT}" --tls --cacert /tls-certs/ca.crt --cert /tls-certs/redis.crt --key /tls-certs/redis.key ping + else + redis-cli -h "${MASTER}" -a "${AUTH}" --no-auth-warning -p "${REDIS_PORT}" ping + fi + set -e + } + + redis_ping_retry() { + ping='' + retry=${1} + sleep=3 + for i in $(seq 1 "${retry}"); do + if [ "$(redis_ping)" = "PONG" ]; then + ping='PONG' + break + fi + sleep $((sleep + i)) + MASTER=$(sentinel_get_master) + done + echo "${ping}" + } + + find_master() { + echo "Verifying redis master.." + if [ "$REDIS_PORT" -eq 0 ]; then + echo " ping (${MASTER}:${REDIS_TLS_PORT})" + else + echo " ping (${MASTER}:${REDIS_PORT})" + fi + if [ "$(redis_ping_retry 3)" != "PONG" ]; then + echo " $(date) Can't ping redis master (${MASTER})" + echo "Attempting to force failover (sentinel failover).." + + if [ "$SENTINEL_PORT" -eq 0 ]; then + echo " on sentinel (${SERVICE}:${SENTINEL_TLS_PORT}), sentinel grp (${MASTER_GROUP})" + if redis-cli -h "${SERVICE}" -p "${SENTINEL_TLS_PORT}" --tls --cacert /tls-certs/ca.crt --cert /tls-certs/redis.crt --key /tls-certs/redis.key sentinel failover "${MASTER_GROUP}" | grep -q 'NOGOODSLAVE' ; then + echo " $(date) Failover returned with 'NOGOODSLAVE'" + echo "Setting defaults for this pod.." + setup_defaults + return 0 + fi + else + echo " on sentinel (${SERVICE}:${SENTINEL_PORT}), sentinel grp (${MASTER_GROUP})" + if redis-cli -h "${SERVICE}" -p "${SENTINEL_PORT}" sentinel failover "${MASTER_GROUP}" | grep -q 'NOGOODSLAVE' ; then + echo " $(date) Failover returned with 'NOGOODSLAVE'" + echo "Setting defaults for this pod.." + setup_defaults + return 0 + fi + fi + + echo "Hold on for 10sec" + sleep 10 + echo "We should get redis master's ip now. Asking (get-master-addr-by-name).." + if [ "$SENTINEL_PORT" -eq 0 ]; then + echo " sentinel (${SERVICE}:${SENTINEL_TLS_PORT}), sentinel grp (${MASTER_GROUP})" + else + echo " sentinel (${SERVICE}:${SENTINEL_PORT}), sentinel grp (${MASTER_GROUP})" + fi + MASTER="$(sentinel_get_master)" + if [ "${MASTER}" ]; then + echo " $(date) Found redis master (${MASTER})" + echo "Updating redis and sentinel config.." + sentinel_update "${MASTER}" + redis_update "${MASTER}" + else + echo "$(date) Error: Could not failover, exiting..." + exit 1 + fi + else + echo " $(date) Found reachable redis master (${MASTER})" + echo "Updating redis and sentinel config.." + sentinel_update "${MASTER}" + redis_update "${MASTER}" + fi + } + + redis_ro_update() { + echo "Updating read-only redis config.." + echo " redis.conf set 'replica-priority 0'" + echo "replica-priority 0" >> ${REDIS_CONF} + } + + getent_hosts() { + index=${1:-${INDEX}} + service="${SERVICE}-announce-${index}" + host=$(getent hosts "${service}") + echo "${host}" + } + + identify_announce_ip() { + echo "Identify announce ip for this pod.." + echo " using (${SERVICE}-announce-${INDEX}) or (${SERVICE}-server-${INDEX})" + ANNOUNCE_IP=$(getent_hosts | awk '{ print $1 }') + echo " identified announce (${ANNOUNCE_IP})" + } + + redis_role() { + set +e + if [ "$REDIS_PORT" -eq 0 ]; then + ROLE=$(redis-cli -a "${AUTH}" --no-auth-warning -p "${REDIS_TLS_PORT}" --tls --cacert /tls-certs/ca.crt --cert /tls-certs/redis.crt --key /tls-certs/redis.key info | grep role | sed 's/role://' | sed 's/\r//') + else + ROLE=$(redis-cli -a "${AUTH}" --no-auth-warning -p "${REDIS_PORT}" info | grep role | sed 's/role://' | sed 's/\r//') + fi + set -e + } + + identify_redis_master() { + set +e + if [ "$REDIS_PORT" -eq 0 ]; then + REDIS_MASTER=$(redis-cli -a "${AUTH}" --no-auth-warning -p "${REDIS_TLS_PORT}" --tls --cacert /tls-certs/ca.crt --cert /tls-certs/redis.crt --key /tls-certs/redis.key info | grep master_host | sed 's/master_host://' | sed 's/\r//') + else + REDIS_MASTER=$(redis-cli -a "${AUTH}" --no-auth-warning -p "${REDIS_PORT}" info | grep master_host | sed 's/master_host://' | sed 's/\r//') + fi + set -e + } + + reinit() { + set +e + sh /readonly-config/init.sh + + if [ "$REDIS_PORT" -eq 0 ]; then + echo "shutdown" | redis-cli -a "${AUTH}" --no-auth-warning -p "${REDIS_TLS_PORT}" --tls --cacert /tls-certs/ca.crt --cert /tls-certs/redis.crt --key /tls-certs/redis.key + else + echo "shutdown" | redis-cli -a "${AUTH}" --no-auth-warning -p "${REDIS_PORT}" + fi + set -e + } + + identify_announce_ip + + while [ -z "${ANNOUNCE_IP}" ]; do + echo "Error: Could not resolve the announce ip for this pod." + sleep 30 + identify_announce_ip + done + + trap "exit 0" TERM + while true; do + sleep 60 + + # where is redis master + identify_master + + if [ "$MASTER" = "$ANNOUNCE_IP" ]; then + redis_role + if [ "$ROLE" != "master" ]; then + reinit + fi + elif [ "${MASTER}" ]; then + identify_redis_master + if [ "$REDIS_MASTER" != "$MASTER" ]; then + reinit + fi + fi + done + haproxy.cfg: "defaults REDIS\n mode tcp\n timeout connect 4s\n timeout server + 6m\n timeout client 6m\n timeout check 2s\n\nlisten health_check_http_url\n + \ bind :8888 \n mode http\n monitor-uri /healthz\n option dontlognull\n# + Check Sentinel and whether they are nominated master\nbackend check_if_redis_is_master_0\n + \ mode tcp\n option tcp-check\n tcp-check connect\n tcp-check send PING\\r\\n\n + \ tcp-check expect string +PONG\n tcp-check send SENTINEL\\ get-master-addr-by-name\\ + argocd\\r\\n\n tcp-check expect string REPLACE_ANNOUNCE0\n tcp-check send QUIT\\r\\n\n + \ server R0 argocd-redis-ha-announce-0:26379 check inter 3s\n server R1 argocd-redis-ha-announce-1:26379 + check inter 3s\n server R2 argocd-redis-ha-announce-2:26379 check inter 3s\n# + Check Sentinel and whether they are nominated master\nbackend check_if_redis_is_master_1\n + \ mode tcp\n option tcp-check\n tcp-check connect\n tcp-check send PING\\r\\n\n + \ tcp-check expect string +PONG\n tcp-check send SENTINEL\\ get-master-addr-by-name\\ + argocd\\r\\n\n tcp-check expect string REPLACE_ANNOUNCE1\n tcp-check send QUIT\\r\\n\n + \ server R0 argocd-redis-ha-announce-0:26379 check inter 3s\n server R1 argocd-redis-ha-announce-1:26379 + check inter 3s\n server R2 argocd-redis-ha-announce-2:26379 check inter 3s\n# + Check Sentinel and whether they are nominated master\nbackend check_if_redis_is_master_2\n + \ mode tcp\n option tcp-check\n tcp-check connect\n tcp-check send PING\\r\\n\n + \ tcp-check expect string +PONG\n tcp-check send SENTINEL\\ get-master-addr-by-name\\ + argocd\\r\\n\n tcp-check expect string REPLACE_ANNOUNCE2\n tcp-check send QUIT\\r\\n\n + \ server R0 argocd-redis-ha-announce-0:26379 check inter 3s\n server R1 argocd-redis-ha-announce-1:26379 + check inter 3s\n server R2 argocd-redis-ha-announce-2:26379 check inter 3s\n\n# + decide redis backend to use\n#master\nfrontend ft_redis_master\n bind :6379 \n + \ use_backend bk_redis_master\n# Check all redis servers to see if they think + they are master\nbackend bk_redis_master\n mode tcp\n option tcp-check\n tcp-check + connect\n tcp-check send \"AUTH ${AUTH}\"\\r\\n\n tcp-check expect string +OK\n + \ tcp-check send PING\\r\\n\n tcp-check expect string +PONG\n tcp-check send + info\\ replication\\r\\n\n tcp-check expect string role:master\n tcp-check send + QUIT\\r\\n\n tcp-check expect string +OK\n use-server R0 if { srv_is_up(R0) + } { nbsrv(check_if_redis_is_master_0) ge 2 }\n server R0 argocd-redis-ha-announce-0:6379 + check inter 3s fall 1 rise 1\n use-server R1 if { srv_is_up(R1) } { nbsrv(check_if_redis_is_master_1) + ge 2 }\n server R1 argocd-redis-ha-announce-1:6379 check inter 3s fall 1 rise + 1\n use-server R2 if { srv_is_up(R2) } { nbsrv(check_if_redis_is_master_2) ge + 2 }\n server R2 argocd-redis-ha-announce-2:6379 check inter 3s fall 1 rise 1\nfrontend + stats\n mode http\n bind :9101 \n http-request use-service prometheus-exporter + if { path /metrics }\n stats enable\n stats uri /stats\n stats refresh 10s\n# + Additional configuration\nglobal\n maxconn 4096\n" + haproxy_init.sh: | + HAPROXY_CONF=/data/haproxy.cfg + cp /readonly/haproxy.cfg "$HAPROXY_CONF" + for loop in $(seq 1 10); do + getent hosts argocd-redis-ha-announce-0 && break + echo "Waiting for service argocd-redis-ha-announce-0 to be ready ($loop) ..." && sleep 1 + done + ANNOUNCE_IP0=$(getent hosts "argocd-redis-ha-announce-0" | awk '{ print $1 }') + if [ -z "$ANNOUNCE_IP0" ]; then + echo "Could not resolve the announce ip for argocd-redis-ha-announce-0" + exit 1 + fi + sed -i "s/REPLACE_ANNOUNCE0/$ANNOUNCE_IP0/" "$HAPROXY_CONF" + for loop in $(seq 1 10); do + getent hosts argocd-redis-ha-announce-1 && break + echo "Waiting for service argocd-redis-ha-announce-1 to be ready ($loop) ..." && sleep 1 + done + ANNOUNCE_IP1=$(getent hosts "argocd-redis-ha-announce-1" | awk '{ print $1 }') + if [ -z "$ANNOUNCE_IP1" ]; then + echo "Could not resolve the announce ip for argocd-redis-ha-announce-1" + exit 1 + fi + sed -i "s/REPLACE_ANNOUNCE1/$ANNOUNCE_IP1/" "$HAPROXY_CONF" + for loop in $(seq 1 10); do + getent hosts argocd-redis-ha-announce-2 && break + echo "Waiting for service argocd-redis-ha-announce-2 to be ready ($loop) ..." && sleep 1 + done + ANNOUNCE_IP2=$(getent hosts "argocd-redis-ha-announce-2" | awk '{ print $1 }') + if [ -z "$ANNOUNCE_IP2" ]; then + echo "Could not resolve the announce ip for argocd-redis-ha-announce-2" + exit 1 + fi + sed -i "s/REPLACE_ANNOUNCE2/$ANNOUNCE_IP2/" "$HAPROXY_CONF" + init.sh: | + echo "$(date) Start..." + HOSTNAME="$(hostname)" + INDEX="${HOSTNAME##*-}" + SENTINEL_PORT=26379 + ANNOUNCE_IP='' + MASTER='' + MASTER_GROUP="argocd" + QUORUM="2" + REDIS_CONF=/data/conf/redis.conf + REDIS_PORT=6379 + REDIS_TLS_PORT= + SENTINEL_CONF=/data/conf/sentinel.conf + SENTINEL_TLS_PORT= + SERVICE=argocd-redis-ha + SENTINEL_TLS_REPLICATION_ENABLED=false + REDIS_TLS_REPLICATION_ENABLED=false + + set -eu + sentinel_get_master() { + set +e + if [ "$SENTINEL_PORT" -eq 0 ]; then + redis-cli -h "${SERVICE}" -p "${SENTINEL_TLS_PORT}" --tls --cacert /tls-certs/ca.crt --cert /tls-certs/redis.crt --key /tls-certs/redis.key sentinel get-master-addr-by-name "${MASTER_GROUP}" |\ + grep -E '((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?s*$))' + else + redis-cli -h "${SERVICE}" -p "${SENTINEL_PORT}" sentinel get-master-addr-by-name "${MASTER_GROUP}" |\ + grep -E '((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?s*$))' + fi + set -e + } + + sentinel_get_master_retry() { + master='' + retry=${1} + sleep=3 + for i in $(seq 1 "${retry}"); do + master=$(sentinel_get_master) + if [ -n "${master}" ]; then + break + fi + sleep $((sleep + i)) + done + echo "${master}" + } + + identify_master() { + echo "Identifying redis master (get-master-addr-by-name).." + echo " using sentinel (argocd-redis-ha), sentinel group name (argocd)" + MASTER="$(sentinel_get_master_retry 3)" + if [ -n "${MASTER}" ]; then + echo " $(date) Found redis master (${MASTER})" + else + echo " $(date) Did not find redis master (${MASTER})" + fi + } + + sentinel_update() { + echo "Updating sentinel config.." + echo " evaluating sentinel id (\${SENTINEL_ID_${INDEX}})" + eval MY_SENTINEL_ID="\$SENTINEL_ID_${INDEX}" + echo " sentinel id (${MY_SENTINEL_ID}), sentinel grp (${MASTER_GROUP}), quorum (${QUORUM})" + sed -i "1s/^/sentinel myid ${MY_SENTINEL_ID}\\n/" "${SENTINEL_CONF}" + if [ "$SENTINEL_TLS_REPLICATION_ENABLED" = true ]; then + echo " redis master (${1}:${REDIS_TLS_PORT})" + sed -i "2s/^/sentinel monitor ${MASTER_GROUP} ${1} ${REDIS_TLS_PORT} ${QUORUM} \\n/" "${SENTINEL_CONF}" + else + echo " redis master (${1}:${REDIS_PORT})" + sed -i "2s/^/sentinel monitor ${MASTER_GROUP} ${1} ${REDIS_PORT} ${QUORUM} \\n/" "${SENTINEL_CONF}" + fi + echo "sentinel announce-ip ${ANNOUNCE_IP}" >> ${SENTINEL_CONF} + if [ "$SENTINEL_PORT" -eq 0 ]; then + echo " announce (${ANNOUNCE_IP}:${SENTINEL_TLS_PORT})" + echo "sentinel announce-port ${SENTINEL_TLS_PORT}" >> ${SENTINEL_CONF} + else + echo " announce (${ANNOUNCE_IP}:${SENTINEL_PORT})" + echo "sentinel announce-port ${SENTINEL_PORT}" >> ${SENTINEL_CONF} + fi + } + + redis_update() { + echo "Updating redis config.." + if [ "$REDIS_TLS_REPLICATION_ENABLED" = true ]; then + echo " we are slave of redis master (${1}:${REDIS_TLS_PORT})" + echo "slaveof ${1} ${REDIS_TLS_PORT}" >> "${REDIS_CONF}" + echo "slave-announce-port ${REDIS_TLS_PORT}" >> ${REDIS_CONF} + else + echo " we are slave of redis master (${1}:${REDIS_PORT})" + echo "slaveof ${1} ${REDIS_PORT}" >> "${REDIS_CONF}" + echo "slave-announce-port ${REDIS_PORT}" >> ${REDIS_CONF} + fi + echo "slave-announce-ip ${ANNOUNCE_IP}" >> ${REDIS_CONF} + } + + copy_config() { + echo "Copying default redis config.." + echo " to '${REDIS_CONF}'" + cp /readonly-config/redis.conf "${REDIS_CONF}" + echo "Copying default sentinel config.." + echo " to '${SENTINEL_CONF}'" + cp /readonly-config/sentinel.conf "${SENTINEL_CONF}" + } + + setup_defaults() { + echo "Setting up defaults.." + echo " using statefulset index (${INDEX})" + if [ "${INDEX}" = "0" ]; then + echo "Setting this pod as master for redis and sentinel.." + echo " using announce (${ANNOUNCE_IP})" + redis_update "${ANNOUNCE_IP}" + sentinel_update "${ANNOUNCE_IP}" + echo " make sure ${ANNOUNCE_IP} is not a slave (slaveof no one)" + sed -i "s/^.*slaveof.*//" "${REDIS_CONF}" + else + echo "Getting redis master ip.." + echo " blindly assuming (${SERVICE}-announce-0) or (${SERVICE}-server-0) are master" + DEFAULT_MASTER="$(getent_hosts 0 | awk '{ print $1 }')" + if [ -z "${DEFAULT_MASTER}" ]; then + echo "Error: Unable to resolve redis master (getent hosts)." + exit 1 + fi + echo " identified redis (may be redis master) ip (${DEFAULT_MASTER})" + echo "Setting default slave config for redis and sentinel.." + echo " using master ip (${DEFAULT_MASTER})" + redis_update "${DEFAULT_MASTER}" + sentinel_update "${DEFAULT_MASTER}" + fi + } + + redis_ping() { + set +e + if [ "$REDIS_PORT" -eq 0 ]; then + redis-cli -h "${MASTER}" -a "${AUTH}" --no-auth-warning -p "${REDIS_TLS_PORT}" --tls --cacert /tls-certs/ca.crt --cert /tls-certs/redis.crt --key /tls-certs/redis.key ping + else + redis-cli -h "${MASTER}" -a "${AUTH}" --no-auth-warning -p "${REDIS_PORT}" ping + fi + set -e + } + + redis_ping_retry() { + ping='' + retry=${1} + sleep=3 + for i in $(seq 1 "${retry}"); do + if [ "$(redis_ping)" = "PONG" ]; then + ping='PONG' + break + fi + sleep $((sleep + i)) + MASTER=$(sentinel_get_master) + done + echo "${ping}" + } + + find_master() { + echo "Verifying redis master.." + if [ "$REDIS_PORT" -eq 0 ]; then + echo " ping (${MASTER}:${REDIS_TLS_PORT})" + else + echo " ping (${MASTER}:${REDIS_PORT})" + fi + if [ "$(redis_ping_retry 3)" != "PONG" ]; then + echo " $(date) Can't ping redis master (${MASTER})" + echo "Attempting to force failover (sentinel failover).." + + if [ "$SENTINEL_PORT" -eq 0 ]; then + echo " on sentinel (${SERVICE}:${SENTINEL_TLS_PORT}), sentinel grp (${MASTER_GROUP})" + if redis-cli -h "${SERVICE}" -p "${SENTINEL_TLS_PORT}" --tls --cacert /tls-certs/ca.crt --cert /tls-certs/redis.crt --key /tls-certs/redis.key sentinel failover "${MASTER_GROUP}" | grep -q 'NOGOODSLAVE' ; then + echo " $(date) Failover returned with 'NOGOODSLAVE'" + echo "Setting defaults for this pod.." + setup_defaults + return 0 + fi + else + echo " on sentinel (${SERVICE}:${SENTINEL_PORT}), sentinel grp (${MASTER_GROUP})" + if redis-cli -h "${SERVICE}" -p "${SENTINEL_PORT}" sentinel failover "${MASTER_GROUP}" | grep -q 'NOGOODSLAVE' ; then + echo " $(date) Failover returned with 'NOGOODSLAVE'" + echo "Setting defaults for this pod.." + setup_defaults + return 0 + fi + fi + + echo "Hold on for 10sec" + sleep 10 + echo "We should get redis master's ip now. Asking (get-master-addr-by-name).." + if [ "$SENTINEL_PORT" -eq 0 ]; then + echo " sentinel (${SERVICE}:${SENTINEL_TLS_PORT}), sentinel grp (${MASTER_GROUP})" + else + echo " sentinel (${SERVICE}:${SENTINEL_PORT}), sentinel grp (${MASTER_GROUP})" + fi + MASTER="$(sentinel_get_master)" + if [ "${MASTER}" ]; then + echo " $(date) Found redis master (${MASTER})" + echo "Updating redis and sentinel config.." + sentinel_update "${MASTER}" + redis_update "${MASTER}" + else + echo "$(date) Error: Could not failover, exiting..." + exit 1 + fi + else + echo " $(date) Found reachable redis master (${MASTER})" + echo "Updating redis and sentinel config.." + sentinel_update "${MASTER}" + redis_update "${MASTER}" + fi + } + + redis_ro_update() { + echo "Updating read-only redis config.." + echo " redis.conf set 'replica-priority 0'" + echo "replica-priority 0" >> ${REDIS_CONF} + } + + getent_hosts() { + index=${1:-${INDEX}} + service="${SERVICE}-announce-${index}" + host=$(getent hosts "${service}") + echo "${host}" + } + + identify_announce_ip() { + echo "Identify announce ip for this pod.." + echo " using (${SERVICE}-announce-${INDEX}) or (${SERVICE}-server-${INDEX})" + ANNOUNCE_IP=$(getent_hosts | awk '{ print $1 }') + echo " identified announce (${ANNOUNCE_IP})" + } + + mkdir -p /data/conf/ + + echo "Initializing config.." + copy_config + + # where is redis master + identify_master + + identify_announce_ip + + if [ -z "${ANNOUNCE_IP}" ]; then + "Error: Could not resolve the announce ip for this pod" + exit 1 + elif [ "${MASTER}" ]; then + find_master + else + setup_defaults + fi + + if [ "${AUTH:-}" ]; then + echo "Setting redis auth values.." + ESCAPED_AUTH=$(echo "${AUTH}" | sed -e 's/[\/&]/\\&/g'); + sed -i "s/replace-default-auth/${ESCAPED_AUTH}/" "${REDIS_CONF}" "${SENTINEL_CONF}" + fi + + if [ "${SENTINELAUTH:-}" ]; then + echo "Setting sentinel auth values" + ESCAPED_AUTH_SENTINEL=$(echo "$SENTINELAUTH" | sed -e 's/[\/&]/\\&/g'); + sed -i "s/replace-default-sentinel-auth/${ESCAPED_AUTH_SENTINEL}/" "$SENTINEL_CONF" + fi + + echo "$(date) Ready..." + redis.conf: | + dir "/data" + port 6379 + rename-command FLUSHDB "" + rename-command FLUSHALL "" + bind 0.0.0.0 + maxmemory 0 + maxmemory-policy volatile-lru + min-replicas-max-lag 5 + min-replicas-to-write 1 + rdbchecksum yes + rdbcompression yes + repl-diskless-sync yes + save "" + requirepass replace-default-auth + masterauth replace-default-auth + sentinel.conf: | + dir "/data" + port 26379 + bind 0.0.0.0 + sentinel down-after-milliseconds argocd 10000 + sentinel failover-timeout argocd 180000 + maxclients 10000 + sentinel parallel-syncs argocd 5 + sentinel auth-pass argocd replace-default-auth + trigger-failover-if-master.sh: | + get_redis_role() { + is_master=$( + redis-cli \ + -a "${AUTH}" --no-auth-warning \ + -h localhost \ + -p 6379 \ + info | grep -c 'role:master' || true + ) + } + get_redis_role + if [[ "$is_master" -eq 1 ]]; then + echo "This node is currently master, we trigger a failover." + response=$( + redis-cli \ + -h localhost \ + -p 26379 \ + SENTINEL failover argocd + ) + if [[ "$response" != "OK" ]] ; then + echo "$response" + exit 1 + fi + timeout=30 + while [[ "$is_master" -eq 1 && $timeout -gt 0 ]]; do + sleep 1 + get_redis_role + timeout=$((timeout - 1)) + done + echo "Failover successful" + fi +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-configmap +--- +apiVersion: v1 +data: + redis_liveness.sh: | + response=$( + redis-cli \ + -a "${AUTH}" --no-auth-warning \ + -h localhost \ + -p 6379 \ + ping + ) + echo "response=$response" + case $response in + PONG|LOADING*) ;; + *) exit 1 ;; + esac + exit 0 + redis_readiness.sh: | + response=$( + redis-cli \ + -a "${AUTH}" --no-auth-warning \ + -h localhost \ + -p 6379 \ + ping + ) + if [ "$response" != "PONG" ] ; then + echo "ping=$response" + exit 1 + fi + + response=$( + redis-cli \ + -a "${AUTH}" --no-auth-warning \ + -h localhost \ + -p 6379 \ + role + ) + role=$( echo "$response" | sed "1!d" ) + if [ "$role" = "master" ]; then + echo "role=$role" + exit 0 + elif [ "$role" = "slave" ]; then + repl=$( echo "$response" | sed "4!d" ) + echo "role=$role; repl=$repl" + if [ "$repl" = "connected" ]; then + exit 0 + else + exit 1 + fi + else + echo "role=$role" + exit 1 + fi + sentinel_liveness.sh: | + response=$( + redis-cli \ + -h localhost \ + -p 26379 \ + ping + ) + if [ "$response" != "PONG" ]; then + echo "$response" + exit 1 + fi + echo "response=$response" +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-health-configmap +--- +apiVersion: v1 +data: + ssh_known_hosts: | + # This file was automatically generated by hack/update-ssh-known-hosts.sh. DO NOT EDIT + [ssh.github.com]:443 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg= + [ssh.github.com]:443 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl + [ssh.github.com]:443 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk= + bitbucket.org ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPIQmuzMBuKdWeF4+a2sjSSpBK0iqitSQ+5BM9KhpexuGt20JpTVM7u5BDZngncgrqDMbWdxMWWOGtZ9UgbqgZE= + bitbucket.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIazEu89wgQZ4bqs3d63QSMzYVa0MuJ2e2gKTKqu+UUO + bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQeJzhupRu0u0cdegZIa8e86EG2qOCsIsD1Xw0xSeiPDlCr7kq97NLmMbpKTX6Esc30NuoqEEHCuc7yWtwp8dI76EEEB1VqY9QJq6vk+aySyboD5QF61I/1WeTwu+deCbgKMGbUijeXhtfbxSxm6JwGrXrhBdofTsbKRUsrN1WoNgUa8uqN1Vx6WAJw1JHPhglEGGHea6QICwJOAr/6mrui/oB7pkaWKHj3z7d1IC4KWLtY47elvjbaTlkN04Kc/5LFEirorGYVbt15kAUlqGM65pk6ZBxtaO3+30LVlORZkxOh+LKL/BvbZ/iRNhItLqNyieoQj/uh/7Iv4uyH/cV/0b4WDSd3DptigWq84lJubb9t/DnZlrJazxyDCulTmKdOR7vs9gMTo+uoIrPSb8ScTtvw65+odKAlBj59dhnVp9zd7QUojOpXlL62Aw56U4oO+FALuevvMjiWeavKhJqlR7i5n9srYcrNV7ttmDw7kf/97P5zauIhxcjX+xHv4M= + github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg= + github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl + github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk= + gitlab.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFSMqzJeV9rUzU4kWitGjeR4PWSa29SPqJ1fVkhtj3Hw9xjLVXVYrU9QlYWrOLXBpQ6KWjbjTDTdDkoohFzgbEY= + gitlab.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAfuCHKVTjquxvt6CM6tdG4SLp1Btn/nOeHHE5UOzRdf + gitlab.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsj2bNKTBSpIYDEGk9KxsGh3mySTRgMtXL583qmBpzeQ+jqCMRgBqB98u3z++J1sKlXHWfM9dyhSevkMwSbhoR8XIq/U0tCNyokEi/ueaBMCvbcTHhO7FcwzY92WK4Yt0aGROY5qX2UKSeOvuP4D6TPqKF1onrSzH9bx9XUf2lEdWT/ia1NEKjunUqu1xOB/StKDHMoX4/OKyIzuS0q/T1zOATthvasJFoPrAjkohTyaDUz2LN5JoH839hViyEG82yB+MjcFV5MU3N1l1QL3cVUCh93xSaua1N85qivl+siMkPGbO5xR/En4iEY6K2XPASUEMaieWVNTRCtJ4S8H+9 + ssh.dev.azure.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Hr1oTWqNqOlzGJOfGJ4NakVyIzf1rXYd4d7wo6jBlkLvCA4odBlL0mDUyZ0/QUfTTqeu+tm22gOsv+VrVTMk6vwRU75gY/y9ut5Mb3bR5BV58dKXyq9A9UeB5Cakehn5Zgm6x1mKoVyf+FFn26iYqXJRgzIZZcZ5V6hrE0Qg39kZm4az48o0AUbf6Sp4SLdvnuMa2sVNwHBboS7EJkm57XQPVU3/QpyNLHbWDdzwtrlS+ez30S3AdYhLKEOxAG8weOnyrtLJAUen9mTkol8oII1edf7mWWbWVf0nBmly21+nZcmCTISQBtdcyPaEno7fFQMDD26/s0lfKob4Kw8H + vs-ssh.visualstudio.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Hr1oTWqNqOlzGJOfGJ4NakVyIzf1rXYd4d7wo6jBlkLvCA4odBlL0mDUyZ0/QUfTTqeu+tm22gOsv+VrVTMk6vwRU75gY/y9ut5Mb3bR5BV58dKXyq9A9UeB5Cakehn5Zgm6x1mKoVyf+FFn26iYqXJRgzIZZcZ5V6hrE0Qg39kZm4az48o0AUbf6Sp4SLdvnuMa2sVNwHBboS7EJkm57XQPVU3/QpyNLHbWDdzwtrlS+ez30S3AdYhLKEOxAG8weOnyrtLJAUen9mTkol8oII1edf7mWWbWVf0nBmly21+nZcmCTISQBtdcyPaEno7fFQMDD26/s0lfKob4Kw8H +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/name: argocd-ssh-known-hosts-cm + app.kubernetes.io/part-of: argocd + name: argocd-ssh-known-hosts-cm +--- +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/name: argocd-tls-certs-cm + app.kubernetes.io/part-of: argocd + name: argocd-tls-certs-cm +--- +apiVersion: v1 +kind: Secret +metadata: + labels: + app.kubernetes.io/component: notifications-controller + app.kubernetes.io/name: argocd-notifications-controller + app.kubernetes.io/part-of: argocd + name: argocd-notifications-secret +type: Opaque +--- +apiVersion: v1 +kind: Secret +metadata: + labels: + app.kubernetes.io/name: argocd-secret + app.kubernetes.io/part-of: argocd + name: argocd-secret +type: Opaque +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: applicationset-controller + app.kubernetes.io/name: argocd-applicationset-controller + app.kubernetes.io/part-of: argocd + name: argocd-applicationset-controller +spec: + ports: + - name: webhook + port: 7000 + protocol: TCP + targetPort: webhook + - name: metrics + port: 8080 + protocol: TCP + targetPort: metrics + selector: + app.kubernetes.io/name: argocd-applicationset-controller +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: dex-server + app.kubernetes.io/name: argocd-dex-server + app.kubernetes.io/part-of: argocd + name: argocd-dex-server +spec: + ports: + - appProtocol: TCP + name: http + port: 5556 + protocol: TCP + targetPort: 5556 + - name: grpc + port: 5557 + protocol: TCP + targetPort: 5557 + - name: metrics + port: 5558 + protocol: TCP + targetPort: 5558 + selector: + app.kubernetes.io/name: argocd-dex-server +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: metrics + app.kubernetes.io/name: argocd-metrics + app.kubernetes.io/part-of: argocd + name: argocd-metrics +spec: + ports: + - name: metrics + port: 8082 + protocol: TCP + targetPort: 8082 + selector: + app.kubernetes.io/name: argocd-application-controller +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: notifications-controller + app.kubernetes.io/name: argocd-notifications-controller-metrics + app.kubernetes.io/part-of: argocd + name: argocd-notifications-controller-metrics +spec: + ports: + - name: metrics + port: 9001 + protocol: TCP + targetPort: 9001 + selector: + app.kubernetes.io/name: argocd-notifications-controller +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha +spec: + clusterIP: None + ports: + - name: tcp-server + port: 6379 + protocol: TCP + targetPort: redis + - name: tcp-sentinel + port: 26379 + protocol: TCP + targetPort: sentinel + selector: + app.kubernetes.io/name: argocd-redis-ha + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-announce-0 +spec: + ports: + - name: tcp-server + port: 6379 + protocol: TCP + targetPort: redis + - name: tcp-sentinel + port: 26379 + protocol: TCP + targetPort: sentinel + publishNotReadyAddresses: true + selector: + app.kubernetes.io/name: argocd-redis-ha + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-0 + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-announce-1 +spec: + ports: + - name: tcp-server + port: 6379 + protocol: TCP + targetPort: redis + - name: tcp-sentinel + port: 26379 + protocol: TCP + targetPort: sentinel + publishNotReadyAddresses: true + selector: + app.kubernetes.io/name: argocd-redis-ha + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-1 + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-announce-2 +spec: + ports: + - name: tcp-server + port: 6379 + protocol: TCP + targetPort: redis + - name: tcp-sentinel + port: 26379 + protocol: TCP + targetPort: sentinel + publishNotReadyAddresses: true + selector: + app.kubernetes.io/name: argocd-redis-ha + statefulset.kubernetes.io/pod-name: argocd-redis-ha-server-2 + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha-haproxy + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-haproxy +spec: + ports: + - name: tcp-haproxy + port: 6379 + protocol: TCP + targetPort: redis + - name: http-exporter-port + port: 9101 + protocol: TCP + targetPort: metrics-port + selector: + app.kubernetes.io/name: argocd-redis-ha-haproxy + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: repo-server + app.kubernetes.io/name: argocd-repo-server + app.kubernetes.io/part-of: argocd + name: argocd-repo-server +spec: + ports: + - name: server + port: 8081 + protocol: TCP + targetPort: 8081 + - name: metrics + port: 8084 + protocol: TCP + targetPort: 8084 + selector: + app.kubernetes.io/name: argocd-repo-server +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: argocd-server + app.kubernetes.io/part-of: argocd + name: argocd-server +spec: + ports: + - name: http + port: 80 + protocol: TCP + targetPort: 8080 + - name: https + port: 443 + protocol: TCP + targetPort: 8080 + selector: + app.kubernetes.io/name: argocd-server +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: argocd-server-metrics + app.kubernetes.io/part-of: argocd + name: argocd-server-metrics +spec: + ports: + - name: metrics + port: 8083 + protocol: TCP + targetPort: 8083 + selector: + app.kubernetes.io/name: argocd-server +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/component: applicationset-controller + app.kubernetes.io/name: argocd-applicationset-controller + app.kubernetes.io/part-of: argocd + name: argocd-applicationset-controller +spec: + selector: + matchLabels: + app.kubernetes.io/name: argocd-applicationset-controller + template: + metadata: + labels: + app.kubernetes.io/name: argocd-applicationset-controller + spec: + containers: + - args: + - /usr/local/bin/argocd-applicationset-controller + env: + - name: ARGOCD_APPLICATIONSET_CONTROLLER_GLOBAL_PRESERVED_ANNOTATIONS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.global.preserved.annotations + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_GLOBAL_PRESERVED_LABELS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.global.preserved.labels + name: argocd-cmd-params-cm + optional: true + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_LEADER_ELECTION + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.leader.election + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER + valueFrom: + configMapKeyRef: + key: repo.server + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_POLICY + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.policy + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_POLICY_OVERRIDE + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.policy.override + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.debug + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGFORMAT + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.log.format + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGLEVEL + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.log.level + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_LOG_FORMAT_TIMESTAMP + valueFrom: + configMapKeyRef: + key: log.format.timestamp + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_DRY_RUN + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.dryrun + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_GIT_MODULES_ENABLED + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.git.submodule + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_PROGRESSIVE_SYNCS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.progressive.syncs + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_TOKENREF_STRICT_MODE + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.tokenref.strict.mode + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_NEW_GIT_FILE_GLOBBING + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.new.git.file.globbing + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER_PLAINTEXT + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.repo.server.plaintext + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER_STRICT_TLS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.repo.server.strict.tls + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER_TIMEOUT_SECONDS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.repo.server.timeout.seconds + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_CONCURRENT_RECONCILIATIONS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.concurrent.reconciliations.max + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_NAMESPACES + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.namespaces + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_SCM_ROOT_CA_PATH + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.scm.root.ca.path + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ALLOWED_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.allowed.scm.providers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.scm.providers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_GITHUB_API_METRICS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.github.api.metrics + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_WEBHOOK_PARALLELISM_LIMIT + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.webhook.parallelism.limit + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_REQUEUE_AFTER + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.requeue.after + name: argocd-cmd-params-cm + optional: true + image: quay.io/argoproj/argocd:v3.1.5 + imagePullPolicy: Always + name: argocd-applicationset-controller + ports: + - containerPort: 7000 + name: webhook + - containerPort: 8080 + name: metrics + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /app/config/ssh + name: ssh-known-hosts + - mountPath: /app/config/tls + name: tls-certs + - mountPath: /app/config/gpg/source + name: gpg-keys + - mountPath: /app/config/gpg/keys + name: gpg-keyring + - mountPath: /tmp + name: tmp + - mountPath: /app/config/reposerver/tls + name: argocd-repo-server-tls + nodeSelector: + kubernetes.io/os: linux + serviceAccountName: argocd-applicationset-controller + volumes: + - configMap: + name: argocd-ssh-known-hosts-cm + name: ssh-known-hosts + - configMap: + name: argocd-tls-certs-cm + name: tls-certs + - configMap: + name: argocd-gpg-keys-cm + name: gpg-keys + - emptyDir: {} + name: gpg-keyring + - emptyDir: {} + name: tmp + - name: argocd-repo-server-tls + secret: + items: + - key: tls.crt + path: tls.crt + - key: tls.key + path: tls.key + - key: ca.crt + path: ca.crt + optional: true + secretName: argocd-repo-server-tls +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/component: dex-server + app.kubernetes.io/name: argocd-dex-server + app.kubernetes.io/part-of: argocd + name: argocd-dex-server +spec: + selector: + matchLabels: + app.kubernetes.io/name: argocd-dex-server + template: + metadata: + labels: + app.kubernetes.io/name: argocd-dex-server + spec: + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/part-of: argocd + topologyKey: kubernetes.io/hostname + weight: 5 + containers: + - command: + - /shared/argocd-dex + - rundex + env: + - name: ARGOCD_DEX_SERVER_LOGFORMAT + valueFrom: + configMapKeyRef: + key: dexserver.log.format + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_DEX_SERVER_LOGLEVEL + valueFrom: + configMapKeyRef: + key: dexserver.log.level + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_LOG_FORMAT_TIMESTAMP + valueFrom: + configMapKeyRef: + key: log.format.timestamp + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_DEX_SERVER_DISABLE_TLS + valueFrom: + configMapKeyRef: + key: dexserver.disable.tls + name: argocd-cmd-params-cm + optional: true + image: ghcr.io/dexidp/dex:v2.43.0 + imagePullPolicy: Always + name: dex + ports: + - containerPort: 5556 + - containerPort: 5557 + - containerPort: 5558 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /shared + name: static-files + - mountPath: /tmp + name: dexconfig + - mountPath: /tls + name: argocd-dex-server-tls + initContainers: + - command: + - /bin/cp + - -n + - /usr/local/bin/argocd + - /shared/argocd-dex + image: quay.io/argoproj/argocd:v3.1.5 + imagePullPolicy: Always + name: copyutil + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /shared + name: static-files + - mountPath: /tmp + name: dexconfig + nodeSelector: + kubernetes.io/os: linux + serviceAccountName: argocd-dex-server + volumes: + - emptyDir: {} + name: static-files + - emptyDir: {} + name: dexconfig + - name: argocd-dex-server-tls + secret: + items: + - key: tls.crt + path: tls.crt + - key: tls.key + path: tls.key + - key: ca.crt + path: ca.crt + optional: true + secretName: argocd-dex-server-tls +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/component: notifications-controller + app.kubernetes.io/name: argocd-notifications-controller + app.kubernetes.io/part-of: argocd + name: argocd-notifications-controller +spec: + selector: + matchLabels: + app.kubernetes.io/name: argocd-notifications-controller + strategy: + type: Recreate + template: + metadata: + labels: + app.kubernetes.io/name: argocd-notifications-controller + spec: + containers: + - args: + - /usr/local/bin/argocd-notifications + env: + - name: ARGOCD_NOTIFICATIONS_CONTROLLER_LOGFORMAT + valueFrom: + configMapKeyRef: + key: notificationscontroller.log.format + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_NOTIFICATIONS_CONTROLLER_LOGLEVEL + valueFrom: + configMapKeyRef: + key: notificationscontroller.log.level + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_LOG_FORMAT_TIMESTAMP + valueFrom: + configMapKeyRef: + key: log.format.timestamp + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_NAMESPACES + valueFrom: + configMapKeyRef: + key: application.namespaces + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_NOTIFICATION_CONTROLLER_SELF_SERVICE_NOTIFICATION_ENABLED + valueFrom: + configMapKeyRef: + key: notificationscontroller.selfservice.enabled + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_NOTIFICATION_CONTROLLER_REPO_SERVER_PLAINTEXT + valueFrom: + configMapKeyRef: + key: notificationscontroller.repo.server.plaintext + name: argocd-cmd-params-cm + optional: true + image: quay.io/argoproj/argocd:v3.1.5 + imagePullPolicy: Always + livenessProbe: + tcpSocket: + port: 9001 + name: argocd-notifications-controller + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + volumeMounts: + - mountPath: /app/config/tls + name: tls-certs + - mountPath: /app/config/reposerver/tls + name: argocd-repo-server-tls + workingDir: /app + nodeSelector: + kubernetes.io/os: linux + securityContext: + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + serviceAccountName: argocd-notifications-controller + volumes: + - configMap: + name: argocd-tls-certs-cm + name: tls-certs + - name: argocd-repo-server-tls + secret: + items: + - key: tls.crt + path: tls.crt + - key: tls.key + path: tls.key + - key: ca.crt + path: ca.crt + optional: true + secretName: argocd-repo-server-tls +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha-haproxy + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-haproxy +spec: + replicas: 3 + revisionHistoryLimit: 1 + selector: + matchLabels: + app.kubernetes.io/name: argocd-redis-ha-haproxy + strategy: + type: RollingUpdate + template: + metadata: + annotations: + checksum/config: cd6508bdf9819601c454d0cc491fb77a209e3a88761d92514d105b6681829953 + prometheus.io/path: /metrics + prometheus.io/port: "9101" + prometheus.io/scrape: "true" + labels: + app.kubernetes.io/name: argocd-redis-ha-haproxy + name: argocd-redis-ha-haproxy + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/name: argocd-redis-ha-haproxy + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: true + containers: + - env: + - name: AUTH + valueFrom: + secretKeyRef: + key: auth + name: argocd-redis + image: public.ecr.aws/docker/library/haproxy:3.0.8-alpine + imagePullPolicy: IfNotPresent + lifecycle: {} + livenessProbe: + httpGet: + path: /healthz + port: probe + initialDelaySeconds: 5 + periodSeconds: 3 + name: haproxy + ports: + - containerPort: 8888 + name: probe + - containerPort: 6379 + name: redis + - containerPort: 9101 + name: metrics-port + readinessProbe: + httpGet: + path: /healthz + port: probe + initialDelaySeconds: 5 + periodSeconds: 3 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /usr/local/etc/haproxy + name: data + - mountPath: /run/haproxy + name: shared-socket + initContainers: + - command: + - argocd + - admin + - redis-initial-password + image: quay.io/argoproj/argocd:v3.1.5 + imagePullPolicy: IfNotPresent + name: secret-init + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + - args: + - /readonly/haproxy_init.sh + command: + - sh + image: public.ecr.aws/docker/library/haproxy:3.0.8-alpine + imagePullPolicy: IfNotPresent + name: config-init + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /readonly + name: config-volume + readOnly: true + - mountPath: /data + name: data + securityContext: + fsGroup: 99 + runAsNonRoot: true + runAsUser: 99 + serviceAccountName: argocd-redis-ha-haproxy + volumes: + - configMap: + name: argocd-redis-ha-configmap + name: config-volume + - emptyDir: {} + name: shared-socket + - emptyDir: {} + name: data +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/component: repo-server + app.kubernetes.io/name: argocd-repo-server + app.kubernetes.io/part-of: argocd + name: argocd-repo-server +spec: + replicas: 2 + selector: + matchLabels: + app.kubernetes.io/name: argocd-repo-server + template: + metadata: + labels: + app.kubernetes.io/name: argocd-repo-server + spec: + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/name: argocd-repo-server + topologyKey: topology.kubernetes.io/zone + weight: 100 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/name: argocd-repo-server + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - /usr/local/bin/argocd-repo-server + env: + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + key: auth + name: argocd-redis + - name: ARGOCD_RECONCILIATION_TIMEOUT + valueFrom: + configMapKeyRef: + key: timeout.reconciliation + name: argocd-cm + optional: true + - name: ARGOCD_REPO_SERVER_LOGFORMAT + valueFrom: + configMapKeyRef: + key: reposerver.log.format + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_LOGLEVEL + valueFrom: + configMapKeyRef: + key: reposerver.log.level + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_LOG_FORMAT_TIMESTAMP + valueFrom: + configMapKeyRef: + key: log.format.timestamp + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_PARALLELISM_LIMIT + valueFrom: + configMapKeyRef: + key: reposerver.parallelism.limit + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_LISTEN_ADDRESS + valueFrom: + configMapKeyRef: + key: reposerver.listen.address + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_LISTEN_METRICS_ADDRESS + valueFrom: + configMapKeyRef: + key: reposerver.metrics.listen.address + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_DISABLE_TLS + valueFrom: + configMapKeyRef: + key: reposerver.disable.tls + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_TLS_MIN_VERSION + valueFrom: + configMapKeyRef: + key: reposerver.tls.minversion + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_TLS_MAX_VERSION + valueFrom: + configMapKeyRef: + key: reposerver.tls.maxversion + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_TLS_CIPHERS + valueFrom: + configMapKeyRef: + key: reposerver.tls.ciphers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + key: reposerver.repo.cache.expiration + name: argocd-cmd-params-cm + optional: true + - name: REDIS_SERVER + valueFrom: + configMapKeyRef: + key: redis.server + name: argocd-cmd-params-cm + optional: true + - name: REDIS_COMPRESSION + valueFrom: + configMapKeyRef: + key: redis.compression + name: argocd-cmd-params-cm + optional: true + - name: REDISDB + valueFrom: + configMapKeyRef: + key: redis.db + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_DEFAULT_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + key: reposerver.default.cache.expiration + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_OTLP_ADDRESS + valueFrom: + configMapKeyRef: + key: otlp.address + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_OTLP_INSECURE + valueFrom: + configMapKeyRef: + key: otlp.insecure + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_OTLP_HEADERS + valueFrom: + configMapKeyRef: + key: otlp.headers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_OTLP_ATTRS + valueFrom: + configMapKeyRef: + key: otlp.attrs + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_MAX_COMBINED_DIRECTORY_MANIFESTS_SIZE + valueFrom: + configMapKeyRef: + key: reposerver.max.combined.directory.manifests.size + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_PLUGIN_TAR_EXCLUSIONS + valueFrom: + configMapKeyRef: + key: reposerver.plugin.tar.exclusions + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_PLUGIN_USE_MANIFEST_GENERATE_PATHS + valueFrom: + configMapKeyRef: + key: reposerver.plugin.use.manifest.generate.paths + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_ALLOW_OUT_OF_BOUNDS_SYMLINKS + valueFrom: + configMapKeyRef: + key: reposerver.allow.oob.symlinks + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_STREAMED_MANIFEST_MAX_TAR_SIZE + valueFrom: + configMapKeyRef: + key: reposerver.streamed.manifest.max.tar.size + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_STREAMED_MANIFEST_MAX_EXTRACTED_SIZE + valueFrom: + configMapKeyRef: + key: reposerver.streamed.manifest.max.extracted.size + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_HELM_MANIFEST_MAX_EXTRACTED_SIZE + valueFrom: + configMapKeyRef: + key: reposerver.helm.manifest.max.extracted.size + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_DISABLE_HELM_MANIFEST_MAX_EXTRACTED_SIZE + valueFrom: + configMapKeyRef: + key: reposerver.disable.helm.manifest.max.extracted.size + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_OCI_MANIFEST_MAX_EXTRACTED_SIZE + valueFrom: + configMapKeyRef: + key: reposerver.oci.manifest.max.extracted.size + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_DISABLE_OCI_MANIFEST_MAX_EXTRACTED_SIZE + valueFrom: + configMapKeyRef: + key: reposerver.disable.oci.manifest.max.extracted.size + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_OCI_LAYER_MEDIA_TYPES + valueFrom: + configMapKeyRef: + key: reposerver.oci.layer.media.types + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REVISION_CACHE_LOCK_TIMEOUT + valueFrom: + configMapKeyRef: + key: reposerver.revision.cache.lock.timeout + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_GIT_MODULES_ENABLED + valueFrom: + configMapKeyRef: + key: reposerver.enable.git.submodule + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_GIT_LS_REMOTE_PARALLELISM_LIMIT + valueFrom: + configMapKeyRef: + key: reposerver.git.lsremote.parallelism.limit + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_GIT_REQUEST_TIMEOUT + valueFrom: + configMapKeyRef: + key: reposerver.git.request.timeout + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_GRPC_MAX_SIZE_MB + valueFrom: + configMapKeyRef: + key: reposerver.grpc.max.size + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_REPO_SERVER_INCLUDE_HIDDEN_DIRECTORIES + valueFrom: + configMapKeyRef: + key: reposerver.include.hidden.directories + name: argocd-cmd-params-cm + optional: true + - name: HELM_CACHE_HOME + value: /helm-working-dir + - name: HELM_CONFIG_HOME + value: /helm-working-dir + - name: HELM_DATA_HOME + value: /helm-working-dir + image: quay.io/argoproj/argocd:v3.1.5 + imagePullPolicy: Always + livenessProbe: + failureThreshold: 3 + httpGet: + path: /healthz?full=true + port: 8084 + initialDelaySeconds: 30 + periodSeconds: 30 + timeoutSeconds: 5 + name: argocd-repo-server + ports: + - containerPort: 8081 + - containerPort: 8084 + readinessProbe: + httpGet: + path: /healthz + port: 8084 + initialDelaySeconds: 5 + periodSeconds: 10 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /app/config/ssh + name: ssh-known-hosts + - mountPath: /app/config/tls + name: tls-certs + - mountPath: /app/config/gpg/source + name: gpg-keys + - mountPath: /app/config/gpg/keys + name: gpg-keyring + - mountPath: /app/config/reposerver/tls + name: argocd-repo-server-tls + - mountPath: /tmp + name: tmp + - mountPath: /helm-working-dir + name: helm-working-dir + - mountPath: /home/argocd/cmp-server/plugins + name: plugins + initContainers: + - command: + - /bin/cp + - -n + - /usr/local/bin/argocd + - /var/run/argocd/argocd-cmp-server + image: quay.io/argoproj/argocd:v3.1.5 + name: copyutil + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /var/run/argocd + name: var-files + nodeSelector: + kubernetes.io/os: linux + serviceAccountName: argocd-repo-server + volumes: + - configMap: + name: argocd-ssh-known-hosts-cm + name: ssh-known-hosts + - configMap: + name: argocd-tls-certs-cm + name: tls-certs + - configMap: + name: argocd-gpg-keys-cm + name: gpg-keys + - emptyDir: {} + name: gpg-keyring + - emptyDir: {} + name: tmp + - emptyDir: {} + name: helm-working-dir + - name: argocd-repo-server-tls + secret: + items: + - key: tls.crt + path: tls.crt + - key: tls.key + path: tls.key + - key: ca.crt + path: ca.crt + optional: true + secretName: argocd-repo-server-tls + - emptyDir: {} + name: var-files + - emptyDir: {} + name: plugins +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: argocd-server + app.kubernetes.io/part-of: argocd + name: argocd-server +spec: + replicas: 2 + selector: + matchLabels: + app.kubernetes.io/name: argocd-server + template: + metadata: + labels: + app.kubernetes.io/name: argocd-server + spec: + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/name: argocd-server + topologyKey: topology.kubernetes.io/zone + weight: 100 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/name: argocd-server + topologyKey: kubernetes.io/hostname + containers: + - args: + - /usr/local/bin/argocd-server + env: + - name: ARGOCD_API_SERVER_REPLICAS + value: "2" + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + key: auth + name: argocd-redis + - name: ARGOCD_SERVER_INSECURE + valueFrom: + configMapKeyRef: + key: server.insecure + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_BASEHREF + valueFrom: + configMapKeyRef: + key: server.basehref + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_ROOTPATH + valueFrom: + configMapKeyRef: + key: server.rootpath + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_LOGFORMAT + valueFrom: + configMapKeyRef: + key: server.log.format + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_LOG_LEVEL + valueFrom: + configMapKeyRef: + key: server.log.level + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_REPO_SERVER + valueFrom: + configMapKeyRef: + key: repo.server + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_DEX_SERVER + valueFrom: + configMapKeyRef: + key: server.dex.server + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_DISABLE_AUTH + valueFrom: + configMapKeyRef: + key: server.disable.auth + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_ENABLE_GZIP + valueFrom: + configMapKeyRef: + key: server.enable.gzip + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_REPO_SERVER_TIMEOUT_SECONDS + valueFrom: + configMapKeyRef: + key: server.repo.server.timeout.seconds + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_X_FRAME_OPTIONS + valueFrom: + configMapKeyRef: + key: server.x.frame.options + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_CONTENT_SECURITY_POLICY + valueFrom: + configMapKeyRef: + key: server.content.security.policy + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_REPO_SERVER_PLAINTEXT + valueFrom: + configMapKeyRef: + key: server.repo.server.plaintext + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_REPO_SERVER_STRICT_TLS + valueFrom: + configMapKeyRef: + key: server.repo.server.strict.tls + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_DEX_SERVER_PLAINTEXT + valueFrom: + configMapKeyRef: + key: server.dex.server.plaintext + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_DEX_SERVER_STRICT_TLS + valueFrom: + configMapKeyRef: + key: server.dex.server.strict.tls + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_TLS_MIN_VERSION + valueFrom: + configMapKeyRef: + key: server.tls.minversion + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_TLS_MAX_VERSION + valueFrom: + configMapKeyRef: + key: server.tls.maxversion + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_TLS_CIPHERS + valueFrom: + configMapKeyRef: + key: server.tls.ciphers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_CONNECTION_STATUS_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + key: server.connection.status.cache.expiration + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_OIDC_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + key: server.oidc.cache.expiration + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_STATIC_ASSETS + valueFrom: + configMapKeyRef: + key: server.staticassets + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APP_STATE_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + key: server.app.state.cache.expiration + name: argocd-cmd-params-cm + optional: true + - name: REDIS_SERVER + valueFrom: + configMapKeyRef: + key: redis.server + name: argocd-cmd-params-cm + optional: true + - name: REDIS_COMPRESSION + valueFrom: + configMapKeyRef: + key: redis.compression + name: argocd-cmd-params-cm + optional: true + - name: REDISDB + valueFrom: + configMapKeyRef: + key: redis.db + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_DEFAULT_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + key: server.default.cache.expiration + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_MAX_COOKIE_NUMBER + valueFrom: + configMapKeyRef: + key: server.http.cookie.maxnumber + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_LISTEN_ADDRESS + valueFrom: + configMapKeyRef: + key: server.listen.address + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_METRICS_LISTEN_ADDRESS + valueFrom: + configMapKeyRef: + key: server.metrics.listen.address + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_OTLP_ADDRESS + valueFrom: + configMapKeyRef: + key: otlp.address + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_OTLP_INSECURE + valueFrom: + configMapKeyRef: + key: otlp.insecure + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_OTLP_HEADERS + valueFrom: + configMapKeyRef: + key: otlp.headers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_OTLP_ATTRS + valueFrom: + configMapKeyRef: + key: otlp.attrs + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_NAMESPACES + valueFrom: + configMapKeyRef: + key: application.namespaces + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_ENABLE_PROXY_EXTENSION + valueFrom: + configMapKeyRef: + key: server.enable.proxy.extension + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_K8SCLIENT_RETRY_MAX + valueFrom: + configMapKeyRef: + key: server.k8sclient.retry.max + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_K8SCLIENT_RETRY_BASE_BACKOFF + valueFrom: + configMapKeyRef: + key: server.k8sclient.retry.base.backoff + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_API_CONTENT_TYPES + valueFrom: + configMapKeyRef: + key: server.api.content.types + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SERVER_WEBHOOK_PARALLELISM_LIMIT + valueFrom: + configMapKeyRef: + key: server.webhook.parallelism.limit + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_NEW_GIT_FILE_GLOBBING + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.new.git.file.globbing + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_SCM_ROOT_CA_PATH + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.scm.root.ca.path + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ALLOWED_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.allowed.scm.providers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_SCM_PROVIDERS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.scm.providers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_GITHUB_API_METRICS + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.github.api.metrics + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_HYDRATOR_ENABLED + valueFrom: + configMapKeyRef: + key: hydrator.enabled + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_SYNC_WITH_REPLACE_ALLOWED + valueFrom: + configMapKeyRef: + key: server.sync.replace.allowed + name: argocd-cmd-params-cm + optional: true + image: quay.io/argoproj/argocd:v3.1.5 + imagePullPolicy: Always + livenessProbe: + httpGet: + path: /healthz?full=true + port: 8080 + initialDelaySeconds: 3 + periodSeconds: 30 + timeoutSeconds: 5 + name: argocd-server + ports: + - containerPort: 8080 + - containerPort: 8083 + readinessProbe: + httpGet: + path: /healthz + port: 8080 + initialDelaySeconds: 3 + periodSeconds: 30 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /app/config/ssh + name: ssh-known-hosts + - mountPath: /app/config/tls + name: tls-certs + - mountPath: /app/config/server/tls + name: argocd-repo-server-tls + - mountPath: /app/config/dex/tls + name: argocd-dex-server-tls + - mountPath: /home/argocd + name: plugins-home + - mountPath: /tmp + name: tmp + - mountPath: /home/argocd/params + name: argocd-cmd-params-cm + nodeSelector: + kubernetes.io/os: linux + serviceAccountName: argocd-server + volumes: + - emptyDir: {} + name: plugins-home + - emptyDir: {} + name: tmp + - configMap: + name: argocd-ssh-known-hosts-cm + name: ssh-known-hosts + - configMap: + name: argocd-tls-certs-cm + name: tls-certs + - name: argocd-repo-server-tls + secret: + items: + - key: tls.crt + path: tls.crt + - key: tls.key + path: tls.key + - key: ca.crt + path: ca.crt + optional: true + secretName: argocd-repo-server-tls + - name: argocd-dex-server-tls + secret: + items: + - key: tls.crt + path: tls.crt + - key: ca.crt + path: ca.crt + optional: true + secretName: argocd-dex-server-tls + - configMap: + items: + - key: server.profile.enabled + path: profiler.enabled + name: argocd-cmd-params-cm + optional: true + name: argocd-cmd-params-cm +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + app.kubernetes.io/component: application-controller + app.kubernetes.io/name: argocd-application-controller + app.kubernetes.io/part-of: argocd + name: argocd-application-controller +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: argocd-application-controller + serviceName: argocd-application-controller + template: + metadata: + labels: + app.kubernetes.io/name: argocd-application-controller + spec: + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/name: argocd-application-controller + topologyKey: kubernetes.io/hostname + weight: 100 + - podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/part-of: argocd + topologyKey: kubernetes.io/hostname + weight: 5 + containers: + - args: + - /usr/local/bin/argocd-application-controller + env: + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + key: auth + name: argocd-redis + - name: ARGOCD_CONTROLLER_REPLICAS + value: "1" + - name: ARGOCD_RECONCILIATION_TIMEOUT + valueFrom: + configMapKeyRef: + key: timeout.reconciliation + name: argocd-cm + optional: true + - name: ARGOCD_HARD_RECONCILIATION_TIMEOUT + valueFrom: + configMapKeyRef: + key: timeout.hard.reconciliation + name: argocd-cm + optional: true + - name: ARGOCD_RECONCILIATION_JITTER + valueFrom: + configMapKeyRef: + key: timeout.reconciliation.jitter + name: argocd-cm + optional: true + - name: ARGOCD_REPO_ERROR_GRACE_PERIOD_SECONDS + valueFrom: + configMapKeyRef: + key: controller.repo.error.grace.period.seconds + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER + valueFrom: + configMapKeyRef: + key: repo.server + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER_TIMEOUT_SECONDS + valueFrom: + configMapKeyRef: + key: controller.repo.server.timeout.seconds + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_STATUS_PROCESSORS + valueFrom: + configMapKeyRef: + key: controller.status.processors + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_OPERATION_PROCESSORS + valueFrom: + configMapKeyRef: + key: controller.operation.processors + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_LOGFORMAT + valueFrom: + configMapKeyRef: + key: controller.log.format + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_LOGLEVEL + valueFrom: + configMapKeyRef: + key: controller.log.level + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_LOG_FORMAT_TIMESTAMP + valueFrom: + configMapKeyRef: + key: log.format.timestamp + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_METRICS_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + key: controller.metrics.cache.expiration + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_SELF_HEAL_TIMEOUT_SECONDS + valueFrom: + configMapKeyRef: + key: controller.self.heal.timeout.seconds + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_SELF_HEAL_BACKOFF_TIMEOUT_SECONDS + valueFrom: + configMapKeyRef: + key: controller.self.heal.backoff.timeout.seconds + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_SELF_HEAL_BACKOFF_FACTOR + valueFrom: + configMapKeyRef: + key: controller.self.heal.backoff.factor + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_SELF_HEAL_BACKOFF_CAP_SECONDS + valueFrom: + configMapKeyRef: + key: controller.self.heal.backoff.cap.seconds + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_SELF_HEAL_BACKOFF_COOLDOWN_SECONDS + valueFrom: + configMapKeyRef: + key: controller.self.heal.backoff.cooldown.seconds + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_SYNC_TIMEOUT + valueFrom: + configMapKeyRef: + key: controller.sync.timeout.seconds + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER_PLAINTEXT + valueFrom: + configMapKeyRef: + key: controller.repo.server.plaintext + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER_STRICT_TLS + valueFrom: + configMapKeyRef: + key: controller.repo.server.strict.tls + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_PERSIST_RESOURCE_HEALTH + valueFrom: + configMapKeyRef: + key: controller.resource.health.persist + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APP_STATE_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + key: controller.app.state.cache.expiration + name: argocd-cmd-params-cm + optional: true + - name: REDIS_SERVER + valueFrom: + configMapKeyRef: + key: redis.server + name: argocd-cmd-params-cm + optional: true + - name: REDIS_COMPRESSION + valueFrom: + configMapKeyRef: + key: redis.compression + name: argocd-cmd-params-cm + optional: true + - name: REDISDB + valueFrom: + configMapKeyRef: + key: redis.db + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_DEFAULT_CACHE_EXPIRATION + valueFrom: + configMapKeyRef: + key: controller.default.cache.expiration + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_OTLP_ADDRESS + valueFrom: + configMapKeyRef: + key: otlp.address + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_OTLP_INSECURE + valueFrom: + configMapKeyRef: + key: otlp.insecure + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_OTLP_HEADERS + valueFrom: + configMapKeyRef: + key: otlp.headers + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_OTLP_ATTRS + valueFrom: + configMapKeyRef: + key: otlp.attrs + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_NAMESPACES + valueFrom: + configMapKeyRef: + key: application.namespaces + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_CONTROLLER_SHARDING_ALGORITHM + valueFrom: + configMapKeyRef: + key: controller.sharding.algorithm + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_KUBECTL_PARALLELISM_LIMIT + valueFrom: + configMapKeyRef: + key: controller.kubectl.parallelism.limit + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_K8SCLIENT_RETRY_MAX + valueFrom: + configMapKeyRef: + key: controller.k8sclient.retry.max + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_K8SCLIENT_RETRY_BASE_BACKOFF + valueFrom: + configMapKeyRef: + key: controller.k8sclient.retry.base.backoff + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_SERVER_SIDE_DIFF + valueFrom: + configMapKeyRef: + key: controller.diff.server.side + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_IGNORE_NORMALIZER_JQ_TIMEOUT + valueFrom: + configMapKeyRef: + key: controller.ignore.normalizer.jq.timeout + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_HYDRATOR_ENABLED + valueFrom: + configMapKeyRef: + key: hydrator.enabled + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_CLUSTER_CACHE_BATCH_EVENTS_PROCESSING + valueFrom: + configMapKeyRef: + key: controller.cluster.cache.batch.events.processing + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_CLUSTER_CACHE_EVENTS_PROCESSING_INTERVAL + valueFrom: + configMapKeyRef: + key: controller.cluster.cache.events.processing.interval + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_CONTROLLER_COMMIT_SERVER + valueFrom: + configMapKeyRef: + key: commit.server + name: argocd-cmd-params-cm + optional: true + - name: KUBECACHEDIR + value: /tmp/kubecache + image: quay.io/argoproj/argocd:v3.1.5 + imagePullPolicy: Always + name: argocd-application-controller + ports: + - containerPort: 8082 + readinessProbe: + httpGet: + path: /healthz + port: 8082 + initialDelaySeconds: 5 + periodSeconds: 10 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /app/config/controller/tls + name: argocd-repo-server-tls + - mountPath: /home/argocd + name: argocd-home + - mountPath: /home/argocd/params + name: argocd-cmd-params-cm + - mountPath: /tmp + name: argocd-application-controller-tmp + workingDir: /home/argocd + nodeSelector: + kubernetes.io/os: linux + serviceAccountName: argocd-application-controller + volumes: + - emptyDir: {} + name: argocd-home + - emptyDir: {} + name: argocd-application-controller-tmp + - name: argocd-repo-server-tls + secret: + items: + - key: tls.crt + path: tls.crt + - key: tls.key + path: tls.key + - key: ca.crt + path: ca.crt + optional: true + secretName: argocd-repo-server-tls + - configMap: + items: + - key: controller.profile.enabled + path: profiler.enabled + name: argocd-cmd-params-cm + optional: true + name: argocd-cmd-params-cm +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-server +spec: + podManagementPolicy: OrderedReady + replicas: 3 + selector: + matchLabels: + app.kubernetes.io/name: argocd-redis-ha + serviceName: argocd-redis-ha + template: + metadata: + annotations: + checksum/init-config: bd30e83dfdad9912b6c1cc32a8c26d7d01429a0730f5ee7af380fb593e874d54 + labels: + app.kubernetes.io/name: argocd-redis-ha + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/name: argocd-redis-ha + topologyKey: kubernetes.io/hostname + automountServiceAccountToken: false + containers: + - args: + - /data/conf/redis.conf + command: + - redis-server + env: + - name: AUTH + valueFrom: + secretKeyRef: + key: auth + name: argocd-redis + image: public.ecr.aws/docker/library/redis:7.2.7-alpine + imagePullPolicy: IfNotPresent + lifecycle: + preStop: + exec: + command: + - /bin/sh + - /readonly-config/trigger-failover-if-master.sh + livenessProbe: + exec: + command: + - sh + - -c + - /health/redis_liveness.sh + failureThreshold: 5 + initialDelaySeconds: 30 + periodSeconds: 15 + successThreshold: 1 + timeoutSeconds: 15 + name: redis + ports: + - containerPort: 6379 + name: redis + readinessProbe: + exec: + command: + - sh + - -c + - /health/redis_readiness.sh + failureThreshold: 5 + initialDelaySeconds: 30 + periodSeconds: 15 + successThreshold: 1 + timeoutSeconds: 15 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + seccompProfile: + type: RuntimeDefault + startupProbe: + exec: + command: + - sh + - -c + - /health/redis_readiness.sh + failureThreshold: 3 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 15 + volumeMounts: + - mountPath: /readonly-config + name: config + readOnly: true + - mountPath: /data + name: data + - mountPath: /health + name: health + - args: + - /data/conf/sentinel.conf + command: + - redis-sentinel + env: + - name: AUTH + valueFrom: + secretKeyRef: + key: auth + name: argocd-redis + image: public.ecr.aws/docker/library/redis:7.2.7-alpine + imagePullPolicy: IfNotPresent + lifecycle: + postStart: + exec: + command: + - /bin/sh + - -c + - sleep 30; redis-cli -p 26379 sentinel reset argocd + livenessProbe: + exec: + command: + - sh + - -c + - /health/sentinel_liveness.sh + failureThreshold: 5 + initialDelaySeconds: 30 + periodSeconds: 15 + successThreshold: 1 + timeoutSeconds: 15 + name: sentinel + ports: + - containerPort: 26379 + name: sentinel + readinessProbe: + exec: + command: + - sh + - -c + - /health/sentinel_liveness.sh + failureThreshold: 5 + initialDelaySeconds: 30 + periodSeconds: 15 + successThreshold: 3 + timeoutSeconds: 15 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + seccompProfile: + type: RuntimeDefault + startupProbe: + exec: + command: + - sh + - -c + - /health/sentinel_liveness.sh + failureThreshold: 3 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 15 + volumeMounts: + - mountPath: /data + name: data + - mountPath: /health + name: health + - args: + - /readonly-config/fix-split-brain.sh + command: + - sh + env: + - name: SENTINEL_ID_0 + value: 3c0d9c0320bb34888c2df5757c718ce6ca992ce6 + - name: SENTINEL_ID_1 + value: 40000915ab58c3fa8fd888fb8b24711944e6cbb4 + - name: SENTINEL_ID_2 + value: 2bbec7894d954a8af3bb54d13eaec53cb024e2ca + - name: AUTH + valueFrom: + secretKeyRef: + key: auth + name: argocd-redis + image: public.ecr.aws/docker/library/redis:7.2.7-alpine + imagePullPolicy: IfNotPresent + name: split-brain-fix + resources: {} + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /readonly-config + name: config + readOnly: true + - mountPath: /data + name: data + initContainers: + - args: + - /readonly-config/init.sh + command: + - sh + env: + - name: SENTINEL_ID_0 + value: 3c0d9c0320bb34888c2df5757c718ce6ca992ce6 + - name: SENTINEL_ID_1 + value: 40000915ab58c3fa8fd888fb8b24711944e6cbb4 + - name: SENTINEL_ID_2 + value: 2bbec7894d954a8af3bb54d13eaec53cb024e2ca + - name: AUTH + valueFrom: + secretKeyRef: + key: auth + name: argocd-redis + image: public.ecr.aws/docker/library/redis:7.2.7-alpine + imagePullPolicy: IfNotPresent + name: config-init + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /readonly-config + name: config + readOnly: true + - mountPath: /data + name: data + securityContext: + fsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + serviceAccountName: argocd-redis-ha + terminationGracePeriodSeconds: 60 + volumes: + - configMap: + name: argocd-redis-ha-configmap + name: config + - configMap: + defaultMode: 493 + name: argocd-redis-ha-health-configmap + name: health + - emptyDir: {} + name: data + updateStrategy: + type: RollingUpdate +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + labels: + app.kubernetes.io/component: application-controller + app.kubernetes.io/name: argocd-application-controller + app.kubernetes.io/part-of: argocd + name: argocd-application-controller-network-policy +spec: + ingress: + - from: + - namespaceSelector: {} + ports: + - port: 8082 + podSelector: + matchLabels: + app.kubernetes.io/name: argocd-application-controller + policyTypes: + - Ingress +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + labels: + app.kubernetes.io/component: applicationset-controller + app.kubernetes.io/name: argocd-applicationset-controller + app.kubernetes.io/part-of: argocd + name: argocd-applicationset-controller-network-policy +spec: + ingress: + - from: + - namespaceSelector: {} + ports: + - port: 7000 + protocol: TCP + - port: 8080 + protocol: TCP + podSelector: + matchLabels: + app.kubernetes.io/name: argocd-applicationset-controller + policyTypes: + - Ingress +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + labels: + app.kubernetes.io/component: dex-server + app.kubernetes.io/name: argocd-dex-server + app.kubernetes.io/part-of: argocd + name: argocd-dex-server-network-policy +spec: + ingress: + - from: + - podSelector: + matchLabels: + app.kubernetes.io/name: argocd-server + ports: + - port: 5556 + protocol: TCP + - port: 5557 + protocol: TCP + - from: + - namespaceSelector: {} + ports: + - port: 5558 + protocol: TCP + podSelector: + matchLabels: + app.kubernetes.io/name: argocd-dex-server + policyTypes: + - Ingress +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + labels: + app.kubernetes.io/component: notifications-controller + app.kubernetes.io/name: argocd-notifications-controller + app.kubernetes.io/part-of: argocd + name: argocd-notifications-controller-network-policy +spec: + ingress: + - from: + - namespaceSelector: {} + ports: + - port: 9001 + protocol: TCP + podSelector: + matchLabels: + app.kubernetes.io/name: argocd-notifications-controller + policyTypes: + - Ingress +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha-haproxy + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-proxy-network-policy +spec: + ingress: + - from: + - podSelector: + matchLabels: + app.kubernetes.io/name: argocd-server + - podSelector: + matchLabels: + app.kubernetes.io/name: argocd-repo-server + - podSelector: + matchLabels: + app.kubernetes.io/name: argocd-application-controller + ports: + - port: 6379 + protocol: TCP + - port: 26379 + protocol: TCP + podSelector: + matchLabels: + app.kubernetes.io/name: argocd-redis-ha-haproxy + policyTypes: + - Ingress +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + labels: + app.kubernetes.io/component: redis + app.kubernetes.io/name: argocd-redis-ha + app.kubernetes.io/part-of: argocd + name: argocd-redis-ha-server-network-policy +spec: + egress: + - ports: + - port: 6379 + protocol: TCP + - port: 26379 + protocol: TCP + to: + - podSelector: + matchLabels: + app.kubernetes.io/name: argocd-redis-ha + - ports: + - port: 53 + protocol: UDP + - port: 53 + protocol: TCP + ingress: + - from: + - podSelector: + matchLabels: + app.kubernetes.io/name: argocd-redis-ha-haproxy + - podSelector: + matchLabels: + app.kubernetes.io/name: argocd-redis-ha + ports: + - port: 6379 + protocol: TCP + - port: 26379 + protocol: TCP + podSelector: + matchLabels: + app.kubernetes.io/name: argocd-redis-ha + policyTypes: + - Ingress + - Egress +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + labels: + app.kubernetes.io/component: repo-server + app.kubernetes.io/name: argocd-repo-server + app.kubernetes.io/part-of: argocd + name: argocd-repo-server-network-policy +spec: + ingress: + - from: + - podSelector: + matchLabels: + app.kubernetes.io/name: argocd-server + - podSelector: + matchLabels: + app.kubernetes.io/name: argocd-application-controller + - podSelector: + matchLabels: + app.kubernetes.io/name: argocd-notifications-controller + - podSelector: + matchLabels: + app.kubernetes.io/name: argocd-applicationset-controller + ports: + - port: 8081 + protocol: TCP + - from: + - namespaceSelector: {} + ports: + - port: 8084 + podSelector: + matchLabels: + app.kubernetes.io/name: argocd-repo-server + policyTypes: + - Ingress +--- +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: argocd-server + app.kubernetes.io/part-of: argocd + name: argocd-server-network-policy +spec: + ingress: + - {} + podSelector: + matchLabels: + app.kubernetes.io/name: argocd-server + policyTypes: + - Ingress diff --git a/k8s/argocd/kustomization.yaml b/k8s/argocd/kustomization.yaml new file mode 100644 index 0000000..da23076 --- /dev/null +++ b/k8s/argocd/kustomization.yaml @@ -0,0 +1,27 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - install.yaml +namespace: argocd +patches: + - target: + kind: Service + name: argocd-server + patch: |- + apiVersion: v1 + kind: Service + metadata: + name: argocd-server + spec: + type: NodePort + ports: + - name: http + port: 80 + protocol: TCP + targetPort: 8080 + nodePort: 30080 + - name: https + port: 443 + protocol: TCP + targetPort: 8080 + nodePort: 30443 diff --git a/k8s/production/base/deploy.yaml b/k8s/production/base/deploy.yaml new file mode 100644 index 0000000..9fedcf6 --- /dev/null +++ b/k8s/production/base/deploy.yaml @@ -0,0 +1,49 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: webapp + labels: + app: webapp +spec: + replicas: 1 + selector: + matchLabels: + app: webapp + template: + metadata: + labels: + app: webapp + spec: + containers: + - name: webapp + image: registry.internal.uia.no/ikt206-g-26v-devops/group30/exam:$CI_COMMIT_SHORT_SHA + imagePullPolicy: Always + ports: + - containerPort: 8000 + name: http + env: + - name: FLASK_APP + value: app.py + - name: ENVIRONMENT + value: production + - name: DATABASE_URL + value: postgresql://postgres:postgres@db:5432/postgres + imagePullSecrets: + - name: regcred +--- +apiVersion: v1 +kind: Service +metadata: + name: webapp + labels: + app: webapp +spec: + type: NodePort + ports: + - port: 8081 + targetPort: http + nodePort: 30081 + protocol: TCP + name: http + selector: + app: webapp diff --git a/k8s/production/base/kustomization.yaml b/k8s/production/base/kustomization.yaml new file mode 100644 index 0000000..ee2da5d --- /dev/null +++ b/k8s/production/base/kustomization.yaml @@ -0,0 +1,4 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - deploy.yaml diff --git a/k8s/production/kustomization.yaml b/k8s/production/kustomization.yaml new file mode 100644 index 0000000..0fbf490 --- /dev/null +++ b/k8s/production/kustomization.yaml @@ -0,0 +1,7 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: production-environment +resources: + - namespace.yaml + - base + - ../shared diff --git a/k8s/production/namespace.yaml b/k8s/production/namespace.yaml new file mode 100644 index 0000000..75eb300 --- /dev/null +++ b/k8s/production/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: production-environment diff --git a/k8s/secret/.gitignore b/k8s/secret/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/k8s/secret/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/k8s/shared/kustomization.yaml b/k8s/shared/kustomization.yaml new file mode 100644 index 0000000..4153c20 --- /dev/null +++ b/k8s/shared/kustomization.yaml @@ -0,0 +1,8 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - regcred.yaml + - postgres-secret.yaml + - postgres-pvc.yaml + - postgres-deployment.yaml + - postgres-service.yaml diff --git a/k8s/shared/postgres-deployment.yaml b/k8s/shared/postgres-deployment.yaml new file mode 100644 index 0000000..2ee3e99 --- /dev/null +++ b/k8s/shared/postgres-deployment.yaml @@ -0,0 +1,35 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgres + labels: + app: postgres +spec: + replicas: 1 + selector: + matchLabels: + app: postgres + template: + metadata: + labels: + app: postgres + spec: + containers: + - name: postgres + image: postgres:14 + ports: + - containerPort: 5432 + name: postgres + env: + - name: PGDATA + value: /var/lib/postgresql/data/pgdata + envFrom: + - secretRef: + name: postgres-secret + volumeMounts: + - name: postgres-data + mountPath: /var/lib/postgresql + volumes: + - name: postgres-data + persistentVolumeClaim: + claimName: postgres-pvc diff --git a/k8s/shared/postgres-pvc.yaml b/k8s/shared/postgres-pvc.yaml new file mode 100644 index 0000000..23afd37 --- /dev/null +++ b/k8s/shared/postgres-pvc.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: postgres-pvc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/k8s/shared/postgres-secret.yaml b/k8s/shared/postgres-secret.yaml new file mode 100644 index 0000000..97f49dc --- /dev/null +++ b/k8s/shared/postgres-secret.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Secret +metadata: + name: postgres-secret +type: Opaque +stringData: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: postgres diff --git a/k8s/shared/postgres-service.yaml b/k8s/shared/postgres-service.yaml new file mode 100644 index 0000000..83d0fe3 --- /dev/null +++ b/k8s/shared/postgres-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: db + labels: + app: postgres +spec: + type: ClusterIP + ports: + - port: 5432 + targetPort: 5432 + protocol: TCP + name: postgres + selector: + app: postgres diff --git a/k8s/shared/regcred.yaml b/k8s/shared/regcred.yaml new file mode 100644 index 0000000..2b1e5a3 --- /dev/null +++ b/k8s/shared/regcred.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Secret +metadata: + name: regcred +type: kubernetes.io/dockerconfigjson +data: + .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJyZWdpc3RyeS5pbnRlcm5hbC51aWEubm8iOiB7CgkJCSJhdXRoIjogImRtbHNhbUZ5WWpwbmJIQmhkQzAzVW5kU1pITkhaa1JTTXpoWldtcGFRMmsxZUE9PSIKCQl9Cgl9Cn0= diff --git a/k8s/staging/base/deploy.yaml b/k8s/staging/base/deploy.yaml new file mode 100644 index 0000000..73977f9 --- /dev/null +++ b/k8s/staging/base/deploy.yaml @@ -0,0 +1,49 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: webapp + labels: + app: webapp +spec: + replicas: 1 + selector: + matchLabels: + app: webapp + template: + metadata: + labels: + app: webapp + spec: + containers: + - name: webapp + image: registry.internal.uia.no/ikt206-g-26v-devops/group30/exam:$CI_COMMIT_SHORT_SHA + imagePullPolicy: Always + ports: + - containerPort: 8000 + name: http + env: + - name: FLASK_APP + value: app.py + - name: ENVIRONMENT + value: staging + - name: DATABASE_URL + value: postgresql://postgres:postgres@db:5432/postgres + imagePullSecrets: + - name: regcred +--- +apiVersion: v1 +kind: Service +metadata: + name: webapp + labels: + app: webapp +spec: + type: NodePort + ports: + - port: 8080 + targetPort: http + nodePort: 30082 + protocol: TCP + name: http + selector: + app: webapp diff --git a/k8s/staging/base/kustomization.yaml b/k8s/staging/base/kustomization.yaml new file mode 100644 index 0000000..ee2da5d --- /dev/null +++ b/k8s/staging/base/kustomization.yaml @@ -0,0 +1,4 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - deploy.yaml diff --git a/k8s/staging/kustomization.yaml b/k8s/staging/kustomization.yaml new file mode 100644 index 0000000..e0e7708 --- /dev/null +++ b/k8s/staging/kustomization.yaml @@ -0,0 +1,7 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: staging-environment +resources: + - namespace.yaml + - base + - ../shared diff --git a/k8s/staging/namespace.yaml b/k8s/staging/namespace.yaml new file mode 100644 index 0000000..711386f --- /dev/null +++ b/k8s/staging/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: staging-environment diff --git a/k8s/webapp/base/deploy.yaml b/k8s/webapp/base/deploy.yaml new file mode 100644 index 0000000..9029108 --- /dev/null +++ b/k8s/webapp/base/deploy.yaml @@ -0,0 +1,42 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: webapp + labels: + app: webapp +spec: + replicas: 1 + selector: + matchLabels: + app: webapp + template: + metadata: + labels: + app: webapp + spec: + containers: + - name: webapp + image: registry.internal.uia.no/ikt206-g-26v-devops/group30/exam + imagePullPolicy: Always + ports: + - containerPort: 8000 + name: http + imagePullSecrets: + - name: regcred +--- +apiVersion: v1 +kind: Service +metadata: + name: webapp + labels: + app: webapp +spec: + type: ClusterIP + ports: + - port: 8080 + targetPort: http + protocol: TCP + name: http + selector: + app: webapp + diff --git a/k8s/webapp/base/kustomization.yaml b/k8s/webapp/base/kustomization.yaml new file mode 100644 index 0000000..fafcf9b --- /dev/null +++ b/k8s/webapp/base/kustomization.yaml @@ -0,0 +1,3 @@ +resources: +- deploy.yaml + diff --git a/k8s/webapp/kustomization.yaml b/k8s/webapp/kustomization.yaml new file mode 100644 index 0000000..22e83ea --- /dev/null +++ b/k8s/webapp/kustomization.yaml @@ -0,0 +1,5 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - base + - ../shared diff --git a/k8s/webapp/webapp-app.yaml b/k8s/webapp/webapp-app.yaml new file mode 100644 index 0000000..a85342e --- /dev/null +++ b/k8s/webapp/webapp-app.yaml @@ -0,0 +1,22 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: beetroot + namespace: argocd + finalizers: + - resources-finalizer.argocd.argoproj.io +spec: + project: default + source: + repoURL: registry.internal.uia.no/ikt206-g-26v-devops/group30/exam + targetRevision: main + path: k8s/webapp/base + destination: + server: https://kubernetes.default.svc + namespace: default + syncPolicy: + automated: + prune: true + selfHeal: true + syncOptions: + - CreateNamespace=true diff --git a/kubeconfig b/kubeconfig new file mode 100644 index 0000000..4f20829 --- /dev/null +++ b/kubeconfig @@ -0,0 +1,19 @@ +apiVersion: v1 +clusters: +- cluster: + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJpakNDQVRDZ0F3SUJBZ0lSQU5MSE96Q2pRZzlsbEltalI2OUtXWGd3Q2dZSUtvWkl6ajBFQXdJd0ZURVQKTUJFR0ExVUVDaE1LYTNWaVpYSnVaWFJsY3pBZUZ3MHlOakEwTVRZd09UQXhNREZhRncwek5qQTBNVE13T1RBeApNREZhTUJVeEV6QVJCZ05WQkFvVENtdDFZbVZ5Ym1WMFpYTXdXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CCkJ3TkNBQVFDc3BSTVhKVktENE0rU25rWVVvc0ZoWElhMFlkbUpTeGtDSVVTUEFvUUdYMEF2K0ZrWCtPQWk2b1gKMXlZYzFLM1VqK2ltVjhGUW5lSDZNc0Rab2FLSG8yRXdYekFPQmdOVkhROEJBZjhFQkFNQ0FvUXdIUVlEVlIwbApCQll3RkFZSUt3WUJCUVVIQXdFR0NDc0dBUVVGQndNQ01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPCkJCWUVGR0tvU04rZ0JaeU1sb1J6TkxpamxBTGVnRGF1TUFvR0NDcUdTTTQ5QkFNQ0EwZ0FNRVVDSUVvVGxqVUMKVEVhN0FpQVhmYXdubTY4VkZvTEViNldJdlV5c0Z2K2JxMWNyQWlFQTJMdXZHM3JNZEN3VUU4WGR0RUtNV0xGKwprZzJadC8vbDVkbmcyZDJMY01vPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + server: https://10.225.210.190:6443 + name: IKT206G26V-g30 +contexts: +- context: + cluster: IKT206G26V-g30 + namespace: default + user: admin@IKT206G26V-g30 + name: admin@IKT206G26V-g30 +current-context: admin@IKT206G26V-g30 +kind: Config +users: +- name: admin@IKT206G26V-g30 + user: + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJoakNDQVN1Z0F3SUJBZ0lSQUxDVUxGRFZ6V1RRbVVOYy9hNDh0S3d3Q2dZSUtvWkl6ajBFQXdJd0ZURVQKTUJFR0ExVUVDaE1LYTNWaVpYSnVaWFJsY3pBZUZ3MHlOakEwTVRZd09UQXpNalJhRncweU56QTBNVFl3T1RBegpNelJhTUNreEZ6QVZCZ05WQkFvVERuTjVjM1JsYlRwdFlYTjBaWEp6TVE0d0RBWURWUVFERXdWaFpHMXBiakJaCk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkVWWi9rRlQvYUp1YnFTRlhsakt5bktIV0EyYmVaK0gKLzlHNFRvNjk3ZTZPSXY5VGZhcGxpaFVwdTkzWTJNcTErREdublBvWVVFWEJWakVVT3dhVklTNmpTREJHTUE0RwpBMVVkRHdFQi93UUVBd0lGb0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFqQWZCZ05WSFNNRUdEQVdnQlJpCnFFamZvQVdjakphRWN6UzRvNVFDM29BMnJqQUtCZ2dxaGtqT1BRUURBZ05KQURCR0FpRUE1SGVQZ205OVNIckcKUFZmS0taU1lycy9kOUpyZ0V6WFF1eWdNMS9zMGY4WUNJUUQ5TnNwL20ydDF2RmdxTkFEaGN5WUV5Sm1CS3BzNQowRUhWd1JkVlkvQXlCUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUphb3pJdEZMUUE1dTFHTGM4UXQrb2NydVpEV0c4SlRSV3dQQS9kTFNPaEtvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFUlZuK1FWUDlvbTV1cElWZVdNcktjb2RZRFp0NW40Zi8wYmhPanIzdDdvNGkvMU45cW1XSwpGU203M2RqWXlyWDRNYWVjK2hoUVJjRldNUlE3QnBVaExnPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo= diff --git a/talosconfig b/talosconfig new file mode 100644 index 0000000..dfcd3fb --- /dev/null +++ b/talosconfig @@ -0,0 +1,12 @@ +context: IKT206G26V-g30 +contexts: + IKT206G26V-g30: + endpoints: + - 10.225.210.190 + nodes: + - 10.225.210.190 + - 10.225.210.189 + - 10.225.210.188 + ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJQakNCOGFBREFnRUNBaEIxYll2S1RmUkN0ci9jek5JSDIwdjVNQVVHQXl0bGNEQVFNUTR3REFZRFZRUUsKRXdWMFlXeHZjekFlRncweU5qQTBNVFl3T1RBeE1ERmFGdzB6TmpBME1UTXdPVEF4TURGYU1CQXhEakFNQmdOVgpCQW9UQlhSaGJHOXpNQ293QlFZREsyVndBeUVBbU9SN2sxYnhrYUtQMXU1ODl5QU9wTStRcS9MY00zVnVhajB3Cll0WlphbUtqWVRCZk1BNEdBMVVkRHdFQi93UUVBd0lDaERBZEJnTlZIU1VFRmpBVUJnZ3JCZ0VGQlFjREFRWUkKS3dZQkJRVUhBd0l3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVWUF4OWJhU1Rva2szZkRIdApMMVVaZy9rZVB4NHdCUVlESzJWd0EwRUFhbHoyajc1QmxLVFpoNVBtV1VlZWs4RXNvd3hiZ2NqVVpoNWpoYTVzCktNL2FRRmc5bm9lUmxKeUM4NUNQMU9BSmI1aTV1WGp2WisvdWR4RGh3ZitjQVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJLRENCMjZBREFnRUNBaEF0T1luRm1uRFpkMStqSWg2RWF3YjhNQVVHQXl0bGNEQVFNUTR3REFZRFZRUUsKRXdWMFlXeHZjekFlRncweU5qQTBNVFl3T1RBeE1ERmFGdzB5TnpBME1UWXdPVEF4TURGYU1CTXhFVEFQQmdOVgpCQW9UQ0c5ek9tRmtiV2x1TUNvd0JRWURLMlZ3QXlFQXBEalVJSTRma2lrUlltNTNqWUhmWGo3Z2VLR2c3Q1ZxCnhzMk5jL1M3MzRtalNEQkdNQTRHQTFVZER3RUIvd1FFQXdJSGdEQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0QKQWpBZkJnTlZIU01FR0RBV2dCUmdESDF0cEpPaVNUZDhNZTB2VlJtRCtSNC9IakFGQmdNclpYQURRUUN0eGs5RQovM1krQ29tN011WmRIUDV0cU5xLy9uZkZOUHppZmV6ak5nZXNWT1BXQ013U3ZJRStUa252VktNUVk4bUZlb2JECkplalFxa0dsdW9lRTVXOE0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + key: LS0tLS1CRUdJTiBFRDI1NTE5IFBSSVZBVEUgS0VZLS0tLS0KTUM0Q0FRQXdCUVlESzJWd0JDSUVJSkJpL2MzY1ZXMXduVnlTblVLeTRnYzNQVFkwQXVmQ21Dc2FMWS9BanBOVAotLS0tLUVORCBFRDI1NTE5IFBSSVZBVEUgS0VZLS0tLS0K diff --git a/webapp/.coverage b/webapp/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..d4e680ff6fe10436e6c01bfcfc0e76d2b27f2840 GIT binary patch literal 53248 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", methods = ["GET"]) +def FUN_delete_note(note_id): + if session.get("current_user", None) == match_user_id_with_note_id(note_id): # Ensure the current user is NOT operating on other users' note. + delete_note_from_db(note_id) + else: + return abort(401) + return(redirect(url_for("FUN_private"))) + + +# Reference: http://flask.pocoo.org/docs/0.12/patterns/fileuploads/ +ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif']) +def allowed_file(filename): + return '.' in filename and \ + filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS + +@app.route("/upload_image", methods = ['POST']) +def FUN_upload_image(): + if request.method == 'POST': + # check if the post request has the file part + if 'file' not in request.files: + flash('No file part', category='danger') + return(redirect(url_for("FUN_private"))) + file = request.files['file'] + # if user does not select file, browser also submit a empty part without filename + if file.filename == '': + flash('No selected file', category='danger') + return(redirect(url_for("FUN_private"))) + if file and allowed_file(file.filename): + filename = secure_filename(file.filename) + upload_time = str(datetime.datetime.now()) + image_uid = hashlib.sha1((upload_time + filename).encode()).hexdigest() + # Save the image into UPLOAD_FOLDER + file.save(os.path.join(app.config['UPLOAD_FOLDER'], image_uid + "-" + filename)) + # Record this uploading in database + image_upload_record(image_uid, session['current_user'], filename, upload_time) + return(redirect(url_for("FUN_private"))) + + return(redirect(url_for("FUN_private"))) + +@app.route("/delete_image/", methods = ["GET"]) +def FUN_delete_image(image_uid): + if session.get("current_user", None) == match_user_id_with_image_uid(image_uid): # Ensure the current user is NOT operating on other users' note. + # delete the corresponding record in database + delete_image_from_db(image_uid) + # delete the corresponding image file from image pool + image_to_delete_from_pool = [y for y in [x for x in os.listdir(app.config['UPLOAD_FOLDER'])] if y.split("-", 1)[0] == image_uid][0] + os.remove(os.path.join(app.config['UPLOAD_FOLDER'], image_to_delete_from_pool)) + else: + return abort(401) + return(redirect(url_for("FUN_private"))) + + + + + + +@app.route("/login", methods = ["POST"]) +def FUN_login(): + id_submitted = request.form.get("id").upper() + if (id_submitted in list_users()) and verify(id_submitted, request.form.get("pw")): + session['current_user'] = id_submitted + + return(redirect(url_for("FUN_root"))) + +@app.route("/logout/") +def FUN_logout(): + session.pop("current_user", None) + return(redirect(url_for("FUN_root"))) + +@app.route("/delete_user//", methods = ['GET']) +def FUN_delete_user(id): + if session.get("current_user", None) == "ADMIN": + if id == "ADMIN": # ADMIN account can't be deleted. + return abort(403) + + # [1] Delete this user's images in image pool + images_to_remove = [x[0] for x in list_images_for_user(id)] + for f in images_to_remove: + image_to_delete_from_pool = [y for y in [x for x in os.listdir(app.config['UPLOAD_FOLDER'])] if y.split("-", 1)[0] == f][0] + os.remove(os.path.join(app.config['UPLOAD_FOLDER'], image_to_delete_from_pool)) + # [2] Delele the records in database files + delete_user_from_db(id) + return(redirect(url_for("FUN_admin"))) + else: + return abort(401) + +@app.route("/add_user", methods = ["POST"]) +def FUN_add_user(): + if session.get("current_user", None) == "ADMIN": # only Admin should be able to add user. + # before we add the user, we need to ensure this is doesn't exsit in database. We also need to ensure the id is valid. + if request.form.get('id').upper() in list_users(): + user_list = list_users() + user_table = zip(range(1, len(user_list)+1),\ + user_list,\ + [x + y for x,y in zip(["/delete_user/"] * len(user_list), user_list)]) + return(render_template("admin.html", id_to_add_is_duplicated = True, users = user_table)) + if " " in request.form.get('id') or "'" in request.form.get('id'): + user_list = list_users() + user_table = zip(range(1, len(user_list)+1),\ + user_list,\ + [x + y for x,y in zip(["/delete_user/"] * len(user_list), user_list)]) + return(render_template("admin.html", id_to_add_is_invalid = True, users = user_table)) + else: + add_user(request.form.get('id'), request.form.get('pw')) + return(redirect(url_for("FUN_admin"))) + else: + return abort(401) + + + + + +if __name__ == "__main__": + app.run(debug=True, host="0.0.0.0") diff --git a/webapp/config.py b/webapp/config.py new file mode 100644 index 0000000..0c56836 --- /dev/null +++ b/webapp/config.py @@ -0,0 +1,16 @@ +import os + + +SECRET_KEY = "fdsafasd" +UPLOAD_FOLDER = "image_pool" +MAX_CONTENT_LENGTH = 16 * 1024 * 1024 + + +# Simple environment switch used by database.py +# Set ENVIRONMENT to 'production' or 'staging' to use Postgres. +ENVIRONMENT = os.environ.get("ENVIRONMENT", os.environ.get("APP_ENV", "development")).lower() +USE_POSTGRES = ENVIRONMENT in {"production", "staging"} + +# Optional: provide a full connection string like: +# postgresql://postgres:postgres@db:5432/postgres +DATABASE_URL = os.environ.get("DATABASE_URL", "") \ No newline at end of file diff --git a/webapp/coverage.xml b/webapp/coverage.xml new file mode 100644 index 0000000..9465316 --- /dev/null +++ b/webapp/coverage.xml @@ -0,0 +1,325 @@ + + + + + + C:\Users\Ermin Zec\exam\webapp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapp/database.py b/webapp/database.py new file mode 100644 index 0000000..15824f3 --- /dev/null +++ b/webapp/database.py @@ -0,0 +1,288 @@ +import datetime +import hashlib +import importlib +import os +import sqlite3 +from contextlib import contextmanager +from urllib.parse import urlparse +from config import USE_POSTGRES, DATABASE_URL +import config + + +user_db_file_location = "database_file/users.db" +note_db_file_location = "database_file/notes.db" +image_db_file_location = "database_file/images.db" + + +def _sha256_hex(value: str) -> str: + return hashlib.sha256(value.encode()).hexdigest() + + +def _is_postgres() -> bool: + return bool(getattr(config, "USE_POSTGRES", False)) + + +def _postgres_connect_kwargs() -> dict: + database_url = getattr(config, "DATABASE_URL", "") or os.environ.get("DATABASE_URL", "") + if not database_url: + raise RuntimeError( + "Postgres er aktivert (ENVIRONMENT=production/staging), men DATABASE_URL er ikke satt. " + "Sett DATABASE_URL f.eks. til: postgresql://postgres:postgres@db:5432/postgres" + ) + + parsed = urlparse(database_url) + return { + "host": parsed.hostname, + "port": parsed.port or 5432, + "dbname": (parsed.path or "/").lstrip("/") or "postgres", + "user": parsed.username or "postgres", + "password": parsed.password or "postgres", + } + + +def _pg_init_schema(conn) -> None: + with conn.cursor() as cur: + cur.execute( + """ + CREATE TABLE IF NOT EXISTS users ( + id TEXT PRIMARY KEY, + pw TEXT NOT NULL + ); + """ + ) + cur.execute( + """ + CREATE TABLE IF NOT EXISTS notes ( + user_id TEXT NOT NULL, + timestamp TEXT NOT NULL, + note TEXT NOT NULL, + note_id TEXT PRIMARY KEY + ); + """ + ) + cur.execute( + """ + CREATE TABLE IF NOT EXISTS images ( + uid TEXT PRIMARY KEY, + owner TEXT NOT NULL, + name TEXT NOT NULL, + timestamp TEXT NOT NULL + ); + """ + ) + + #if admin dont exist, create one with default password "adminadmin" + cur.execute( + """ + INSERT INTO users (id, pw) + VALUES (%s, %s) + ON CONFLICT (id) DO NOTHING; + """, + ("ADMIN", _sha256_hex("adminadmin")), + ) + conn.commit() + + +@contextmanager +def _pg_conn(): + psycopg2 = importlib.import_module("psycopg2") + conn = psycopg2.connect(**_postgres_connect_kwargs()) + try: + _pg_init_schema(conn) + yield conn + finally: + conn.close() + + +@contextmanager +def _sqlite_conn(db_path: str): + conn = sqlite3.connect(db_path) + try: + yield conn + finally: + conn.close() + + +@contextmanager +def _conn_for(operation: str): + # operation: 'users' | 'notes' | 'images' + if _is_postgres(): + with _pg_conn() as conn: + yield conn + return + + if operation == "users": + with _sqlite_conn(user_db_file_location) as conn: + yield conn + elif operation == "notes": + with _sqlite_conn(note_db_file_location) as conn: + yield conn + elif operation == "images": + with _sqlite_conn(image_db_file_location) as conn: + yield conn + else: + raise ValueError(f"Unknown operation: {operation}") + +def list_users(): + with _conn_for("users") as conn: + cur = conn.cursor() + cur.execute("SELECT id FROM users;") + rows = cur.fetchall() + return [x[0] for x in rows] + +def verify(id, pw): + with _conn_for("users") as conn: + cur = conn.cursor() + if _is_postgres(): + cur.execute("SELECT pw FROM users WHERE id = %s;", (id,)) + else: + cur.execute("SELECT pw FROM users WHERE id = ?;", (id,)) + row = cur.fetchone() + if not row: + return False + return row[0] == _sha256_hex(pw) + +def delete_user_from_db(id): + if _is_postgres(): + with _conn_for("users") as conn: + cur = conn.cursor() + cur.execute("DELETE FROM users WHERE id = %s;", (id,)) + cur.execute("DELETE FROM notes WHERE user_id = %s;", (id,)) + cur.execute("DELETE FROM images WHERE owner = %s;", (id,)) + conn.commit() + return + + with _conn_for("users") as conn: + cur = conn.cursor() + cur.execute("DELETE FROM users WHERE id = ?;", (id,)) + conn.commit() + + with _conn_for("notes") as conn: + cur = conn.cursor() + cur.execute("DELETE FROM notes WHERE user = ?;", (id,)) + conn.commit() + + with _conn_for("images") as conn: + cur = conn.cursor() + cur.execute("DELETE FROM images WHERE owner = ?;", (id,)) + conn.commit() + +def add_user(id, pw): + with _conn_for("users") as conn: + cur = conn.cursor() + if _is_postgres(): + cur.execute("INSERT INTO users values(%s, %s)", (id.upper(), _sha256_hex(pw))) + else: + cur.execute("INSERT INTO users values(?, ?)", (id.upper(), _sha256_hex(pw))) + conn.commit() + +def read_note_from_db(id): + with _conn_for("notes") as conn: + cur = conn.cursor() + if _is_postgres(): + cur.execute( + "SELECT note_id, timestamp, note FROM notes WHERE user_id = %s;", + (id.upper(),), + ) + else: + cur.execute( + "SELECT note_id, timestamp, note FROM notes WHERE user = ?;", + (id.upper(),), + ) + return cur.fetchall() + +def match_user_id_with_note_id(note_id): + # Given the note id, confirm if the current user is the owner of the note which is being operated. + with _conn_for("notes") as conn: + cur = conn.cursor() + if _is_postgres(): + cur.execute("SELECT user_id FROM notes WHERE note_id = %s;", (note_id,)) + else: + cur.execute("SELECT user FROM notes WHERE note_id = ?;", (note_id,)) + row = cur.fetchone() + return row[0] if row else None + +def write_note_into_db(id, note_to_write): + with _conn_for("notes") as conn: + cur = conn.cursor() + current_timestamp = str(datetime.datetime.now()) + note_id = hashlib.sha1((id.upper() + current_timestamp).encode()).hexdigest() + if _is_postgres(): + cur.execute( + "INSERT INTO notes values(%s, %s, %s, %s)", + (id.upper(), current_timestamp, note_to_write, note_id), + ) + else: + cur.execute( + "INSERT INTO notes values(?, ?, ?, ?)", + (id.upper(), current_timestamp, note_to_write, note_id), + ) + conn.commit() + +def delete_note_from_db(note_id): + with _conn_for("notes") as conn: + cur = conn.cursor() + if _is_postgres(): + cur.execute("DELETE FROM notes WHERE note_id = %s;", (note_id,)) + else: + cur.execute("DELETE FROM notes WHERE note_id = ?;", (note_id,)) + conn.commit() + +def image_upload_record(uid, owner, image_name, timestamp): + with _conn_for("images") as conn: + cur = conn.cursor() + if _is_postgres(): + cur.execute( + "INSERT INTO images VALUES (%s, %s, %s, %s)", + (uid, owner, image_name, timestamp), + ) + else: + cur.execute( + "INSERT INTO images VALUES (?, ?, ?, ?)", + (uid, owner, image_name, timestamp), + ) + conn.commit() + +def list_images_for_user(owner): + with _conn_for("images") as conn: + cur = conn.cursor() + if _is_postgres(): + cur.execute( + "SELECT uid, timestamp, name FROM images WHERE owner = %s", + (owner,), + ) + else: + cur.execute( + "SELECT uid, timestamp, name FROM images WHERE owner = ?", + (owner,), + ) + return cur.fetchall() + +def match_user_id_with_image_uid(image_uid): + # Given the note id, confirm if the current user is the owner of the note which is being operated. + with _conn_for("images") as conn: + cur = conn.cursor() + if _is_postgres(): + cur.execute("SELECT owner FROM images WHERE uid = %s;", (image_uid,)) + else: + cur.execute("SELECT owner FROM images WHERE uid = ?;", (image_uid,)) + row = cur.fetchone() + return row[0] if row else None + +def delete_image_from_db(image_uid): + with _conn_for("images") as conn: + cur = conn.cursor() + if _is_postgres(): + cur.execute("DELETE FROM images WHERE uid = %s;", (image_uid,)) + else: + cur.execute("DELETE FROM images WHERE uid = ?;", (image_uid,)) + conn.commit() + + + + + + + +if __name__ == "__main__": + print(list_users()) diff --git a/webapp/database_file/images.db b/webapp/database_file/images.db new file mode 100644 index 0000000000000000000000000000000000000000..8cd3d68df2b6533e004ed4801f2935479b94dc12 GIT binary patch literal 12288 zcmeI$O;6N77y#fd%YvFft;G1P~0zeyMb`? z=FjlvkMZEef59Kno3p!Oq9I|uVe(EpZD-oPee<-Jz6Y=O^TGtSH|WSBAl^f-RPvq& zf#-Sau9scEZY6gxe?4&f@%Xm3?p1$$T=KtrbH4U`?SHxL1~?A_AOHd&00JNY0w4ea zAOHd&00RH3fGI7muC0|mY!otUo4g~B&2YM%+j&z@8}*=(zSyq^)4AZuDAz$@E{b5( z&Cf<=E9jkf&0sRM6?A3C{5mZ1ju{rR)1Qo=Zq6;NK3gk!c~_f@;aS`L*SF-T=uO70 zY48@F?#KW2_r{(}u9uguJpa@3mA|(fE{98B$MeuY00ck)1V8`;KmY_l00ck)1n!)` z;Xw8GMpq@F(H|>2{M*Y!jU!!K}rci zn2KW;eiBy=@_td>Imx?bc=H1g4Ml_#5jotWmF<*EYKXQbW<+3(5MxpqL?z`+Tgo#_ zGMvQ`|DFF(4SMbN4au`wLc^FuJVr<5O7qcnYF$jFkmQ-difGJ~+bR`Xl~~JA#v@9F z;8~-7(6DVed|&MkdZ$JeVZZwa4XP!q7AGM~1Wuy2^X@G?PE}?yMOem-lTWB-QDhYn zlx7*@TE@!6+zLt4-Isf>CgJ}M>%>_N#UUj~VDzr!k|rsUR%$6DNt8?5TC1pbZ$v1G z1)-T>6d9}%I!?MHwW*%x#Yy$X_^1|(8WthKoTK=G6EFLhp8w7N>|aioJNJb{LLdMF zAOHd&00JNY0w4eaAOHd&@b3a!8q#8~||1S37PH-}P!3H)IIM7Ig%EisVg|>FVHSDK`i_Lh8LqaX7Ar^g&41OMCBKOBFr*V1`mc7Xs0fB*=900@8p2!H?x{Qm?V4_1fS@MLF)Vj>^nurWmG z80)bR374ssYEemTWS+9rV4M?Y6}G}@kEs*R+f<|l^J(D)56yE~c3WkPB~(h4@}p^4 zqp%rNUlfI_Ykx5d^QF2;nD@eKE@;ZMrNTIta$%{Ljwvs5U08~ZW%<*M5b@SYmfeh) zj0GDDo)9f{O56GbCyrBXIHxuzTsz4r4l)1wmg-0n$`g#IW@=cP z7er#lxDehunRBeIN*R-qDXcluL^$V7sP2bs^S0>t>2P%`o17d?4v%hzPRFe`OBg2M z1^@VT^UBJjZtB?syxzYu8 zL35FukK##kny`!v>Hoo%CibXkUw8*>&W+*8-h&5=1Z_+&|dMzP{VL&hCBK P8^zrhf|U^a+VSpRjKnY# literal 0 HcmV?d00001 diff --git a/webapp/database_file/users.db b/webapp/database_file/users.db new file mode 100644 index 0000000000000000000000000000000000000000..ce5a1a1fbd9ed5c5a6865bfc7e89e73f5572de8c GIT binary patch literal 12288 zcmeI$Pmdcl6aes#5LTUxctmfcje z$4EWESKxzG@FDmFT)0)-I06@NvRa8tKR{P+Mjm@Smgl|SBnSKP*AGwExi9AzXSnWl z^KsL*&6j=OG|j4(VJ+9kt=bq}-_*MOU;ACnRrC4ZKTNy7nnCxv>0WogzH1=&vj7XQ z01L1H3$OqSumB6N01L3dO&2(7$Fte2JzrydmS0@vi_6_*aPZCH{P?gxp6@?A>~~%L zr>Ci3=a=jL`NioOUcBm`=2xHf&%fVw-oHN>&%T(o&FQx(zr6hJSzXzm;EVP7?*3#q z!-?Eg+jae9>pJazscZ9lZFkn)`{=iN{y6=2`eyp(rkitqEWiRRzyd750xZA+EWiRR z@LmWkkM>4)Hq!_5xhuMO5fmklwvbSebs&uvbrPunU@DH#r7ToXCKf44Sf9Ylpc2@l z$<;&)7aKKNJ%NLin`LMjUqJ`$31+34!F+(x8D@L9R& zi>8=jP{KQlj&xEHg9%`>ah8apaL$lZl*#ClXgMC;-As=UA0LMTE(wqThJ121peh+r zkhPeEtf|Ffii|3X2&$$oZE_@S6h#OW(EZ%}w3!|(AB;w~H`6BzprRCLOfDCJS~(|d zh(-c>UBLLDH7Kn!Dl(ChCRwZ`9g5VLeT{5*9T}wHLe9ly!a7a`)aa@!i0r^o5u}Sv z7Qtbu`J+@q2@0ydn_R6|gVAg=oiDyxJpyvUyKJL1QkWWi%0WO(Cgoi7DN#C)fuM$1 zql$naiz^DFF@QnB_IG+z=OPRqq*V1~G1f0wkd&5DS2Uf-B=k_zE+CC3lf8-og!f>v zU=N$2OJ~|umB6N01L1H3$OqSumB6N01Mn~fyoEM zJ8j+n*}JM2lgaRIyWKn)*Y*4-2g}u?@$h!Lzkh36Jz0#d9}hnq&f47u#GnF==cE4s D3}@=V literal 0 HcmV?d00001 diff --git a/webapp/image_pool/3afadaa2a3cbc1fffc6d8229ca1936b9760e1c56-made-with-flask.png b/webapp/image_pool/3afadaa2a3cbc1fffc6d8229ca1936b9760e1c56-made-with-flask.png new file mode 100644 index 0000000000000000000000000000000000000000..ac546db3b2cbfa14696c6e9c40535c2495a631e9 GIT binary patch literal 2196 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

=Qfc`p=dH`I<~}jGa#?TX>hd74arH~ zP@wyF8x$UaR)$q>s7t&2S=TBmJYw`PkQW^LwE5}&+b}q0AUm?|#gt@ksvUp;jGMtJ z7i^aN*}A+_J#v?pgCK)Yc*9VNm7joT+Ri#_H{ao(>^g;JBnEiqXLqw=A1T_{Ar9bZ z1Tdg!miO4?**@j*a!ARB(D8llENV;b`Rs|K2NYtt=)4nJ3o4^+K2%K!jPgE$FmLRX zp(;^XP4Ni_{bQzwxv}yJ4SJyU>6XF)d|drfKbPAtBiM-_DZsL?a*_vbJq_2pMQa0J z(kFHV`G8Fi7Ny23RNQd#3OA-N!t^xas=_eVmZ1TWzjuUH%E-zAXE%-0vhVk^`eidj zaDI0DBLcChoQd3HGw#+F1Ri(s<+0HYKR+hD_+->m;t2xp&1>!)yZKpCT+U;3EVIO_K&E83Y< ze~T7)oimkIWBbf0zD#F*Kid+`qve3ga*(7R_ig#qzzWvFBS=eu^>C%XV5WWHhLW7%o?tZ3?RK_z-SeHVg| zZs{@?m~=1MCK=LYvQmc{pV19BhC^`2nnKKqoFlaQRMvqS14doZ{zLJHk!gIGP?#8( zsq^ZElVnS>_@?r|FlW4;@LA^(b+0p(i_Z*T6oOHeqliClUby=KF=fZYPoUd`6FoJq85<5kh{=s< zU?Nw|3Hr5NQmGZKzf1Wm?2)|=HVMLYgWMwyOgHza$Zm~&*js#J(&l2_M!hmH-p7?b z{5f>|Inr-6E=qSl<|DKI@-gwNkd=xAH~kcxB%a-4kdU(TZRI6%!ah{vvsGyQEn@bL zO0n@Vx;`@b5Tk~S>_MT^Gm!r3vr<9+BkJqFJb^ZpOKo1|j6R2_@QN#$MnL>6eN^hIE$f zk^M`xTN%1>;%|88hb}Y*H?o}Ra&h0V;RU2TMlf_0q%YGgm4ERuVc!U@!^NCng?0%g zKR1jjdU>M=f9kCA?3VHLPW{HKq9lR6BNpZKs)-kOcr>`8Z=bzRJ#<%pqPkNkG$Rt< z=Bsdg8`^u5vp|n0mkeB<+k0%o*$qKqh;adNBaH5HLFHFP-6AHfoV?sAlqWs6p~Y0D zTeRwdfBNl@BBUa_STbD~EJRzv8JG|Zc6uXJE!zEC!a$4px}^mOwsH(gji_7Y!ZP?P zK>O$$8tQW0Tb2Ep{;}wrCE1GXRd{Bwb1!hm>u}Q`zmYZThdRJ8_8nzPwGug|qP-n@ z9iV?JqX0)?cC zG2$`tYY_Z&Gvlr!n&B(md$$hC7q$^g3dlNfNUy=w7Ud++8;U}%ToUC!4h*o%5_J)c zswXC`Ew3Wt;113sw&udC&rqu&e9h_j-h!Uu5nfv zIU1)H^J85FF2-j|eCaZ1UQ^00{@jhPx(lqt{$ZtnHtU8KFf{u1iYTc-i?NDs!#5LG zq~-zfVw(A*72QI57%^q#Ln~yo!{9FnmfaTkY~{U>k5u3TPl~rE>PlYyxV7V^D9OqR z)sEAuY~3LS49=f?Xrvh~wNh%wIsWJLhipxa(TklzkFT=|&%}(Z(Z1m=G=7|2)9Ix0 zEFT*-S)Tb-jthHzQHbS=)j<|&S2-+ty>_*2L5ZKjo-KpM^u(h5SM;>TDS{}HS=fBO z|5TQjh(>_I9&}eV7{$WyArYtX(UX46Il=K7M)g6Ai!koPJ55lv;*5j(Ld*F{@8r4>!`osaoGnV9EGpXtjACVhn&NZ(v%H>ZoB>Y-1LbWlj~&5nc~N{B zDv+@tcXU_>0{?#FViAV{^nf$rxDB`_;SC6riA=uxc*1JJi>)0ZAAHm}ZFAip`%vgr z5fuA;D;K@62YnhB>oK881;LuuEpC%-E_i&B@~p-d_TeN_cFvhXcC>GpNBT+&+C96AMVEct`jmuL2doAgdCi<9v@LT+M^( z#VT%*9)8cOdPKw}W&_Il-r|)Wc(-1zCU}`bYsL7AS&fi7kpGPQ3@75 zL@+5`MF|%Au0h{jwEvWMxT=w0uw5(M^GUttwm=QTN3}tu_ZZTM`;Re+I$6@q>p z-wPb=O6jG!djsNPgSyn${6>iq>6Uin4mxCt_41Ne2m zb29*+pdqEw#jp{1G_(-n3Gp7c?(lG^kh;}=!+S^VZ6W^95bVmc0+I48i61Ev+>TMJ z{7_?98m}s(B%CemcM}|->AS(X3Z+{4c)@iNek)z{5}5#yXqG;v_|RvPolf}rvDO=j zId!?KggjMG=fx)KCSI@1KkaSBR>c6))4sf9Ibdqw0|)ySMZ3uH%lI2x!@ zeSD3fC1LBh9h8Ija^w@sn_?2>c!DuIRe57GdFc05Ao<-2Q%NkT#AXjFb> zunP@ z5dlYHqbXqPybYC{lz0u*-*$LbfBcu#u?RA{gMCOX6gi_#yDKM0}p&zB8b!yRMA-<*XfAZ!yst;~A9)&2A~h2Q~kyxCr({ zPnTY@9}-WTDlDkB6}WyVssz+7=Sx~brv3_dwpa%_IQ*y(dBqFT%{{gs>aYFC7~^|H zvP_kzo_x1rRU~-HOaE^0Jtqr-`gq?~lX(kd@{UlW)3qFYtbeJy6*w@Z40jwwUC0zC zXjK6u6ecQN(b^F=;w=8UTTij7;3p)Qpf2L`w*e%SE}JPGfXOa!!q$X-Fwx7h=^fpH zynxP!Q^DadBM)1T^&VdARtt5Kh%`?3jp3!U-*z@XQlhP`lB|Ll<>>32Q8`H@b*NqUY&B=xMQUvg7~Ob-yyC6U}RT!xul;zw|oa?Q(R?v>rM;Z z$5OYxUgg}w3>3SmMCoPFvbPpf>^69IH3YB<0d#ce1S)v^viM7s+zbKT+FwzFb>bC; zjMkmCTN-^zCQ_vw5nWvB1MlkVeMK)z%pYOv`)tx0iwA`w?V0$vF34#Y>x*`%rgYu~ zrU~6-VUTm4E^49fgI9%SZJ$P=P(h+s+WQ07(YG&oaSCMKuGSrL(!I>PxutAP!HlTH zy#UGR|4t{n+kkG~yW-0#aF9(c|It2#wYFQjd+k|+THzTNNAarISf>Jvnilge`qD=+ zb^yILj@Rn3v?K;jNL5%6CM7#_iZ6fiP)g4tlEo)e@7ghy>20ZwF%<8H-bPT(L%v)A zwDGbKI$5N&85^-8MCCiCH z#JCFU#AREQyj?W%C~9cTDBu10#=Ei3uVIzK*7q@RAgFS{U(1&z6zCpL)Q#A1&aWqS zsSz^})?1^ui$Q#af+`<(h(KKWy|UOn-u$Q!DsPX73uysbb|C;z53i4QY?TX3dZ_|P zlvR-Kb$GRsi{_pDbSAxQ*LQ4qhh$e#{RX_dsA48(x2<|*{TjXXdMmo6Z03wN>OI6N zxpqn_Do*ku#{_H4Q7wm z8H=DPI7zyQWeUr${2~q_NoL&4V{e&vu9pV;{C7>A>c?2!VIgRij%tLD{e2iw2W^W(-;oZjlBKydnI)hY|w-y-o#$?eoz3yo5-V<`cE zzAU3GsDfDd6&v)eWq2`s4vSbhUeu|d;t~G%ibMA zSfYB;XAh|s+~b~Pcc~vaWkdMjr{jnm6Eb6;w|PTcTdF$#4w5*Q0BE|c17af@^VXp0 zW>p|+S|PPLu?%}JGh;p?|0d`Jns_YX_1OZftAp0@U3(>E&yb`JX<`iMTW5Cj(wG_-?O?UCg zsP)CNxJs2-w~BDVBb4@q!5>9xy_nS@ZY!{(~?>9`>3PxCv*vB4+l?VuUz-gP%3U*l6Lf zA^o%@H#PIkXDiXz%|Ttzw8bMY)JA#s2&_Ecd;?Pt?&DCleqXBPsujd}q+y$MnQ0L+k8cGQoQsc<>HH@PH98 z#m82WY<|hLYS)c3CMQ%#?G%;n-Mu1KM0()$GLXIn#Zb-XhnlgX>Ix+XDD2yxOQubx zs!E=9-+)h;O!Yz~pE8#GkBM(wFZxB&&mD;rQnDgM4*>OddbSlnUf$Yk-oZ%i20g$~ zwpIZ_k(dKXV8g$&-HOVViONIIhUkydd~iy4v8J^@!?0Hyi+Un`A8UwNi}Z;a88Ghg zo3p&9hXYD5RiV{^Szav<@HKKX`;po^*nFBA+%c|S25MsZy)j%qkZ_`}V%wPA29@9| zz881dgLKPWW+xSI{=_h0lhqHH25HjzDL>BwTyA{7`@71>sATVMhBRz)lf!AOPVwpL z6l&~dk+p>D?_^AgdD-yP4ziMzPd>L|s;2$oh`yU4M@k_r85oy)t)YXM3jwdvTt^7wg-VE_WVbaU>Fshz7gV> zBdG1^E09TV_8O0cPN!Wvi}6YKfIW;DClbGfV%RU;tGn}v(ho(02uLk{CNRI+0^OCL z$<{pWtvu_AEQp*nA5m`xy&(KGPCDki;z6Im<>i_r0h%it30q9(kD$A#pUR~+t#U?; zmGpjT9(67cA=?Na!^^3@(_y4G74`N_tFY6G_7Ca!;+4dcz-H=W5GWmahX~rG_xUM( ze#uY4LsU@rUP=5Rc>Ga7*h-c|1-Q8a8(c--OLs2%cIppT33akkj-(q#S@z?&OF{-)&}2@?sj2kO~V$SIy9`m4aV z1!}sLQrkH-_*#LPWG#^Ll|dV8FTMCC*VH}^IHAy4rP|-W9)v4k@Yc-W<3t^=L41!L zQ}&Ick3-Fk>FvkFXMP=jicxKP{y-rs5deq>?NQtk%b?(8VL&B z;@`4(1&Bce3fKvmZTd3--6=>AqU{SQLK<-E{%vgseCZ z2kM~Xxea!{SEFJCxRhrNIZ3LY$@01=U?kf0MBM3n*qQYaqAXn@Ih~~3h8008$7AUq zEozMAW>y8AS(hI+sa#zX+aPW`OM(e|5M#yeXsLfrPj!md*&#i`ODPLc0!$;W3)ds;yDKS|s{x8e)CN60 zMov$oj0Rj>j8)n*-4@gm9X@K%bK_z+2JIpaR@0sMtpr=R=0rLKmjNl;Q8gn1LRm&W zY?)zFL$yn-N7n3rxyCypl3v+19a$#eV~DH|++1J^@@b>nY3_2<+#`ChFdgH{c&B$08O z0OU7dHoku#%nNjTdI;G^h!mJ{2p=RBBpLK;koP(p>#)HL`dx$=j3yTiH^7>O*eH2m z{K>T=-*D_mgt%+`0tEU5pct=k?gmgy99mCLDcbJ=GV0?uLHi9Ne*Ody-Vv+?)G0vk z?U3Js+}TIyTX=y=qP>MDG*>%SBju6d*+gGB*LtLBCS2M))x*F z>2>io_l3G;_3mO*qJ3E$jPEWK+Wpm-9Tm~!?EHxQVDE&~a{r^i0>nI!!GIX6SNXQu zF3jIoI!e##94-e=wbjy;tm3>|UX_dd3ai-*YcLWeYi0%)}Y_ zMv3x9)Sy`x5GrS%)8Cw4V~-ERyV)aSq9z&MM|uPW_|sAJ7&iQd-Xv!Rl56k8tf1KI@RmG`Wr=tbDXhcs)nR)#t&cU9! zlAb}Cud#Y`dX~8^b}p*U~@5U%IPbx_Nx7M;8{M7BusRtIO|T@uxfM zR@AI^Eb$am_4B<7kg>Ps2knvF!N;&?0I&r`!~j9$gtbJ#AWlEi#>j2~m0(I3*k z!i(>9I=&!GFDGhmU7iMc06Q}c@mf3|r0I!Q$yV7eElf|UR@XEZsHiAg1#!0C@omK%=^zzWdjhR1KW$9R8)4~c7w2~aFS?} z6~S}BCx-x2`-R;^{Zcq?aG3R@{=6GKJg#;;vG46t`o@C}C7h5Fv84Oh zDu?f6s9toD_RUUKg>;LQa3Maf5F75s<^YryV%%=M3@}8V(;>TZFifZ<9 zHbC%}ww2uUM_9y~+O74;XR;1xhwToMkIi_!NUMGyjJy)>%$<(*Inew&+noIps%$|j zq@wO%trmn+Bb%D5PX3nD|I5q?1RTYYQ9Ij0i}R0*B&AzEJ*B`ty&&oljAZ>Xf6i_1 zN1KI@!fX_}oRN1OOl6mX5-v=LyDNbg%Ad=Ry`{Im30whkbt`y%Oeg^_SJ`^!bhV;h zcFb*s8UL=kZ!u?yD${Wsn@d+wbJXz|){3%4x^NEPQ`LBZZKBqq*6>6VcTu|13E3QV z;FFL$h9#(0KWN@l_W03CZY9+;=r}T3RdX%|9VtAc>(Tv^CtDN#UGtQ4-vKL$!r^^v zae7@y_`@rFV-;8s5F~mjwCH8SG6StWKxL=DK*( ze20@uYsZ@*2_IVf;`d4MH);<9D_VN2J}-*;w`XXQ@)u1~Qa{VGcd@T8PF#laTM6~r z8ddmSnVH|mYn)CFb=cK6m54`yx5ch;Oj8%U(Wlt(A+}T2y*GaxQ>aoZl`B1lEc`m7 zK3)$?@3P_t_GzaaF*mER-Sf8=>f-xfDZfhk;nt%LMy;C!;9`$qVYn&rPO!P!{2SYw zy@I`wJqQP+j~*->?xU|yaa6=VFzy)*^NaRqUKHMgWUY=$?Gu$zwIn%5qrTve$()SI zKQ{=ZAUu`zVa~P3LpC`}JSq><5qHbs{By!&DI9?K^MD2Cd2b|o<%|pZP0oiO&>|r0 zO>5W*^k}gfn&)h^W4ibMk?(;H82Ixa4)}gLfmb>!G49X)NM}*Ni8k<;nX=&OT8s+> zx8U{JT8#SZ%$9Ktb|Rg!v5vs|yEoPCQ;sm80X~IiMixcp3g(#V+TaYHPR2(a>Z1>m zo$sV)qL*e%Kdn%g3Zjut5jrnWFuCS5hBOEs6O;Q;ZB?JMegz&EE1&A)Gf-{rtJhOVlD3I!xXExlO2Lopah9C931(}j)DWZxD@879d$1s{bH~~JZTi)e@dwPq{g%+1a z;ZRrZ{`&={&Q$F(pi6EAqpeWvQlO#4IQpeN}8lvtg2 zi3&ZFhzaQSPPV|IfDr+_Saua4kPyssgOVzZCI+=Vb7&Ya5Ivv%d%|1J_^+E$E}I4# zW&}-kDk_*BgtG>{-9v5JL5H4VNo}cgF8H#MgB#k1l#*)##Jt=G1(%6MVbDzSs7poU zF8UQ%hbQ=j@>21hBJR4v$J#xar#6a2S>3l(xIA&5HuMs>eV9i%JLo`|Owqe-&9!@0 zL+DFAxNiHWB{HSD=hqz^)X)Za@)DYdJSBN1zc|SDyrxFfOgxxkh{1c|105!t_%@Eu z;^yiSRs(+7D&KnRKlj+v0y4)8b?P*6RPqop%SWgQxi!8~uhvICiM-1c)RR$EZ+%+_ zQiRDmBql+b5w)7yQjZETbJ!!b^SZs={`%CR=k8@bDs{R)E7#bRU5U59Kl<+A$=pKt zh8;cPFz2#$5;vy5(8(h2bH(h%9;hqm)4jo{+UGqF*zOQ}%vYkw0;-d$RP>fb>(?rl zvX(Yd(q`1eXw$_|07u=deO`%7kx5il5nL}6u1Vin%BKVt z;(Cm#%+WTbMm>`BpX0TRCMpdr8{imU52OVo=D& z&uur#f)*6OZH>YNO*+(M=E3s`tCi6n1*f1vk>1Oyi<-Zxa<^gIY(LCg{c>ztOtI?m z`SRk#(GT!S6w>2ddA(^d2}qb6b%;V)>zSKZ@(D=oHzWT4ga!cq;MLsI9gnXH^%~I6 zT7-B*t@v_)hDPl#n!uF0P8x98@J|cYmPXGM2uYoWqB2LPg~}`Ts^KkDqt^ryUVM2q z*__zhj%^EA3AHBG+d*nMOA($qW1Te*UieW!@c1P(VKCmDDs*8p*U}LBk9*~0a)lr2 zxY|sPI_~@amCR{qo|4<4ROW>rxX65?fzQO-aoY$FWJS+-V5GX$s_groE?PS0V!ayf z9Y($?=ORLBNuy)e`kq{#bqwTOk}nXhEon#t@(*~HqIScBnQs{`%mz9(58>sthyx(Y z5*^@V<^v4uH>@PSLaEZKO9IqZfnRbydTCUEU!5nLV-#`bj7zD)n0jld{bTV)9_lD2FHnAtjDGIeeEGH4g*YnX-lrCRo7Fb ziMkq|)8CUHp26T}RP06ftX%|h7Ju0Ftr?RhuAb`Bz ze|EjZW9p~L=a=!lV`hjBv;a71pS)`dIb`0wU#xy2PK>v^9zmy1j|ZGJpuy(2Li?w= z<5)E=I~&N5Bk;Iyh!v~*Zg|2_`qpk~W@LBPQb753@AFWENUs{b4?k468Ndoc{&y&= zoSFcAo9&Y?5Ma5SB-Q&fFX73dFFA?A(Mo5lpGQhCYvP($D=Z+j3okw{Ui9Exg<-q9 zqZRmD59JA8-5_bcT7QtMnL7wO#KSt+Ug2dxNEqK2z4=pq|6pu4zC|YQ9#QtMx%;6> z&_XRCx5Xa}HMyXd(6)5>)Ra_;`q}EgBQJ|xU7LX6GD<{l)w?=!Ce)=w4fn$oKMBv( z8dwrt`s|BL;R5Nsxp1S#Nbbm4n0|1!srGTwdYYX z@rF}s4Ydny&ZkdzMUc7MebwDC+z?x>!KFLPG7Dy4R&|-qC_^c@clSzj!|5(Fl90GR zO?!^}CxKzLXL(pP4!bju%bS{Drv^e#S?s3&>v$s2Kij`~hOYi0->iO#esHq0AHT{6 z0Bxz|0IKpV1zLzl*3WqMTngUiO#oBG!pqX$TbWzX{m4pb@8Va){Ht}=+82?C!CSYR z{GX)9l0mZ0OQHd%0a%|QfMr*Kl{EJ$3qe@q;-4!OtBPSyr^+ZUeeq=t=6m>^Y_B5y zeysYYSJDvq;Ss>u>G3lXJg`N{Z}vvm3rZa>d0rY%9Y5ud>Po|d)1(rjo zhb=(&Hbb~pHux>3l+*~=M;z;xmo_d^r}~eiY>%G_4y&>35~Hq`=LuSN&65jXr*1Q} z->-uRcy!sTK7!kE_D2sK6qDJ+XkK3Xj~Pe4V2TWQVd5TcBHo;xXRF{0 z)56~MN~}}DHTnkDkRvYF>e7ZS^@Yc7%{Kt={505gArlTgMQsTL8m!xkWYue|Uuq&s z)YZ%7+SmRLEx@;Q)RE&cvjwmhE=*DT@i$O_>iO~dCV`XsKZU0~PR&dDuh|}?hT@no zpfPwaZ*u3C8#C7a(#IvXX}wV@krkBUOzSv|4Z90<>61;liY8RR)S{_vW-CAJ};}bftXB*sW{TrADr!cqyKJ&F)o#%;Z_?s5oHBf%ET}+ssTy zo_b0T>tO1x&v;=0x0*ST2(pNsP=HijN8!i7*aVCsK8(#fIa(4xjaSeP>1dvbh?haj zHyjTFKEgcN3zKK+SoQ*0qPP%3R>Twgu`+LU5R4vnd9Sx8R96mnUzXlHaE;=B1z|Jq zOmC7|AskH+)4bs=z=R3orY;ZR>fLqpszR)c-X9L9c8hh^oEf=4fSscr3iS?c*^w<;z|6~u-6_tj{#OgNMr@mD*1XI!f z1RQKFKG>i$^?;tW71rx`$*@1DSYvQC*bRYv-9H>Uq*zMcQ_?(O;@o*e?}77c!>09} z$(B#+U`y^ryyd|cVOZvNbRWtjxU>`Be+u!P!uX*y#EzYWjUWajng_dY4G@Q&Kei1p z*AP+AC{l+nN1-46o;2ghgSk5QtKqTE)O`(-%(vJv>e#ajC;|N$BxKvE%I=b`*@7$M zy(W2+f}N{|p^D5;@2+nPxLq_b^#a{`(w{?gD|*)P7lkC_Os>|hR));oyb zlD}Fu49;G~KR{P?R}{t^BXaXI=Omn0GwiU|-A;c|&jVngq zJwCJ{)&IxP(#uShayW#!-S z-M%}5{}YSEFl>NWu~X^2K~|%wT8`D^+HcemOTZ6!x1$#uyp!20Mj*6(&4|1` z0dQv9D^qS}I;NU^JOpV9FCU0%_V=f5=SsY+G4opI7so0525)T+yojm4L-_8@Uf%rA zh4xGsh2eL6%Rz${JpY9r`fO(cdop0=Dr~jKhxjm$&ao0vv zPeCA?9mbmj?>US+Q`+g>F>r=Q%DCZe#^~zHkS9;N0KX>Y`1}3MW?tOH$5TJ;c2`0v z1x5l@U%xQY=Kg|1O{vk=-0V{cRpXaDg(6&=t|3B#yiGx+tko~iNJ<@%C_5z4i4 zH`q%ri=Dspf@{rh`T+X-J^epn87{rB`@;4qqt7T0CFIs7W@G^e_xAz8Wlu<&r}iNI zoz8r5dN+Z*m6%F#c(4AIb(SacoGc@O36C78<&A~$Lq;f&MRw0=`j}{J3WGzaA9hn-)FY^ z4m)PS-PrX~z!@u-D~f_yErG?{#0$irrCLHC#m~# zdK2qNGsX&4G#{COpXsJwRL>Bf08&oIZ-vwAyHJD9-nXWRF?r*d@BEIQuTn+Z>qsAy z7Kg=Z1$&dFr;z&Sv@l4PE9unJ9ZdU(=L zr|wsl9CDo`s?}C%0|juSW?xig&N^PdxFEvDFT6O`g)3_}7B_NEw#b-}Jh71-_Cr9a z5z7!9$lC~{8@6++;#4tl*tlfI3t^Hd)Mbd-0G;*GceHiY2QbXQ*FN;Q@a32rPfZEEQvVT~74N%0rs6%Unf)U`XVW7`h)S z^Pu{jW7Bj%BMq=V{$&Iek6~N}Kj?X$8zFZ1+hC=*fD_OjoancmjFKJ{3x0c`S$~}P zY6VGPH5c@maT;(*-FA8}HU7rw>%OAHQ(GLTw<08{%miGS@4q4PpZInXa>MK5Yw*IC zrHoTxK%Q|m+e-M=e&{&Z+Q@}w9E&lTAW8%Gka9!CoQ*of{vq+thNws44Al@AJ8=c~mm z`%slxbdYrpWDYIeby*sw>0X_w=M4T8sw2=ZN{`)RA8D*Yl;Xca+jbbv5DFIvK0T$} zaSWWOnb$Ga9TLq=1hBRRYjM52mG*g3(tTRjKL!TCQChdXI#Z9*`gQlw<1N3?*Etr4 zmy+5ofeW)B+k)VrX;m_li!m&K3#c})ZJpQ`tAi({ht2W^e@Xy0;wCjWb04(ulY=?> z6;N-Kyty_lo0lY7!FLME!-FD#>j9 z)bqGUKZ|Zr{>dTf4~5B|<=6}L`;T1h-B+w|^1@$+*3(BgL_|((z4i0YKOaot5#``G zwB=4DxqUXijJMJI)!nkC(xnzwfbCRD<8)o-xWQF@_4eu>cIlW+8vUM@g1tUZ{Zf+S z{4?E|B*baf{R&C(MGYXdtY2ogUdx%d^alssbsR z=9^qkm;_$tR`hW}>8&bmJgem+pvuR=@D5w9dsgkc4s!Iw?w*GDNU~xaF&kHXC z*v%*gT93$|Sg&kWlygCd0EB!+sx0D$ zJJ$>=cY0enh*{Qe_mic84q81=xMz{%6Agjczm#m<761il6<&F2W2e`?6g<_X{Ct!PyixSOeuy7|9Yloh;@ z;wVSohRP#yh^U{`m=zL*H^#VFb_J*>FSQ{V{xv;nsUx)(YZA+o=yD)rJKUJuaZEl$ zg&72hKet=SBMH;CP*Z!rZMa&LNTA11%<=K5i+4>aBUHUI*ep5BX7gk?{>h|nP6=%G zt<`>sE@8NlweTi@cJd)W#`gZ28{#ukV#4w#1#*I1j2M$-&m+aP8U&>u=m(vOt4It* zSg}tqSh_+DroDQI(2*eW1E37o=X`r?FI|p3&~yAxLGptHy+XKtUnT{f{EJZ2IrG;B z>?-WV6Rtw^0vPYkDo*P1&+-?3-f@Q zr9{{Lq{?+aHkJHsBQ}|5oMfdcJSRQ5+S)W>43D;|9K7}U} zNU9HOFfNzxpLaz6Cd7;P=(=teIiWu)JN6YSMe8wys_o3J4)LH-hpzDw;|@KpgCqNi z?fLR&g^2>euLLse{2PXaF~&lH$7HHOw<)NpJDF6%X&bTvN?_%EK@V!e8o4P}?S5KI zh4R`w!TnES82sTn^r48sfK9T7M)?ndSbgPY=dJ&qStWsm$vt0X+vuaulm=8TF^75h zT_J3sk@a!Wl;Tyg;>-GoG+_Fzxkz2Vl zbsfFa42Wju92&e_&8W&)JCmidm$N&s&C-yqBr}fndbnPz$;XaEPog*U-MD?`Xf71c z8~*Dia{DsH?FIW@5+1A3*i3=q{DTx~K0cfy*ltQWB{&LK-&}BY(L$`l>?5fh8<+=g z;DEd>c|$^qYAHvzL~_ZBxySzochtSF`XZZ3Bi3iU-Z3@E(&+KW;4&^EeqAuaR9>dMfpWg}N z3-O7^S*xK)Zh~GBoVaw?g1u7>gCF(c$_Jfq?1b$EdK?%StpPXex{n;V@EjVJ$?Ly6)qDW#|3C}hV8pM(59EKKB2~9Zjb59$W@Io9zgKnobKQu8pGV2?Z2-dS53|IVqv_y>QT5ap` zPy|qn@I;YiRokq!B#+&(cGRWUB3ijRb%#Y=PZ7YhD<{+0p)o`tU?)=s9R~Bw5l(q9 z|AcC{_FQ7SeBU+NbUiP$jb0KmrB^|V6P$yn zP>|(j6-)ZZ)9~INot-%5!Ki;=Z6lnl_sKFRj3MVz76O&TSwY;Yyu`h}v?Ie`9S5?*0 z_{~~Kf!0UAjkiDF)aa(_{lS=OuAi5hJms(fue@BfXl+G3MPhI<3VoQ~SQ>NP$zjT} z>e?lJK>RSWny;0#nqMxZhChPq`%E@bu?`~h2c-MM`NtO%xB;`P_^Ue8(bL*_BLo_J ztI_rQBiMvmE4y6tG}pl0$D+D`po`r&YK6%xw4eY;J4pXl7kGex4>bE<5U?@=diY>f zZ?N*v#oGjP@O+Qu=d}CbGr{&$?$cd@5uBTcuKB}{z5NjeWi3c{c&QGZm}`?u$izT- zOQabDb)HU`^+3|eeiW^PZM$M)3GrD<<%Y$%a_zVb@J7RehTSaJY%XY8D1_)2sWbJ^ z`$(cn>B6W(wXRiuOOCp@V;H)D^_rF6%#$B${>Wj!yRs`R@ngO}G2^@UCaz$ zR_)NCb4AhG!E})XH>sQpfP$Fbtfs6e{%Hf!tYdTui-eG(3ro$j`@14!Q6ZJm)<&R? z`xvgTr#88)*ey>Iz;JTUk_cc^lc;Z7sNacE;J*|#eukq0y_vl9q%BLkh67L_rBSEq zU98M^MRjPIdkDOK3Np0C_(0cm0Fx$6yxg-(daFw`6O9|R0egZ?1m=0*FvsuZyO*b5=JemLtbyPLGW zZMnT$TSG|<*VHNU&ioNvDmlJWDf(BI5@n5CgHIKZsg|R^K)lEs*f>rz8vOBr`5x1H z0vK7BmNLIksY`9}k*fn8)Bt2F@U4trtiD95GC5Wnhz{ZmAt}CEZ{S}wntkkUd?UV` zpC8Pzww?r;6_u2$c7jz;K7bGne zj~&9;+#7X7`hkHxc(ung5Q;mO!E&ZYf8vmP;~ z$O9*QFA+4Y4NgE{Qe9nu#NeG4)Dx`41-n9P=Y>Y}?lZ2$_N}H4VU{J)7o>GVbOs9e z>^`0-dV^s7dgf)MnuB%qDONc$7Q1Wk_)>q>wX0 zd9dsgp*O!mYu6aK+zR=#M=Eqz)G1*VEoC@Kp}4Bh^VDciE!b~z8%evzN#EgP#U2ST zo?ht~Y(z@L8Dp#gZ3#Ljq!%ui*q;FAISt9PzARr>D{|FO9CQwj%(rso^RKEf^8lmm zv!t`iQ4-)1KO-39#X1Mq9JF5M4G0Y$-gnauO1Fc!t-2NwJlTj`D$z9A4A3L?tOl^u z)|+mZHcghDERPE@Jf!)i2Xub7oa%+ED+B(hm+#|W7IsLzr}r@(T4>f5SnI9IJ(soc zi7z|;Xh{@g`(}Q*<8S%CExr7~2bqMI8>%vf`S2{DMR>xK8i1iBNMdm7MSHp|T{Mku zZP))k~?g5%m&C}o&uA&HP3`UqsHK)IBX#lRiEHh%4>Ld)B`ki6C zVPV49A^uvYqa!Bs)X{n*fvit%I&k*lqR7{C(BNyG=h-lP6SSc-k8X3|b_jCN0?Fgx zkvBBy(UqR7b7iLN)o=uNd}9JFG=IMb#s)W(R4uNWTI%%Z$@(CZuJG z3IdK{qf(Zk8hsduy%Jm>hglfLGoDK}b7SQ%yoXUN40j%lQd-5XJsU9#8oHp_k2FM1Q-c#A8e=RkJE%g@+-cNBvH*@;VSE* z6c91>%Loj6;(!RsHuO)qXwJmRYu?Gq`JGJE|39`jW84}4Gb&o#KkO<1cM7?N16*b=Nbws)z zH?abyNnG6Ix}WmbS^z>xyEGlq4V#A|L?n@n$5I~T$?otf`k z1l4;5^mY(+=u70Ne0W4+d?y%>?IR>%jWLofj*tAv6_#C!D3nQxK6yW+^u*UU>V*aAy3^G|?i0Bu3ZA?f%+U zvi1}=iPKs{~*cUJD#}y zs@mjClSV!L#j*xUj977qgsG9~H6?iR3VSjStfM3UpWF5$>csp^$5R^E8W3$C%C9aC z3;NKE1%0N!hT@pN6Phr9!zNoU^kgpyWY~gInEWzo?hFoyu~{K^5bp7s2P+Qa>u%gl z7w31H94p}hq^d&*J~w>e$weCP7-MGh>`i6NbvCUXEI}cIbLstxmFRlr=UD%Xi@Pbi z!-ldV0%Z0*s~Wp(?$A!K=d!bgT*`zrY=PEBJ1!{Wy$OR9^#0{AAw-rr2CsA$&5@L- zPWshLWa}H#!nnXcYj%@Yz>pC8r?TmQuC@7_--9ZDUHIT}YC5Hb zU;hDC9YtQnPX+h=vZUzIlD>zL%?S}OCl@T_DgCDlNS3+ld8F*2o(h2kCkyBLk>$!W ze6?FEb(zm{NMu4Y`N4hbst8zxER0h#ooj(tTEk0SKa)!K+qy=q_^3HVUwb23I{X8N zaBlr~&@kX2$#CcaR5c?F6E04yg@N{o^9>bi?&O%U7pnv}oGdrv^+=I0U=o*jK@k;A zK4rfU&T{w0iHP-8ToU)#2D(TBm6%GNN`YR1UWwieMthN0gY2{9&9if@{Lfu!^f@tw zng0@2JvVO*Pl^>ZDsK_P%4XG^KywQkF&h}YV4e|AEO;{KBeZZw?pERcBqv^Pt?FkB zDlew2<7!Zk5|Dlt^yE#(D}`O4vheL(c4k)LvyJllv72ZR^+?md_c>Gwve89g zn?g5ezkNNADnS8`BYONVt^+#4Zji!E?Zc1`VufTr>@WeS)LE`o@Rpq3^QyN;sRd^~ zn@xkE8LeC8TUNIPt1;ie)u9S%k6?AO7D0PQu$K2P!rI^SRgIAU>~}3pKVjkOnltK+ z0@6fXK=N7frH(H_6syx+=I6N2Qr0K|NA|Vnkz=W=5Y)vpW)V-#KU^`gqMswZ^p{e} zaF%T~=af`+jgpjh55EySDU9$ZNa4e`opFmhOUs9+#+J`*dcn7CgaRPKvUxYDPkt30 z2)pZKjcOP8wY+Xc#y{Pd0XIRNyMfaa*L_LaDJ7L$f!P4?RhdxfHnpAaZPak<0#d|h z+M0M$A|~iV_lK3iDvvvBZMTLu?D@M)kp?WdzHTh>BG@2l^cc$HFsLo?e)CqIE8-IS z!ocVW^g6vV(t1;%l_r>`-l@Bn)R7FNYc|*RPfT136&bPTspDN1u*I^byU&k-N3Bfe z_|f`;(&O_~c%={w04mVU{1rbNPuwG|+d$m$!9$1D=!yB2wUNT0josn=-v6dLxgj66 zSdpoO<4AK>{sEWkENHNTemNOu^O8ug*x8ewbTP$+Y(3XpnDh^+l!qgWgo0SH%;~mcpJk zU4HOnDM?1SHaM{{eoC4>8kl|7q(qBp>CoqH$K`Gmlv_WJ0mhU;n~rpXYzM+lkS1fk zhx1cE;%J>=4bHk;sCe5rUab%=EEno1^}@D$N?*8fGjDQi^Wd&MS(^_vrk3VS{(Wud z5$B??l{HImcg=PmuRoP)3I*Nu+LJGjG$A+P$y~n>9}t|*BWIB*XC~DO&d<0}DHY^h=+1Ac^@KW0Q2P7axI8umZhsd6zxK19<`pDBu_=k~QE7jBVdu*?t2o#Qz{?k? zS(q%B9r4zCiZO_)a}X*5@FF2r{lpif5Dv64N^ zGwA2&kw}m2kFzAn&14gbVgA_2RVW}t*l(S$a_e%7vfaErB1zV5V}4DQKYO4p=pj31 zTaJ_oero0K+^wTRA zxIi7hk>*aIrn}R8`O#&9ISg+p=utf zQV)XG+)um6#U(w@ zLaLrXun=h5w#ANI3Qp`4={1*?$`v#KsU^@)+aZ@cxkhRk*a z`YE*YRwN+Up`E0_>4`Q|s)m*4t8bjv74|qA+cHBW(ujk(0YZQ{>Iwx+?o%X{>@HFq z^z2T>NSbLM#3U+IaV%>x^PYZgXaGsmwJlSoNIep0Bpya9$AifkJ5&Xr{2*@vuYqCK zRp?>lL2@*?>5IndHgwQ`BMyvRUqt*suG|ksI3q#nZs))9WJC;D)WxEc;2j34)T@@D zk^$WESLQahA2j-W936@s8{!I9V$L0zH`(@22KA#}8TSHd+smDiT%gy|HXDW>qC|NC zXg~((RuAq=jCRZwxfLV>1|2oL!y#M!;agCE2X!2?VPsVzE9S=Lb!3jplFegBJYVOj z|Gg@RN|J>BRLb!hYJ44UHunWyIVJ4aYC>(LG;n~Kj0PX6g^_J&(?I#(kva#^vfqGeQ1#fZY zE@w+m`}7*D8opk@2E3$4T0cl%oZsnR%X>0P|`hsV(hkPwyqCq2$=h|x%6HB1D0Zun(JD})47XK^w3{zdJ@jN{d( ze{cab-0wLt0^jfoDt-7>6-B{LIxa}b>!@0VTo<(};n)?-S{hIRt8`tqu;ERm- z8OnI8VOI;gyf>k)iW7NzGa18wDKux23o#qQ!CQ(#pcyM@HV;;RcSJI5IPLxXz-B_3 zFs8=7ImV!x5Y_x&ZosZIJwfaWAxp`!+?x-S>yrg7=^*p@ndy5iY}e?vYTNhm_<9R~ zU21wm5jymT$T&HcB~f8)@+mNRNSEFWPbPO$Ks>G2?Y*-OA*mq!B)(Oj2&|Na2}@k- zY;W?WXxw6!hO6h75)S8I_Q{-$y4j*d(P}{f{R@Vc|j4cI+(Y;{C>bHS&E$v$|UccF_-@4%NHrf(nwQ zdT@#z_xc(*R~?dPC2zJYO{j{W8B8Z^F2?l&p>M~TZk;BiYjcJFvc~3&`FWJf&yFAT zFU1x#9jJm7M{%>NwRkYjAe}cE0tK}Ed<=#H4h{~t_mih$^oRBIgo)~O&w}U{V<_Do zV&Tj=BlVk;3I(V8f^rDLW^vj$0LG zR@T3iT2==kPbT`xyL&M3dUnDC!pj|x#xt+BQq;h!UQ<8KLy$3ciF=*5^1P_p zAY3Q_u8Hps@4bU@bCD19haz#cLX|Gi%xTDr25*NiAKZx40QUCO@4LN?o-Dv0|J)A% zWtGdctDE^)_WyjMDdU%c9qjiGun3 z=Q@ZOl^xZ?p{_D0VBg?X&RIMyTE43&~(leC7|?qX>+3hQRWfU09yDH4h@4^ z1IMFU<2S>HiiYkJp?xo0|9@YPpE0lg>I#b!k&6&Y2BJ&qD^lBuJ9;0&ZBrowA$jl! znHyJ#S$|DzyD@<6tpIr5=`OXrNf9KS(!d#6Rg#MvZwbgCm>-*yMy-+OvsW6(wnDZ1 zy~S)z1<=?kwT?OWyp1EVa7;Tje%BwsalB1nfstco6Rgt!^sa8E{4eyR{R&G;zDl=< z&XWtqDQ$at97yGy>ve^nxrRe^; zOV1;nAbIPjIIuJgH4+1i%mMkesIfb5Q~q!4%?C1K95wSi<15MGV9(po zg@{-!=C!LQT4-=8JoyNICkCod?qv)!RnCm%0?7Da2ERnEP5n+sUlQ#nK)bDv-R-*2 zjjc}^%}fARe9O{Rfpe)fCWGCpPHFJjTUirblimFCha}pN zP%9987)l?~x$Wtwpj&CpCf{}t#FK9R)m{J_sNP7*{>uCg<9_S-WY(OVM%QORB3k&A zIxVDE2~6LN5mH-h1@*iU>58xW=tn9a=`LZJA$UsJgz70`3hiy=X=p8El%n_>@c$zH znXh$jhE^ysM+h6(+G2S9Eiqna9NSDOv-~Wz$vTs81NC;fXSyS(`|(G&{Xh*HexQbo zBPYEL0~gHi-&+fl5k^<#ZfOJUCmYlT?Zkkl!V+hj%#IIb+ek7zQaHV`08zoN6oi8K zCDe*8_g<)EH4;HToN9v^a1=4`4?hi*cc|Ig5=n#o*vM``minhuP}}TOD1$+fE3to} z>#_A*$3Q#!N&U;z3$frQKf{yP;FZT87w?()4ijRqhR=LiKT8SgaR(cETQ*8r<77GO zlSZ=y{T}&!yez}ET)+XVxd=S&dm#q(CFS2mTm<8qt@nm4l-@TI9PdKB-?Q^s@;QV$ zpiWmLcT!wFXgzx{7Y(o2Ky|e+gWH``4>T>R8*ZMQ&8gq+?MoF_@JV6@uGgkCsj#JD zT?eXwDGesNtph6tTmh)~x@-TPJr6B>_HbXSW##?DvrGriGKx!6M9drsUy53UpwH0C+wY-!=0 zNrP3n>otf+OZFG>7b$@Xj`C$=Y2{~Bkz{uc%A5^xFX)}*V@S%M1!dkXK=1`Wz)vc7 z3TNniVLLuowv-=e`eze@Fy%M~@#DxCqJzAPcAPA6Ka@EZXb=`7w*S zu{p#7pnfIct#3wkcJ z0StKX&BkM84h8+{K(iBYPa1s;1uW=|T>khiQ=`s+QHvc7K-rAS1+2yOB&kHsd)&3D z8@c9x`0s#;Zn($xX>r@#c#9@ww0cj|LgzY52bDmVki$wkfT$z4mMHIfL6Gr0&>oG9 zj;~l$UGdUlmUC%>tD;-i)BCp5p24to zM~W?1!;pJoBZE&W!O7f&VWggLg(Yfa&K3i1Z3QZ!QEUY-LEtiep{`J!_|c4k^4iE; z*NwWT`*Oy*x2+Cv9i^e&&sb`d&I!hfA9&6qEB-cBgGL?L+Iy!zv3It4x?M!oSyC{L zRXEKXy>0dF2bMOn6S1`sYi?BV6b; zZTTRFM03kpS!E1y28%N78%folT1TH@zqw;w(le&or_9GwWT0MjI~xm1lN4gKZSSnG z@&n!Y5_j*G;N1TGPd=lSYRu)w!i1{iLw)JiH)mZ=Lz$`eq>jG{eQ}JmA(f^;kL@ZF z6?f630<<_UA&q1eXo$Z#OC9^4i_lx6^rh^Ng=wda`S((?eiigdYZM0^|zfq66ce zy}FgdS-C!pj!vR_u?tnqva9I`ar}fp;1z4We0^dfF16!cua|bYba*Wb)o%1}my2&W zMmor4CsfPVOiLKehF8u_ZOJM?34gQSh4*^j_TO6%R`sj{nHrc!~<>wk3#4E{e!d{0oZi=H3T#l}AfGmIh( zjseLLC8c`%d!sR60xE$5)aG715K?q?|5nZ&&en$Eyab!06@E+ml<{$&&ZnIe+rFVf zFNQStSB#mJ7&6T~RZ0p4^Sd`%6AxHku(Ojs-Af(2;oH14Q2wG{?WUQs@14G4thO>x|4tZdIf8`pCJ!4d+@8hSnZ=D3kaPQ_ILroq!h} zHy*$le<4xvE3d_|S?FWRA5VytKT6}Y=S)6EbEt&NTh1U*CmJjCx&2B**Y6yU7ax@N z(F{$+7jl3nhWyd(2#|XJtGt+Cn)0;0rv@x)33t#n^{At#N_F9eFn*ouC%P=z3v0|) zABSc>kR*2XNL*8<+fEGG&+@n*?)kWk_uk{p>n-OEV81uY*#ymfw5vlTpATD_hE(Y~ z`a7Om?-;-a;_GjZg6^!*0|E6@P>+Ik^k*GygRb*Xz{EZ-GhbnJr@wAwr8R4`1{ZuD zAb&c4D7-vgFMMes;5TqL&fVvJlYUxSjA5zZn#T5z9nbDK8G-R*FO+^JT*|na9E9^? zixRKHE51NC66i1~V$`@Yt^^IgUUe7J^YgYz8g)b7BUbR_s~kFE0jQL25nyD@9YDW= z=NHe-WcpF_$ox4{;sAz9DC%cKadG@$rmN+Bz+Ix#5->E#DVMd%J!deHsy0M;_z=Hes!)*IsR4_p8CWi zWxY|F%#)}s6tMos*xP3)$m77Z|4p|H)UL5e2$0+F*ul0SHBxz2|BE0s)CcJ(zpi2A z_S*JVkug;k?^W_i)fFa8VWY6MxXLKtjFY>u83sg8ahu=(qIdR16B3&WhnKyuXrG`3 z=vPF`gNvF2<;w(&y*FGTRJ2VIJfS`HdnR!@(G9tEOIL~8@~L>mFhXD1uMnf?Be8@iL zM?!9g$Y8@eo!i-ONF_?%KMh{4Jl`(arpe>xtQD>&|3hV9PJC5fZT4gEiHAu>QekSS=Dd`n6d&XD8oC-y zU_o6I1&#R#QFI`Rx8>8~old@)8XSQ2uZbM50IC{wh&8nqJXz^_P>lvll81$aT<>zYnO?qI{vA_Lyu=E2{!Go zZhr2;YtcTOsZVJd4;|1WUVhbdZ!I(+zJ07}ULp^^TpqRFQCW-{L=8U(a}<9mHb0Y~ zR|}inZ@$TGh|qfca=un-fwE@90?NEB?VJJ>$j?xgXrE%L0Q+GH%PVlkrXm(O>|{&jI$Q^C0wb^~wfg z2SYej?1b4xnmt*|vWu7@nV`WPt?O4SuxwoIr_)i{f5Q`B1r*=^ga>%cB)q_0N92(} zaB}1_?k0tT=;PId*Y(b#OCeV&{_LEcFko*;#0GyYi}>5id#p0^)Z7aR&& z`UI45E<%FyW?j^4%C>G3_Yp%p=tJyoec?#Sl<#YR>)+|z%D(4Ya6W^o%sKR0Cr0$4 zK-~4SVn^rP05DSnPk!hQdE5PbwNctnR`Nq{`%W7leX-P~lx%x7?)rpLT0yjc`ye<{ z$<7(vk|DyH@Z4RYo7k^NKNMZ_^U+eOlQF8{Q1LXk9A}W~)F^j6sA;Exmy{a2@!zpa zy>iQ!buhm%!mfg2-PSvH-D?}6h6_}RFLN+|3%7rL!^1o%gP~7)IpO)53g&reVEkje zXn;m9-^%<-sCgo^i)8eL=seVZTeKz&0O~|7x@1Crr_SwnJ}2{JGqE(;j^0$PdB%ua z(;8oO3_cfhDMIcpvks^p4hyJ|{EG9o0m$hSt|G^&Eh)+XPm>Zlu2$;BFEA2^Q6GF7 z(J9xW!cOSBD`$r6kV5ur4z4dFOwXKZr-G*tttrEpCOkJrQbX_|sh9)EoqL?Pdrt#P zRW|Y60c5w%7t9~kKg$g?=4-UtlJ{!KS-!-D?WPGd-f2tc85{U z(>QlUyPomR&O)H+8lnq`Twzam_EieDc;-d?b!{dF*_}7Z0PoR3`dfQz0v?5wptQb~ zpNj^M$%KVwZWj#vcz=S%O#Px=!Opad%>h)AVv=`xTelrSMHK`hQ3}CLKE#unKrW?3 zd+(NQ9n=TII#Rtle`Mb?DKVwS;|wn{Bu7aj?vAJz*yod9X__sWKntEBW4xq3bzIl% z+%KRJKK{T+iuIT@Ruab0tW(^X5r%IfeD$TC9R78N*T16flx_?bkkOZNBG!9Uo_+b` z0(4Y;1ytwyyhO}_K5kuDn(x7i2Jp%bu-qIju}cQDfH+sx%b-TGL=xIMaEVUMgpH#? zif`L7x>|ABR~>no8H8E$5@$dp^t|UZLx{mNVC;UE7FKcRUJf`aVFDIu1PE*%K+s)b zppg<(CY1GNJ|=TrihDKisG}NZhJH+s>8Yn{qUQLvqu_KX@Gf&BjeN7a|dL%sd~&tfV2q>#0&DNCYg zgbFdnl2G5Xt4iYgppyl z>NfH{W~W2BmL^nlVi`$$tte-Hb;rx<9?-TIyCgld_s~926OO&)oeFkP8UF0x0QmGV z#c}R2UmhFA3j2f1pM(s`{S%VR2joIx_&+GW0K9qK6@s72$*dQX8?Y9^ETR`xP%j{? z=-dT(ay2v*X3djxJYC`L1RQ)3Rv#>2hWMg6d)G2^=?d zxaN3z`?^ycqj4m1CMaR1dNj5$VWee=wJF;_9#^%nIn}w~_~;UM73lA@SuQY(Ll85> zV1^J^W%?;pb*_$06Hv*uY0DvQnn;pJSRL`?%-=Go2#^C3h<}Vt^S>9>(qw#X=|`bC z@A}?mGZQeh2qegeW}(ksI!zW4dGF*-T1s}qbD|A=6l%nCLN)(T$`H7^#bTlXo0;aN z5TIW9n#sn;@b}z2gz{bkoma2hc7{xjyEX>soJPcBGmgr5b}fmS7Co$$8nS zRrz(5wmo|Ln$J-T2_yH124${S{(xD+>)v=9w23vJrTnf+*ID8s9hRvy2G`3|J6f@s z{yeCKPunx=`}Enk&cDAh^G{rKi>L6crw<{Tg{o`TvJO_XewuVu^+blOyCVs0h2--YIKU! zT9ZUr4$&&u!wqTK{V1z}H%z3)ldgt1UP~YOnHwgG&Q-_ewrdrk~=J; z7^}&>=yoNJL~O^^$Le%nu;*Ugnfm@SdE`~XsgI4a2qkI%xK7H!l5nQim)57xxwc6B zJ~qVUR@@tWT$Q86=fnLF{bc_p=C?B$Q89n8@k`R*Gpbz z@^QXl&A!}At@Jl~5L40gh%R~&SR0-5ZBv$v?F4~pOg>H+U5XXGDR zQ$CQDh|LDxYC*X|A_$u-uvEYO=nw?lzmEbfF`~R`zs7`Zn}mkQ=kdiuqiv*mm?dPk z5Y2?fMeW@GHSd#>47aPW+C;JdA~H;O*_~>1L`G4PZbgolDOjJ2)+Du@PT+5zWRCWn z#DY0O>--U%k#LaiOU|gc=9AKj88{>(FYmpVGf4!>uHrj%UEy}Mmc$6GKXWyZ+SPCy zYcgsc%N@3-#`5zaL?p=?Ob_937-4bSL7o~C${uZv3Sh6*Wg zR&Un%4a2Csa>>oC`dM4nzXQ*Mo0(C#h!w5Vta?HG9*K8g+R z^}!^KMY$v?qk>=yQQ=!@$Y_bNKIREhy-Wg@*mz^%BT{c|fD|e*+foe?@@Gfg4S%t6 zN9e74WpV^(tK}!;fsASf5vSbAKVruL!~3SQY1b9|6zDSKZ{(kMjLgIbFE3@SzU55u zECohLhju`FU63{=@aIz#jY#?VgFCV+uSid$LT{!mI<;YOa~XS^*E1RUxUM+8?q@F7 zVlv9}Wrl2m*H5EX;4|}I#=t&{)pRhnrqbWXsux;$_6PUi;4#0tzD3I&%U$yPp}cp$ zDL5YcADG-iWvwDBB#iAkGR_IyyV%3L2D=0?f?U*;RxOe1P!G5P zCOB_RsRx$>FR2zPm7EddF0wJtX(2hAp)x<62{*+12Kf)o^oN z{>hmW_}0rACH0Hlh{)ATp8VA6#smlYQ7sY9K5Ow$Dz)>BVY}_V?wiC?UKwyN0`t?# zi3HR69p{Muk7N6uv3h_m zNJ7K@Fxll^ij%zL;iYQ%d4&kUsh@_P7wIAhxO|X~u{`%8J6tF1ns9Ze;qnbF_g0}W z@gC6dUPVk+sygwD8^sSd;x?Rq^HbiUxhU{#)N$%ey+JGXk;I{VC>k3!9X&;D;yO|E zmHu8`#_UcJg67M!Feoyqp&;Hr>g%%OEm%tI9(?T7w z*pyvXp&h^R)nw?ExKh<6u+4?$6I^<5#|qBcq5+<6zH>DeAKR7*Gp9>~8FMchdrwoK zDd4y&%D{gNcX=@ht7xit`Z1rY7$ zqnB4dkYtKi^H(4y)<6JNMpi|bhR7$8vmr3bLrYxli6s-T;qPS zDtXlT8v5L-vkLd(I?exqnaYR+J zcU8|9g~Z_5g{*|M-GVS_4Z2%3Sa2%yMFLV+ak?PPy~0b z0;{!`C*_s>98h+_Mi;?9UVib|1v7AO)tYw3vxyQTFF7AiUC$9hu(M$6hPCWalpl<` z8kTn-9|~K_`}#Www=@5_8DXUj&*LfJD!9Vxcpc+yZXSEE#)7weo5JkXa(77{ygkq} zf9U0j!YR!0ib7q0tR?y#LlX{arkx2#OM*5{_y%XUVi9#mwf3*y1D;1KB|bD`P97CX zoM>nM=Bz2%Pbp!BXNZOyydSl7-(*36YiaQ>WL;!6M58lfFzPrz#fmO7op6 z$CRYK{T)Du3>pE5s1Bu2Vb^d?Xyg?0rb1CGsmJG>W%oCGw^IV(&JFl*>L>Snp#t=+ ziPGoREluz(Ou^{6g=rxl@#bo(*B=&?miF@$T+f5@UG=J*%d?=(63Z7po8IItcE7BR z*6qqJYZDV0-@%h5{EES69sFy;0pk#?ldci3NunP>u$2R>DkIAxbBz4s`p z!=+(utzq}lo=n(LvPhwtGKwW0id8}dylO7sCBuB~Q>S{qg5x9gd+V$HiWa(27Ty1I zjesRBgs%=v0DR`ke3?>I%a&O7rF|rv;F{*coNG*e15>Iu9U3wVp7B7MtlIERvfh!D zWOm0l_86<9hEFb8c%G=iX7t?7%jd@lk9Az_7sq%A|4<4@@=Wk-AMtUk6n<_udzGP& zm%=T$WCT6sqwaXeU2NKhAl&M#d1tpiF{7srnjH!2{KPEuk)8>_vq}ix8x88aR=^r~ z>#2dB%lNaDr(|35u>F#aZ2r3&&QtxfYDeXs{oO_#uu;lpYLVgqx~55(B_^6;PZL0) zY<1>hDy_WK9c!)l-@-J{B*n(GB@v5_6!#EW5XC6z!D zFaKn%;00YWzO@*HSemN@Jwps8JP4YDQ$ZmT|A7Ga$|q+R(xacl)jZTZO=8NahEK6+ zbJf7r&eW3e_P6KSSGPtKN*aoxp*03^ZOIrTm@6d~av(s~liSmNE1zjVt zoHJ}uu|f`ySv*x99wtjc247IXnA08)1)hp_S_t0~9Y8y$my5Mk^FKe+IK4;fod(zR zMPM8rz&LuD?F4JcvI%oK@q^k?#pFl1NnK31wcZp!NZo5avNMun)!ETU@9=9+Ju$Mn#uuC zPt!{8^?i5;oH$(bpc^*d+nt6crvs!}9kV4nml^AjjmbJR0a`98RK39OEXIS^)oiVP z@n(9#do!ZKwi`l zYDWi%dfhWu6KREI5kq4R_S_6Vi16#wjY04M!334m$Qg*&|Yp@J$ z60oln*YA>n&(|WD)m1%7=CR5Sci$bsRpA?1vKro3pV;*o#D`=~+q~^2lG`EFq@2~D z%KlbF^1L7iD&$MfA?Y;3{F8=%^?EfFD`Xsv8eM-c)~tE*J?9|G%k!K8+f>pI_=;Bg zMNn)3sn#qkdwd0M24{^gvaB;mp_Tb^a>?yb|!8)MOqW2W%dV++Fd8 z%hN=7s|NgrWULqO?44_+?^?)bOHU;Y>dihMJ(H3JmV*;)0XLpj(F6k2-ZPXH{OzZt zM)&5h0_9kN=v>C7iES79(XX`$Rg7wC;=YZhgk8 zEc4UY=fMq7#2RJ@-$VseF;aujbAx)EfuB={XsE?d9zI}#%K-8CYky^}s zk!#v`ZT-Mz=qLybTgnN;cvrTZQP2|cz5AGv>Par|u z;$b7fTsculXC0Z3mHrQJb5o+MY?fh z!IAbAOdLCI#5w&YCVkI`KgWFC*Bpxc5CP(sjPQ8f7AcP6!xpU)<=0>9iorZvx(R*XntANC!g;*pDPD_L_YSd8b6BsI`M$e|73H2^0jk*dx2?M@0BA9sedqd^xYqXCziE9n6TpyKgy{ZmWxgGKjrjD|-t zA~vad*K}S07W9AC!=dh>fVw|c2?(M|(DrjaK^W)e^5!$Vi+O{51Bh`#yd#IC10*b= z)4V?}0Y+J_sLogLE^OrDDcBEw>43N^^rOk$Obo4+kSOp2_+&NL6Ao2XR^Uikd~od& z+5b~}-h>9JEVk2fU4(7(O}?8mU1)+|8!vKD^Afo0wIy;n!Pr`jQ#> zbR;?L@g)}Q8fpc$Q_}L0C5EDkrSDCy&K6qy6l{ci8>D~t=T3SXb?IK_Ei2p z(MSQ1Bu8x;pS~Yx_T3|=-_BU`u*?DPcfLhlY2$`GV`9-Dz{J~Bhd zBjl;F6@i*64)Xr}m<%g3UL6$h^rN;?6Q5)Aye_lkNKH_8!L66rBFXUzfNTeIV^R+K zvD9cX05hnIyicI15PiGj-&}{7Jfv%l2}E#Rv)iUZpt_6MP*?4psk^#7Gd}im)|&8b z)ba469t&DKY1O%0IZ{6zb7IBvUuXtQUqr+d%5cYLR_cS>nCiP}E+xqki*jFoSK&;} zVz$pxo9>49KSN3+>7XO&NDh7?td8?X*Kly+`a%k<9RAjOhRwWy zDORGJl2Jrzv}T)_-Xrj{H!~Yf))>>J6ILabm8s>qLVG+}r%;+t4lAD$ajXp^QgR3l zEsUi5LVFNe&oRZy^m4KkIFz<-&;p?XsOu!Ir9F)Ve68#gs4jFsLq_q|Mjd0|+SL-` z?+U)D;zO|>DV2v3`G(JqyzALpd41y>-YyzC>&Xw~_-Oe}dWY9Spd{k%J#f^b2}Oci z(vF?j94L5&j)w|Po@yUckg(0aA-VjR62sGrR#Xqxcl%X}P_%*yX%?1d$a0bD696Fp zB#vx#2`d(wIQ+AH^L3U5br;8^_doDUQ;Fw_7A)2Ey|evLXzNzxBQ};gy0>3+P*gRn z8cMBKVna6U>1wv!i+KykBHnDqv^5*jv8g6)7K7S6q5!o4l!(3 z3^1nYR4Qv|ozy+QPsi{A(%h|qk8Pwz-$QF9553Ofd9&A(pJoP#LIa&`zfjiYiLANH zxDB|-;CSNRF*^!3d0k>!CRg{#M7xUoCQy^1IEIU&+b)b9@?&O8A^0)@nlx2-ANaP2 z2XiknmhKCQyy+E|<|$AKsNVy{c=)nXNk$mf8~Z7mk-%1M7dm939gDczWReORh(1J6 zk8Y;(`;kJ%q9sv5gHvxhu;G8w30}<8oDe^lV~1*}(DM27IbWFX^LGQdGAK(P%3_G( zM&SSrj-7UQL7q0zS5y}QNtATM34=F`K2Mf7IhI^jR=>9{9Q+kywG{!a3+0WMwZfll zF0o@g;j{;&nIKj0^v*W{v)bljHSXpBSZ*9>3B*0X<57(#3fFwr?9R^&sg_~i>& z3=CjET0-zn3pNc|pKzi^X4#*v2KW9*2=YLHd&z4sbdiLs_ZX$<)HLRJ2O|1p*inZ; z>QN^&r34_Jz|*$W+gaPLNHT~@3#=PU|K=lkc*iACJDUtJMl1zDGPHYgghU!^b_4q1 zLD+VoXj`PzvUREYF#QX`k(6{(yzZKYgGs5{(B~L5I(9^~GpphF@L$6Pvc%X3{hTU& z=_ECd7zjp}+8ZmxAeU2gI$k~iL9_QPra1AuqmwV8Q~hDoPv%*1O=`T)L2%n0t!N-O zRtnbo_wnUH%0cfhn1P0N;bBRdTiMF$;NHr`Mg)if{L->0duw$=;6hwQL2)kBnc9RP z`gufI8M)m(@hlSmCi^0{5G;hSYKN-6Z~tTFIm51^<)z2ych%Na4J(sU%PaiUMyRvC zy!5fRT1Jfq^IvWezs)87FE!SE6zygA?^=7BJHwiR_8oTb%vFWu7udw0Vnzf$_`RgN zZd(gL)|VTHj(UKFJ}L?T`VQqxNd#%2#JRH*=$nQU&EN;pJf|p7o?dRUHQ9o+9>f^g zgHQ+O6hRe+cB&OB1p2vq@>X_AjiP{pZlQF2tV3pur@8ZP*AAKzXuuITvYl4PtSE=c zH_5IgZW?6zr$@U*Fr@b2_u(P?*^A7tY#R($q;ysxrg? zOfl~dfq&lO-lKTeE2>7)4=$+{mf8q4B{o1PZISXR^<8mzEUdTa@?*2K}qJ zSBl}9N5Fiy_%|-lMc_2;J2P0tw@nX;H#j_|D;3QIkL`& zTi==O&5B8heyt(UBZ!|`)mt|9^r0?L4UtQ4PlStLm=tZ0Uqh72Vwqd0NL=lixF4Znm)r@(Dzg-|#nZ_i-7}Qn5Ep|1k%x zUZBj&KRf_t>_`xUSaZ8OAwNPkag31TuOytSQWQeV=5f-Zy4;Sfz_p%4O$azX11GIH z`{!s*$!E+A4+dHQL<8aAQ|rd^B_Dw)m_HOBYsIGXyv&*J9OdH#Ai8C6Qyp8r$p!j9 zAhT6_f~NyMd6?cxIH4-DEBZF^NvKW4ZDJuI&M&Yz{<2hU{KvR3 z`ckj&q}Gfg)i65{`b6}9CZPrx+8-2qvS~OhABG(*B)gXx3p~8Il67Y673nV!`-r{!eHo2r?de z<=Auyi6DpvcgQ_#SP1N8;_=73jm+GEFs0*{I^VNsrd}_Ex-tas-q*3+enp z8~QiA2CxN|LI;QhrQwS0!qGu=Y54qC4h(pomO0zVh_|!^|0!fzxECY~DF`dD`{u40R|ue21w}LhQ`5n zav7k# zatj|zUE!-a^WPkeEh%U`8$Da`xE^N}+&RIl2KfXD`v<2gs*B+uw;*w09i|IkKOcGJ z*~grN!cZ586qIUbMf$-TFRHh@S)_SSbCSlW6J#Tlrb!Sh_TPm%0+Gv~iy_~}>s||U zFN}w8JRyDqY~?Ne3Z7+Pzq6>)#{`elDn~p2iHGF9^U6Scs&nQ$yHrcDk5^h)%@v%t zhtPPCnm*&lnk7Fdi_qzPO+F0VZ3Bk)`FW&C@jr3HnRN#Fl_Z)}Sv_{}Ehi=SU~jXq zDvIBZ!F4Q@u6Eq3@?n4OL}C>Kjpn^2f&Km6&W^NnA1hnq0Nnc`U!{KK6X+$l?s%ew z?g@}h47w2fVBxtrr4CH;SJyoOT(DV|t~i{v=#G0oZOzAemUxKdW3Q-OmfnNf$$C+V! zjD%|lYZDk*!AQ%rEJ5~hV9F>~igS)H9~(H@CIr8DM5aX98ZJ~b)yI>I&=LoZu_+sz z=jsB1AAYP`FJ=7Wkjt|pUma0#cKebOdFC#uEcr~Rhw#?0^}>u729FaA(ZlZ_**$~E zJwi{Fv-+4_gbv<#drE%r4zc(vdh-ByC)d>T2@#IdY+7u|kgR7vBFe#+3jZlvFg z&pNlcFHDXx)2uB#Y^4!FRsX}_y+t_c=N}y1MR14ya6|UsV!>k$bdj#tOb3FHN>Z_k z_ix~c6nBr+ai~fsfI?Z!(x<~$cUao~BciL&%0{eqVHj|;@>a(tKEwsF`^!0wxQ^8L|u5egEnt$g1 zHY%{XvG2F=d!$3PbYQE;g1GHTf#^1D8c)m>Kwrr%_N|`6$sd8+-K=59JWR41p%5sx zdZ0)}v0Xy%1vdS42z;8i4O9RizFq!O^A3WHp~od3D=_L!k2!$ZJem- zAl}&28L=~e=s_99X-3frXm~M$(zw~r?8L3$d~ph!T2F{o2XtlrR|{|ro_go!uSEih zZkC=WP3; z0RX12ngz{nqz(Rn7q}x$Qh`GsGECx4`@tu?#D<50G+Jpx-&4t}g2^r*cePn(AQdgOoI!Cy*5nY~N3>14voFvL zY0mmph2-U_Q&|3G4No{V_nwd_!UoXHD|)~cLVuQoh@~_wx>BFHjOGIyUqWv-60f11 zqwB=)HQb?hFdwV?}W@qZ1#{zdHP1I87g%CmBc#q8Y$)nHTG!YDlQnl#G_I8 z@$n~61GhLD!kbh?uH~==F#emr+9|VO)I{cIdLA`2>CuF>0bgB$P?!^4S`e`IL%|#q zntKIMXc}X*3&X#P(WT2ifMI~c>CSw2stb~>bHB2gy;fGgI*6g=lld__j~seL5yyvy zUQ@hQ>?%W_YsI9RJC~qGkrIv_=+XJ^bL3ib6`?~RAUn$Do=!2*N-@Ei0&bzj>r!@> zb}vAd7FP16t|DyMnMuI3T2G!1qUMi6GaAA-kWy2JWabmQj>X<0W2uOmo-C9Km94{ z`X3D|O*y+k+F|MgAQ-EIM!4MZZSw`?>a>d5z0JBnHh2(MKI1=dl{`*R9^QYJ@|bMa zA{syuutZ`2xgA^$h`+a#v%-zKy|4eM7qGBS ziJwDtWQ2jltT5RH=M-@g>yC12!-!C?jVCG%Umgs%ml+y>GP#R_SZ#)87NE$2GhU+M z*Fg-{i!d!Lvo#Cd>g8~ev>m-NEH35HxXIy^JfZ{6!D4o~Mi}R9_p(}V>HP{t- z`rrK_te&k*spz^||2G!AqG?J>0%dq64St|lqa;`b1Rj9EVIW)X6eej$Z!lXafqSf; zRomhnNqaOhTK_ar&qiImT>Yc%zSTt+q&crO_q6tx^-#j9GF2rqLWJ6xxoTU<2!E?B zH@vgrFG4LppUf>xZ9+d3>YaJ}8O;QBOq^lW$N2sgRJ{OIWN4h+|SHohH*2P)$o z&XgH^Biirj%NyXNJZ_AkLlQvL>7UOiRjT6tVT(lPr<5JiE@=QrD}kzpTEoOZV#-E? zC#sP>0E!H}y+H|wbUDOBAyl%(mzyS!TB=R()>i@H#Rh=IBISi5)uGO2_U=|RvYR8p zSpKa;JLs8(7+_Zu&4P=k`|udK!NZ1zgxbz)1K{BLTwNq?ZtLm(OUxsDXd1LDmFp7c z6VBN#jMmCV#3dZ-={1hD^EbTIbD5Jw&^ePhVycdE#+Ub(ox2wQ5u~q-yFV42<(r&+ zQh4PEqJ8-_I6{~Xu;Af_XCm#sh?ONbcm<%IeQQ5&G60lcocSiiA-T`1LMj0=mO39% zk50Xrc2g=P)E@qdX+=m0aLG(`6xpaH%HY~DGXQA`7vYKK!)$|=P()=bS@=+a&smI- zGF{EH2VtYRd+RL4mRv-VV|6{wu*>40tx zMyZE(+|!Y(fjDTr5$#N0i)Te`m5Uu%>cy?{|N5Te815VFWhLr0Kq+nfSjSM8pwB=K z&}V$=+m0Wd&*XN-@GNS1EZA)d*J7<2MVxMAXJcG=WT+@)h1j8 zIU%hW)v(YUyNX-Rr7SVxJhApRu|2r>P(Tbw$~2m03uctzz{3^lGMBF>YWD|eLJ}3| z_2kDSzbK#6)Lf_wDt3R3MpzX?yEU945qqs6hT|nckpz(!ADn-F(p?;2$ac+k|6FE zK=9$R8<=1Q?3rz3*FsJlZf4~&qN|-8fm5$Ys-06H$5oJ?j@P7q{b8}fH(C97f+y;y zmU}UHYHc|R1=c6AiHDS+6&Bv~Li`L%X0qJEIjmns6QH)YzYMiyw>Do5`@paj&!qu| zBMN;qR%@#smkZNWG|l>o3I}J*v?JHdZORTPisPe9klgET)&N<}uYk|rtC2ifhD|dB z@hP^Kse>whG_5;ar4*3Gv$$7oP!Vj^A&{Kj*HnETiOw*9#E&ts8E%o8?8^>1lqcok({qu7o<+TPo}MMz+D?ZI+0k) zuroUnk{TEkOU;E*VcMHOGd6=sEPB@A3VVKAazF4a&Ez|?$La;K3-x?O@G%3P;iRB5Ni<@p^uXH71e`C9wXk(Ri?mEj?=aV+csu_`uG zrNr*vBX50~H3Ri!g;R6KwgqaA)o6;w4e0s*QLE(n2W&6VY11-GjR|ISkwKD2uF!eT z>E=vM#$ zk>f46i0qL#!O0Smfysh9eRv9>@jwEWWeI^I-x*GNs-43b58KibrE8?MrhIgzbo#W?pUO^6eXg7Maug`lR|CRk4v zexC3RiTabms9cctF+n!l^mkT-=-jyiMBduIOUTm#;wbNE{RhGe#riEv$wMm!Qxw9l z^;7aG7oR=-UPc!4&0ZavB1>U9XP8}OT_z?;AgXxKU)Jf?wJq?&o8>}=CP-g9kAZJF zQSK5zVKFc2cKWH)lpM0z$L^qyE=uaE^d9n=1c}f$hIa<7GO(W|?VfHYxM>8iG+Z@H zL`BCZqTd&lai~$+L_Ir?p@2J%FV5}%q{8voRv;}>p+wF2RQPhpO9wtS9<|LnJ}`sZ z>v2azH}hO)6_=VL(&S(e$UY>$VlqxsTgTSN|AcZiz1l;0#JjkeV`D~3<K-rR2IT{0R^NCib4_Jv-a~Wy2=i@XG60lS$Tk+U5~jdE#Hy?a z99N?Ek$;n~0`~gO(o@qDO>N2np#(cuSgSAcqFm4Bf~dz>5sG9dO^;yKgmw(*f3F%9-bQ%j_k3er5$|1rOZob#8hP-Ju1V2AO->d)@9$gC$i2Km=PT0u#PLz zKan%=PdW1oCO^Z-1;+iIzhKfW0jQg+-+K6Szk#1D>~4G~Tx!gHnpt0QD@*QBK|rP} z;P6~klcfv&!toB2(N7KsH!G%0Z~UkD*^L>(qg6qmqGmvV6{Pv!;?RD#^T^X(;2HS$ zQPZh9E_{<_xqs%SF7v2H9q16RyjU8vcQS^5BA3Fpw;_^<*i)14wGD`V>};6#CK#_Uwo16=pde1;nxPb6Y9 z^BRIIcq^VxHY3=aREtJkf@GL0U0R_Rt_EV=Zk$Dxg_XH8Umj0eJvi~3$eNc75K!Js z`*mz^>O7zWv&?{IUG(OMv>D+DJPScG@{QX(R4wyqT_^czz>drekJ?mf__RPa zdTy1wNN#*^&5)G+PaBV@KN6Nm7je7yzg?c<>~fz07baNWbTCQL~Yz=^Jx z=5^H!v!2*N5+0L5d6|zZ4Au=k8=*^^GrSX_w9GKPBkI#C6J1F3%MrQ&(&2wX=|=gedX#3NF@Oe?YxIPLO` zttR)1Syi4-zrh)raX`K^887mRyF?RReKPj>3XPu}TcuAc6#;s7D}J3*%XS;}Z}C(b zC@veB%?rlqqy6aD|F_fgi_$ba5aRunmu0E!$#&h%N5`AuLBG`Td;dGnJQuSYVn8l0 z(-7)v7q(@9*?CUeKqPCd2yj>YG6hd`ZQb~~`dZCXld38$&IY30=p{J#)dW zqdyD`%p3n809~6i*y9~yW3nLWmXnrtFzd!_#c}F7G&Q&1R$CYXg8vuT%((~pV6h)h zo|a_i2rb?RY4{iQY)B0^d*EUR`=bkHM>1NM_S#n22gKQ+3Fsb3Kwa;` zu`E(6Zc2fSf(_`wik;u4Km!lSOqR}oCa$_t;xNZ@KLv)>D6s=-K!u_MErzsHF8tM0 zptVP#+=KU1|5Hro+4&)%1&JkUypo9sY1UZ4}JJRDR)x4Ie0s89Znx1z$eCHMd z)RiZjlk0+Htoo<1@TK@+OcI4@U?8a?Uv!vzF+mnr*o~+zZM8p6E$Sd@msuLp7TcTtHbbQ2vuz09{Q4Z7V8_ z0|D6}^?$T6>Sr9(A$5(nCG0(TBE2GN%)Ouaf)x7Wb)g(WM03GKz!On}PU2{iif~2_NDV=%HV_=gjv^W@QwIw})P6eWL z@<--flF{zx;H^mirUMC43uCvzg{`BIkJQ9!hIX*c5{j0Vmk$gh4}{IyxHkaA@jdv$ z;H4R7Ik0QM_wjZ)fu@>Y>DBoy2*nbsOE6G#F(^z5g^?hJuu~xOHwx9b*KpS6x@iwk z-a(Z)s6CV96as-^naB88ajWGa2$23=RpsA@IUt;X6afll6>r36{e%!sX8W0~8a+3q{L;YoLCU?Wsq`r+b;H!No!Py5%PK zK;f8dmX0Z9v?65wK{>WawmExVdwDm@Mz!lY|}gQ zhb#40uG|x%XjbWqbgI&&X}si=;Gz~}SQhcp`1ZPMMtUMrVhn_Yl8$wplpt7)=L7Ii zuP+h%m3(E@|B#qL2~s&a)*$R)O$hyzfzIuDo=$eK4H01>kiNIs$PG}m&NA?fNO~sr zDFb-uo3H#>vNT!RFVL>#{rcFz-*AE$)EYukFDx_LhPL(p8+=88E?SyiYjVVilKGOt zFU+}A&<-I1V#ZX8mqks2QqAs~BVm{F%MEfX-?6z3_{Bu8u&gWf{Zl#rKhC0?VT>#r zKRILzc=HyfNmx2XZznMqPr0u@4f(n;d$nK7M%AvsT(PY89>LP~AVC>%f3KvDfx&~b zW%8y^EB?B5UOtBKGjH~w-P!l9$Alla4ajx61ham8E*dp(T^bGQ>^~W|lNjU%dcj|= zJI~BqGxextA6-5{Te?w-{ZNcMj!Dvb!vJ^3FKUC6GDnIRE*d{Y9wa>Bgct||^#y@o z<$!RSD^F81d#`8T-X=4XXF$c)vsRTkaJ_QnRiFJ-RQeO7JM$Ac2-EqRSwt#6w7*7& zIxxPiRU@!$Fu!oVP9iLwcxKUa=o-f80@7I6ky9EC#+(N!iMPNJX$I%SZJVYe?9!#N z4ymzS&DGeP6S1(3V>OkGk3bgtA`6%t=vI!yx&TrVe4G~a$4}UR;9m;myuVq(u@;*n z^xM#3mI=xxZl-PL-hKHhoM&0!cakK-7u-sF?Lx5Hqz7xQ!!~JKJS>-iJ@7P}!Hc&+ zZEA&yEa#v?oJ91{6rOQ`n?m{R_#p8`$6K5UN{AK1MtHv;mLUo`MchnF%(^=}hbHaF z(`7)3yL{P70}VktPtzwYsmUmpr2d&7-(=5v3`%@rI~XWK2t=|aMIY}$kz4qDH&$%p z4r2+_8zPbwq$1$2nZ^VSo@qxUdbP?AZv?+IH2s3>#Rt*ILSL4orwnQd%H(}w6ZZQy zE?coG=Wf;<7pfkzaw6>G*}@NCV?ZkC6*HK?gmpL|(K2=EVhA=+Mh2TO9%=z6D@S?c z$~p~;cg_s={*&6sqk>TQhQ0gXe-l)p9YRTs8@2+^oi=xpy&B;(Kv+FlSscmx(=Ry{ zzdm8efoTb~nXMS$N#=Z{|r*(JD*rfmOo{`6mrtmEDG^ zSUfB}^2&Rx7wuzI@Z{er>xQmtxO{YKMJiFXOxwg{=%CcV;3&q(pXEcIAPbhQ41GQa zo-HJh)~&+h?kL37{cC|epzIClLR zBMCl}wQ5XLAnzQFGFx}R!JnS6lAj3Z;Hgf!NpwQ~j^r#YB6)zRP3YiX?HVkzGcSLi zHkU9C3e7xOt{|cB!PCLjdr^;K-UL;Ft3Z=_Hyww(MEISY?~e`-27|! zID&3kQC4J%GU}nQp3vAMV5Bd_#@;at0oZkW0+H17rF3&frMa%RS|?9b1G}1XCib0N zMaz?Ft$FsdjBo}p5lBC8KU|}BiWwqIDuxKZp6R5hgKwX`A>5F^DphnRHpbLnag|Z@a2GMq~)2MDDv?fOXSEpv>8R)k1|>N-~)@IP}36rg$BDR}EqqE}#8C z805knJb4^mvGx-Tl>%-GU5=YzX5f9Fw)F0ZG&eFoJK@wP4E%I_ZBZUTz_gN74@(Vv ztj*CWN|YK!tAtbwON9c&5D4}GsR6Apjv1L#^I`l@7icH<#59g8ny2|@Wgc6f%!}g= zuJ&a~fqF@0Uz?~aAfTAa=`UFWt%WK9?VJ|H5|zt^kIxXMA+EhNv8Li(n9MKCw7CY% z2f?Cxd>;^di>}Jlc%>)rFJ|y6weKFwns27Y+MLPbdF~RYf1cuCuldCq&|0Y#1LG=f z5ghRn{29crAt>Gdy#rYQ+4p>L-pX3Bq% z@CP;Q>9BNyj{fph&)qcN#wMk6Tbp}myDQIb{G8tAp49uo5Tn{$`)Q<_V%(uSpawW2 zHKcHhAmL?56DAl2vffd=!0K$?AgG@ zNBUsEe$Q%WyB7dK4SzS)TN9#qnciVL{mj~Sz!nf%r|R;KMZbW`f(r&>UyG8Tkaj@W z(}Z$%r)(3VvK!ioR!UXp2ii$;q;}8=1HTQY+D5`#%3n!T6AwpsfHp|N2xfVEPSXq? zWFBinKcN0^g2UwA9{HDt{#OeS1uAm0Ir$6F5y}%OdR)Gw_&;NC^JS^hsAjgQBFSgmAjZlyZO; zjjz&&u?`jDw&r?4Sj}}FWbIkIN z|9ZZAVL>28hT*1pqh`RpLiD2m7#*Da@^D0PyQ+XtHzYds)b6%XrZAu_X`ex1)hjHJ z^K2&@$(rcYLzfjmKg-)+7L_IIE{c7btDj?U_qqMfX0U@px!QI`i`M9eDLeFRy$3b& z63uAJW5UH3ev5Mnq$Mc0r3MzIAzi-jzo@(&B<$gqe<-bR-A`%6VB8hW|7HjT@Da<$ zfjm)niIJdgDlP5Bdt{fMqB_4T*K^>cQcnqBF0)2C&=&m3k0}# z$Bq_-VwuOyZ<{DF7*3g{r`tRG16zryZYK2I01?PZV$!6a8z9%X&mj=@jiI?)rY z1pFW9o9Q5@Q?yP8U96tWf**~yx9il}TEyRl5EWEphZ zjp27jy+6P2_d9>wSJ%~b-JSC~=ea$ekLTma1ah4q_d;iqd-`12cMfcxSgs!<+hMw~ z30H()tp^pxPsYe`SNL#N(F11>zXHTx^~wi!Gfctxrvs;op83LSvMZvVQbEy*?U=9g zffn|@17a!0B%$seksBk?%$s`DgzRU^cAw4~rIkI1_*=+iE_=P;jj74}V@V_%+5h*l z={!vFDXU)SM+_PRLKv8l0J_p(TWVRGxt9O)F`}T))V_g%!ekh@qwucdHMO;LL-O#z zWKT`h9cruhl3#=sS)`ioSt!yr1x6{ytyRNYjT!fTr}%Ef41E0sSbpx{`2cbYWRiW{ zVn&t?MuW#ZTm7UXi$Ctx8?z|O>TRc>UzrwG?)tJOpOLxYUf!fdQ{qS(?FuD~WK;A1 zeHH8-08M}lt2;+ZA$^oax=^lXLSJitRDo~$e?65Ms92u$X95HYrirfKOyT_E%H#9h zg}hfzmnLhCIPzF$6w+wFiAtFVM> z+ncS2jm4ykMP0u7@DyOq&SMNcV|H=~(esNVm$5W&eA?{JK5nS^d>VAfFR0G`e=n|s zmDZv9$vpGEx-Co;HrOwigX!ar)$O%2C&&o>5X`X5~8MU&UBy<1fXZ+=9(N~9Sudz`P#o@T36*$-`~9|sCq z-bSGJEsmYu9)Ln|0sCe!hYj9>KI6&dtA+G#@KHaR?|)Jhjo(x5cSY?pH5tQ zscGpai8hK^D$e9A&jvA~EZ=rK>~*}Ild*+5{U+MaFL?LY!(6PSXUksTrxTA8s~`$D zlWOG$dSn>3h=9~AvGknEbbZQzZglzP9?#%#$AQ%|a^$C=!du!devHG#~-_Ix!Q zA_zqK-C(9g@9EGL*c6K#zUpdG>}d1IdPhOMn;%m~&v#+NWTn@=^+Y)YEH-+4-LyvS#oRzM%W^H+mmEK5-NIp)sjK-d zrXcI~-MKvr-M{F;Y7RFhA2{EW433(}^?e7|1tfMrOaf~>^WT=$=X=Cs)%OAopD}zz zkYFLptd|kHJQQe#y=n#UR_A&W0|tnbWSfYkvQogbM)<%E@tt{Q-PD&k=b8jqsh5Vu zd>&{-czKI(Wei|n=0mcfyD}at!5p46RWc1?2={xbIp^N!is4}~25bUC*x0j^wl`@u zK!Niykwx4{TBzW7$_&nV@O>QJniooTXUc;tWp^-vMD?UVDKPcZf0hIDZ zQWetkEbtzoTCmB6bdPw3nlM=2EbX6CB?Lw$c_~ozO@r-50@IkveJUBFJ*G0LuF71R zw916`p%VOPrsVshj*sS67FNuK+4YZeubwINT`bXgjqtfnyI5$vxbm#$>b^1<@Wzfo zurJb?*Z+KDiW=h^Utwg8oQtNw>?1nHiCN}%7x$9RgBE(0@|Ss_ypwm@dnyUK=f@Nc z^Y+r>O23G5x`d@s7|mFnN;!oKq*44((F`*XXzJ(}{P4p^ws;Yrj!E}w$>y?V8R4qC zKr#_88P5yjgq8aBTTee{+vM@TOHd1Rfsxh7yEW7`EU#J6LEVGu{B_BN{Sm8x#5A^h zV^%1Lk$!>SFLcdPe)z{)-Y%OzDP)wADl$g|;6r!4LDtfCg{J#oqF$NJ;Z0`$B0|&H zC_A9~+Nzd=wL3!X4|+Rl8uIQyHdCpM%nxzRpg;L8gn!u@Kxx0aiL?09l+_lzqv|#c z{m4M`pn6h|pMN%!H?)|!@k!y~7$u4`B_1)ncK%7!1yB9S1&#LmKOs8oKsV%$ZOV@2 z%+_^jS7k~yaSP9hSGLQSr~v)YDe`U=^|4QxOGJZlH_%V`(}C{mG(IK#LSo+_*%uhT zS;P=aV|(>l;^7;*3FQt+!{xGkj^=ZkC7On|C4lJ$fI#7gSmdC|z$V$6T_f_(UKaqu zDNKv-p7s9k_g5@sSR#ct8^8-BQPw09o)fZbV4*Nk0du1qcNQnlkLgUV->8uqXFLWOQAk_vsarAhG2QuK^s_Lhkz9kZz91<8^wZclhK}!l#ff zIF4};5FIdPm}}~a-^n$)c3=t|r39|K5V-CNkOPfOpmob#&Xzefpjuu{eZbmM#76D( zS@LbL`#|=w(AsrVqAa52CJxsbfE+lD%11{~awL{~+6w_uLY4Y01M%4QU~2VU+RU@3 z9BKQvgpV8p-L=tVVXSdCF=!8mn@n2k=LH_`7ZVV?;i`md!PE>j?MZLIms93tChfa@>qG$Iz{vqgWT>u2qd_?9pZYys|%p%V27=RCtSWgd(=6iP%mym zOvT*ZnN~4&c3AmXmBtEO^3rxPp}-+SEyuB+tZ=cCE0a-1pazO~ht&QUnlrc%F&{{X|f6L~NZSZPXNG2s}P2Eg$l;T1h6Kt&_uoKCW-{~qY9MP_ida%@2E z!`^1}=%0(w;4R ziU)qEPa1TkrzWBHCqUyK3oxnF9d~Rmje)36xZe< z1+Uq&4#B<*t_C&n{pYWyK=;oUWNTT3*vQ;_(bsy{)i6zIb!(Z#YJBr)56{d1`sg|h zOj6v3Y^W;w<+?$eVHrq|cXD04+UH3Nuax4hZK=jR`5RzNYmBz!7XMh>oh)#hNsqkV zzXDm&D!vu;g=%cz>WIxG!p5sUYZQvSIsptW1(FZdO6j?JX*OsThpYL>w*B?iq2=qm zGg`;3->pa2Y%otAh-3~ee8exYqP}cb2-}gxY(TYOQ!wAtscfWfIE3s34Tg?WO8Nn{ znQfl>(=mO?jVzLXdcfh)T)@|R%rm|N%*1E-$&s&NIU!)ElgQ^tzNh%NKAE_({crt# zMEqDEgF^YCLGF34xzB9%sR%p)sAc)A*;3po5`dwr90CUV5K*ONtmEP(5PR0fSN>10 z9%oquT`Xjd@S88%V&1w?`=M8}i_A4|=-D5ntT+j3S#c3ZMtH4B>kZyZKD1DB$H?wW z>Rtuiz*)Qyws`~$wYt(8i2ClO=^cgUAEvdG)n~xKW>J)!42ujrGJbBh$5_T+mboi& zb&E4jxM`;Q6+F&7;&#{*RrcyDg6)ipiAx1jRH8_UVJpF21mXfHuJ?gZejsB2=C?&P zU8E={Ky5trv?_Fe1BHG=Aca1Z!6jp(Zh#JebOItHqK^~UtK3YmM^>vB)0$ER-L){E zVhDQj=~Q`g^UWMKA28eO01QUI9>3Va^F;YoXFzZUq1Mo|E~1*64PAQmmK*Z(K(yFw z2tMsJu_P#1m$+_+-6~+62>~g@PUUmO4h8VwC+QIWr$>KkU;1&7i98Js{GH9`$TkS21BJk9QY+ ztLTEx+>|M!o~A?ofGV#Xwzr~@RUP$~x-=GDOVz{Nz?MPxJZ~(dg~0N`>tP(OdVbpg zOvxquAwg|lq*m3fuwG29q>KYMHMhlZQzt>7VblVvN6Bh%$&?<1uo}lE1aQ#!@v6_B zrh#uifx4%b-pk&#+9jf)NM*U{bM z?zCPY%e{Dq?CFqEB<-yWSz!0(7(e0B&%C6247@RVB?-a994$Y~f*-Sd>P)*xZh-a| zXzn@+M_VZUG^#;l~1Dm10$YtXOb^u5QAY)n}X~m61AFj(|Gt<7>p#qc* ze+4F*`nvycBj-c*`txMgteYMM1U;taVskM}7;Z7DT*0D|8kr%xyy$VVT@oWb7PXT> zmGs%`S~oC%gzV_wxqy&{-88hV@`2`BRjoF?h9~>=tIH=VzcO;&uNW^Au48HDXfw7R z5rip_wbVzgChupl`=)nvn(N4HMNEBFbvt3&FVIi?3(b1$;C(7NJ@KIZawHkjj+ zl&zZ7$juMuJX*oA~}|O&KNwMBhAfkdY!X$4M5TBaAZVm&NQiokkuA(EoKH zA@G)ryd>xTDkCqEhe^U$KySG<74%eXb#Jh;w_ z{eVsA--I7AWK0@WQ@Vqy%KeWB!rL8@hnVR zOL*XeESMB%2Ko9^zg2JwOpAiU0j4D%w+1+G@_U?KzJRW*R_~F=HjoqZkBcmj&N|$r zc~k5}C)YGVZ8@*1&_0C?axY2J0!j<=_<>U6A>gz8z>IA)2Z-TXFD8vA%W~%eMf!Zp zUd=_my+alD5%HucnNM}3OWk&=E16|%1=$|r{W2{3*DJH<;Lm+Z46g$PSDK*`p#5pR zl9&$yX;y{Yas(wDEs_LqQxE{|uC{^Wm?ef0X~1&1D-(xR5PdTsOT6wq#k5n>+V3sl zfz>S2F3m-|)$oAZ@F7i@xNb(=AoF^hw=+l^diB;|1YYOemhHs8V@k@O1Ai+EMmw}@ zyUqx!n~=g~RM9``^6N5->KpoZ|nbeX&q*tuMlnNeDJB;o*n&*gT48&D#W< zsD3^7$P!p{ueYSfF3<`?rU4A&YoO!(j%7|F?v0aTS`%^8H}u zG~y$EiX@kp!;%idJ+dHV%FQI<@@`i8rh6VyCe!mjIBS!7&-bu^dWsee7X{Hmg^*8Xj$aP?69! z%9(o7Ll$i|&o|=+#NHZgIN&B zvFnhhqeUv|rn9K?IuBn%sq}7ZEcMh{yZQg(d5Rqu=7hfq~=?8Yk+!0E($L zm8R4iPNK63c-4I~Z+%z{;+e#(J`hm$49n5T_RWz4b|VSyqk2#-G0GCOT>}PgQ9Uv_ zm9VeC1C(TOVdSg>{%87v1i2St6@1p=$1`F?gR<2Hv2LVC3|b_y>YvK#kzFZQk+qF* z3V84n-GSaNC!`oF^cWHAi4)y!{9n`Ylf(CJ3AoWtl67n8VPr7)8B8u3+ckc0R&gNS zb9q}&6TfdNF5bM5;gDO+_pz=G>P{$BB_n_8)2aa-J|L(Pu^L;}AMRSh7wN}j{4DSp zfy=-E>V{&^DFs2=7FXy+-g(i9RAsa6>;jxStIVFzD{FJp$nE;?Qil&qB%o#mklY$(O?kZ<)^PY?VERJ zSD;JG(X8V(b|*&Mid&M#W;W`Hy6Ihtq-%IfpH_7QeGboDmOc684_@P1?n9ZzG${Y5 z^`0WXdJ9VKzJPfg=!Rb+H4=YZok8Rrt;9xY1qDUYuVqY-#^ckyeGW6IAkCI4n1PG0xZfKnj$qoCucvyroWq3^~9 zy55S!gpW_GDgu=J`}L_F8qWE0J;OM6*vAL!smicy`&!f5$MQm?H6} zfVc|Z7pHIgt(}Y40FhI6?3+3w>eG4@QCFbu#&6>r`yE=oM?l=+_`Ss{HjH1$HIQ)! z@7D;E<;MnfE_5+^e)1!`8p|}2MoyUw=YmPlotn-CsE>KB2 z7Q*%@loQB)m**_8TIL@{c@4*GNte^5YqANaZ!g`DXP$(3!y})~UHVVEKI7|r(%Dm2 zKA&qW?_4=r=&~ay?lX01CXB2PRT4<0shBhU;x!1LeqB+T4@Qu!;M0$9C>Dwy6umcC z&0(LeSI@{=Pkl`y+6W8nX@aR^lR$r9?ZNw|at+V(a?Ipm1>;gBQ85f=X0wvKML=x} zTJtJt-T)Mx?(YmWwXp;bJZGL~@bmj9t?696qXVN_2P!c-jXl)=BH7^juoQH7C!a{m z>xNs~q;cZQR~O>kXd0AUVt=mA>XE`mUc>Mx_=QE~cI%`tZT}jA@WmTo5Quva`JWBZ z6};EixS<;6)OMn-6zesUxcV(#{Lcr!P_i6pRwy@5U3YahB69^gFW_*-49N#n*nJ2a z!17yxTi(7$jVLg_{&B`f*;SxiWmysp>bPh|_%QnA&VeC(0PlAQYiXD$Fl~a-Yv3h- zK`hrF39TYFO2coWH4RDe)x1&wvdbXbJr#alNRze~?u1w^P%ATP>7&jxQ)gjkC)*|F zEg^qa(53*Y)^&rCKzE%%BnArOQHgWVEh5qhg|`h z&YDB-97tn8hg?uoMZb~Qjvta@R6vez95gQ+Mb4T#$G%r&x3`TT7qkXwqt~uJbEk6`=Iuixq1)30>!8-&Ir9?B($02d6XW2QAiAazy)a>z zx3BAe^y&pI^obKs*38S^OW-?I&CMt0O-VKa4{n%+0napML`uL2OEf7+{CAri12ikY zh2brsI&klEQ5~Z?=ryHZ)kGCyMUCIA{d=4{=ygN&!F={~a4mh1VZ8UA5Po1*u)JU- zYudQhAw1zs&dKVgFZ|~D`ubI^R3a9PT8T&rOSq(>>knE3r1!X5gtm(MCNLh-J{ji=sJP-$ig=gXMm(jWZQHM$A7Az|t}O1*#=ZtTIp;4(~(Ws6l#zQx~g{ z{H#%pAhmd0u_n93N5S!cj9Sl)&Z|KIQ-YiIR7I`8k!W)glvtY{x1vKiNtsS^u$H#h z&HEIFy!XzC!!i4BJMbwGx+xK-ULG8zTU6J+#Yh64irKL$CzkQElfC(%PGyXGBUuwy zZ3~-TAFVZ!D{IMJ8dyKC3)y)PnW-OfnPr_NI3@6u{|l-X+f4xE^h#sq$%=`DyI2ue zdaY}t`^aaYS0m48Xr^|_0P?r#%rnj};=E%zpVp^qvMZzRQ&)UMu0^;4(N)maJk~Rc z+rsQ6RiTvB4AV}}((ybVH(!rcP}3nBCjO)5;9a=0XhReKi6`b0bLrKwghsx2_X%#W zq5Z)p+^<7GbO1E;{6;2+){|>$YnqyX#6=bA0vxX+2L7lnooLUG0s{d2{`It z#4_k^I+Q;ma6R5QM-Ca=6|m6X=!GPN$l7@2!Bfz-`A^ctx>7R6K9l7kqXI-b`0_00{|NU)-?za;Xbs16FUP3kh+>e<^oXAEX=SY?h8<~kr%j~|j|Advqivy#M{E|WxFr#Z-d z$-2~c=L4n;U=RpJF!ac!NKSyKfV<1ok7*Upl$w1u?eP6GmRLyCtxqmhk%t;Tt1{H) zHB95!hL2F|%i*7?@kx=q_iu->i`07u5sCDS@vDC1OUh zVBz;BJ-d}t&2Q*aY@Ku0J09{Z40uKXfF~ae3iW^l;nC2`@UgH2TizAL(dOeLkh&JH zPqs?O0G~t;KPl^xS2jP!*1m@A$2^wgn^z(FnrD9Xd$wu;suPK))C-uh;jpcCq6&UD zfbay!qqBB*X@9QATl#_Me&JJ%hj%5TWAx{Pf8Gxv_kpln;e!ERbDDBrDhTM!H))+j z6OhYeYmq=Z%nu*@WIvZz9N-ivlJJnh=NW86{Ezu7D46Ic=_%!1Q4u$yyQ5Z%BV!+4 zJMGVs$}z%LXGzKzdmOg#nCgYqZb&N*@`7}j2DwZ*kxKEw$*V0yr`He3!=BEKDbNO3 zOiExCVOUMz<9aFaT##e)3I98UR&nZ~9fWm3pGL>;0@cUdip2u6-?IK#GpNOHFovpf zKS2j9X!az39AwAAf`prLxtnkJw9gMH0PXePGJ4adoqE}h*W(Hct`E$F5Yfb0Vw8ElQL%YM1dBy%=Pwa1c;{#{kYB{% z`bh7hK8`kv)HMgj-*JOaa%G%bt6E7BZ#qg`Pa-mjx30Yyd>#K!g9V9KyjydWqxwE` z4NLUktUq_^v5^|e4uZb;oVm<|cOSq7OT7JNQ3TN^flp2hJnSz$SWqkF>z8oUwVhZ_ zKTs~^5A84t z3=MC)N*uK|q?mdg~s zM-m|N5+!c^DG2^K*X4JdK z9n}rk%hoWD#Oao#{}|JNC?}gEBTbA;_T*}#AYi7{0WH&C5&f86xE0#=TH_;cUFJr3 zU5?$mi`EsHv1rYz8uevTaJ*ojYueV1@&Ea?+YG;^_>d4LRwD0Vg3gC>U7?yqa*fa6@?un%p+GTuI&Ajaaq63+ph;WO z-auTxK(xco*C!XA(NFJ4f8=?KVu0?f4qL!ER=9I-{7*6%h0%cKnaP@=NUwWSp&H8v=qtm_%hBE!uX zAo2ch8}#u-UED#j>2U)sQj}RA&a`~cU(sIyC^p*8jf>z)LCb@WwWfv5o9QgjQedz4 zAWAZvk0A-hXhWe)?BJV`jC%kQ)J-t!s4odpPBYSZ*QhV+6Xuy$eV49g9cr0D19Vo0 z*hU)|71C}`j<0vZ>HLdftTM?4Uw z1OF$U`suJ3=0#~?Q~Fxz8a=mZFSaNmx5au7%A*_qBh{xd!h4Tsh>N&z(*-bhzYlKPSi3WtI(%emXEe z#xI8vUvSMj{>&^1dY<$Qy~@5UmIZ zhUfs*m4wl!bEy-??s>6V#7=VBpS2^AbI*bbaKE(hJWp1A(NoERs>_G{wf)5gJu19l z0m)r_K7f3t7zn^-@AHG+(p+IEdGP!Vqz+9=-nYtLn_~>|L4@KsxRRooK$sNnfLYfM-yndMGr zio5&^_~+>Dolv8B0KWdZ43AG#E@2StjlpMlQu-obqVoP|Karao9 zE=%@ZbpwnRvMD`8W%>eMNAumLK9og8V;$9#_A9og3_i)U!vlIQMbwpf{*m=T;-}n6 zZ4Px?QlruJ#}B$qEIu{`s{w_Z!$2lDfFg!=nr(07u=Z_Rl9UA$k1|5*9Dm*V;d7Ol zBY(A}fRDP!AaMbd%5dx-k|VwcavUbd+|1$4DPyhdym|*13ZT_-7II5-!UQHOAOA{x zi=kr-`?~=1!4o`r2CNl%4|u6*U2k2ZY9b%?hVyXSpBUk@_vYC-ZxK!~ z(?j@lay>=a)an;tGlDIJa%L{T$oZquDb!=$Cf0{_??rWlPD#6$Oh?7}G>?@{Xfk_< zI6p(gOj=y6)SJpIU%*ZEs`lN*JF-U#ysqV@7yeTzEWn5j`#;l*0MpJX5|c&FPT-rR zffD#Rih1GM?;vbxW;=hBC?81fzn7_L<$ro|AL$jiA%I_{edlG z@FQBqnHCkt?h=)lW?F{Vm1?pN=s@i46gp36@Qf63!^t|#o9B~iMZ`SD@7R-hVScbh z_uG+}Z1Qdp+s1JB`g39t#`R*DA@ z>)hJ14Fby~M2zE`_zF8I|7@5{-+TIByYJhVoit>iv&Ya*_(0}mh(9af8w7o)U9OS? zx2pXbEyO&ZPsB>ouhn2~-nHc+T8RYKnjEK3K z%-m)A-ECd?f%dG43AP_9|%|9}l9J9C%S{=*FESQPDJpU$q7vzI+KN{}@$e)_ky-Tdw<6JP8GoEUIhvri| z8We`*h_goHY974aXzKv>=ct7ez!IM+rY8TL))}(`xk73Cc)nz%w_$za|?nujbZaic;yz*-k|?O zG9tOAlnh^Iz+U&jq`Irj z3{Qp~k&QLnM+7KuNEkcO)BtC)p+WIEbp}Jlun0B=g`oup6nArLrt~ZVBajM?`r&Y0 z*ravDKRKs>$VYSSC$f`X(12azmyfWGEiFYXVf1y`1=_{T)D~!G{C0pA+qlzIXvXu# zoWHCXkmR^B7VnA&+H_6g4hP5Cgt#JM*7e?R_|Aho(o~WhGMwh=b7*|uD$HJ|Q5+<} z6e}Z_Ez*(pU_5TA?Z~rVWpO}gDo|@WnI(WmfGRh=2U_%TY0DAwmzhF873KSO{I?WD9{6|B_F9e-m zG$ww#k)+r75AZ_D@76_YLZFsRa&noHE>AZgR+nrUQXsfr4{u1*1dWE=j&Qx zR4}Dm`16&7Ct%`teEcxc{qWTfBjsA?!OpKZu=67t-?Xe1&>2c`Mme->H|U&h6$@n=y4tDxI`I7+%iR7&eV*1{(SH>W=g;9dqHffO~`F*1Bb*7mW>D4 z8!X`$NH>VjN*?zsI>Lth&K^w6Aar8;Sufk!>Kc! zsJ3f}Te_eO6SHA)np&zf29K$`9ec8hCzO0No{2gYbi7hW6}HQdkV?P%{J9PNrvzip;N148VCb2d5ioz;Cr}xfW<}cx zKTYW@xKs5~A6tu!5Non%-F^fSWsUa(qDvSpTI1^S;ntgr8?=|l**BRL^hWLB{@8}+ z`#&46x5SC!N2oR=;?{xXqoYAhbnM;!yfa>DT6O6bmr0L_--tSK zb6s7Z!oS>o}i_n1)2Ke_4QthH-f zYgYhMXpKhCgvWpOHr46D*i(Gn_J2dRa{g-b{)peBxXozP4qF}92yd$PEt$&GZ(|#5 zIK-mFX5HUJDCt9%B;&6$D;!Y={}Ml<)bxzfyfJh~2bpIq+}2h9s3olGr8$sF$|KOg z^otp5mmPR%k^dWA6tk!NtT;kQvfyL3k0HALkh;Xo^45G83A-J9Yf22c%`3H0%QX5s zmJC-@Wu3?`kaal!c$#Pa*CeNc-MinS*sZyP_|}rBXl-Xu5nMianLP8Vk2nz`#dCCE@pA3-W>FE55It9~VG@NH9WObf)nWwv2r}kHCcyQOPV_ z$uwDyb#Bmtgr4Y7=dDX9^25?DInP{c*Bzc2K4u@*MB%wES;tf3A0zxBDW+cL;Z)!uyu$wa(4Z8|UPM4c=W_^RC%I^|t zS`Lncp13CM+@)~Afud77yiJdu!SQLdZG!gy*yZcIhlYyeEQjY)!Cfp%ijoaw3H49B zM%UV#(rClmB~Dn^35{@$K)@XN+0j;IHPfB;Sn##~cOY!z-DCDB8E!-ia~9LZCn{N~ zGCrp(lW((xRPx|g6M-nyF-%KdkE^yH6J;HDDd>F7^Pn;^#t1tq=5u0J5-*nwL>NNE z>2^S2f1T;)0Z!&gBmO!=VG%??9_KZ;iFZtksu}ZX8M?;r-VjVMC7(1CxNc71_*UI6 zyOy-3JsPgK2u(K-D0Oc1xm3@l4xZUr;am%ujCK6AL3@rhViuH{^`QKKPNp5L6GH|U zE7+-ljc(k_hBcrC7Ff#oY4qJCILAZWT}%XKRJ=rTRvGjt17itVV#3lM7H{rsv9Wzm zmqkjPR+#*Im}%4VUT!|8kUt;d_8#Hxe=6;xzS|sL>525j)Q*4a9{tbxNi&?E5vuI~ zqQV!o!ygJzsqE{X%;0t>KP5al-G5y)UbCDrj%VS_icL-#b=K*JIX0qQ2@gcIA zf_=|=yG*B-wq=9~aNUw&xvWE^vFNusVf+lj8wvtHtjYSvu!TCmIEUZ0@SkYHsPMO7 zqEE0vxp?iT{vP$`Ti6C07lfj4xo|m~!p$*dH=j=%l3ho$6Pbw6Yijk1@WU1EHa8DJfPctSo_ zKh4@D3&&S3csti{nX|RaNw?$pO{mFHjv=fs)6kRE=(!V7dOw{h5^vbnfoKGINCf2#F16Sjc%+{!$%nA=O8&QK`9oq2S4QU2yP^^_nj3Gud*gwh zJVDz|@3>>J;PEFQxV_!1Z?Qo>?iV(ZoZsCDupgiNG|95aBFAFPVhlHCie||;V1IGw znbU*+f;2mmR-d8j8q+mp;ISU1d?Mtl8jl7DuOBSd8yVp}C+m z%eQ%oFm)|t-X#z-G*jdQ?T%Lm-eO4%R`kABL!4=WSfj`@XRxNJAECaGD7v*VkH z$F4{8-%Ori^QS6o5W9;*w7DW#tSw0;DvK+Elre$fCA}3qz4(Tk

`0>6^Rx=3pnWN%O(z8o=&I3Q)i)q)5wi+G)_gyW8?lm0a z-#qJYI(K%+?5CLY?d+35hn2hpb3YmLK6fI`hPCL+7gg-m5Ve99`(tY!;~rnVuTa_Z z9Tw6#&79WorOFp|S!*Qyaq0JTrA;%+JVz~-knk~{ws3K&?_Q=1(&bj6ye|u%O=}ve z%~vm89-BscpvoA@@QSzmpj_q zX%)YxIt84hi&lesZn0T5mi;;2=NvsCRaAM|#&lU1WP_iWT8;$53u&r#%?Lwwwb z+Qc(>&cuN?cLLBRaF%M%mgBeIn9M3vo&n#w6~8JF%RBm0@yLjGs`f6Y(3y{9r>?Dp z@q+6eq`-9fMD2pJR&yulJ5R%XlcTKH?jUYKMorH*@TRWE5F?2Qiy0~R^4_M|PsiE$ zyZVR?8XKE1{~M^wj$+m+o_bhXpzKI)nMs3?{gu|SFu&c){D{iI@|M55eGKA(+p$N0 znpJTOz$7Z8pDMZYjBd~yVfIWy?8O{ir#$4qC_8Agwx|lo4H}cAiJsRv2;R>7`G!Eg zc`@e2L)4JhftQy<@bL(ns-KUQrL`7X#DAy?Lkyo!ZgmTq^*E&bhl>vrn=Sa3- za0_(bQ_Ps3uBw*HExUXc^63&D@79bX6k)`%ve-Sbc-IL(Jxc1p$*$rbi!8}0fiDPs z1?QEG!^W7d6tX+aNfS5rZ}tAx>m_F7g%Q~zo)|&`Ru)ss5*m@8G4aX-=6L!^8TaKw z89ay-6lzY?B&GBg^)sk;+YS&P#8C-KXJ!V%w&mcF)rFVE&q5njKSr!1I-mr)OusLE z;~Z5>;$^o~o)Wda1+OFBSHHb^psp%U1TrJ7Fr>EkH_+I&f^#-{h(jY?LMV!q>&}a9 zPr{#n)MU(`XcI9bb=<{{&4K*38foB|=l{X$JPG7c&>cnhFZy}~ zjfo>wjX+$r{pL!!6U#9nh%%@)c2mnmg<^qyesV*u?o2z2|mZYA`^9#pC=`;vZ`lPbKdCv@eWN%X%t24lNb_*7O!zaxZj`_vrjL&T{@ykAqFWns^p| z8?dean%BD*eJO|Ei-&I>7V@VOuN?9RS@0dC%V*pOS17*tL63|F_ZlJMQ+;O4q11Dv zTCq&I*$-`R(~z_9H}}Q8?HNWZF7_B-b)@`^!s(#n^O|N5-ulC&V(BQD5Sz@&S-*l- zb`-GjgsU^Z&a)*Ao_YS91C-8|Z9zso*-X~1b>|-U2u5%&4~-L`GL>Djz0T_jEz0!yC_&Qk6|epRdb$KH_A?;(md#%^PA9NDpD>TNI(4FyBF& zr;`PH3iHSI4kRb7I-r;GIhEqfFf}s7CI1G!Hrs*=sW!9#Y{M}{`zJof$=~_KW+f=^ z!JRekiHg==+WB%;(mx6%M1C)sGA{$`aR7i|0DJ?k>$+1q4-eCvA<@~!PtpR6&y%LF zXT~xs@s_V0UfR2JJLcxpV_YoQ-t`F}ksNI_UkYd6bpCL{&GYDozXgs>6R;K4I9#eK zl2fu_G5j!P-m>I3#Q*5>F=tJ*pn;|ysq#U+~El8KQJPX4M9q+E_d{%n>`&OX#7Aslz zS#2!sAFm!u=WNaIV0xnOAHPfChw5H@Z)UmJrXxNRoN@8yi+Vrh#;Ysa)9#Vl#jUjl zT{h+a9sQdR4rPNvju}uI7!JtPS=YI+?MeMa#P$5rMb<8<*%f^BiP>U#b6i?tD$C>i;-*>XmH%AD1Rx{v zC%ne0rQuTvDuO*EVlZRXzVeVF^tR93iEjKV&vFw85d(do9At!utjL$-hlM%BsJA$4 zh2DSAOK{q1L|6$fRjgy&1Y>6KeV(Tiwiky}@wBF82@L&P?Ak$V1!eRW_6J*O=KQt$ z?MxfkEY8c}<|Tv_Y{Y&3bq$JEY!|P;8#h9NS?&=oEX_LC?5xAewlJMy1fT zM(fm`^8C^=ZrS6k8+9od1i#um&a21JGtl9@p1!*hP`Nmq6r*BUpN54(fc&#jAF7=WmJi~t%s@XK8Gqi|mKxyACyWZ`ka%;NY*xFV#> z%E^0+CRE1L7MV+u@QR(QppO%j-raR8|&ZyH3MkI&-Twf|aP&j{A2-Hw;;H)?XX zT5RI0eNF#;B!W{487vtQIvw$tzKcLO3A%h136RlZDQ{&smW-eBoZVdZXHbYJwbzvp zdUt!Dg^xJW4Y~_k;Ed!@FZxaS@Grf+8y?y4pyX#)0POx>OH}#5v^Z3WbU6lI2D$Fs z-gc}0LkH2~x<5}x@R2@h)Nwed1iHK+r`TdF|% z5m8(lCiGlWKV>_3`dW}u*;0mHb+FxjT(m&&1ojQ_-@A{bR zcj*D$Q^>sI-F%NH6rO_VxT++Uhie2ZE$KRJ2IMTDtqaH(Vos=Kf;7ES#3sTy?j z!jZo|)lvi;aPI@$sOUE&<)ZTg#%_yZKk2rsk_K=-4@Xy~7S2qwsP zs^2rKL6_4XnpCJ&{&ZmXmMb8)M2j%*NCx5L){1b}GK}LDVH|JaDSwucJj!M^B-`<9 zrV5g$TVu(S^59NHP*E?m7S(2atT@Pr$!j$Qv`+pz;>8O{oQbQD^25tP=os0G84S`z zj`Hi=WLDfl`d93K2i4^}c>3XcY9AwbAxksXuIhFG9|HT0pOZNslhdI` zbImOlADB((#%^J_m!80t?VsHe}A_X)~qy z^I)s*#kA2XCOJO;Kc>Ds9_s!3f0&rEHrdLOjIAOi``R{^Aygu}$(j(d@6;`WP$T=+ zBEr~{u}>wEtz;|PL?!!{CF}1@xBL12?mzc&??ZaM-mlj==XsvzdCrR;U8V9{C*Z)E zWmZysqG#rM`;<2aQe3kU&(Q0iVXl!JGAZfa`RR9%D$(lUukn+f5%aouqR{ZjH3CYp zqot}Dgl`5rJfd|B7O9>wU-|jbX;)qttK^kag1us#dAQLWhz)jWJ0|LUQ}L>(iv1(g z|Dl|MB<8_FacmJO|Fzi2b5C?#d<0nV1-7I%*>g0jNQa|33do z;3}47_-()mEjmHDkc>k`LB}!rH#o`MViW4r5iZB~=2R<9bFY+0LNPtx zxBb<_r;qDY^Z6Za-h4ng&gegPkAG=NSq@`dOmoYX-YRICcbH%GVed7~~N!c+4sx943W582Dks#%J?=|h0f+tX> z=W@n@30aZmC^3gXp*E{WH7Ba``q-_0X7*En8(QIyb;*K2|7@Ij$hg;=tFT=EDOG_7 z*NF(dw(0Y%R*R?|fF_f$^*1V!?mpOihm{&8rDpxJs*it(*=P9!ywW z^zqoy#F9=@ruyhRe^}Tmav+m58-utClhU(&!%>&UuRSRAytk)pR*&P#i}6veLfgNV zhxA1GPMM*ly|L+MdXKo>?eecE5Kx?K~iNi!MkrOK}L#82IKR<*8Cr;eK>H z`=ZqY6m#sv$TRCM&?7VS?(guTJSVK3zvGnj=eHvdgs@Au1A|$;p&x z&<<)+fhdI&z?9m))8{Fl)MK)suJ0=!{sEy-ql=Hy&ULKv@cj)FG%k*wM=oTef_}q- zUDX&Lbo}%FHPer{nA{Vcq!U_}470AEf;GWLJCyF~?;Jqg*P;_a99G>L#-U6D;@ETF8LUI8VzE4BBS?VEj`n(+cVwR=iL z=aYzm$1mQ@{2RwuJMRee%3*Ajs5kKJo28abX_Pax9cTy0cw}1r_-ivpI$blwdOFEn z>GVO#io}ZETNGu$UCYTx(cjMSpnwAyKHMyBbg3nrP~u(iF9(dc$(_6T@B5Zy*Mv)i zR|(tH({H3-ku`}^I)X8lJb9+;6UBpTX2+_-L%@kn zbz(|rmCiAj?V|%czoswnBwBz69i0ueo5FFpTzXx$l-pcVRadZWmiV9)saXT0FSkyQ zxh9dTil^?wx(s!hX{FQqjA2(GMS`K%wZ;u2T6ebB``Y2#+z_1)l0k_wB1m1DQl&nn zcm5_#=dO?SdUNrWx0grOK9k3Hy_ubYB+nb--)B%R5u1L?JdjPDCKrBW5dJ^LRK0%I zP2dmmq;Zl@V8jf7-8O6GsV+1%^6|*puXu6}kE=u|7(N1r zO}sT0*p8v-YlvwFWR$Y=%Rbd^j>TAh9w@!7LhN9O6}bNHgl@Vyz6KXAgBcCAUKOol zv@plV)aIb1q6iPus}G>jriO;m*syQnH&{xvbJp{uI>pQrns zT|bLAHp8ArS};s!D(j*G5~jaw-z3gz3p6#2O+EgzGv_@xH{Es76AI9RHwQbjnjO7i z+@K<2`9K+~Li7@KH=g9TbU9Oo`r1y4fbW)SWFM|V(L^siqaR~O8OIQCOl=;}naAcd zsC{@;F?H^t)weyJvB%xr*642g+6c~ej@d+cV&=!|E8)fPM9L_pIv7{w57=dlH2@bKo0v|&kUFsb()tCSA>vmUa;*Jy6LJ+O1iH)*N zT;e1*um$OLl`Az3zn&Lo`&Eg3weWXmiE&`kV^}Bx2~alk%Ds{!-YLJF>mp}5%>Zrl z=WKK}yNrm&!p{BP=#ZZ|Y3C6^GTyt(rB;O8uTJirIp0N(LoT8+Z!1$V5)UbOQsLGcMLygxN3#4RJ zkajhKEa@F9C4a>I4EB5`(A7OafE(Xwbv9X=r{CF|!A#;o$8(u9#4`^HqC$2D9Y{td zpNDY@Am!4;AEidij`*+Z`m0QY=6n2_SfOZ%u9BWo>hf>x48rVrf?@&*9}H=7S;x7N zUEBN6eVUEw!Q-+~gI7=?h|L52`dvdxFKhVyYVeI3;pa9sx9{FsicaQ)TtIpGN4Ga6 zUT#jB?gZb5d^X*s_~4BF@AHUJA+9^luNJHiEB;p=UW7!%`yax7G+La#`RnKi#)<(t z?{Y7o@QFR8nzB0BN^h_ zzq@a^Q2)sPMEQNLb+!VJ=^uI&Mt>eRPPS9#Qf8MT5KFo+x|mNy?U+-#cne=c1M=F+ z>lGG?W3)ce3pGDP4D<=2i7L*o{Im1&9LoliyB1b*WK{$AR8&B8Vv4BWTAr1?dSvz6 zxH`J@=2)M%4>Wr5t+}=bc0XD8{cvjT$>+i_E%Op~O4pm(on7D6Biy7Ehap1$jTv7d z@&=-%x!mPS3?XLxP{vE+W*PhaHM41%u(29c3Pq2nWlb=kS*& z_hy{!TB58Pj{m%Aj%~D}-EJD$rWgN9et9#jQY&0)))8UOWwFzAYi!_EDrNL`-2t?r ze5_}kV1I2(o%$}T!!j4U79IxPERUrJnANW998?>N8F|AkL$82s4B&DJ){j);KqP52 z>b&@o_t8zO@yoIPT((^Lx!&65@?+C4U$pI=3#NA&TC29Y{E>cj0%P-X-^PFG%!i<% zkuTs_aXwMsuY>L0|7a&(Qv`mv`zndk7jje@dK@5n6=WN=%(m|cd+)G}F^v?P90Nd{09V=53}2IOTTIU#N5BX)yGf=WuKOMqs@eDk z?V*j8WZ8>m)`Uo9IT45CevU7W5S8-`_t2si-SUi@UZwx7&vuR0JhaPQ%G7tIR*bGA zn(#e!aNCUfecw`!YnxhG%hr5|%-Zv6>l#jjxhH&QOR3J- zJ+ofcPU#%00>o?h3fhyoa|(v}vKyIgnVC_=2TG$n>_- z6o0E`<2a<^Qzt{Hx#vb!*Wj=q+JK%NQG+z%W*-@9`=+TdS&RskIC0E3JaFvnwv5u@+OJAo^Pv*BXN)SWk-oj;5DDf%9{z938)1S9RV(Kh znnNGAZ2fyT+gySmbA%C<@eeGUt&e~+TI8J9z$t(;(t{VDOr&lol*eKwF5#u|y3~b6 z56K3%95#Hf{Uj;rrx`I5!KR(@w6z^!u@4;&f5d?nri{*Z#oN7oV3ZcW*{o&BIt}Hi zC6>fr`#-R1`G>?#x|!86@b^z+h{L;#QQN7uYo3%h43%qcvCmwxNNuKfB2*lA7K4#_ua&TDmI5&|6>Xo;qBTo1L2v?5zs)^I1!; zX|%?LgPPsg{kJN^Y=sZ(;!gOf51TP>?u5O0ub=pf#rbQO|X{jHTm))m}7*CpkG4d((CZIG*txAocU|^h09~(6g2=~ zRgq!L!M7qzS7}Z_llZRMwC`#=5LV6P5&GkFf#aLalc(C>PV#ob$a&?{UCGr7@gVKI zNZb~2^5W3_4v!7xMlPc`(H!@=6ptG&f1%u>oY8BWdnh#ihG3!5f|qD--Wi&Eu}fh8B^L7(wq_1>cGMUG){F8L^Udr?Ltim=9R2}^7qkS`u zSp<{(Z-csFxdkkS@hz87*Alal;jUp02fM<&7-oy(y@~r_td^t(x0~0k&=S1Z|74Cv zkO3D8Z0=rjnA|Jy%?vN&dt>f8&AtW49eOK7hR*xUO*Kendov(uf z_1jVJ*n=gKrtuasQ|{pU@-5E=pL!lFfpHMLaX zyf2lHsIDW>cpb2PDGec1r)Ga7vLU&J3bIPP#F|zy?fLg}<(n5(cKeBV6AqSGVj=H> z`WYl@#z$~-m#j;FU@5~&&9m%-d-(a#X{<6Ylb8mx;5{^l_!nu}5&OoSdIyx6+IpwO z(9&12{HV=6$&WuT-!xj5#|$o?dvh>1zf1MK=#>o)#cx{*%1=DCu{2&X0NbI z&$d#2QOZSE4x3TyflaWo5&U--GJMIP>`7_blRQ3ZGhBNR(M$ZLKY7SlB~<_3cks`> zP)Cw-V#Rw>-*)>4^fTollfCJz9iQI^Y3U3d@HNN~0ki~7)A$`e$K-r2Z{M&GMqOs` z5bkNXUJKKsP69#h?*3s3c>R*Df&K>Lux|RZqyCxuT=StNUJNOP^l@{@AhHn%8d3V! z2U&hQvHHIcxJ|O%2%y{}vYk)Qy+oX4ydj~q)x`Alo3vq;HG7XVaC$LBh2AJ`avUP@ zNNL=E^hKLO<}ny(u~(5jSqb9ef|Tj_$`wOYY2y9|%BT4}XkP0Gv4f6#mwwaRdq=>- zk^DKHv3+nA8DinjQr2Qm-c3G?QBMPao`RGsB77$m#PdaXoL*(k68F z#e?&|CEZ!vQS-*w!Gq{#%|^`_%xvr@zkH9j6K@;@er%o5X!N3ZQyncPi0`CL)wX*cR4Sr8BAz@!Cg`4AckaH*P zG-mJIIIpw5TYKopmJ2RTdoqy&dG{vzZ5(${{4`ydG4IgY+=ZcmD~G1amMc&4$tvrs znY*W|i2p^TM$LU&h2P=UtU|oFoql{`72KI_70hX)(SDht6Y_W*Rg1C_Irb~+v+xry zLsc211=T8A^H_W08r=tD6FNmH;GZQrfV7ZG>Lag6QXCkX=IB&+okv+5MCW1~9|jN4 zy`^8>7DLwWu{do!9dZLJY1*tA^JL`|w$YrTLJ_98+8Kz}3!;x}G+LrPOtG6sX+ms< zyNBmPRGMFEs9O;TZ~0QV51%a7G>0eCl6~dft>2nPJzttSZSJIcVZP?pr|m-%L&}RR zUq8{WK2~ma`>-~rr#J2C_G;n(i1t_&vbnBY>Yen+Q!9%B#B}iv&2>O1}7`8K>!i}MVQ!=L(WU2r7cjmDnYUC@ckT8Kf0TTt-vH-Y z$wHS8g#*3tiI5D6@>PWcpR@X46B<~_D+}ui2y=uX+u}Bhok3wS`}Cf4{gtrS1!xZ= z?4}5&_a4ECcPwIx$~IqE`xP@PL9uQ*n0-w=P!sz&cABV8w^Dq>;GnPApvs;2{Ttq5 zaU4@jC;$0K*NQ+Sqk&zd-%S;PEmgxW9yvKxlyZYIAJ-uU}-j|7%wXqm+xwohlm3<}PfA`gt<~u>;A4)}|O{Fzh4gHkc-GatEoI zyp<+mm_(`M@r_`sR5nF~ACoWJ!S`P%Bbd=ih(k~0#t$pG@lu^BXDC@MOv8fjtA;Jm zrC%-}F*dz~H8oSmsXQGA(!eWpY2brB#3ID@Wy8$J_k^af-7+F-$mt}{wRYlcu}tS7 zb^6)+vfa0Z1nJ{+0_r1!w=Ha98@T@h2qVxj_3CUOs)~E~v~bnOym#xq23$ugAei3H zHUN6f<-E^&RS!+>)b4>=<;C&BOrRjhJJ|Q{vFKHd>}XRCgOk&5DE8kPv>c=p+2SUX zMp}i#TO@S5>x@ye1i~9(n^Cd8fV!yDb_$c+h@1|k?R$j%#S)O@9z>&%afpEr+txgx z0_ZgE^m4U%8-c5LPtYglz72eN+ctd4^Pb9+*+aMeI1~eur41fr*nGHW9)5+X!?d(T z?Qc#iNn?{Eo0fZPSp`|FgonJ(=mHDz?HtU&!hC)ZN~pzn~|D_0h#avgF&j z($DjN!+ZI8$dygflo;qc0a(ur{RyB{mzRY)gR4j#y~V{b?s)oU4lDmZ@k3eyN=E@yz-~T06q7H*<2G!JBX%fkHkMKZd+3QL#>4tUS zkxx>1sJ?=8AV8q%t@dV^c|`9^2#c6d+z0ln$DRZ z6rWMk=a6yorQ_D&zeNP3CTwuy+FuaKf@IgQ1+~6cTZTlbUG;36m7T3g$TXenQ?s(f z*`!}*7<4U>wbu9`MC+B3zZzB3;wA4;=R39wZ#XshEk4RAOj!VUD<~{}ke2c+rws}P zvuRaBvtcdBz{6Uf6 zUDH<#(lg7M-Er9S#&*Q)v@n6m$ZkXVNP^lTTjDRNl0EbKk#z@=@(+KlBc{|DNc8+o zEL;uXMQ1><;3)?+new7j&8a`psd`Y8L2W&;P0ZM<^8y z8F;@)g!+WZcF+l#R$P}b<)&Q>L!lBFgoK;jBtq?)7WG-TPymQEtI(x>vyI%!z!5|AeI6DjDC|?rdAAF91u@d9 zv}p_VTlR5_4Ho>W`f=AQB5B?kHB7PAQkc!U$iFxQ{K5_Ib@dBB0)mQpS<{o0|Eaih zcGaLd9TJZeu0s<7cwuTHLDiD`?Dg zMv5mSuc}c8_bs`QDxgsW!y&T8q^R8dAy~xH(0yhsTu?rw2KxRi?drV~P)B-W9FJ0$ zwbx3W%Dxb-ELR^JgQsDq{%9==1kQ@Xn7epetg=lb>WEi7RwIw)36gG9n3+ zCC4Xt?6kNHn1X8Bczb_~1S3?f+`mM5+x@qAA)4X4==S!sEpD8fMD)u4=l&87O|ati zsFASrhs?0_v=f-1LZO(tFmXVDLb`O0zsH71!4Ol;{**5Ive5nHpCY(8g!mOf@f1r@ z0kMg^-beavF0y|Sc!q)n?To+TCqp=x5|r2F-h z<@L{kWVZgI7H?AdRt?qfe_5U!4bR<-Nvj#i?f7`r3RMIhYG1&4{~-;^i6Uz3B)Zy% zz{o)-rm5%PTQxeITf7|W^0_C4ORQ7^triW8V(&hp6>8gLNxmi_-S@=2Pr{jfspKc# zAuN)XH)sE$%we8C&P02q~M~Ms_cG^?cu*4d6 zN7VIrUS7l{kzf`V#x_oLv_g5J_lqYCvl89J|JZ$Ba_hsMt8)0vZXxA1hIT94ilR|K zD;DXt4!yf@adg(mVUT{jp(PApfCktu>u_7}57MXZ?N(TlbwF^>w0m>KX(4c+e0we5sZghcWBRgg^0$pkjdUg!>(h6al$?gN~siG6sl=U#d zoL09kplg%|-*wXk4AN1yAXX-GU~DSj`v+t|j7lh?%PjPdv()WSIk@)d{h`S72!50* zC%OiUEy}$Qxd5S`&+k5Ie-#sSTa8EQ6MtDl4iX#U=E~B>u=$iq?4-+OpI`r+y`!>2 znBH01M?Fr7=OR^kGB{s``Z4G|pX75elFB)cftuJuL8iQSF@_bkH6;%pQwP!~J1sAB z>8)Z9b2l2P3Cg(&0^xx0=w+%Nm9dP`@f0cqna-HbZb7HYhZfgpeA4nd)#xL|hFkoVqlsAKy&AHWGBL!bMnwYREzAD@t;-r`-% zK6%RYIe($+Hc={GmXTaf zz1hd+#X`zf(BAMG+mFABYt{Xt-PI@3&Okcv+1wHggZqocY`jG>VnV4CMsY;7wu=A& z+S^D8LAGxoK2^uSr@n4Zcf;yp+Y%AV%&-4duxQ_In%_E=Edl~OOA3yxp7 zl;Xm5fR6uTLu-Au`Mc`YB)NSiPg3yS4}c{?AYG{p02Wd7Wt` zREvyUH@fMRKa3cnN?wB8hQ^5;hU@9$SDV;xR8>gua8gGk-pWX&jvOfs!JBvZ+6VK zsjUhu?4FVf4j`0V40OyfIU?Ma{o*Vv z2gBpT`=VKF5Yva97H{b9MK_29GA-2cw|3rtvAk zt&Gcg(T(VPZO?Tn2dSW22eh?HRmZb$(tqU@0Ex2k-LQZIBT{ybsQOM58e@ z+%urI{jPszkz4S*$}^OI>J0~K!BA%QGNWrSHHIxopEdpP1Ps+mctOr~qKTi6!qY*B z&*aKg&&=E_!}!EHth|MP=R*Cmi4vQf{TRhpgmH*tdi#vWfpgv>A|>(tMQu08_L?Cu&;T?OO-l7XDi3+N zd!x`n*#TK~dqc|tf6X#pR;A<;d!@;K#TOCd3KACBU7yu{YiB&mwlWZ)kVfGSoJ21$ z!W{Iz-OD4#MO>j*z?1_b=%p$qzx?LF>BD(rvHQ^;3huh>i?Tyq@EpP@7VW|JS))L_ zM%73mgQs4~>Ai6#3S+}cm7s7~IvjmXb0zQn>B$8dNYP`ABt7|-M;v{=ew!!CB1~ba z0quY4x1<{YQ#BxSQZLSC!+*!LtlBn1dS(1i@rR97)f(;fOL40wBrZ>>ubaYUfO5va zRux4E4BOGocpAQI6W7IKh>|W)vA$3$VrIae)j#Iyz#!jIwepkpeVHak+4iD$4%NK6 z>2`5^`hypx9=US}v(3`R9+dIIHca1uTxoOxJBUWdRrs&b7h0d{`6{2mO-7O)*v7!M z&4uMbk;NO*aS4doOK=%tI)?`SuJM;smaS-TnL%I**W1-7@ixc;hhQ%_jYc%(cb=#0 z2N8-XF=(cd6al~Hh=9Rdv+Yc}=a3SmMuSlrA)g?d|2$r!u^}uW+&N0wF=E@G3qxDo za2$an{7zW=1iVP)jb59~0D zcrF_rWN3fHlHM9!oRqTQFE_-fez=gZ5Bc9NQQNzPbl&}4V^uKHPt2RZm`YD}-~1vi zBM}QW50^mE-8HV#)Trxh2FQT=!XyIj=T3+*_#9pQr*NmZS1j=G;}J22?Gulq&Cm;H zu<3M?bS}FF`y*6~=|`sDsQ0=oy$G3kLD{mxdqp^N-x;4DSN_n zaxd4i<|M*c88T9+V4GJaW;g5<^)mWQjDZ*uy*L@5oU>bcQzzo>%_$e01W&?PF9ejjS5h2;7%z&u?Q! zzY_W*NK4DglnKtI)g66249IY%8$ZeSzMp6aOT~ZF+%So?`&Oxn4Z=0p@V^$f87&e5@lLmp)cagceW)&H?&EKwp z=C$vgW)BH5jkM6*7;_#$ZEMOuhNY4V#=0E@h_dO^bgX{{l=R&GBjzI&!BrhvKMxC# z5B~oTTRr32NU@HY#K&O=fk?uYceA1cTJWQ{Q&hdfnB2ny8L*8g82qH0S1#M_815;m zm#9oIwFF=Ep1P(!UFzB49V#VzC#I(y%KHRG-ZiFqpW~|sI={gidWn;E7qPX1Xa%iC z17RE2vRkWn!Yg3vQ*ij3aO)Q#I|6t^d=tS$4HF`Wp7pWWI(cN?YHHPg_}t)0d~l5> z&g?|96}5UWh%;BT$|F7@rVo^Z=sLHYZ%PaVkHTR5?AHaJ^^=Zu+AdYba- z7WgSfm=SYs$uS+?A|4NO4cF#>me;#WpZKlXqMUwBkO(EfKKi(2zcdZe!bIDlsOr{eIwQ5gV-GyGT!m92?Cuubs;Rx=MD zW>l1#deE-)psz;+yI`itfwe2etGsvz>Pg(wb#kuhDS^KA<-GK%;?7cs_VhsbY^-nR zK7-AZih^cFs-=%fy_-o?p$?qhUbQnOb+ccc8PY44C=ZDwgwh#+)51K3IB{voEA}xQ zbeOk`8#T6Dht7XV%qCEf?g|XpFbZ7@V7H4mrk*Jh<@b3QQf#mfC(OOXBLgFMDqtae!r|aE$D7K3(j1ZtJcDIB$E*`0q@su9G!$q_QlY0={ zpj9>8DHy3iiUNzazbQ3u7Pq>eaXP_vNJ#@Fjp&^lcR(-fD^Yg$6s)vFz`WS};K5I% zX{nCC9*+61hdZk4Ygi!0Yp&7@c!39M;$6BPHL_EBoJ0@Z}N~Pc~yad zftyQ3U+QBTcyeCmW}gG3Rlo}Y!iiQcIuP7{T>@9`O$HBIR~nV=v|e=;TgwEqYO4W8 zvRjBbZK%&W89Vqh4W8-?2mt*YX>Z}`W0_|iG+}73u>H~PvPlm(Ayti6jG#cE36QHV z=CIAe`?MRmY**!X`?`0kK2#1%_yRLTjzXP*iyQ5RNJGv6Md==>tE>n@%A)`p651Dn z`)yC+1aIQVgek1Zbuvl)$(rZ}SW*0!V zGMF6XSrtgjb9z!BRpgWEm>s@H+c-_iNHgri=HV)KcXaAQui67}f~wL0-hw)u3AO$b z=#Uwr?7&`vth?fX&@Eu%F*VD>HtPKvfAcn$s9dK#Ck3A+BudYm11Z0&V`{0l205;~ z$Y9}2BJ8FT`E~mwX$_2WssCP(4w_4ceO|}YuHurve@ z*^%bX0R{zv;)fA4x|`b8t#mI~Q~*@+rd%{f{u3NIj54TrBj>n^A(Y<8kNp9bHqS+U zq3*UNO4Y=9uJ~J*pR7`BPCd?*3A|4#4Ou~ScATZS4*3athw+-6B}S*ZO72+h?`tDE z=m_|SDy{ve1$ce5fV7kOgDzG_;I#{VCiGN_&{njtL0lo<4h#MEIv(*TmnsoTk;d0Z%WK1`h{Zq#EN|S7BXcWPZQm zH*(QBskuB?;lezCUruwpKiFn_p$Xa7O@}H2RZ*vh6^9g_y@g|VzkbL&?2L=(L@1mA zUuT0M>TtL;^65Q) zOes@^TnWfajsuYal)PwiC0E=7Yvt;W@`kyRPp))1JOo}*n-X?m1r++@igSC4~a$lV+UEZ32_(mcIcL{a)@mpHvax@Uk%CNCB>Dy}?iQ5k#Vo=(_>?VF&oe2bw zXHYXX7jN%Tl1(d=NbrrYl$@Np!n0Z@;=SnhwJ}rF>1C#`N0Mwo_EQlxHdR(thT3Bj z2XH8D-X3Ky9x93cWe_X5rs9fwZab+3c?j^KaT%oTjjc=Za*ow4Lt#ytBwwxd&c1K;T93cL^pZX@jTo!cxMY z9@w1gJV_~p3F7W<<@xVFy$ycz+7Nu!r?#{|80x#cJs?17UAR(E9z1^c=Q&%Rf`6Q7 zpSh)l$*E0QPRu)u&E>4m&PT~-IXq9d`N*I>mr(O{cgw0F_g%nla`e;py-s+$Dk?B^ zwcM)w%i^hB5`_e)oxU^}5P%8gKF}kZ8!i!;o*QYL*c~5TOAOh?-|~UyfjHgEU9-q~ zgbT~ymlk8nEPCN7fh>(_s(Qzb-iak-ggpz}Kq+-jQ@n}tlX%+d0XM{Ew=f&nI5_By zM(l}}bAr;oL+{~P@TX29?Fq{N7y<5%EeTcLEIO0@7>NX zU<+0U(GTE!t`vlM^#Wy(JuzZ?{tSTV?Wqy9qJJ!i^>X4~I=Ik&1VNUM|tqM8N! z3J$T#A1TrQDDKKt>ANoG!VTkkPEcDZPX$O@Z!e&*jcRrZ@{DO0U@o5dCGk%TZTUZs zQfJuu&NGmPZ%e`=`K`4D9y!2}JW5*|FLb!hn5zPofC>nYqc=`(E*-R6S;?Kci~qD}b7RiwKelrg#;se_>4v-mRl**WYK@L#aPd@Cud*ee6yv~hv$r!mD|?P!Rw8kCm`*d zwXvz75#rvl&t^mH9UQ8(d1?Ayt@gE1n3S{(0{Q`(JDSpmUr7kSgwkq7S?(xqNFR0=A&q3duP4ceqO(m9-JHRCMhE#?GGVO zI0|0ssNxfYjq|MhA3DO(3-a#Q-Nt0Qs)=F}qgdifPV$0MD_sKv+cdttQ$+7%_ZjrU z73#bY8y_PO32Xw>ZpL!pE6T$~xH5sgPsJMzK6rNR6HpTl4lyTbSGmjtK9(MOfoiK>i za-RjZ_H3`xW=6N^^f_H*pKhuIFx{MRCyd;c=H0VazF2jgbv+npVGu9-iG`vu6zh`k zg4JDH`T@dZSAY2QoQ=v4@u~IU*ev86o5#I(O+4$GgdU?z`qhgdxd)Z7L(Kdgh|=$9 z3=1g>qHr(`DEL8w#S5AJYY03i2fjv-P%EL9( znMyjjQVrf}(o+rX4Bpm#{;{y3%UkwA9FvLEzcv;`A4~kE@W5Dw#yQ6E>ni+nI3l!5=aOCX%0Z_e$wI+n~z?&Sz4InlnY2mOg^gTUa6T}fY5do2e8 zZB41lIDwek#22#jj(B2b_N@u0P?nW8ik0iZ4bLwPhgQvTH5L9O(*%o$wm|*Ew-hF7 z(#`0*l&!S?@osWDMLD}!Me&8*LZmWq&7?w6Jz&n3hotP4-%LqOIJXk7gnI|ql1Ym0grR%Rz?36V3WZ_RX@GQ=}`wM6C9?dR{*kQHm(s#db!y?1YOJKd(;AFeBWsiw`2LqW#9EL%e4 z*ontT5xpZ$24$lw6C0^Ft{Kv!Uiwd4E32+{iUyazk#n&3IW`{vbqh`q#kE~8Y*FwI zaJn_u1L;as?_`LoF07;crJK6B{w&q1HW46elhKOOfj^xydZ|- z^LX+y;l%~MX3P6ygId~VN1K()yPUi)l20~wu|{`*buM>T=aoBv_mGRrZUOipQ?8kO z3doPtJtoTDy9-3XXS-deLc28ScnE`JmNHgj>q6H9@WlgSIrk^m_R7j?BMDV?^kr$Ic2M1qYZ{vB6FKxg#{8097^RXShz*My%b+6ghWAj16+$f@WM9xk2hgLS;^4^)X&YFkGrWZ zxKH2rI2fP(7fRWu4TDSk{^IcL+82p8?tOqdr`UPOHsCJTeF)L@Q*!YB5y0>g-sJ?nJtiP;Zmb^>mr@VZn^O^38#?AIs)&pYLv zdZl*@%*en>k6~oZJGvE-aouoSfz|eJ`u2T=|_LRh@s$=HnUgHHoUTRh6l# zi@>F>1LXV-udn*Sr^Lm9)cf3`Pke~n*qEZy^klYFsjFw!%btAnO7E);i-n;hkwVyQj67wtuHs~g0ql?;XGkxOsLAfQB$FkSW)oPDZO3k;%X`FW!5FooCMs|Y zo*6VCa+RLiWwC4XuFI1-o^XbD)i({=R4F$oGsIY;tgG9Oc{eTA1!z;YDN68gmq61| zR}TE$ZlQfjxjjEWxLhcVJgT?l+f}GBbfh}PY{a^Or8Z4DTJM7m#g%BRC(uaJjv{m) zXj8^GDO0m350wl`y|9By!%FNJzR%Lqt8~!hGjRKx*+KFVN3ntiC@y?`#dghmlI&Sx z%ecUMBGlQd#MB)6)QMnh?E}yVr}QLc z4}?E69Dn|tS=a{B36hzJD_uHKSxYa54%$nnKzTf?ZMI*L!{o4cA|shik%uganLWPP zSQx?i!?o@Q-<+KDgFwAT8Ol-g0#|s^H zqbXo($|CJ_su{{!F_rbi7@yEymz!_M^Xz{VOXm~0+jp>1ho*WaW^058dP+4YV7Rj= zN{(~~5jlc(GkuuRUuSL>?jn!r_zu&t?dm`tj3r1ThO70YG^lT~r=gF2!J z?Tjj?yId)bo|&h@z6)avJW5QDyf~;Bkl0Z(ntl*%J#|I|J`Ejil|C9~@*r|G8xx`C znPRFY_uSm^xBxGD1Q@J*jjni#MV@DO|1-N7zF}Q~#xLSd`qV2FvApvB=6iG?i}VpZ zW89{0)P>EcI$+|li3#2yWOpKIbAGgJ!|E`jCGcr^MJ$mdXxPToXf}QY-1WOctiJyA zcGK;|x{*{-%rJCtcU|jo-{LZn@#g01W~Jny7tTTj!QZHkuT1VTb`bSV;8;a+_IGjj z4xX?%w$c@L;tv6lKGro&a|J8L#CwD+Y$MV(dVmgNa~``1X+|tTP@^%Q^1^PcCxo>& zS?s2kJW=-Y#~TU;-Oz3jGa z!Xw%a34kaI%5G%V4|$vo-H#Th<6$kkah-Y|ciWrw)T3w%z11axUkNSQpD}*5af9MQ zVWfPvv!u3OyM!MQikeNITuK8}P2DEb`jw5IE`x#tEWT&iKDfVSN^>KsuX z)cEglU3QdC!*T7O*#tk36BpcT2W-4&B+ZRX@Vhgu_WozLsmq0Oc>ioYG8<FC+A?S;!H2K zF4=T~$^)nMOjY|#pR23(0MfBa8%FSCJ^Uq1b)s_OKfj11h0E&-JZc<1FYsvBOXO_A z3mxc&VI%e;R`fE2A7^PaF2OIbchQlL?5y7yfd= zRR1oG#u`en<*YR8e2-M;)x<9hO1&(odSkD>;9Y4!!4F8AASNd45 z8PNxnL-|4&dS8#ZT)l8U(e`*{Z4R87e%BEg-?4$rg8sZzXCzLlKCMLcll9a!DR?F` zWah?fd++s4ucPgSTffEKVL+Pkk<2wS(vXPU@gX;&?T?+^MqoC+$7F)Q!TH4-V&uvI_IR8>J_I7*d+x2%Um%+e~JVPRWa= zF@1ApH@;r~*~Q!4kH;A`HM+g4q;v07E@B(w6uyVlz^?cr+C}e$S+N3v;3#Z!9M6VV zpypZ4DbeY&E-VK!_1mV6*h9Lu;c%+^`22pZe81GLMRFX zvQ<#3Kme5{5_(esAtJC9LT?Jvd+#LM0*bVtAfZ_hB=p|lR)L68B=jDNAfbaaY2V^G z=N;d(-*d+BmpZsvYt25dc}+}6R%f^8clg9HduhA#eHR-*i|Fh~Yq}B32Hd+)8f$%u zqQ;kYn1%5C-)KRD$Xr46dnC^ZWp&wuzJcBXS5OhZe;D-JE0b0a<{n?}OTF69SJ3(w z37!Wq#6OmxwqtQ#j9ZuqzRxFDCxz`tXmQa!+)qcB8%_e_cV2Xv3 zo%X%yiqr6o#&BBCgVS@b;X5ua`vW`Sr<9YV&ChJsLt*(*=Xn6>y()9)x#|k*5JWU9 zI3d%Zts;7Z-IKTMrNq}7_q?0O^|*6O^mhOR*efclv4I2te1Dw$-j0G$h0~l?{u-!F zG=Vn64#=jMK_mCm*q%_>Wxv;o@u&}3G01ed^2tT5vbu4zn&Wacy2fCmxd1kLW!@1T ze!aZaEHg2dKjeIMn}1xCa?hIr98#PXa7}9IiZh3bf}ae+7!iO9cc+T=%fcsUdGY1x zIW(q2pb|`-ib`9^wuxsAFJRRek^ap(UW1D!NhW!yq*oerf;YU~l)3mKN{Y?PUPDYv zHkPVPdBp3ncX--b@*TuODWgj#iM^_)TQ=X(tpZ&VG=V3;Lo&JzyMYw{PsE4mSA=fn zs`rk{ArAmwS>9sA!-HstcQ_NSolbuuc7 z)$>!Y&C>+kt4EPpV_-w3V*I&0zoP|5o4Q`pzm!A-z_jJ(D?e>41P64~5>S9r3mmhW zP3`yJn$k2RngMN~@aM})_P>l!r^G0`X)XcWi_vUrS64@5JIiQ2mv+)e1*aG(S!qKA zd&SZtp2VoA1;GclHgL+NV7b}VA%5?AdSwix%A4y9^fw?e=EQRED0I6e8&riE6&PQG zG;!|-3KGK4qL1_9D{ZU=o1_e|pAys^$3H+3_aYsuB@uDuw<04H{a#;7M5Sg~A}!(d zC(=MQ^iGOwim8_UvE2;zJ1W%6MueYKUcR~gCmuy3&pXKP^|E)IZVR*^i0Wi-=oW~9 zMp4jl@DilaTvBfA;_!1Lh$4Yjdo|PbBMG3#3)lswR7yo&ZJ20~pR05GoHlicdn?8` zddaDA?JzVTbgjvBa8raJ1vOa=X7=@qoefa%gCsG{)Gk%AwK?Y+|ONmdV8qMF?ysi$N80^6HV2$gPmjug=i_JA~dxmsrwtwS= z6Hu917|^9%ILJ>}XRr1Ub}GG@2vjo{P2df9bg8VSjhB900Ko30^IjYPNqsY+4OlfM zf#GpV2SufN#lo1*pJO{CZk2>ORei>>YJuWtGaa?F>V!fY z(}YXQm7fuuTF6zu6P1Pj+FFv&>I(C{_u@#P*j;0Es8!XPzVq9;b-@5l4Sh-9@{C?3 z4~Wn5gzG@?$1ecAB+OtXFoEFW(rOM;=R5ACU7Xi|#%>TNjiC$>A%Sq%-bfEGi|7Pg z2%jVnvT;$yAk6VjKvK{)oy~V$KabN%(CE=i#6@*K+c0V32DQ;G79=0Rxv=-r;WNn*>(p$mqRwq3W-!+>Xz-`Nv^THbF zJl{7S{*hd*iK>?LJ1q*<{=wxC205J%EbCYXB?StB-Vs3C$Ve1#gyiaYMLN3G{Dy~5 zsDN?5;E_)wlPeFKLuG##!zj~>uPG&$TVYI?$$xIU&@R&3(XD*P$2eV>h-h>Fc8C(- z_1LK2fR7z+uk5yT8GSk`gW3^?I|=~YyH;ei?AF0Q?`o6Ct!r@ z?8UL8tc!pQ{Fv{;9>jy}rI}}>kDJbMaFC52fOFJn4|D8zQMqNo@Gk?-oS}ZX;G23j z-k#Qo^8TN#E*b+Q^TYm#9L>i$Z*;L)=D3HT_V?^!-S&YJWk2exlK2=S2;wON5H}E< zuM%utfGx#{xuDH18MZ8+)>;NpF&}qJ4&%$=rW<$kM~IQ4fK0~&%v4j4>2j3t>#=jS zY64F~ht(Y3{+xui1*Ui=V2&eTtn4A6U2*i=%}iOm`Q?tC<-RpNZ(LMtt59X94CgO< z4T>$Bln2Mch`{_+o9(s3ojpKFQnX!ZA73u+X%YJYkaTM_yR--c0PwYha%Di@W=a)H z`c4P&vaM2Tl8d&@|dO!AXILd329t7_1@n7?hp+m*EvZi z`_hxS8+w$13kE;0i6&SIPObLxf72$*K;MAX`>_FKV!_a9Pwp4gtE?d01kFNr=e=ul z8qL{2XZ*Akxp(}JArG9zni>{>*8bI_td&GdhtfaQwDR%->#~BfT%Zh7;9q;`G3`#M zhJ{-5t{R;(?9TXP%?e#3y)w-xU0^D`Ora=l`-v2dTj#f?`GyD@E5xB0GCd6y#3s#rK`L zgO}GEQl=BTzy`pZ5Be@TiIldTO&Vu_8r@?ZZPAK6JI+*Yqv}2E`{VU5O}Sr88i3n( z)*_#vTv+$pkrxz@^{|ao$2Rz+9f{kpmOj{CSpD_t?Wp$Fj~jwa2|_$47e`wz^TtH& zKK~|t9$l3X^NeTVRn+T7zK}Wo`3GQ6_nYj)10p9{EG zOa+|?H%^QxsQOdQCr>XgC13^k)X|nrSX+S(X&;G*H4P35R%k z+FB@GiaMBA9EsBtsdujY{NNtR>R z{po|bQniEtdQTVtMS=;wl1htspRp_WVAVFz0Q{pvo`Dpqs~ck3>BH%iMdl6BdFb^H z73nfUB1&zjLl30!$ygqo2r~U5sLOC!*rA#)K^OWz)USSd6Mlsrh=-0snIEk^ z29pieApy66-S>E{l@McUAt^Af&H0U9$mu?1MIm|R9GjZtH9$M?p@+Kc$y;m$B2l?G z5T+%=wjWE{y-w+So<)bt!m#G;XFsG+@`JZzr8)KGKKZC&y^JIi4?`Xp`coGXQ}{wVKCh<#V`Ac3_9uDIzF`*z3Zfuiw15Ka>^~%3M%rZ?BTGHHl zd$Lr*YoQ{8y#kN_ecsgJquvYkzcS~eC8 zP`vk(Ubtcdh5_?MS@F6y3b`_tJ)Aem2~cOQ54awH$82R=154yU-QEKSkWIj-TpbG8 zYl2tZYBqSbf$XE|)hqLztLRFVz57#{L5zp33%Dgv13K%;Xd3C6myv^OikGRXQ4|=z zlScZZ4OGLrZQ^$iaXu4j0S+-D`q*=uw1Gt2Ij`?vKD@NsDg95dM%rL2uM17`oP3j? zdtB5G@EZrhPJ9#*h2)|OY{u*M8ISH9h(9k{qsK84v(juM*VBW7n>Pb z3T@d-JND%%rrRK+vHrkvmkuA!xcEvjl6hVYN{4uCBMLVBQjL7-Yj96+n^@+xm&E!* zME>GlF!=lesHy|>*n=m54An{bl-;63-XEv%m4c}hmyWa08K_~pf!F218H?1bpzd3M z{v%!N6#F4SquF6(bei6#g*(K=VVp*lgDoJNg{+THLe~9CB&D&f-AM?dYLk!R{Vt@^ z49W`FF(yBT@yX*S=;RX2Q+rGixlA-IK=P~FOI z0L6<^(!cPGc!vg$Qn;#Cd~r1eUbNe`EMpdM3*n;C>;^&&g$iC_)71RS!%wkf;ZojU zf>DW*r>;hQnta@5R2Cm%4}9Rmy6{l**JSL#*KzemMap(jLW4t~Ewr!+Z;I&Ire8RY zrd;qz^zL0Xp)FC>xiKmLZLa>XVOy-&RYN&hQM;+Ub>JYnQ_GLxD(FOBQNN5S0+Cb}RB-$NmnMfq#q)t2&Q(Iv;`k(Vb1P`o@0(Q+mx-J}Ay`)kVl`Jt4!eX? zI72EyWx$v1M_mq<*DVkQAvh6)Irw-5n_Y}A1A9Z9HSLk&P)O&Vd69_4S!+GeKOIi= zy|DU(TSq@Gs;Hud)B$-bY!!EooeXV6(_O~v(N=br`1VA}=loLk6LMlKW$~7*iw+4w z2gm1&-r{A_XjXgP4$8X?f==#~ZLnLS{rPYB>WLw`RaVI;t>!Yc0qBUl&SHb&ut#57 zF6wSy^HeY`+55njuzkZ{lnux+2M8YQjifx_00U=zk0F;6?SgN}EVgGV{hambIYlc` zmxHsd`pE*q+JJTE02y}RVS{L3b^YtO(eU6Wzte3>v|Ytt3zG{cx4b-H+fwe6dtq#A z!DPe!l74mjWJIQZdJE?Qb7|pP6)dN`=j_m*V+jbs8_^vm0m>9;bjg<~xt!PYZmfz} zrcc}RDy}u={Aj(i4w}vOnsZV*X!2dC3YbDU0Tzj4>wd1N5AMxp!)l`egk0?Cem&D9 z^qx&h(di1vnG;c>tGXat^a0y=e)>xC#c((AgKl;j$s6y>xLgSgMd2JyQmdIc_mSaU zmn$n_!0?&grx{cf&;yY^*+u4qIqTqy{OT~fVGW}jH)NS-?o*!iFSM03fn=mdv+R>L zfwwxvHTb!ya~xcRMs0KRTRFfS#9W*gw%O&@iQr~abM=V>F}C;O{d6v7*B>v}?0{vm zg7r?4tFS2tzQn#~SshquZ;2))fh4j2oF_--A5Ry`X&b{Sd3!_yOj(h#`E?Kk4K9}- zrKG&NyWsGL6Vij8Rx`b;SaB=WLvOPNs$BO+3=5KU3jLTjZh%f4a9+2UAJ~jU?F3LS zV*381Y=CZ*z0qqxLznOTYhcNhnpTp4;NHfJ*0WEVteGHQJ*3~KodBsPrjD& zV=qh6`I_BcpRTBF0L(Mz4Kh8ntB}-qqP@E_Q6Aq&8)#?b5kt>HdpKBr6EDI0X7HPS zoq4)8AtnE-SkbP)RQJ1ekmGJ6b(viei>Jh1%Ey}KSUtG@NeRJ75uAGU@)Iyzxcdi|RHrNU*zHaJ-46$Pn`+?(D^B*8` z-}CxRAAXApBu4w}^O(rbt%nIrVEEk6p#6Ux4&I z1l|320QTg1bE|lm3KfHr_5E?X(a+lN@r>3Ub9^IX8vUi?$6Epou(1q3Fx}FB9$!hT*IDwrGRmZ~Lj}NnzaO7er8IWN z0XQ2Eys#kGGZgX5hZUMk-)(JC1UePwkZ?}ff)UIl^R{_q2x2Y0TdM^D<&sYU2pZmQ zhR^yyigxLy>&l_dMjTxeEU+J@oFCl3iWF^i)ae?vMJXw0kv6Esc zijgTl*Wtw>8vDY2rx*CpE{HvZD6pPJ@uW6q-q_fvkbB3a*gcpUI{i!jPd1xRQ9Bp? z;ngl=(bLq}BvrN7Wr0Br~F2r&@19w;|4IgSw&SdL|1d zi&G%FJGz}lYG1TPir+EnZ4|m{4zxBs_<8=Xu*I%nxifRQfblwB<{z&dnY_9X+yp{o zE`^K)%RLJpXNt)uzxwjsZrh<#mnSP0X?dsr`loi{PruS<>>Qv)e84{+4I;@(!fgVk zw*y+i8l)PLdR_3b@J4Vmrr&4TylzoX>mC!voJA`oH01v3Jx;PyLtJUn(rsB6+65sv zcsuo=tTDd)?2yUo$r^f-hQvq= za!l)Rr3}Qa-Uedzmd&&ugn=$6dbj(k{H{yae6ujjWq_ zc~VdU6wbCb(R-ho?U%kUX43lmo@YG+y9b7abeS#a#jIz7#Gh^B4se;W9~2C( z;91~Xdg))UR85jW`nwc?+<0C(PPL+^2KJ=#(h1!JS6{9?-YYS^#*&H z-l?rgw{w&TCFP0c=RZeET=QJO{8GgYG9x~mRhe~^kz0K$EJVg))V*IPG2ZWeojUo! zv$EHwkF*KK&#mV021n!>w)Z%{ zU;D#Nuf9*eNT*WSIF)mOawOiQiF_dBB0}lnPBHyGpDM`I zdrizk=X>=QhyGkQH7h7AHnJ`P?Tr;3&Y@4c%T(c0L(E2CcI9!FB)XQbI$`mCm(v-o zYc526gdBQU43tsxQGi0rq8;j-{T z81Kt+mq^XB4?tyT)P8vmX;Va0q71UMgvKrbELmO+rNQ5do_@hhTCmuMVQ!%kI^e?Z ztA1^Fr9pzN2j?IPML8LUOqzkl&|*`uB9^!ns2oL z)rKpgvAyRY<-qU zM{7|+JZh^#d8b!qs$YMK8w`sBn|7(-^XLRZ$+uVx3+D7=$FsialRZmw z84ygd6T*8JL+Lz?G?bGBQqO6TCvZ;~6lOGSVx!J`(>w*^+Sy*d8}~hzqN?+w0k2hs zAOM-V?nG=YD~}Hck00$U_{d#(_0jRF@jLt_&0O2t@;@(~ojlKZB88>%6F*7H{sh0> zuh$M2bS{Wyy}W!|;4CvIhI6@YdnL|gtjRwh#3V#_z{;g5BaRfj7*^zGIk8e#7gE%) z?HAUVDd|#`u1PLGJTF(F>bm( z`Vj?{W!g-G8;Lu6t60N6Cft{i&bOKiACVimeFm9}7DUa(yPH{L=?Mlvib`P@$n`oZ$cjB*OT0N{( z*Cw38RIusJ=|qowNEL^x-oxZo@z{}(L42OtBMMpP_7m+VTV~N)mM2=4U}y1wHz=L5{{_ZClIFv#G5DH!@02$<`N7?m5kq>xUFevNVA|IE^)W*(gs<39}x-qcXx|72|pWABN^!!OxI$?50$oukepJ41!Bhn zW4fapsOGTj<~IQIU-GUG2c(=^e9(D3YMGZ_xp?U`ezrw`1AP#9X6$HONZe?|sBhLS z^0i_5Q=Yw^k&2*Pj+~xF?iy3PAl_oc|BbuQ?kUUhL^5P~$ES;W10CM)e}2pip9f=d z{;*|nQdy;KoGGmP_0y^NN(5Mhk*wEql35$ig=@eWjC8)!d?=PW7c0#)TJcdxA=O@U zEmY+r(SK!qFmCJW;e*l__U5Dxys}7}R$^Mp%xC0;?z$17;HK7OB`WVl1O}t_k*F2t zIF3Vm8{r*#&JsKND<0@jvWT^NZ)OXLeoAA#YCsdaHhzakFUh^Xyr@<~3?8F*qsFq( zg$8mTF^k!yyO}qQw!Gb5@&0<_Z1qGPkyjb(g>*`*`KZIG7EnkWsQ?nclS@=WNV+OT zqJ;h3l^~?fIve5h-RM!7J0wKhopmfS6Md~PJ%g1_b;3VN)9!+1a#t z9tr7}5c{H)7m z-I9e$w7-t`%@N$6zRSgj0hIE}GBKJ7_;Th+|q-6 zQ71+RnFeb=uXaRa#sm8iILWZ@0;VDWgNZhsU5J5LXXWi}DOwo6Kum|Jp#_FZe1*(n zalNc!;Rx6RQC$V!l^}Z_L$DWw2)W>Th*bBnjF&UPl&EtVR*0Qj7&ob6UjUSz=O+1% zeBz<+X*ob+e#+j&vwt9(aa7$)Y<)$yj1OMRKbBv+_<=msBV;Cww@sW&U%R22K2WaM z34eg!uV1?U=;cf%im6x9QR(|*#gl=KcrE1aLtxv~oazySGyzKSPk#ziY@u27_|h_a z^msqG;MU$+H-^`S=+5^}%|Q==C)~Anq2%!wLzd2`>Z0q+eL5D^F`MN?g8vf_%ouxM ztD~UqLO8^MwKnQg#Z*ux)DlNEdMc($6<8X0I&SY}V)}}RRJACWMDmtow-7%o<^A%P^j%bxAr zkz*Ca+OhsQPeS3H1Cuj>-kG-AjGk!|Dw3 zG?b}q~hG_1xhZSumLjIcaX}Hdx^&T(qtLhZTAC zphCe(agK%o5um&N2N^x(BHPx5B_ZU>(;v2{!xt0mNS!kFy79;yp&;Q7m9NS02uB4x zs<0Ern=sS8?Ed!LXu%SU{M!31HQtYUwDo={NQ3if+5c-J#_|UwmLrWY9sbwxTu#s5 z$&|_9maq{F#;iv)tAa^AMm>m zr*GWXvpflxXpF{vngofVY7i;0i!ChX=fzc)=*0KBwUof zpZ_D%(Ui%6+zkdQVS$#=S(mkurj$T(C4*>cYbG|QyWTiFXX&b0e82O5-XB=n2k|q} z&<2R}p8Z@&IChY}Wgf65>SX;MJjBmyloWE_oM|E((!%->sSweuV(Gec;N^}dBX@%> zlAj!n!1GQieE*AL0L0vaL3meX_01A)oe`FcPKzKaB=9v2R3h8Z<|&rE`psQ7066feY6ey%ZIYX#V(~;-v@L7u&k7P;i$$3HZtK4N z#H|1;x@8^)n8&p>GlPOa~bwN7Yq=>Gd-87o;W&_svRj&khy zj+pim^Bnz0>mBf6_%yQrn`|%!09jv&QZnlKnlHXHtSx0se?2(!cu(Rlp--kc5ssL z?-($G&eX|wf{g(yoj?)G@~9V>a(e>s(iaX|mK*Bi?G3>c&jOr}u=YLDG}C+kK! zORn#q3sfyO#j^^T4*Oq>i9|-+_SV2Za8vv9KUjbQE6)&OkSNa}lA}WTpN-vPx=RSP%!lLv2MIJYr$8J_NDX35?Q4$?5wg zHLR;2h>9PGy#4;KV-GHj^=nlzSV{FnV=53GPd?ub3BeS|kff{;;c_IYl|rJszsC<0 zKJ7%B!k6#KzonMxAf^!IFgHRG8`|tns9)n;s6?9q zju{(CvqBqwqwIS$Dz@;0saQ4U*lj!ib)=GK4A`S*yJ)tPd==+bPVUz(iE)}+qt~BR zs*4!`ffCjBR#}bZ)sN5xj)f!@IoZ+N@(TwA5UC@W3d__Rc#B(QW1}DIKN4lrCM)J% zTqPNDT_aT%q(>|IG;oN)Rjn|rJch-Zzbt!{t6r$qy+iKO=#p}*>Whg+%MRgaPHFIw z>7O=Arnjk@bM~DwtOmzMt z(5$dlq(6LI_;z^hzYA6mY#5sSKtP7>Y?$0s9e_&ga1+l61S29D!hSx*-Aq3<|d zJoihx>{bJE=+25Zp~)6Fnb$&qT=8tjwx*M6+rU$JTw~wzULX@McJe_Nq(1>~!gju1Y`Wqw%9oFxwS+?t$s~J>gx~rVGI57-G78 zV+Tu@#PGAfGmw$TN$3udC<%}AP>L*v!Y;MpK(07Sr0PMUxJOuwdF=b;G(_lmdBwIT zZjmX57(bXNZQ`EanhQmnGA(h486i6BQf@$nkOYdk$jC$HW$!5BK%yh$r}5YY%|}KU z{V$rIfL#cndQ`NOO^( zqLwAI6L^cnna9YZbUR~;Kgv3yD0^4skZOc*ma2j82zR*i2HaWyh_tS(wp71ni%>xK zP%94aAd+Up2v5tGPvi{kGY^Wioe_8U$mALQaKW&T$5BzPXz0s)*X{Lgh1R2!#p;qn zD6hizm&?O#@j6-xUKpNlzubq@b$Wj8Z(}NyR?pc~uyv@US|;v$W^*X5&_&Sq|9X(` zf+Gnj-2Z!$J({S<80bG2=b^n$g}u`-Q!ce|i#EF9p=1)TkbjxOCjn@2g7=~`vc^BlO$=G26Ok3=Q% zXvkpRl318L#|~_@8yVrD^a5p_p6xh7KHIR;ySwl1W>40rVUbUo-CG*KTMT*givNYF zVC*>9XbhN1V#l!xD}a2h_5(2(wTdCMz9xGc|3Lk{!^dGL$qiJs>?1LNMv^+&t46bZ z+k0Bfc13gJdv^IK1{%Qy`1-S*uO*tr*gx5{fB!me_SR$&q@sngmW$O}e=)@Jktm3r z^HUi2gU;YX-%kL+z!Wf~F^}>F-obk?+q6fLT|W)x+2Z%jkFUbQu#W|`k~$_vCD;vg zi^UTbyi{~2*T|hDE{7c-Ig(g9NKhZ72|>3FR5KT(21-P`UG#T27g330iT*>On4UAN#Yns{I>?xnIbz``DM0D1n>_Xv?nK;SxPPkUiN0qj& zVV3u)n7(PJ+Fu^M{z($z?=Q}buV(G=<8qQ1_~Gk(B(NHD zcg!Hk$PjaMvOaf-n>uoju*Wlyzv@Mu8-UAo@4t|ph-*lb9wA|z3Y~Pr@)bIKq*aVA zv|F1SOJwZ^Z84)q-CW^BVh#=8`^EYNYtL8?J+hjj8 z)QE0W#)d}U!tiKs=!`EVT6E8uq{2ZSJ4(7L2RBD5PAR~n%ouQ?7K~8wuC9y+3k}*NBj`0Rb$_A#y3@_X>sOu`n?MA`TlNu557>D zqQlfmhk9acO%toT-j%eW{XL>m{=y(}Ni4c~{pRnQ=iPIg!T1HOKi1u)o!cYsjFSUd zPV|1Mowl2oGxfLUFplGSU3B5B`~TQG#9T;y=Y0RyD8~V}M6C542?o9QH5q`w>NZ|y zI3{Zd)G0dN5>-!d|M-$?3`-TR@l7h(rj4DKNfjP%f$qO}^P_>NiuNgUC{euFcDD>% zdnQB1)i|kSvhT?L9qTssgwD^I@A1lcaZ*O_hJvOyQB8NYzKefBiYsC&zTpp!8S|3YV_pg^e*|4Dz7<#x#1( z-PBOkpk((==F!|ulR-mF%Rb|@@ofJ@*+BYqSJnH2)JQql3jLv6+beO0?s!b!7V63J z9{H^3M>&UXl#T-L&Y`QWdihmMpC#@HmeFBTn7MTYnuom7Npa#Zyn6w0`Ex<^_{zBR zrI^pA5E?8%eTF_9^yYOk!&Ja^-?OADb}n8a>~V{#N;vSg{9>9k!=ZAC&Ri5Os1;QE z%9E^f8Y&~>j$jg0WeHjd-|f^jTU;F~QjcTX$I*z=F|dbM_5hBRb#eI1pqcVht6x@_ zRI=|SYgeAyq`kZNbbF;YM1NTLwJxt@c$c2HZ&w?83P^tjtbZsq1%|=~?_(3(X=QcR zbKtR;(M(ozpMT$ndLmJpjuOKAK~G55*`bHqNI7PwaNXB>{Nw8^>tpOKMLYYK>dsrS zrrqe_0sAfV@o93OcZI~gF`E*U_)4Es-7zS+=;R4hV<=B8EG$N!=1)&teRo!5*k-3=8la-?9HhZrtiEJULn2`PP06D=Y zqepbMq`ZPQ<_ogzxkqU&+B#b1ldpw!|0#Gr*w6@~Sz_&(RS60ja}>|RBAW=a6Fut^ zOHHd2i6~`E1wCkWg!uAqr>*afrHp>=@$$L6>f^rrQR~7d;hePCLosyQ^C8+5IiEg zy@RalkUGr4ifrR`qsf0Wj^#NAP|P23dYo#w+$QP(gm(*=iTjH%eZBRe4E(X$FzU)- z2gsw%yh&WRkQ%zItd>IJ@`+KVL6}L?hS!DF00NhEGEMT2vqje9MtW#`Z#vQJW=~6? zwM~FcAOD>*?&Gm_BNEi_YE9n+!8PF?0Y%ydoxej@! z?N;N)pZ7{`n_=0nfm~1m)Atso`Lbb9x^2Mz!k#;dXn!c5W2KI%b{3hfkJQwzK9N>+9QEg40QV?rcpJS&7kg{_KCU=pa;6+hIe#+3O^x zuvz=%DJpvQa45(^>E}jDM%{z+bz?eYU!pSy#l}XTA}jdXJDW#*&Y9OcWhI7S2z<09 zkyznaTU|8pWquB3E?nc4v^GIsUrq`%8>Ke_8W#y$;nXIs`DP-U(t*YWORP5XlA5>& zoeC9DpzL&7p1peIM2;n+Yr@PZTj%BDW8<^v-u1LBH9`o-O3|k8FG)N&Xa4>^NHd-E z1hsuNiK8Slai&Pz4v*CR2z1b#qoGLdyUzlRj@ikPOwsC}+XK<|f%|@ydq;RM=5N?X zgtj1wbW$v|6nx(Ka)*TEoF8ul(2gL8PL?Uby$zHyc!^XYXe31W-~)PG>iggV*>$8k zJZ@Tt1F-^&1>GJ=gkc{&io=dQ&sZpE+Lgh#(MU3D+g&$;hWF)+he}4%M@-)=D;L0hdN2hO5f_I{U`9`|S`6hpaXf2dkJW!o}PG?}Eiz#&o-ekp<XumhWce-xpGx${SfsFu`wYDNqhC-?J-;TD)Z zKgAP%E>cCI!$9XpTf7b=G=|v0*$PJIE1vqL-lUU-Btr6&Y&kl45^C43=B{r_$#~eVj+i%p!=4|K}^m2O=X&L5<}G29!mz zNj*)eGm}0qj`*PaDzTCsKNTrTs5&|efSj{{yQ0g~KeaAtnxEFwE8VbQ!1V3m=1$o( zKEj83!lv)!6KmBxIsbNZnBOtP9}Khb|MzX76TbpG%7DRuVB;W|dujsDE&Y8*wA;6P zyppsgwCS*coNM>Lj#;8jLt$$Q>3HL3^5HLJ5{T6Iko0h;REsWTgbp9^KmD&CN9uebkA>x83tT;bT0lB$6F$co4Hi(b@>HsH{V;`b#(oUqZK#gv5 zCZGPIY=Z99|9wxOd1yOaUGID31dZO}+HYMPN2kpsIpCcLcUOf-RG;)LIIRM789^w*9_0}?=~3f@3%=bGZTB$5p(;hUeMW>o~d!iEj2v7u$Ay?>Z{A79uM3yaT{;ox4yfZUUgr{%IgO zA4tUR9m3{DPs=~RPRG=Vz^MS5W-V9|ESAolKr(TGdHkBHo@kez zw%E!gF3~H`RtNt*09W7a@x4?Zc6*x~rx!g$#$DlD#j zyQoK)6ISr91>w;$w1*wj;zHZbGE(lM!xcwvVEptcEzqayep1W2&=y)R^I`iE)?hB7 zf{P?FeQHa(tAN-s^1qaJ8U#O1*YOsx`l>j7mV6>ZfK-DG9uS9pvJv<+ z#>LwK=~Wfg+*c>g;P=@EDsoLdkj5 zU1^^9nE@yf`$16WgV*X~VsJ~S{%vn=PdkoCciQ?U;<7PD)Zb;ot#PCCO9ZpmqL=5X zVi&x=NKNQ&BD(O7w=3S5W*cVJ{`rz`gau{^l$Zal#15~rmQIm1a)|@5q6OP1W8okJ zj*U?U`B&MOLjP*u2{g42Oe7MIU@Tm2$QYbHyi3Phvr5FU&j>1-l_Cj20a$4u&LW+n zll!#QI{1x9d6LFQ;s}fZUIbh2eeg09KGOAj{9h&?O*lR^7Sm@2)j)q#Sl0Ay7LarP zQUhhU_rYln+}sH6mox9?t@4Q;G;zFcS#XU6Nlr8BoG56wY@b)_**q|ejM0Pm?3BJ7Ws>9$R;_R|Gswek7Mb&foV7& zsKuwwooQDkG51G)wO4i4?3YB&{MXRl=R65{&OTru^okp;`Nc;3%-R^Y35JV&w$_6| z`P3ktNl4Vt@Rl6F;UuCDQ6o6arZZ(z5G@k{;0>#l>Mv4>!)!a(mVAAh&Q=@abn~7%6QlrQC=oe{6?Xg4b&tW1onK0GNndj$NKOPrY`230`#OappN`CKS`dT4l z$HVlv;mE|riO==_`aG&%%rp6E7BPdFyN`6517VJ=sgJIarO~64rP?-nc?zzwQ<%|( z2=I;wP~dZwHi_<}sYH9LHz6<}(0Wu|LkVLLE>b#VhT?E%6yppM#qx-eKg78pZ%rx zfMNMuIzm~lEdWNO8bFC7F}=hi^!o4(Rx^wX4J*SIjF-t({+9wfRus1aZ=$yv^G+J7 zztYAv!Xnj4q&@_8Tu3l&D;YXS6yusq`~NxiM`8wTXk{Ef%_3o@Sz>Mkbj$cQVp5L~ zR=0cn_VdIYoO)s)1b*MyYm6 zT;ZM!{a;_XHPm8g_Cl34ZJe}A7y5=+d!_Zx`UMJeSi78i21}Y|kLmvNq_T3SbClP_ z;Xso!S!-p;NZ}!t!SnL*_V+(kd?6SgO#}l_0WG=_?pq<+3Tr4N%5tv#uhUclU&(BW zSz-yz>$-21IJ0TlX^i4|epJwh=3W|^1t<4URD1CG5W|uY+xp(T*D+&kfvDBidkJ zlRszD)D_g1v4RY0_LVg3`vyI7tj$(qGV%EKJqI3l$Gc@!u(PmdEX9pg8SZH{_j3uGs1(g@_G+dUNfHY3!i!_;5M6YQj22_= zwI$wWBkrclV3zC6EqGTqHBXE@`!ugi^V0gSIhh?7)B-Ah6G>#%M9XM@t_O9hF)i)NQbeM z@vc?|b?&iIR#oRPAsKy3ICPTGt|5M}`)o`m-9AY8xy@=-kv05n+xU9rwlJJ7_5k;P z*!m8rCXlu5gcwk1X6ao+m)<+5gc50rfOH}Vi1c2CL{|(Qg3_c|qDT{v-lKwuG!4>Q z76qh(pmg|$-SytP`~7o{o|B+Vd*_|E&GUS*POScDi}BqBshbITP#Ae=XKp7Ubn&}C zh4dKS@T?#AR4wlEKg0>$R|fKr7tE_fS8XuUn)gOD(1QRJ*YQJXUqHt|$hMeIx^8|kCED!y{n@Zw-d4&sJU*oLIn|MQh+|O6k_v=vaIfRyVlI|F-JU~y# zKdJjiM{dPH%O`+R621`Qytmnm9uK~L2<>W6Ty>&o-s;gfVNBJ0+~e3-&H7MTKdNGs zzhiKh<58g^jfKJYBB(QGR^g5bX=?IaCP}eL(#O)UaNd@}dnI?Ix-X|`biD>{>?GeX zItKAjVsJ?MrvkWnB)t~q3$PZL*Wm0WK7;RFp*^=40g6+T<}7dUsIZFXJQD~rmT9db zG5Z##-HV;*pEuQ7ML>Q;g*)vmkmL8>9;6T+(UlYxD&TJ2 zsGpuJomQp=#k=bu%>e1inR&KPh$y_bW&!UxrkFEbRw@u0F}sxy<$Jn`+?<2}^>-_2 z_8&)!j4B89Uzg2q!9&I%(P0+|Qa%35g20b$VZa>t{$!&7fOf^v^Et=?em7OcO{YNt zt!&_!pT*EpmPuN;6<4Z>vZ9-6S#4A%)B`tFdM@~@ti}rP-Bf#DTToa^6<)l$k?ViU zu2*&?)dKkbYqjXWYOw~YG9FS}mh?WB zgo3h!4)s|FT99L?@7)%D&4$%}zVNcy*4%Sg#Vby8Mult0MJCW4RAXZILGEU0K(i?c zCY7@?SjK5yCE>Gk(nL$XV{?~%J%objYh=ch2n-hcL}<~bc~S8azUpb@{?l({asowz z#5VB`K5Q@@=EV=(=BD(a){S~z2X!pnm*o>A@1prf#+w^9Xg{Gcjnz5LnL4)B6l0qG z7z=Z?tNouylh{p1-`#*n{XY7=Io6s@$qo+E)#vJgOx=!zNN&Zq>rwXQwM}2F0 zIG*qcF#pk@{ZEfDLE}h>!EU>qlu_a(`Iw+(SEd#U!=zX3c2)$mM2)E!48MWs(M(oe-L#uWAW!Nm3ji9=aXhH{;#qiqcXM_-jFX0&K=u}h0+J3%*PAv z(P>dJa9@f>m&vVm7VfkZj`-EX2#s7JzI^`Nw&vb>1vY!ig@qc}Nytj;)X#zo>zm)t zQ`SgAX!~ovyBNW3`0A$~J}ph`8db#gtn^5^P8DG&ut^oLx zLSt%BHT$?Z?Rqb-Tq9Rm_^JeaOLcXo=K|K|Md9E_hw}@cz@?J*Q$}~8aNeABSe@ep zwLEDH$)?G^P{Bp&KufyIeRec8ABE*RL$oMn{X+7GQu#sGC$&26xvIFH@S$4$$eX{< zR2E2x+W6P;O;7*=3C6$+*}MOGv3NCJKyNeont9gku_c=1Yro~_U-@>>U0}k1xkehq z-XiQ(;Sq#l!=_H~;5qLAZ%KvtRcMtgDI@}M^` zzr_@?aX&vO%d5Qelz0b85jt5Ru4o?N=CZ}-OM$jT{iE{`_8uuY+L-h-yu#^{tfh<^|M)18<8d2SF+W-(LJzS zXzh-(%O+g&MD`VP8kiW&1imvzYL;7lTR7qa+1B;^jh4iBJmQpcQQ^;$Li@P;3I~Zf z-?yE|B`?e^Zmjlb&S(@C+TQrz?G|wR1Qe4saCPY#z0SP_KWA8!X}^lAVH9Z>Xi!_V zr>Fx-;@ai*cBgzT9I5Q})m?h%NyGl60h&i0X=<)km8~Q3O?*eCVZFU`CUhr?D*uP_ z4_#7tnEKU!%9VwnqFWj(q0kz>C0N!5iQc90nKZ`DMEDoeMevoqs0qIcbEn!5+HF1_ zVn%S-;B(tjJ+w%Kff}Q|67{#AX-Mq$=f zVef>hJ~h5sI|@VcSAUSi$_~FpdC%MXFaHSS5-WY0j@3qw!1qn+!XT?~z=Itq8`D-moN)EPoJ$||Ro-v+r-?wR-ZO(7D}1=#u)T|QmG zg}cVT#SLzT?AV+CxNkq3_P5;o$M5SleFI;r9yZY^oZ;?iPpx_T} z599vyWe$9wvzz%Zje`Te@0*|0lu{U{yDLSfDLdo(QH<{u)YJ*S;7Q$B z@(h=f0hYgLKGTzC&VtZ~rGc5iByXtnlxe_~pA{}ofOkdxnHyG=3E$(Z9lSj@Y+GO_ z!5#7sL9E08??nQGeo1XFLpn2g$=qfmWBLL`i#o$ur?jx}s!8U`SxWiF#8Sv_w;mPp zehR{S1=iO^QPr}owvYlP^f;eO;8Kfj7FFN5af8~Fk}E)x!gIg0fP@(c{&oP?wmUv2%dX^$g-eAt)2auYvwFV%UEp4c^z1q|7%E2ZJK^gqSY}RG zA7zkr0PhJ_Whv({329&GI-N;QM+u~eDl zukw_qFz)Xk3r7mu#b+UuVF<&|aSJjh=Pv$`6;>WYm4}R$->*V&?r} z=7GC~^`77fLti;s68-%m>$mr$`E+jo4iwN)3e=q(%5k|DyKVXB zj>^7Q|Hlw2Pnq>`TazzHo3 zv@`;x3o@PdBsQ81XQ7p+q5%#gnZYMk6(})lq@L zn)}|N&uL)7HJR7C_VftnBgYHj=7D;Y5rISYDQ>loivu!wZQ9|2+uxIs|Ev4ZCQj<#EZMB zVTsFvb%>BpkbAap<@zg^hU2c%OLuzkp4cN6E}uyLdX_SYwNT4s><}WwfY%J8=UvEF zH&(A>ZsZgTe-yjXJOG}h;ltz#bC?KY$zSQg3)Pwi<>?^O>`n;ZKim!?ybVNXy988N zw{{@+#yCSfldKY9#@v{+VGn4wsd+=dj3!OUAby6o${Yt&2ETc~5zTCh!FO$pE2S4y z67ZYAn(fVNJk{{5%>uJRq0FmqB^f3eLUxn+|2ZvvGeWhTepY_r$WhAqRM@FBD5LTB zKHgW0RC}0nD)qjw)ocO2lENzRu6^N9>*unXA)zqr%hsk{kk#$q1!+Y%KEYAvzB49^ zhzz5Q337PkY2_vLvTyK%Xd+0Y%1 zjJfb-+}vE@OV!OW#hyv8V5$WGI}|8PW^=7wj5F4 znoW`*G}{Lw2Uvd691N1ypC9W#k_SB)i`=xauzz-opBGOv@kjN+LmQh7{6N} zC4@p7I7^1VgXlqaQLXm^g`IK?$W^3^^qRN!@i!_@1BShSwPGi_0yU_dm=yWsgB)D8 znE4DfgQ(2%{dg72$r-4Zn5t?p@d^L7KIO*uW=)zWX8>YNltEU@^7Z1UOULEwk58e{ z>lT^u02TY6&58v8unbHirzS~mnQxax-0ljsk3k}mRTvile__vP*UH>d3yM;9^BFMjL$2(f3A9 zy~PhPTC#6l9p4VXv0%dm_a7~ziUCAo14+_|ZulZO+I$+|0R5|_Jp_C<)QL{GhjQ&> zwq#Bt^-1{hk4%nQd-4t#a5}!0(ek$;9(Hqo)f@oDZbIlulQ$Ueu$;x?4X|Qa?0&b2 z+l3$guh@$V>!8L}GOUCM&2(dMx?c95Iv4<~HA32xqmsIwJ^DcfGNh%tM{iGF1m$HP zez=fXG$F=Nh8Vo-yz#qvVK+&NCWb(LZ;VFVJ^%~oxBt}^ECG{|A{JoYlU`@O?K#dp zNZFI3nxwJs0juJwWjec}OY7i{K$z&Zo+Y`E+!gZs=AvPvu%wHsFD2;hnSjA7^ld?;MkdtPVxbCp??uReN;&VnkR z+_E393y6VuQTM!G0#Jm)WUSdJqv$+5Nk(^E-nu-v# zHFxdZ#s>LDhAuutuR=;YCwPg`#j(y_{PNfVtp|Z=9tMkJnl)mI1S{~d_5D#4S^i`Vy)LTQ3gAQIs2^!WHubl z4X@yPG-#b=@9CcZ$baG0#YbVMSNnM*_crmC%}pGc(^nTUb$n$ZQYI>*$Z9VqFgv3Z z`C~)e%GlgsjVSsI1>}UgJAiHl%?_hKej>w4A=ZB+=_fY7N4d&f606O@5Bd!`%GJM8f-N%@x=wrfs*^hf^$I>zc48; z8p{eJH$dEIM7~Li!lusEff|2KOkK4gpl<^xSvp5jfn~|b?Cs+I=}&TNySeVN9!g`G z{<&i)t3umENdP&ujUR$%&?<9oJ<3zINr}zUGfQ?7t1ec;O5g!v2sg~iA zP*yk05FH`<>Jhc1zd*Ot+)c_!%mHkqmHvZsik0zds)$pcjlW$y^u1ZjJN14cDj6 z1tHc{SMS+J?m3~|&827WkrD-?m-*+^>egj`jaEGtS!bZ%Kppus=CQ*I5y6UL0VAYa zI0a$a_dKPWPFUibv|LdRkwYK{GDcraZoSk3@XA2@K?1ayHj>J}+@ z<+RTlTT2n5^dT)NpJ&^W@mmh4#p7M{z`Y*oyfQ1uQYV$C)JD!NQG>$BKk?R|n=6exIGJtZ_|1*L+LiNHSD?2C!fp&`SI8msgS_FlrI9i#y<~uE z+l0;6PY8FB;+Ws}K!bmDN&NFLZ3y!aXU2<;Q!6vQAC4BZco$%Qd7J{YYS4672DKAD z(Zt8jFjVUUl5A~l-Q`qBy1sRJi?D8M1)^L7oGQH^tCen8_rh;Nc5miLdV#{%&eebW zX+ZHq_YLG2*2LoVa4j3(zZ76;1nu#h8@uCoy>ULRt9X63Tyo=YjPs#4so;MRnAa&eUkgpe^vZ;G}zUl z#JzDc8~mr2AYibAi5t&faN2*!Tw7dgNiM~QJQoSb;}}BJ2H(!7gY|ekU z)T<8~JqbV^+mq$fi7;$CZUJkAPEfM`;fspzIn~}(e2tKHmUUj8h8x~B;Hb}bM2reV z;2h#|FoVm05FrSX*u(vk9}|PGt$1)6Xjd=jOc$Y_;sY-WMKylzdh`Sn%0&q$-VW6t z$Fj!ZYk;tt*=yqru-^R-?)><63)6(JeX@+IPa&#d?}l%$v169;A;|S?ZGeNeZ9u0b ziwx?{{EsyJFeIBDfv$aRQ9O8n4>|2`Sn*sR1g2y@uJlw2CdA@<&6!8L7MTdok14{c zsdZf#TC7pF4^*BXjoNC^pC-8C^|U2rrc34?)K#Bz;$kvB1YrrkQD_;SY{OHlN50uj z7mK&yca+1hVy>EQ?y2DNTzbpu8g*fl@Po^)ygxaP#Ae59JSL!ke`jm>6lQjei8ab# z6yj_lvy61BXyiER>ZlEG3DBoka;>uaDEG@p`U1$<1Y(`w_z7F1z_z7i&dQ8Tb6xVs zCoyAAq?E5fhlSMK&Nz|;7rS0Sfk@4Pb`T2u=~-~PiKYe6@W^*H7cEy zNq+(OCq1xc+cmQ|-Buo!-XorAmw`aQEA5diS}mYad;4R!zIA>7>9%{Dfw&}V6Sqsl zCu;4;C!MMFS~HAAylC)vC7d_G>$~M_#&KmGvN5pNjF40Oly923vVvtgI(;kf#!HT4 zJ`_iEUT^k)HvBbXL31q+=;x-X{Qix>#7DrAaxvfG?+3R){LQ!AN8@m@10-lJclyqd zZe=<#K#kMoLyK_8DQf@@Z(}I$Dgfw))7g07^%khcW8$#Ax@FtNE64Wi$uGeeoQ)y& z3twjAEM(kJjnMo1cHMNgW&zB<47iF2-AXrJa6TkrpYthIyMYI!53K|Rx~as6p3hBq z_5rZgqy7PNsmq;9zP@YsNEuy^XQ?7{_%ETd=@(P^2ToV2`qU6p1-os7Wu0|e)d2Qf zn30vmJp=2SWr2Df6fmPM%v%S@FF*$D+N7t@3XZp{>$)z>C~QoHH;CQ3nodj{BEy+eCeiu2l5d}@+--g zztKd?&A@HJ93L!*eh6!aEenmSOu#Jg_^5##{hAbc7HKVMp4E$}G269>3fLwr^#NV^ z6%==l#F<~0#rc;*xb^FpwUhZAya+(wJEETzSJ^Nf%VNB~g10Pwv*n_QNAF1bAf*G_ zt{CwlO3l>o9UTIzK>%krd|JrO517b5yB_DkS%D;2(+jvMQg|^R(keK|?2j=(jAQUG z$FeNQhtPCL-{+jTTT{+JrGzvBr@))=^B9AeN`!owA8IUFivQQvq;5E4x~IyIg$CQ_ z)(&;|7h4cmsT64xk3H|^J{Z7Tp7l4Bt1!{eV%UPa1#c8``WkT|N{_U|(aqp~q->K@ zE6@6v!yos?;uHLj5h_J}tP?HY`4bbDg;A|9>Qmj)h}-(5gTwPZZJKM+WkjjQKt;4R zP7Mn;hz@~U$|G|>q(3;ChmhB7ALljK@uIxmo0Nt{IFCvTUN;a5<5 z4$mzCvMFIh2g66copUYoZPNQs$~{NJ@p#lReBw=4{UwwweYVy4ZwUe=sYe3DV0)iG zO-8POw2wybUMvhVXevfdoyVXl%k}={CSA1IQXR9*JmN@Qm<`P7Vsr*Wtr_|H_N)Kc zBjw1cX}mHoJ9?z!)pRn4V}>&m0vHf?5#^k#^b{?QH;Fx`0MM=jVl4pWpB`m10jUn{3-FvtnR0-X}V+j^pYtpwt<~Y4@tY zkzx{qgn!QY{f7k73zq19ru8aLD@+Dpe*W340+CZ~fQU%BvQ1fqcBSi8ES?K{7x&bL z4v?bCxfkI>WRajYUSQHumahWPWFGZSB`62z#o<8(r#Ci8Cse3(TE$2|RUC)&4NvUd zH~SVzBw8&Pzd!&8@-kJQAfWn$83-Hw^{Hi%OZ4i4Z?>v%+OpGs*{a}-HmPxkv@8pB z6`G2_8Da_{-j!Ys^KhxcueKbxhMqnwrKv1oD*iNzIP1QsrzhklZINU@3 z)>pk5%tIU@hGaBhrcmwi0jgDx^qf=@IO_;8G@M`7K##{*t^mMr@?@CU&-;}+i4jM$ zIBLbN2mqy)|LU#(jH3m(wD^W%zn5BpXimils@0cxSGDB3BhQgkSMUOydB6b1vl;~V zjmj&R+cJ@DE6+8e+dCDaPv#Tsb_l+3D+d3Gw28aA(9;HCk7)=GZp7D~sx5AlZa1*j z)K>jd9f7|F8k{aB`U_hwa3a=%Denkx?ZCXMV)2s@#v1l_?VkVbP7{IXg=hf--i%a0 z_A&Vo3bWYkSfZBzW}x zUyoXIp_%X{qU3XZx3*w=-9mY0;Oz=)?iH}b|CydpfVhu8-1n+bAinpScf_YxcE^h0 zdj@0$Pz$T}I2YAAO}Z91d+l6UH_*_iKw-zGI6#!WZ%rphRclC==P><`be}*0i0_Aj z(e;;l>bswU{_Zq@{UCl&@%NOltMGH7Zqk;~|||8&lPbPT&TnK{O* z)!NjA62AhX#fMf)$SGe+8d%*iucMV8paowJyZ-6tv;3aRt!!tSxS6}ZcDJ)$9A+yq zr-+_>sg_v|7;=4Xw)Hg{ojuNLzNQX)EhS)N7yR2m1AdErC~H6}SCWx?((l55_A*r# zzATwm;kAz1kl{A|RSVGJJFzs_rP}sDuzfqj^FQ5Nc{4zli%u__l9H^!TzesG)wzjP z7#WHbVVO{wE6|^F%7?e#?qf4`h7gjK`Z;8VdVo5TI-7Q{=1pBGO(eq}Ye>x#6~BjR z_bUR+07zY&G@wxXn&p7`SoU$GJ#sqzt#M|M7@O49RGb6O{ z_!LqXDToyKRV-*y5(#c67}7BqV@@eCEC)#&V(5ag<0BCMdh&6Xs@DbYk0%Do0>b&f zT7~ZiTiO6z13l}JiEX^*2bL!WQ1gJ}$9D9My-uqq=`zdjybRom2TB6nXA2580R=R? zR?gLNfRF-o{-8dml@srZIdkv{3br}-6hca;bq!ID42>NxO~ii@&iEpPSs|>Ac(PMo zPHcNz)%l1I;TjUv7J<5=tp&8j{~m~(!3X)rzDkx{;+LfdkR?mo(l5(papu z3o)@c6>Nm=qym(`wv1yUXrp(&Y@0n5va5XPcKxiE(c49hkD8K*Mx3FJ&mA|F!nY3` z9^x<8&f@fZr+vzLRtp0zh}{HRS>OYTmN$^{O)=K6Y0)f5EHV>2kg>+ zsx_CRCD7Dq6`|ZS^FP0*q;q~(91s$cNnu9sl<$4FX|@U!qN=9hO{olQ5PBfbwEFC9 zKEyaZ;F4UNOqfW}Buhvo?y;DGb;Z39Mrf~sYE-un9QejDP>e`fGEr14+ew(RMCa=w zv@|0f8V##y!Za5vu6ho2WTM^BiLso)J^m2zW zfFM~2))N~{@ z3V=m6zhi2hdWqi+g|a=7O)oC#Miz3iy>#B*BH@Sr_}E|%%O!F;)?qq!koX4)2k3QK zJq0hJ8WD(lFn^dkY|!<6>6Ky;wdbTkA^1f6)+tLlWUiZw4{DDq zhU0HwxF*!EIKZ||K z8KHIYU9Gf(>VR$^RXgl3tr9hS8sU4g?6=j6FI%mpm3(rDOoGm$`iV!*s|sb5)TH7# z00K27+x*hb4MK7F%OqXWH^Vct)RF{w-~X99?*BLSi>N&g5-{h&XrT|uw;EU@O2Bl-;3O0wy4w8> zzLs8D+UfoD`=~|fzc-xg{RjEq*Y>r*U9n90b!lu-rDs+-22&o#uN~Waes}HgSZ??I zxPEOA4%a3GiC%fng)o5_P^G)}loV&;3^eH z=t!~A5=xT~V6wYUR~;|Jin!RVKr7^PwxaxOx6oPXn|^ zM~{r0vcqUop2lBGe^6=B5kXZe;v{L2SAd;_2BWQ;hhHDroI*Y!GmX}38m3B{3I6bS zJR@?dhLlZ2e!XlIJtT_kNy2}@J;UYuPY>KP9p7GJ0)zw$OWD#$O=?A<6(ru_qP5b0 z&j79voPoG$aQN%*xCb36fv&JWQk~`8(Wo)#V!F!W8E4gCHp%x{G5wyAlrZ$HK~_yB zPA7ex4{8J9vmn^5KZo}u2RtK69qk1ObT^aKce8aUb;6e=@c6_A-Na$y7b}EA`)H{5l1&%b8Tc0(I|!AQrE0ha8y{b|z#Zfq@Y4iugrP;%cz5 zqV&<_?x#$*75*+{9cuG{J6vw{!aLhyxd@tC2XYL-1u(p#_Mn!CkUB!whi#!%A74i$ z*{k5H)C2{RfpJj!X~F;%=0Lp6pDGZ{pE}DF zzFdm|4pK4K)?cGBB7X)YmA9}GI8Q8>z>>AQqvGkK0a>#moUle%CE4h42QssuzuWUW zRe?#5iFX;3^i>T_-`*u7e3^jAI+%Ankj@Tp49+7K36v1Td{Ehp5pd;(ynNoXZbQc= zcX@ogU)qMPqVATLgxOFXcC)Xn6Oo%8a_{7S$*%qf*4ka(N5EB>{mW+vYD)HB)6v&e48J0Gtc7s3MgOjQr|3xUVM_!Gcg} zl{iS=0<>fpp0FsR2j!=Hss-}WvyQHL&~8}_F9b+tfYB~QXxam1W;J*=E7a>#XOgSC ztE8fIUGn>`S21{hY=vy}m^PVP@ZC71F;|9h!SD){29|^#X})LtH4lOC1`0f?P_+(( zeT<>GgvvbPoHac=f-R+faMQxFS+hXw-~{1k%7#BCkWyzcyZrhsV(l6jp?cdgbvk&g zu$)qPsb>ptN4gCrX2+c#IL6S)4z9RAo5v#`nm&J*@W6a; zlaTB5q@i>emJ6NnbRyq>0t*xlnybFqb&MOPF5+f`PW}1g>ye?%u3W>@@j#w`m6nqE zWHqAM;}%evj^bUw6oc#k&^Jp z2XaDgm-{R-oqnxeV8bi;^73&Ij~##u{AE;+f4fA9+gEoDQTweN2TqVn8qnlAXL%2l zue=WwC^2&!Ys;LeS(Xv@;V#(S?%kb_v}dmKK9)WC^6SN{-_1e}9MI_o*5w{x*M*VI z+9RCb9O{1ac+)_FDs-u_8)?37NrD`loioUs-RAHyn#pL_w+08~Z)vOWngO;GxSEgh zp5Po5>09#-RpauFO?}TQlD4PPGM(8FN+~rJD=CC%MU|PGrsqrOHTzQQleHw~*wOx* z8^kAlhtZ@Z&#n@2Xi;kH{gt#zw_(o+b-?_RMD2%Uhd3iG%4)1&2}t{;a~;sJcPU~{dr zi}^NuyB-w@(4E!o`+4zDK@=o~|ObzTSbl@$B4L zbUsyQf0nts5I+l>mI&ZTPLtviK_0LnX!KgCNE@UP(jUZe_N;xIu;W`nsKswnKdr|; zc5cG6h1}j{1B1tnw5H-j)k!7nlIZrgrXTS9p!me6JR2-j@amtoZ~f~(NY+M)M~j6* z)Nxj3Wr9Gv4oQ{cLISkeK7iIMVA&n_K(@;>?6jk`;?UH;wuw$8RZ!l%h|BOe+I{ zCPq3bnE*0AL@QYHXjXtV5}{n!`q7zximz_H{I$~!keeKSRK`-KTtKN~(blKweD;vt zUq;fW^vy#OA95;ZBKI_!WJ_}VqR||Eb++p58AUu=0*uRSwdYeTFX2ASB+e*CXH`GfE?D}p&g?~JER6kuAVNyuUeypKWC=_ z%h!<*eNpvn;rFt?gCkvD;PfC_~WN&9u^>~|H4!L2~XJj{d`&f6tpFzl!LsvadC zUkfY{f(vATM)6D_PtDB)=m8x!FG8t5C*ItE%uDj#2_2yUe!*izis$PXVjFe=*WuSD z&@?E{is*HT|0Rre#^hNn2bLqQw2#U=m6g&$)kxRKZWpFqeAkoY8jnx+n{~2)qt~H~ z_u0d)qrTRzeD;mC^V5@FZt|qYoTQk)Yiem?2Q>w0L@Pc4`ZGMK?OM7fZ)yiuhrX9x<@Yi=luC4PGOIc4Ng*dn)Y5S% zGBatLNPVwlNDPpWBopXOkNoZG6nX9~rLuF;KKD?qCS2LUMiergzxClVbq}ORQdLFC zkbIj2Sab^Y#h*eHh3!0|Xe>`!@>s@f{PEakk4u@V_O$D@ia-W*A5|}TD0avnN6$a? zC4N0Bt}^c3M_U;Hhtw%wPwMzfF&Fa)BtT|P2X;l$gIMZ^pz&&Z=DR#`up;Q>=_Pw* zerY$@TL)^d(-QAnnwOCeT=YkHm7lkM?A2?f1qTLKx@BW?GUMS!u;PK!NlMAonv0Y} z9*p;h<1~pg+u!Yx;gvM#Ws1G{XRDNrgKFiuCeJX=hUy*Zws0;V?TSs8E#TL!NIJ-`*i@J$O8?CXQznT1lb9Dr>lS2}Qw;I5-AkErgS`F-$rSvU#1knmK6)7iQw`)G1 zt!R*IVg%A}r~VQS=m;4LKa^|fAa+ejCxID0rsWWk^E~|;AAwb~>G)o1fcok--Dx*j z@?mGcerZDa?7g>~><1!WdKgRj@OiXx0C9~tl5s#~L2dRKpbsbykay*y`BqbX2&ZN;__;bez@>&ID)%_Csnh;&x zRww!{6~yYX90z5MM&8F7< zl7P|05z$q5QaJJ9SE=~T5Z;hynZ2oPfo%o)N}~Bf^U@R7mM(#eDAeQ!xEw3~%`O(4bx@$R$5GG_{h)$0O!3D9ZBZSkK7tRa(wJ zGyeXNdsX#IJ-k_VDE1L`?2{MsT*M161NB#eOE~G((Pv4yt80rx3(0M}2cjew!I^I( zRGU+g!#9bWwa(ZWx!>t2Hz~m+h4FfS9kJLi-^_@cFJkmdt1eE=#`!00(ySfM-sK36 zx4(T5H_WvrQ{dZ^f>=wUTN^1nk{%jAwl7n>t7OuX_ytw<{Sb$ISKB4hjo3Fg$=iEd z4td88pksaAvmFFh8U~1ko8!a%pj&5!-)(t9Vgt|~5=o8EedUfSAcZoduJ&+D_GN)w!1 zo?uL#H%g4h3(K}GhP1uZEn-P>77aF>>u|vF_x;7uoe*J&LncLUQ@8bY<}4@G z9^afov;JDfW7G>*+(K--1OHUiFrn*(a?3c)5WrP1c^Af7`@k&k^GD=2>L#PGJoeAD zaGF1}jicz1y8*r>=20AK_Bb zb{9KX@xWk53sH)o8RBulx?pTh7n+}9e85|v!q$l*6G#%E!VZKjda|`yR$5ws)g{~h zmw!`nn^>oBbIOFe(V+ga=1-X*u{F~+N1gL+pW{a@!gEjX`hTB$Si7LtszTqY@z9Ji zk)DJeub7ZH2n|>Z+>6Tn-50)e1#%OR|3nPxqU7LWB;j$B!xLQw^Vc^83f4yeFpeHN zCuQ<93rmZ_rMUTbVtZDZel2%&o2au<^#dPM?3Mt18n=Vvw_<1SEQ2iYaH-(b(gN|} zR-dBso;G>6b%|(9h+2A{xP2#qco$H?R=Mp3XTJ?6w&^*sA&iC|R9?0-r`R*UFJ@fS z3o9)p-yz;r&j%HqEWJNC2&~j;!YmpsI;vhxGOq_O6DRkRr$U(`d3M=t$~3FBXDXZa zc8B1~Osv*XV#t^8_a=ko%V2Y3f3Q#l$tv#*nD*B5n+KN?qGMf5oM_J#d5H(H%|(8< z8aIs}ya4#pVV*e4a=fdv=_jwACs*}1bG@m(#CdC!>YeoM1dL7;pTBvr>SoL-P|da{ z(WP~NqhaWjWt{rvR|n+&VM}af!)`c-W3`>H#{^`EFQX_a-<}z<;GE%YY`RaHC;BfH zYA)=-zy*_4XEIj$48Q5?m3Wmen-qT2oQ~J9s*g=uQT38@3YI%7jpvh~dNARD zFOwd=-Cw22b^6{>Y7X&uSLtqLF=(hm&6%qlzI+d+cUnvF&`s_?aiI2Bi2s#Oro&U; zjX$!$m%p$`@{nBBj4YO*n1?|@Z__F@eS#Wh+(}l5Pv4C5_s_B}G+n40FVsQ?W^s?V ze|dW1VB3?tw*M7hTi(CdDU!&7jV=XvAM7eZcJ zWh5;lWD29V#m>yx5C`Q)$2x42yD0#DowJx68 zn1&%9pFbk)kQBS#=#NWdTl;((%h515I(y#z-63=%-w!DT{G~`9$BKr=vKV*_0z*bS7;tnzXLar{!Ch0-yy< zW|HUUr-HqHg{1D}5_jFA*6bV(5Qxs7KYo8gJK^N{AzuqB?(iI9L^i={f6xD1$%35P z2{IO$>m*6(kAIrCeX(j{iWt{Wm{}DiMC#AWP8JU%r{*-LVk_6bGGbRQdp-Oi%S#h^ zBKyyGGFm9JjR&>?h;CAAo`e@)d5*0fN^v$JUucT)7q)m~N8)q__}0t>i(?E_X)jbB zXh9o5<+j4?Cowbt92Jy!@74MY@yX2S!dh;fT0xrd>~7FgUFc*IzSBK}3$2#gQ&InE z9C3MeR^0uLmwk%2i=8+!SNPTo_x^OO9cRRHFIt#7ZP1Rm)HU#ICpDK5%ZBE8FfT-* zLx;<&o<`co;_qOG(c{UlyiQo);MgnJd_kT|i@#&WXALRaLb)v>s}~Dtc`0M`=fy;PLHfC6|St3M+opuS+{%E0}lEPe7RbPLroe_%~< z1MT5&B%W^Db@w~3c&5X}?bGDV$S$O}M5=BcHwRxeQZ}iB^p;Sa_SNp{D2mKLdP=-q zgS#{~@kzi)c+Q$4J1^mNZ)2ifa1~3`WJ_=+yKVk z6aAM#dFC9%^vh@6IDo$CnvDjhm$*Ti7So7Ya zEXG58?R~!-SD_7BbcK@i~h_%b8Y$k+3YHUpJqi!~#hw>T)lxK%J{?(;j(|nPPrBbp6?G@hOJBcSl;O!$D36SFZVdD zq{On-(99&@$%ATfiD7Z6L5|^4CSgX~r-qWc?qZunRnZRAi#o33rJNV*XM*dAvUZmK zVht?o`K(3Ecb9CEgLL*`(!oVBRX2ht$4sFkPZVZlAEC1@km2A(cV*zL9J~I`*;Q}M zvwHtb5*^7w(9>>BJ?EAF4Q3wjep6w^xxfS?9@UU}7G+Uwb*`Lh~|R-rd23 zAYVhQ(AQ~OAZMvJ z!jPJKlHwm_wCn9he|^xXw#f#S4ZFW&+Mh0pyCq03F%znS^h(6{AssL&zIFGILY?bDbqo)pT=a`7TmLIN`#VC^iqPfz8^P!W`71--RjPLaw4YsON~wS9 zy7b80BWl-(eD<5|bE=o(^&NlJQCP(xr&fr_1%sQ0UwFuYgf>DtMWrP&?t2t#Axb)8pAPrPX!m47k}Vdt_l)dOs{y}atY0K z5+CjsRh^pQr*KfTh%@YUo)_i=hI*D~G(>lIw^*@&YOq>h-zfV+J;N}1<}{0#msKzl zmO@M+F5HHduva>vcX-`42Zn8q%f){7Jd7kyJHemMhTm7Dr_2~E)PqOdqc}zfJ z<2yMOpJrm7YoblQvH0nII`kET`s2!6TNlT-edb0MZrU(wHX?X@eZ_ym>TsQ-etPTi;rpJ06hjQaLSzU_y?3}+<1YnHs^sgB*O zpcfc7vJRO1aC_07EuA^8k{8+J`m+x6Oh_xW((U1FL~-}}w4Yhxg3rMA{T`6Cp1%^{ zT6cFq>yigI!c{?fvYN;;I#7QVr@%jzw$>u*ru}GgQU@Ijd8mtOfiJe5{MwDPyJ6y* z^$>liWiQ6{sJ3oX3{&D^WxjBNe0S;!|C3m*n6wz;GyT#}E{mrS?H0+M;zZi7Dm4mC ze3nAUiTCV%e=*r%uC>Ugo$ULsaeaR1urQc1Y1d| z9`n*2kqmzs|JXr50;$Z8EVQQsrog~yJGJar9gjgl3~Le%?y6JcLtBCiY=(vv!Ya_@ z^)TnD@Ft|QKd}2e`5kcv-py%L&$_`vW=I&P2w?K@-@cAZHbfKok`H=>z0Y*9Qxr@e ze-|N7el}}+$`qum{A$RmI;hQe_H@>y5tC{9AT72NmyeuUTAO0vXVI3pq|OSp5Hk5= zI0jK}6s@d5*ia!;0pN$Z!Yo(yq~ztp99BeW&9!C|=JskibQD)fSnB7Yg&};1s&-?v zepbe3c*QWop_6|5Lt1PR&NVK_x&0jvLsvTpb2*Z}bC^;qpGK-a|7b_vy&vwKeFkaY zlVf7s_OfO6NlhE zvKd#>fqYBGoEN$Lhb*N7AL8Fw%LHAQULM*}AWyBuSodc6W9diBS9vt+X37QUvf39j z-`KMwCNnX)I>2FmCfj}aSq&B*XLoQ`*iDDLP&^l%t5AQp@_40PgQ!))QDT;Kk3WGrZTTK}Ml4>k)0!8VP34J-0jk|Htg zh1}-)hDDS1*|8?7+QP*)J+wh;HDx)P$wPl!+4xKe!NY(J;hsy>f@!_ulprv86CePuwD+xImg zEul0BNOzaCg2a&0A&oRcmkgJH-Wy4|bESLp)&;^Z&IZ}ly$|2&QbGNE7dZ52_^G0w%# zD5>2@abZ0rwaSv!PuX;a8W+2rQ#nJ0D3Yrav^{%Xv;)>;dYFU;I)?-$S4xje&=&pm`kx9xdF z*Ph3={ya)p+YvzaqO9YrlN%_2yebJxhf;z*+B@x*bTK|nn_~#0SfMVxehr)0dC}9% zp^Hp2v#Z%^erT)ofu7CN_1U645CzjR7v}6ly867>w(Vuy(>QLAx|(qQIT0?y2Bp_z z^jqs&(9me_L0&}ZokNf8<52@ewZ;6IonY0r%nD#DjI)GePxCq<6W9iO{PihR)u>t% z6@TNtKlajneUj9s4cF82gNS9eY8(Ne7En`KL7E z6sX)zWWnCbk5FdMNwdlinhA-TaS+mSVLBy7@mm%ROxtuQ)^`7%g4m}Z#^LgIJJMb0 z0LJrjIy){bKD;l8KK z{22VSMzD-JQ|_Kj$pefH?! zlir`t{ZQSmI#qATmwGtq??z2vN108%tS1aEPULb^d6yVb-MW%}Fls2d5u-3`g+G4P zLDvL{_W*I)WTCPfV+Z}&WjtG~hIg{NXg?o4ywyvjO6TuG6t%hXwKHNij?!cET(6z3 zqfDm|K2gmdTjz7rw-zva9~@iIr+d$l6{T&FDk%h#hAKvG71l~I%zgZxjsRjRq8D`v zODF0vV2)yi_r~;TpT;VCosV&Ge)E0JYfbXJU_+0sf`PBMYf)d%*FA*jI>xQ5A?Qs?H^EgFwc?Y!v}v) zRdE-c@kAAy{kaAo8GHyQ45tgvpHgnIYslKR6>Gm5(pN}ezeBXg8DDQ~%d?`}#q`mc z9+lVX-!qPHNsw)>Z2yNUhKs(-K^d8n%zAnAz91lbAs(>Ak&yS5>1rzYT)I zdU5S$zfoh)Qt`oe!Ow#_JqXC?cTgzPy z&8!F6`kW2zOIBNtKu-yV%x<@2VbU2`^8{e`{5lO~c`{ph(ARb~b|(&m7Bw~xzBa!Mx@;X(2=8v$)&@~hZ12W~u^&u(IR9h^ zC1sJLZ9>EvvoR3qElIM*yJ)4~#|kb+u-`;`1J9BP7pwv~4mxcIYN4Cl26H9t>iM&= zMswHh>BU-H=qm(x9ew-U6opyb@r{Rt=q#P10tzu{+uz(}pj12t4}GUcVFc46lRn8@ z)xxpNLh;WTtmd#43V}j30H5N63H{XYbb{=Re3%~It6w$6C)FyAV@X$rZ0b{;l_ASkDST@rB(6=TXxf7F<}0>RXXRy>dwL42H_k3- z2#gShQF2me%dz)R=ck#;n{Ko;nc8z-DcEyPKZ}gL+^={I_Qt&`%$Se@J;le^%B$WM zS@OElp%^MFGRr$ECwCge*V|amG|}(u$T(rA=7!+q_nXds9XS0IjR+Hn!Q6E_6ZqLrY}KWnzrRoqcoDyb@#+k?VjfIj-9px- z3*UX*YG}R2>&_j!9^k_jRbex4TpcGuhXyP;JylEsqU}ogLflpGJ6fibwlpWcMj$TM zcLtT4Ui$1m0Wu`GJ&hbQ7#w^}v=IvwaXe9Rt&-c5vhn*Kaoqq@z2^g~}= zMPGBTa-j0l?gF!~W{_X6VQsNNQt>ujIp{uvY#Gt2BA=RshvN7YbJ4KA+C)B2=~YXx zNN2{$>GjHw=e3Ut-P+MMZ01(PEZTstcfr8uqW(0g4%t|liVZ= zE4J=!e~Nd2UfkdMMMq0PRoQ9ynVL|I*icX@P6z28`&&>x$C-zkpse~=%es)`e6gf- zL|W^wQ$=Jc!ech$m9vbhb*hi8n6*cAQ?M6M~mPe-n8x+-FVAsOd0( z*wNV0+)?(ZzjCj&M9EDMYH{D7*7I)*aBWYjYgs9IMX79!I``in?&0NnxCZIh@Q6~_ z<_OzUmU2dEsYpzyaqwLIFw~1s8^`-`ON6LaKZ=&kq5-n@&4cHPT>!H0OO5I*d=`%n zP?bP+;YLFc;zEg@=)tf6V}F7TMfQZfQ0l6W7gva(WCseo>`4&v$-L-Bq8Xv@ZFo8hcZ=vHv|c>ZDGN zI)ynWZ(Ftrv6XQJ!wj}>I6XN{w&t2OV=Gb15-z&nY#9Z#P4BeY7gK~bSk2DCLPJ=t z?S|~^G3!XQWB2yeuU|*jFHSOJlF6Ow;k~w{salrJvp65fTc2_U~* zE%t$N9V~0u9J#WZ9x@+K+!>2$1S4n%y3DVjloeVFbmpI7Ty3ZDj&*tyr-M4#jY(hr z^YUG1$jZI*R4pV&oVeNTV@g!z<~M$MkkP~iBq|K0RwG>oJitxj6@T}?y2tVc`Tfkl zUlywLo!XTU72-?IYW&Z!QEK|+1c;OPOS;=oqE`kcBpVe+?tkS#DOqxxQOc&@c4FxR z8T`^=0=qrXh|1L-9j}A1C&HBY+NM5Ya|u&%?ZXNuU!y%CBdLd(CzPw}#gf7i=~F#> zT&sa7@f=|PiD8x05u@MPwxek>fqf36)EqY>v(Vq4%P>1A9U<@Ji_J0D@9&74YU`u- z%lz=}vhzbEoD*DIOwR9 zVV6w(Yp|O~j+Q^a+k+0a6`8;J;)ou30TKh2^)A`6Vl9S3TKmFf3FuTz_ z_hiO@k4E`@bP;Uuj=888ZXYNp`p9verQ0Lnb68u2W6wMoTE}kL=C1*YfBMZ>V=}JZ z{pWJXH5f(}(6%H#Jmt6{4ZneMmrdx{us#qr?T`m0NNUgZ$(!o0*4->Wg?{jcFPN3n zH)Jcas%1*LIS3|qMjPx51QwxuD_w%*28gSE$H_`1?CJm|r688ov!Oen?$k1+>=VUD zY#7eLagUE&g;x~s@}-yERz}m+lD?p;Y0o%^_u&RL9>qd*TVLw30WuPHdXNeh!Ifh) zymUP;kK?>Q%3*$Sz=P;j+v|XL#_Ah1^FQCHPS4*0Im zY1Gnd{K2XM8hjgFTt&r5@N_O(Im{6>lGW!P81j~bM8pK1AN&BC%N3&Jz?v`XzALx* zNO4QGQ`Z>xga>@9Sf>v}%>Dd@+0SV9s)uU0^Eg;e>~8^iNoQyGd3$+{Vw2?8PBHil zJ}%bSGCtlsz+;@_?q-Zjq{y3(fa!2?`hMdY(W`Ur}qrW_|l$^qrmt*e8QX?!H4D~W}>hzu^9xG&u*&_H3ItGC{1KFY*ed`q1|Dw zYAqBGm4UkEI?zD!#My^PVd$N&s6VzzM;y*~k{v`QNJtZ==?gYR$ybpX(wB{9=~3o- z|87$XecNFN^Q^|uwcjMk#Ffj@DszNasOM|)n3vrCNfr`%>?<1A`e`++)nV~ks%qj1 zH$bq$9qxxjjme5$>_Fv4=xXTIxD2d@F=ng6A$0A8bA9Ai30^DGw1sb2`dGm?16VlX z9&Br(pT~g8`?DRaEGc7NRWS@O(wFRnZM$!H*xwJ?Et|#W!f&3;Zpx$b@XPpRFKfJV z)|Bc^)8F^5VJ$s26}O(6;h6KOzFjbT;#5(>ne}X^6@Sy>6o7qf{ldWZTFhi%Uq86t z1LEgMRz2O5CNGFtBCP&GOFy%DF-A%#LcXX$YWE#`46|!%Fe7bw09N)8FqDFGtq{JX z3A`&oeW0)aOmZ-)`U{_~V_|l@8*>9JHtq8Mz9|hQWM{f*op_FrdyRq{L$(IHQHXqJ z5vzY;Wqc3(!^O+L8&c~Nx$iP-bxDw}fg2{s58$5Atu81NXrirlDUr(()z^_8nfRm) zaasf29L>}g4y40(&@ar*Y&nS3ftTS~@XNM;bL9q6xTelBCYQDR_UL`Nl>!^bqziXF z^i%I0ux`t26{%`$X2Z?9=pe&PEDh-r_vPyJ*~7U7E{X3O?3uFFc-f3AO0*v6I&H154;4n z7MIpNl~Lnar^;kV;x}pF*$ZIhMA4CVp@>fwDy~<(u`rA+f;R|sxr}RV7dlwp!BD`) zOEVZL2ffTA!=?Z()Bp)9p++rNR#93F+)8oPDcP?H=csb*3ILP{Gu}b-PH>Jo?lQ9Z zYYtCBQ+hQ4IdxZ8oG(g=FbLm)XTy4HYwjGO4sREidpa|S?FSV}`hBC>Gi7!*JG{HG zuh&y7oh6a~4xtkNvn_ezD+++`c`#~tz>f;hZ`P4efAW3oZS>>AErb{Xj*tf}70K~p zu2qVIndJ8Ml+x|=SSEc;Vc8g?H#Y15)wk$dOiNhVGb>YCW zG_&>VIQ_$aD>)~gCgY!Mp+xH@0i@4DgHB2J@SKbbJ6N!5sNLpPU=F5#s$iTHxVr`{ zR5jdLPPPx*Aeq@&U463Ux*EAnFz2Fauv&p&nK8X)rUPMMNKi?<87b>BfC9(l?E8~2 z_0O?RIJ#}Yv1*hND)P!|^^f9RX07QLXiXi{TyIMtY^eE{&)rpA0rI;#@)EW-ZgKC4 zyO@R`dBLeq(7ZHk?59E11-m^6xos`wX;`V$aTANBkj6J`E%D~^LnRx82ooqM=8hX^ zltm?|JxdLNVd{2DU&xeV`k`S9L)XkMl;5#dsD2(`xhv_$CEH8UnEx5$ip@=f(h-Er1-q?Z$<7?a}DVBqyEB4kse z2hYa?GRh}MpX!biM4p;Wk6N*b`iu8D*zZ20a%!w94=Scn7cfA+HiLKs7hrNw%9}C> zBOUoczB>QiM}P03d7^LoYZp*#zoQ9}bHuKd1!Wm7s%i)&?(s~X7a3gb0c7MMp^w@W z`q@PZj7UdbOl#+@pJSZjpcSPj+OHyN;p zjr}m^%SzWl=IKyA9zJWrlx_W}WP|b%MN>wqn0_;&*EA@4%| zqq$6GZ=|A~a3l)H%&%cNpi^N~z-x?@U6!6;q3TtQbH00=sE;KEs~`m0=Zqa`7QKGY3Pb( zp9o2~zJ7l^AALVaQB?55{Y8!K$i;M2oRR$VJ-K_Joy^Lgr+1L!u9)%6DgO=BnvQYS~^zSs=o=Eo} z2F%VmT<8{r>>Izw;8j9R`Rnw|6Vj^C8oS9bsr{cE?_L625u*>0*>kH_C=Bk~GZ+0G zi$y>m4jBeVOj#qeQ|yLsL?D6QxB};^_i!V4Z&*`BpxdejLSDzt$d_<%L$9CL2rBpR zWbtf@{fHeYwi*Lce1z0iEP0|PtmR+#=@0k2$6fy5#{oexY)HcNd%48XldG?m{yQL$ zfd_}xC7$hBQ?K0!`l}nUkojg0*}8AUpH@c{vt1oHf{hz+&4k_&s#jsWw2G{MO9ez>{5AJp1Yuxxysa_B$Ova zeEgSQ!CLAtb_Zto%lu|}55ErpGNIu$N+%go@e9qY$tVg40kx&oiq*u~tzrGb?XO|p z(}jhn`29rn*=D$v7K}@k1wV0B5KgK@#FwNoiftM&Jv8f{0f~p4ojJv71{jf+@6a## z&2W}Pz6r^M!MmeTeL2B*dnl*HrAR)l_%wJc4GDBO&0ptXOu>GxkN_m*4|>4zDMhDS zVn;?=LcH)Wv`jccF&VgjmjkMh>k?G3OW%U?be;&g2dfgEx_IAdd zTtUa?B{t>5?P5y}Mec&sBUTqatitMtcfye+RR4QzyZQF5GgiG3siHl5p4H%HVQ*T; zYq{ATeVi#p^{|39P7k4$jFwue%eeeh zZ$Z?w_TP)e6b>(g*~kn1d8i$X@`Ebw=Nz(EFExm`OfooxiK9!c_;(-T>>lFR4;O0- zGkm}2m-gduP#B`NzFBK+_Cy9cucGl$fhS5?qqr3Cl~|3H%Tpn+wboEnSXxHkvN_1U z>%9lRvcl?X!AYN|xbov$j4JS1Cb#eUr1!7qET#N_Iyy8>a5@P^&4}a;Irq6 zPmaSJ7d~s!&n!Q~CHfSYJ@JuwP^bRNR{&WyCrCeIIKRqAFL3(&EZq2J3YPG#{SzxP zY)FXtH|3VuaKH8q(Y*r6Jl$kLGIujlNsW42^*^%4tL*B3nBn7Z7s$RPLi=ogox!6D zFd?y>v35HAn#8`GA(|I_Ro`$dT4FR9%b4w8g5UFfLs$@emXChD-eBQVaZt}p;X_&_ z(=SSORF~GsX=q`GKZ^i-oFBZ({OY$21sH{~@rhs48(;#_UQ(ZYydfPn2yPTX_d+LTj&X+`7q7KIJf*}=KJLW5vhg%?Lf zmi#9Pwst!aJVXvikhm*J=k@U?x%j|FZVRk|eu+<=7;Z!Ye|E;Igh^i;-EfBqvUKip zR&jHqH2$x3C|{vlvOKM!QAfxXAU%f&=x4?#YjcFNjB6?NCqM776B*VkN=gN z@Ala$T#&1FZb2B!#`nEV%>T)MN|dtpqC_g5<%Hn$uWoIpD1_lPOfb2fcp8f zMW_}GLzFC^``V?Nx#v91xzWOeH?Ma!tF5#(MX7kM*)tmeX|aD4jY%2Q{|LezNM_0} ziB|LxuRFUQ(Ag~|{TRR+z)JS{Hy>DJST#?Qr4C|i;N$JRlIS?pHiFD-N5UeB4cy>_ zGljeJr#&ey3Vw;5MclA_a}q&+UKc=qeUTRH8h0K?O_0KPb2Boq54P*sd$^i`h++K( zz@7PdU_BkoCAbw{7w3u#ckFhG?mnd2%Tx^l*;NOszQJX|G^7V9{%=SS|0wjHvatUR?_r=>By>~%eP4AWtYg)VMn(xE! zfIH`p>qZ!*M@9htR)VwPT;z*2I|<|Ml(Bl>ZZ2=0pbSE)>lOyCv^(#5Y9AJ~22hBz zX%~i1lJy?2U$gs1P?m=^T|J}>2=a=!KTU1fTlpN+MDLj`mcMKx75 z{ZN>TUcxe=RtVg9?c(q0wXq#{_EfO;VdQ<(p5X{kMbPA9OYRV^j};GY{182G%l6(j zOcc1x4QB+u0pp@k?esS{FV;@eh3wlaFy`QKf*&BE*cHMD)Zrf!ZHI6I{&)S$V0F9( z=D(YWUtk>Yx~UJJO6wIipd(l7#;4o9DaHN5LDSLeq^SR38VTG1KiY=#D^7>CsOYHf zwq$OWS({GuV`wg(>dI%mGW=+3cd?2;3;%qhoM0Z$sVnt@FAfB?&fWE%SxXD%O|{hn zCE0{68#*wOI=xP=Zvy@e50NqmcRjI&zsErL3Z2Oez5~daPCdl@@E|DmdNSQm=B|zy zEu>WEk>{5P#0l`+i=a+tOMZOi8P$x4Hqlzz|Mi`>jvFmx61Pjo{H34#vN8YL5~eU( z?ywEI$6Nk*sZ>~B$)!Rea)RZ++rLu{t!>fP&o<eaz%IM5LD*O9|nNY+Fl0=+>D({zj z_Yn9{Kj8waWSl3>OFByd!};V7>gKGil~4`PE-UKKY3sc_qmyW!>c%T5h8x5tIs=pb zjlFeggRInoI2jkmSQ{6s@i(%e2Se#=2>Nqm{01KEJL3dV{Y_Wq$S)r$W4!}8Nb-s1 z7|$|bWx8G$A9Pk4d#TatQIT<g11XK42O=_=$)*PfD2AuAJ{?DH*qK6;|i;pT_)kUH@Vorg$3Wt$tE55vX9WRkO~ z6>vxY;$4+-qy%OZ0J)$-;faDk1vy>WgH&88mhhkH4IPY%Gz2FiOuDE^ya~Lc&!5 zGCqeF++eTo?P1ezH-4EGSe9elPxJ3h%f$r1KF>At!#PN>-}5HE`KS^3tV|s$da$g1 zGvv>DiIE4F`9Ty`X%SV3IbzdrYX45yw2hr3jtG@Rz`><*SsU2m33yO}v_Tj8Y$bI7 zWr=Ht=W(VzSIM}vtNOqVe)aqbk`uc5?Ox3Nxoe68NhA@D9L}-luZ#CI6U~RXC5Jbb zDf4`@8d~V7x5UD{w-E5*gb2(_J zx6@xGI@w$1tlqs2CS#{whIZ#G<@r43ZD(!hpq_O7{%X)X*J}Ols{NnM<2ggSn=yVg z1S-Z0W>O-YBRzYV5XpxnJf2Au2B~@KiY4FQnZFk8mF}xcmgNDX&^&?7Q7IU|O!jn)Mq5!0CZD0>A+jB1{S4r@ zTEH<3XSdOuwgnVZf;x6G^@OFF!O5_{fVh=w=9Q0wA4C-C_M(3y-H3%2OSrlMP0v0l zXGx!!_33xRnVW|Px6XHtj?Qmjh+|DYMh;85!g>?&)1k{b!AVTzaPN>{xokBCD6qG76n9*Op zs^X$~9d|E0JGdc+(eV!Icwu=EJKd=mvXxn$g5!dLMBAXPToT)K_Nz9iyy=p0301@M zckQA5WkW_L3O)I-qc9{-&iikcc~ZG2#eb6!+CJir5C}^CS@Mct8eIn?D|?>_=VS4Z z?mkJ4R9}^qKf?s4>eFI3FFRgK=H2Aj&W^Gzb{{FjKW1CCs=vzZci=TJk>R@RgrPvA zYB7%%dU9*5i$G-sHzXoX5JS{c23h>29{hKCIrEvwb+-pV!V#S^v`Nd$@+sV6Yh3uBM8buxTbc)e0{<7{t-=i>X{8$#i_QM^>ju z??XLj=)YC;L=Slj@4Et&(1g~QdKzb%lrlH* z&U#^rmk~PPGB6%=S=>_vScktMswWP`WBBO5_&Tjjy-89c1@j)f@7+BN%i+6xaS~=S zW5i>SC0yXty3pI38&t?JeZ^jCj2wiHafLv8Z_Oq4WSf-|7;+j&OC1{03cu zZA>-2IY`{<8vF9d7lV8v{>%`ZS}K+xNZ%oPHGKNXd+eP(y1#dc4X0Wer zN_Y%}(KS#*9u-24eg#Q)gTWNUJ}AVZW&XMqQ^pX&QXcI}zF09Rf4esPIEm)s1x7lS zP*<#s@`0+0B6o8XW6A!Fw)$#a!xrXNDo$d(zzwK9pQg5flz7wkV_Kf#MUJSNg>v+=uh z0Q_bcjNES(@ZV1rI_*x1EYrPs3)|Q0N{A^gm{SsUZb~#|4 z!+P0rZazLZeUvNt=ZHt9Axc5!RyZ3;yK>7#^#z2LCf(C^aq>l_njh}Zg8ls*a!%3y zD|JDj1zjW)aFgKd_uIVFZ4!~ni(4=-JS{g3FQuBJ{d^d<@- z#qKM(Y5`K3Q~jV13?}i4bT5cJzoN;Rj|u@Yy}usjx4@pw$p>$E)5_`3@VBIu;*16T zPdu?b{Kj;$NnK^HK@!`H;DuW3{4U!1_py6IfwI);DxM)nBsR19Kd+BW#>s_*8r#_* z@524Q(|Bvx2z#isdwiS#NoW4*OM_A4I}rCh-X60blCDL?QKUG`GO})U+pUE7i<=4h zHz21wEptTuGtlwVW@18688UR=b)HUH0EKy)LVOdftcoIz;^Je=-vHRCy=&3rr4^D) zvnkTI_h&B<2b9E5s5*{XnK-rt{&-d=+e{2ktoh23a_EnnL5P1@UHR|eVoV#T2W>943LUS{lvgBg&bl8%JKbaxUp}D)k zTn3FQV_1ijJ7vPzVyk)lA%)@hC!Idvr{~IOnV^e|;eKtsT##LY=gF9- z$HHTbB0fSm4?NQIzvRD>N!$VSYwO!u9Du?-`JBwt$FD?{&{j;)o$>vDoF1KdSBE&i zC)%d~wuh;pcTKBUXdSY(TWt3`48gf6+S8lwm+x|+4Oi`v>mwWAEElg?{3RPHB^ofA zJ^*H2U>EdFx)$~CZ}_|rw=E^$={3w4smVX(RUO&aYXoeCP|eN~C}p>ITnPdJqbiOc z$UZzd(F;(5uiQ6)i+c0f+^B*JfUQ^Ar{U-XKq!Gb16Lohm)arGJu09Ll66tvnAG60 zHioL~T`zbB3t}zwPa3c^9i(#V{nJ6XK4br9AUm*~J_bTNdGrPvOc_*1%IOQDADE1O zNrR>NE2N;xhz$7+ND9AWrQoL-YuNhVcfH^J|KgR5ao3SoA5Il0A%0+hTz}reVq@G2 z37{R?CYU71n~|~Ts+o@-#hSyzc+>jr8P4c4T~b%70b974s{G$XfP=*hj5SBWhj5V# zJ)-bpUiAw$&u1L}2YIbw*Qyf9x2TpNU1Zuq3~0gBWUQ%>lMuv_87$@*_<2tz$Ph=i zIy`sw?{^@@G(~ay`zFv>E0!@Vp<)(4>z$JHQ7l>?J=wAB4Smxp)aXwk-n$q&{kh~` zwY{*P{`p>y#`EIf8;o#|okZ9(YQ`Ubz2k5#Zy=4-gchrY=X)5Mf#>Gt=aEJ1b1>)B z*Gq<8A6jI9cO?y6Hb0)tpR&bh&Ueet;fu;r33KoLc^G82#A0Jym9eU6F1R32(x0}G zzsehP58mDwWk12>lPL=l9vPP9b>@vLH3u2EH*v*OKz<1A7jLwOAD7OrWQvu>>E}W=CKm2hQM%pA5FRD`6 z+PMb)Hw?c0aY-Pi!O0v{_AT>EA|grq`6vcasyQ^*Jo)*`!ta7$bz=r*9SagovZ$QS}$ME6YyQ zNy5Ih&zB3DcgOXY@}_*ECEDwKuUqo@?ecN!g46Jo3a*C1{Yi`Tkgn&%ll5q^E@wvWQrlz(&Oh%@hxd?@iHp}#d z(XbtCT!$qissZLl&$goO9&)r6`3Oj*+1z%d`nR(GH1)Zm{fAMvP;8*C>B!}%>%dSt znxYyA=dKCSUOUD}u7)F9*P`>)jSDbOV@-wQ&kT+8OTVP2_8ofM zJBTSrw>0Np{z6TlO;D4y{Kb1-bvbm}cj2nml6(P2a43$7(e1;YIIS@yaDI?v!DS)UMt_3|y9<9J8oWhKIHDc&Fxad2_XFuKhPk}bO zi=Qgm87c~*uzY|eMrdn2AAJP(EB&(qHtO6Np9fKwj+_~%G@#m_T`J0$E1z-zk;EY; zpB4+@87)^H8bkYUqQ(4Uy1o`#g4N1YviB@D_dV66-M>3a$R3`{{h~`Yf_B;ZIpKO# z3)HhlGU6q`jEJg0B*jH-Ln!i-v?ET@0FBELe;3|1A9LGzkE#6b%V$F;Sv(lIlA zdJ}Yt4Mw!b3di2)C_X_}7XC@~#qpvT=a!M!V#Hk-$u5SjTO6;LY>@{|5wgy#<%XkL zU8Jg%6tDUg)k^UCzhWDU!GTzZMre4I${9+gPFXfw#|d!ym*U`?mq)W@E8byounhd2 z)&pdBY|z5kN7WE|%~bJx6#ZET=DCj_7?O&y^j36}XQ?yw7l(ZKTKH&ZnQG&@l&|$! zt_ZQIU74Ra{uchzO!9>xqwdGh2oN%10ndF>uZ(1J@$V8K-&e(d0RFs9uRMnpz z1i`j=SP5I^>=&?oaK8q0_*K0ni;w{@e_1eVLtGt-Sl=!MAgJiXr{1WLsP;YrThhoR znfE>csBTmr=NL6%Z%{prdg%XZfcO8JVis#ueFzT**hKhsk5qa7XH(aAB;qfWVJDbt z>GSv3h)rO7i}X?xc|?EA><$S-3Vc^wt_aHPDqq4==0)3rP`WlB6J2^!Fi*iZx6baP z_b(m5A`S#+6)<65QFFZ)PCRPpU;&6Dugkdb>J$Z}qwqm;jEJ zYM$0Ce2VJ42fF>SxXcf@#L&IAaYu+KY6z81^{Eb(cQlZZjhB?8;y=+FwZmW^@d6W* zr(#GM*q5}APep8j2Q<*77*ij$oI|FU)m87>s`rx=nx9P+3nk3Zuq}>MOL_8>FBSpJ zIV$hC`!6TpJ&*!B{vtlFIuqKR{YT>_<^NL*5crMOHiO;ZGSp(EVEjq4qHO!WA$F6_Q^jRS;UO_9zS_8304wzuB z|4J$*nXB)Mo*3i7F`PkXlAt^7sF|Ose03D-5I2HS*t=!3wDz<8+MN!3$_J-|{Z3-BUE@i$Hg$)BcJnP9 z3W^%38QF?C<`%nj_Ec7MXME^i`(<&AL0>sO*CJ+h7{mMVeTnSfoHRH~f5nIP33>{G z_8S84gR+5i2bn{sZK#vntvxY0&nc5v9Lw)nyE-%?#*0NgD-HSY{#$NU9Mv2 zFJK!B;a6D1kBS~QKU9T5j89EtG{Fu%o5Ry4k~(^Mwy6Y7R|Unnt1&FS-I@CivGMA) zA*0*)yAgU?*3vqfH5aJckDT$?s*7_uBLCG`qw;T<2diV`JEwV5Gt#kZ^N)nbt<#&X z{5xB{O#iA}CSqQKSF(AFB#J+5hZ5HzqAtk2%ivcLaDCztkD|E5Ag~YK&Z|GG%YD^l z?@b9v7}FFrJj_jtegP2RrG)^KI+KqQVG6!*Tc@w$sxqidtV?6+Gu8?O=>Hpbm{ha? z?Tteb-Ob)}5Cks?#U7thCn!B|o&X#2DKnLQa(H@ux;6{KgWif{vU)MK5k&?J8-?W4 z6Q#*KYtKkPtX#`nXyaAmRo>N&wORig$S~JnBf|Z zDdH{BS@56mB)|&GJqFWLum3wKb@G6hWd+~gsAS$FjC5;d1QotETUCXU#JOmvxZ=nG zCxJ3A!7uFw_?I+i6FTD1R#MOG8;?>hdTdD1J+{TX^2o}|=-Kh{qXnSpKw+cWo*}PF ziQNP`Enwes`bYA{5FddbTlN67dU3n+76QwvS&>Bn#7I!gy~Zkj+8_Hf?rqOiQW0EK zz5lC|XVe{cEixbf>qM92l!(W`ySskSvNPvu`4-dEaoW8PqMdtdwbt<#nj`?g#jL6l z0q)1HiMF3tU-8ZSA25)RNdCO|SBJWOq3yoEuJO00mC~_A-l|&S5DtG*{}z}r$1`l4 z__JhbW`C^-j4}=~_gw`ZBiq@+mMB{O%ycwOf1MjwRX7r`RnNA*p}7X&kesBulD%>QkiOTAeOoiidBlF zvOUF;Dcc2HS++cr3|~90qnPi@^wM-v0u^@WFzObT&9Kzob5k0^@wSIkpC;N1`j^E| z>DODD71*1E(i#W=E|PrS4CUr8f0{|O-y47byIZzZ*eep4P0GiRI=!8XPBdG$|Io5m z2s8fFCa9IR_hd`*;_Ev^8^Eoaxt>PN0_$h~;e(mkg#38zIySs6i@HXgpKcXn@@j?V_2Dfl_LeN8wRM1-_Q3Y@76PW>f$s;<4jt|U~c@G1}NmsdF0^898 z(E7~QXOxF41HgPe#vK9%j4K&ebNJGic=_<*czZb~8ldbj#qwwuK#t1h63uZCwt%|# z*BA(g(3{OR`H$)BsfbI`t-oSANV^k#Q<?ZWyZEkSDy9M18>ewW zckmaNVfyj4%}AR{VdEJm1Rx50RyfVhTe0i(==&O}8&Y3MxxK4BFw4N`cbKL^@c4~w zSOZ3>*-gqSv3rmCJ4cKA9UFS!7dv%KWYPmg7$rV%@;~uP^J~~->(c3Ytxih#9s3D! z&YMgAptGaOypk<83AlRwXL#trOEzeIPHO>7O6iM|F7g>vj${v?s$y{u8!7^%69A5* zfRUlz=nx?SdkjA%V!#*kUdy*zzd}3$gkDrvoDKV#G3p3fgcMxO2V%Tx+IsrXQ44^l zb;`H?13PifI9bOAa!%}*!vSUPFK$3xn}+`>q3v2%V(| z{G?~kZn!}R&Q^<`!GVV~y+s>;x;pHGn^;Zeflclfw=BTW!{NiItM+u39`(8Kbc$Ie zK72THe83TzN>$W_P=p*k0cgRBhMT>RO+Tup??Q*$M8t&T- zSp;D~r)p__Tbfd(QP3FK3M)I50{C(sP|(k7zL5aLds!H*4J`m9zXwF00kVb9s~%p` zw!Xd1f?~l<|13M+u64FujX=!Z9Z|bgtg7ptr0a8o|Ddz}ENZV8M)9I0mY-*d6YT-o z$&jGx3I$>-xS(=b!FQ{aPFxW)h~1Lm8VSKhuBva>oS-BS5U=}kK{X+m+lMABsX=Rd zGuofFh@ANAwb_a!brtQU5PYSLY#8hMhBc`-2{y@NV6D*opTdF`K7`+GNqQIr;$Xdr z;Q^CJI=zvdo$vejSu%!5+1h#O4T4kCNgNOiY}i=IGt56j_%SGuNn0Xq7@J>=Bb4`0|Mg95%&zA8{eDIP-8-H?pX)(1j4;Z~o^WEDO_5A4k zqnEii^N-l-9Qly%FfX(7SH9K=S?ku^-&a3fk4@a#y=L(sW3L4I$qCT_vE+U{1EUo2GxKr>R~RtX&i*-VJ2bC27i_% zKTQu^hrwUJvp%J~>cAnJ&{BE^8pNBg3Cxd%9@iYS*jKhrC>9|3S}7BD2>dj~5) zp5FE*$&dful-3r37zanMRT0o6-O>a#*l9FFkDUS!)zBJVTppQb_C}4P(ILe;-VT|*Zj$e?`NR2jyBcjr4t=DCzP7;2lR$QuFMw`BW71qNXODp}AnMXnHK%dy> z4QHN2YhB!|UVTY{Ox$r@7a6b^Sc;$SmgIa4Y9BHFd9Uc__Ov(AURkCYTq(jd7l0`7 zQrV@Sp8|M@gJRcOgS|Wixb4L?Aj-*Vnt&@-o7o!KzI|YPUVfT0-^8R&8a06Z1kEMt zvvoet;90T=e)Vk(+XC&QC^pr;#Fq;@^d5M9-OH;&sH`^8z?dA<2Mi5LonJXjW_2}= z+h5*9OOQ1(H0Hu8V~dgZayuC2#tKU<|CS{)F2agse;%CnYUofV70PU<_oW(jg%TIB99A?N)ID5*wYy1d*2R-AX8_lai2$2-2Vk zNd69b-_Q5^Jiq;cd+{3Xe9k%VIM@4qu1ms7X`@WPAM^uYf=OB4CRl=+_dx1^lr4mW2U07^P3tCpJ8f>r ziRlRz(0hfVJSFrIs~SlbV@vun7zK3R$-vljsi>~AmL`oHlaWVd|W}%WvPv4Xt@|OuWhN!|YiXg|-oE z$~e!|z_qhoMlU~Br|Wa*Cn~X*hw~XYh(-k6?~5@q`1(~givh%z zQ@&~ITIk7CKn0e@l||>6vi_13g>HDhwP&NARL}(m+YEEiK_jw)z^-Dz z(|g!fecQ$l57u8ixzj^`E(3wZAbSSrOGSKu_^S zK>ugbv`FZ2)$)$5j~`n&-@FfvkZ^jwgmeZIE z+9^t-ZQ1Wy@{bO&KDm8mp^7A-Kk>YWKG{w$@8{#DGAOZTZTqR+4OPy00Dp9Aq$mZJ zyzoNy<_Q~ri^?hfA)|5c#q7~>(Go^*e=~1iu>81>4=IeTu>SLW`-(PlZq_d+$LcU) zz3})%Sfl^juRkE}Tq6B1EBBD)qM_be_bwNx=}oMFO4*T5w17_V14WorF}eUd3aj32 zT7R%fBFXa6`B6z|cW|8?|vxsM#jJG8AHMUc=ZovAUfHeRCN<2_~_ z#eX^?wro$%_Z--mFCyLyWBjj}{>b$X+0ybaU_bF-=@L!^$V_FLTaOMV7fa4T(5)*e z=;RtXNMG5pCn=20a+Etcma#@R+})3y5t&mnu_7uJf=*zTbO7QM8qX@l=;pDFv}Bp5 z+YH_$D0dwb=R-@uT*b-`$Uz+2mX!{CWf4gM#_Z~H>UC-61FQT5;Q@|}sR3h(K4Bv* zAf6-_q@D*IczgRVcZ1ReK=hARG*Hh9D0?~h_B0XJ2#HEla`bx3l75&?++`fmO8>6X zn#y2YGAB$ADty0ac8^^ECD*#El;Rv?68Fazj*-ST${;RGH0KniaSHk~h!CH=?oL&s zh~2#!MAHX!V>;6R4PdcBr187$@3U|0*8kJX5|R)2WDZFJ=|wkwN%GqPAfpVZ&9ka*_$5`){Ko%N#B)-HLR(>RI)}gK zgJpgH_G7Bif3mctjZ(pWv?}AKVo^Lh$dy zh<4I(r5ep{c9yu__q%Z4&SFAwWj1s^VszI#l{J(4TZo@tlCI`%+D%jcQPH>c6& zRI9EptvrMlJ%9V6O+4P9tIPe!NJ3M)UNvXEf$i}dvp)7Ve;c5h^jnq}81%Q@@~r{) z!3D|;83r2Ro-}(am=ti7vx*^d5oa%TosJ2}t&`%kZ}c~^+#-^`Dz@LuB4LnTCX$}o zyy>mOMqDeagSWKpe*!HSr0=ch%l?o{Zg}GB_vb1nOaZa2M-cHB(DEvHa%9z)H!nGq z<*PtJ*5FM)Z*d`$%)z%n>?xA<#rM6>Hz>$A{El%lFZtMd*fX7L$B^ndlI1SMf+hD|RVsf`Lque29T$-LD zras24-PSni-xP*xb&a$Fq|ExtY|Vk!}R8W5Y|ee zjpzLQ?Rw8>YZ)n~G-bCgkN#JCy9@z%~6J@)Y9Np4(1;x{mVRe2x50?JU&dNJ7hTnINE4gnQO}p zRW-U*Dr*-!($#MVar9oTd5SgaiqulRmddqhcgln7R~6+^5z#8mJMh+o_)9nWIuYEg zVjJA|1&LFk?WP%_!4>U%IP1Fa`C0$k>aX1B8X2kk!cd+hU7DZmb}CN)kp?& zkt$2kM>cEJY;Gj5O6u~PS1@%MXT1Kzl%1>Q_7yS3Lme^vtVJ^}joC9?;}yfGqbKPE zk%7WO#U7h#U)|d;VJ(l=-IM^gmvDmF663jqTkSVvNM+E@GxcLgr&xSl%iZLz4MtP5 zVq5Wah@LIBL+Bznqv*7Ci{=j$TZ(VU5YEIhBYX8c+UIk|1;R?XHj4siF3A5{s?B)S z3yDjva>);2k+NL3v7+>nbx5zqal2B8TZRN)!=i-u#>@Pl=3N^5T>2+umQ_Sn?`1zQ zcM3i^JMRV*@8>7S4^{JQS`kyHsjt8yNfjm&*V?nDtFbO!cpoiyr^uZn#6@uDWPgLg!xssXY=EW+ktf(L zO^=*L=Me%Rg?E(6rHM~@DVOso%2Yvk{tD33Fo&!8wOxb7P*{y$6Meh!Qh z7GD*~5rloo!qoT{0%$qV`I4|FATm{R-0Wt1vCQ)DgW(%?OF>#;L(<>pL4Nvbjr=jg z*$BojHPf`>!2&+QSBQPgf8JqPJ1>OuKw~)*qSY6etJe%OxxAM@UI=gME~QR%H*f*VROaz zmfQ7DO{NCWt*XuiHodo~?VwrEL1_evD=P(v@n&VDT%@Go7W5QF?c|dNLT7fvZ6Xp$7PwZ5 zLolRLw?q(bMc(ltYhP@j)^e0H_1f=NZZyF>dEwk3x~U|sUve65_;KSEimF0hiGHK- z^G|eRNeTc*pNmpKr7wMTDC*}l^7`fQcm*bH4~uM#ZSnHkGw)Vt#1qx6Cr9;%SDXWz zIB_X4UdvqHPngWlXH_O1z>ql*Pax?Rg|>fg5|6j?r%kRpRxY>dMZXd<`9X>_^*YOc zT7I14-h>K7F-6r7asV}k^~K49O%h9#e0b5<$1+huS@3*0jlaZ=50VlfTk}4>?% ztDVG#HAkAOyl}beaV$-a0Zk&S8la(j-^XbXeQ6CwiUbspsWsbm^ZouL#$9esDYY|MK5~{y>O5C)6lc0N;!|JRl`ly9BjHcm zCoaJ}blM*Bn01w^maSQ%KXXfqFc}VWEAy444zXtrk5U2XTL(MD9(5Tv7~jNV>)qv#&{=Fdx|SIYq1z^wsJ$lD;vBq|%wr&bni-aNOe} z%?=>~f<$uBq-f#U=_8g(dJWM-F+P0qF$2Pzx~AvfPk$N9BE5Q5zeSbzmM}fPbAOb7 z^QP$<#lWj$?g+v7@z2r+hhj&H`5&&tFhaOZKb@)S)Jynmht^3Z3cdD$`LF&xJe!at z<}Pip(_i=lSAv-8RsN!cqA-&@2usFXs&WYBoO=j{?|ng&Es1@0dvs%ku%Mp z7TFs>qZQ=R9Mc>27jR)F(DCz`H*PaxF5Kv*>(TLB9L7x&a|<3e90A0k9aZWVxy_&DHf#GD^f#o`0iUXA7s%{Fl8T+HUpAB4a~Sl`VQbAW>Ff8&>qTj zM|TeKZBch#zb9?pKkH~Wi#Q{`E4kFFI|1=D{fd%CYtzJgD)zA5GV%p%!Ekb)*WE20 z)MA=co*Q8Pf7jQRR6*(}iNfO<#(KWKCM%HBVwPOUT=2D!EWb2Fb7bl@u;Fb?7lnHP zLAx6ZA%MU9BA;*vq{zbeZx>6`q@B{L&3v`=?_zahyXuHY#b4SwwfFDg0&zyZ_t%0R zLQ`Y$=iR%x430(KF<)#^9}HOFDUB3_w-#wU@V>&&Ez8hi87ymbJ3hc~uAzbbkH&1# zUx4FwOu2q67%^3)@SO)w>cxJr8~K@x--=ugS4Y36TM%>VYw&+Ntw8xwypH}xFcu4Z zRr;!k6kGoktAZVlE&HMu)tIm`0I3<@oNUirHk|VH}CMVgd?qRE?2(! zsSg^SJ~f7-o;3a3)7C(I`>f78Nc*%2v9X0FToR!>+yBB}Z!~3qGw4)ELO=;=Qq0IT zG2ldbSiY|nO_JWr2zC%yc zJO&qlKRJlmvxjknB$@AOgoagY`WaIe!9AsRv{CO+{xABlOGGh_fa!$?AYPe`GW&}a zK6*K{a|$C%`T5#XTq=hLUQ&#|%!K}tBv`a$9JI|>9wy)AKsr@;Jn*MkaA=3J{ee7{Ooy+r%u85*sSrTOK`sco?ii(Pu~5o?y`IM zi0ObPC?4PWg5R9NhILW6pMwG_EkKzuPi^B7Qie6#;HIEubSIi_rJra?7mAY*SPcsj z*yq4hrw1{igy@yy@H=DZI%ZDpI<}d!rf^Ntmr(g(9g~zZ)Ci*&yfA6V2H_cob9i$@ArVk}Zz?rgiJRyqq|DxbR|n+sEcuekyp~4P~?zMhLzoTDZhy40R_N zb1=+J>jCm$vJ6~am$E_LCofveSP|C97&0_suSGP1UzLC4(R|xzfJS*}{|*vkKt0_R z`gAZ4P1b_@IaO-tXQox9{yO0Mw-*5MYJ)^HPwiJDr^449CLRRbnNszYDL)5RlWJ;O zTW7Uk-1eJlz1YwwNNnE?b=BNW3zk$RQh2WT%6;87ldi6U4;-^rCQ#*4jWjVMNc_nX z{$G|UFoVoIbF89&%9qq>BT8t|XztUC86+M(quZ8c8fo|Nc@EA?!7RoS*s6ZJ|M z4$SwD^%ks>7&LX0v^?dSaqc#oFMA<=BmV`{mS`_?HnXRBdx)qS-$?%aruW17a+=Mn z9fVT595cZ4FHv~z2b!v9TCgjQn40KW1Ctd+b@o(#R<>6hQ#cxcW$uMS3AGP ztCnr5#G;uG^0&PQ3W#pYEgu)-+ZA;Apc>HbS!2%=ja=3~&*gG54X#W_a{g+7nqxRt zm+*Cumr=hLwxFUL`@g?7ow*M%LOSwxJ>Aor37uDiTw@aJhm zQfa7Ga6cb=G{-%76fCtw>OS*6%i;+*+fdG%%a+ARza!;#6ZPvZh{E%of5ZL4`h}F# zG7356XeJ-xySsTGo$C0dxLWeE3^Wtxz+8B%Rzl+)72hwWK;zi~} z$Qh)R#~KqJBxlMUAm(jxN8k2d)rECi=B8UgHV&d^Tr{}rNQ+Zm=td|5^h2_mvD*qX zOsDO0ptwS!ur+mGp*&LDv5cUk;(O|ASqMA1l9cjBP^M-9&B8Dyo1db@SI)R9(AC(Y zm8w)RGw<9e>RxaIeKb*POxmD<&GAu#%lraqN9lN-5+YaHzufuwJR>>PHJ1xrjsL+rjJc*=+p3U&*jsmL4+uBtz2x~MV&~%UU zwEf2~)l?ly3`ZxbjW1B#>nF9R>d1kmay z{FD4AuK24biWv$pX9Exag1^q1aT}rjW%J#bHTAWchScV>5V;m*3{AgPH-8b`3L$=z zA@KW7?Wbrx+|C&inrm|)N6&}QVtBK-27218cW!;-8NRMMiI0mNQud@$EIpeOo>lYG zr9xrwOU944uE)#mQQ23AAcPr&z@=c4;{3^6v67pl+qJOZt{UI`E@V|{bq@&W z<(wpF(ebk|j~Pp30M58(vxbL(>S+H&u_kE?V7s?@N0boWr5fU*(FLLIe3A$75c-nKGWwtt+yQI%-{ZYl`0^v~4}MHFezDT({u5_TT=#RIkL5uR88$p! z-Rl38n+k{l^zRz&#t%ci`uDj6QXzH++rPf{(^z=i%m;fmS{ zpz_51Q*J*0$;LiMcSBU}fJNZ1sfBS)7Hy`wx{*@e<%!1{SKdDe)pl~}lF|)l*^=^g zeyU>!%BGBk2ELVIG_x>}RBG4>v`XuAQtYwSSOtyEX1(pR*|4kZaCQU!A`i6f{eYhN zIT`8)_?k0|M4%=*me?R%#@ORHb@?gQAD!@-?+J{_7Ae3MFyD4x1@RP&LwqEpeQ5J+y1a&C0vx9lo4(A(M+_fq5a2lx{fy3{ARvzMJ(6sEYvl6W2XS+lJM z+w9RA&`X3_#r0}-fVUtB|P%h^u#9M+{I;aqxS`i?|nt;pzr?}!2bQ;0YR z%+&qC|EeWY!y^+Vxug(uLT|VJ*smh3^kr3oNsZCLLvL$2C*20yUbKu z)7lMxk*Ve&Sk1eSKa8j-Dn2Ny#Qa%^Ojfw39Z&kR_RB74ffaF~v1Q2et%8jXy~E78 zvvyw&5$R~AZm&Z@kUCc~$uWSWFPaxN-p=6obYaSI4r(`#93E{E=|6 zv{A#5!|YAQW`PrMZI3{AbXJo3;-(7YHGa&!=wQ7vcGzB+bRle;nKb<5t)u(mmoQ@M z#!vnX)b`n^vQmrpvCf-s%Swu9guLYk!pO}4=WD(bu(*@Uyl_WJe+baiwj)}KZC%eVFH7QO-z8R! zl8Z8?l%J)a*x?>MXmmIZUvSgIj2w!e+RzhpA?~0Tm*=K5Mwwc_Vnk;513JsayU#)!ae#Tem6-amXYQC&*(dHyWC?5bxfZsFM5ejg7`(^7 zYIsE{q-L~zg)RgnN5*Fg2ISDSG>(gFC1W_(X#H!(DM%UGo})c<;Z>c=R({0cFfX4( zE$+!P{4pQ-t`ytW9y=|*niSd6hnCz8VGO|yuxz&r9z;Sz%Cj``dG)qW7lydmo7S$o z$qprm7%6RY7utnwMDr44VU|MEZYBivt(b`Pl>UQ>!-$|HuxgX986BpT>MqVHyb-=@9LcN=(WJ1jE5z)C zoLCigx=D%Pg*6#Tn)?KV@r4w%_SNh7jZ8al^6dQDWF}4ZtdUzqramqPtAeY&!X+Jw z+@~*7i1c8r(V>Z`WwZo zdo0vY(aVn%+KS#=3B5N`-q-?8P()B=mE zkBC)gL3;Bg{R}lQzo#W4$vj=dzXEV~opxOc%N%&yES0*rMBDE7{f239YETnH&)IkP ztDG(OEyzq>@q=TpNzZ81^1`V8baT{VmdZ8P<<I}imaaKB5-;oz@4o!akK>|vIE?u5bD(t0FVjvnR|-G-FE$PYxeo+P{^q`6y5!%cVx!8 z*@%{vHqvavBldS*0e;wM0LRe81D6}l0l%{`_Ts3MPfjA^#e#M& zpvG-X^)K2gwq93M^f-sogccudA_|Y!;<}O5c7|$?p1kpkpgvUSl&_3e(Dtn+B^>s1 z;6Zu!CCN2otb%6sImtjYqSBhaVbi*w26zZ#$9$R%sCQBoigB&?&qVd~yaf8K_T%1v z;$jX05f81o>74ceYlZMg(g3HQ6cnX_tPOajml}kur4YKV_(3_e2bB8@<7KzkZ@-X- z5mWVtg%PlteXy2PiRmIz{B}RIpKHvYOiShH(hy64MY8a7fEle`^Be#nhbs%U@}96)Op-wsvxY!aY0Yx{5{bM!28E>JNp^)0Od+$5zW; zTE(2uM@#`d7V2F?;aNy3eG7E)$l}p#+HC#$mEi)qNVcnTn9s*M|Dfi-bMQY66q50t zt3kD?neE4Z19!)D+Wg4-pl#sjRdLK$!?kS=_zuiHO)WYjFuNbhZIB5-mj)eFTr6Gy zD}$|F=qoVl2EA*eI)r)Sj{klX@V@xY#29r+R`N`&aNnWXi^k$3u&)*GWzp4{Q@B8D z?yLrxPBh_~TaIfe)e~)YSe<-;|A3wtUMbW_Q|>)?yM$L_ju1;rs_YA*pF!UkBR!fag9Z7$g|sD89>%3_BnKpg3f zpKGKsx3G>&VY2=`UjAn~7S0`2_RT61nJS?u^1K><{Gq290k815qSW9Y?MuU&Sao9c z4*mpDc!mMhMhhgTd|+c=<9(EAX?^K@RaQALGhfFeJcVHSMdIzL;S506&kr~(BL2kD z#gjm?H^eDF)9hwv5BUK>8Bznv*z?A3{_mV!3~#`VUA=sp>tgm{$|uPIZ{&EG@o)e)YR9Q)WQ(AuaP-SWw!! zDT@CxDEW&ajMD=6e3i>l6Thl30@O&fb{t-D;s0MW7_%i+i%YdO1{M7h9w_eQraX>n zlOv}l})hA-eQ6YWh>`_s$zuO|T3KYWVUzEt~7 zuW<}Mtq2gKAF6TNuppe>so&y+!F39;IaTxr*SMV){FZ3BJ5NP#L(dub+64_L!WsAn z9=JHF4fMi=I#~i^NFzTZFYw&*8ulY7KL=$b4!BD!qmdLe!Rqw%9Jz{Yg;UT%deMxF zVdozuyJk`H9t`-}*&MO^mt4Lpdy(S`zVFa9_ijat(-zzU?Xhs}RJL6ZJlz zFB&QS&}6Oq4j&?gD2>BMh&X#Wu~L{=#u6Kvw9ozQZ!W}s5G}D@tGlR++U2vRQO&;9 zxPBmy5YugANv@sh=)}e%bEGj~O;7)4H~xONV6H7NJsXvPFL)K+Q;Kva3$CWu5Bs{fCNrn56Pz6_EsltvmN^pcLp~Jv4Z$mCU&ip=?JOMor;Ae z5T734C$OBjO9s4d7tv;%2U?sVjU+!v4ZR>?ed2iM|M&eT2t%}~d{i+a7AB?d{>JQX z)@o+PAex|;Gaf80y!(Kh0L%qI30_CCSq-x^YHaR@38X6`x)wVoj-f?>GEN$-#nkgC zO!8XYEbgnw)Z63EYo;Ip2K}sL<#veG&%1oV1%=$&@*6~+9N5PV& zjN?S6t~y0fC&nvETm&x73%1afYZji{RH6zysrII4v1~a{pdlPO8zzv1LvgFf0@CLh zdRgLn5@Cw%D16O(?V1}M^>fc>ZPswcE$KlZhf+*CE`xDIf3Q-@|3ACMMikjgbM+0m zeJKHYU}dEH`p#jf2*f`j?)Z^6MDMaut)2RT?@%lUxMXZ$X*y;8$H)B!C4+6+a`|$` zLUN7d0i8D_SF(mDgVGzme7y7Q8AOewd?ZlXTq=TkB#QA$(;1pwW2%KZCg5wO`2F<= zN;2gPbFjYqH;u*bcjAO}+r9>hJO7WHbaNXj9RGU)IN~rpfWQk`2V=A7%AHYHt&A*R z-#PRy>UscC*DSY3U({sv%-Lx-2XQUb-0r%^pvEZ#{n_^jOe9FhhDgQ~*Ap;)2>)@o z%g$RD8>$I;N;FOzYOM<3W#OPaWCX{S7Up;ljm5*U1SxEwi1XFnP-aHL42%`3T%wU? z*arzpIP`XZ3Ne3NUh#*+#-*NOKuswC8rfYFvjpMrM$1G>xx$lWT9ACi=vBrCL5!s_ z_8EkVf$Ao_J z&;njNw?qGH^BumeEEUFFp>om7dAACVRPM$_3vp+sX9T7{c@q)VC3Q;(y2v^XZXF$t z&eMtSJGX+}EMNn*p;SFwJ_b*_)Ybq|@GnQvLA z;ZDu?kh0xkFtEcd_efA@Sv*Cx2SL_D|CnVu0WYA@_!{FbfRU&66Y_7m72rdZ5JAux zSP)FmM=>E#PvA-IjYqLt7Ua9ioeSLoq)8o#l>%gh&?mbH$;)`){it?HDapzyCPri?~aqlF^J72EYX19 zO$&4bXx7u{wpEZ#{M#$zt9Vv}(Pk=*E+~)%-Y3Qcw?eOe)D`>zD}dIbM|COA5u90< z+Q!b=D2iG=y34wzleW8uw*R3qv4Zq63qF1k)Gj#SlMJb}eNP*YP81-{ng}LWouBwe zn)^SN`V)zsJ=`)|hUSw~z~ zGZh%Pz%sr|N9BY2+11-*9GYvxUD8<`%z%GNmbw5AU-3=^H|R1gR}Z{D^SdLJp4#FZ z#-E-Fn#K&~AZmdSXjIK7?~S5Vb3I=_I-mTJ~;xk_1?rrBH1Vpe#0kw#_s@ z*O(CTp>w@#;5ENCAm+BEbQgEnL>yI{mcd(^lfe1XQ1Mz%yFPdS{m&Vj;6a4XZ` z`9DsC&ytI0dX|X2gRQgdo^5U-aZ(N8w z2G55pqj{>&>+D5c=hulo?8qj3XZpT$CtsK|6Yyqg5VXdrk$l&Aqm-R|s1jKZ*p zr{BH-sztYWH12JpO9mI+MmPKvLJYzORhhwCRj6T;2tzM4l0G94-tqV|xUX2L`Mv@j za1j6+Y+zfmeEq-EV0FV%T{~bK%Iy{BR{9p9{EX5z19LVk9Pq$dCpR}4f|5|7%gPf` z7C*`I!0QEG2MYi80)$i~u4A0EDAO7UTX8lZKGfPZca`inE?bAp)T`A8lysFY4ypxR%Y>_!{VNc8;iNh7huc;SM< zoHxEAb46qyY|294GZt=G7^+R=e+S#tSP~4|Y&#M-i&vEl)&dXkI)@|#yPr6pElbY| zLd`%{N<9d9#og%4ob^}RDTHWMF+`B0#KsOXBF_95Cs-STBCTC6Syrqfl){ z1ZA523ujta+;Q5l0#w_VC0at&nL@L@9-i-#uh~hWF}eM~<8b55ut{?K@93W?puAWkF)Fk^#H;-8^I5SyAs!OseQmf^r!BSq$6;_utYTihh0+AY zn$+Jd#YYmAM0~l*jnNnR`Qc%y96M2ZnVeg)<*=`T1wzYWkXo8AelLt}3%=JUp03^B$TE3!IQozfbFFK{*EQxkMPm zOvs_7AR0+A3PrMQHQyhK1*Wtz)d5F*!_6K20d@cxIwf3tHJ%}oAHFipbP7$5Cimm| zXJhPe@5x$ZKe&A1@^vtp!GsbtJ6_A)U%jL*P3ej=fSLY#IMo*@)#PE@@x7a%H|j*5 zyy#(45dY<{(M4F70wp_$-a7y-qK`=)CRu z9quhLa=V@(usnV(CSIispCb$AUB)@%X6gcvrCb zhx`s>zA_3u%D<&}+Gyq-5i27ywUY5gx%iuAlUm`sh}?$n<)ckT>eqgpJ}ppqGWgo) z!mZ2C7|Cd|4`S+<0)3(qjddol3(0cLxnPSlNGY8$UEc$Itw&G$wlGGL$_HX`(Um@A zp+Xb$F25=`ObzD5{j-NY`XVqlgA>jGm?)d{0V|^r-6W_QSEate$MfY-_zg1SMEGb2)Mq6tJ9= zt=6?z>yFm()G^k{B6L%fQd7=RE|6JCUp#6J1?w3`WDuqQ7COO3d2C3LCg+p4$&x^G z*(6YM9n6=GNJWm(511WQ9-qh5PqL~q;d{peY7gN8*)H9)5E`g)@cG? zrvQeAwiQr?Ze5?KA4&9+DRD4m<^op!oBCCz~kjnq;u!anh8g>GggR`Npo2!RcTsdO{RxpqOorkpV{8Tk# z?m$;c6UhZP8OT0F6hA)tz3~k7G9Olrf9%S*m_TnCkJnJ>^g_Sy-3xGvZ}6`u-QX=} zE_}ClY(7KDkIz?j?#a8SXX1Q@#L*uhMKpX#xgwRrS?{q9w2{#4tAq1L{$y%k!`vg) z15QZ+YzFVh*JZr*%kkpFNw`C*$42P&-pMaf%gN29=lUMV4qU`Sz#&}9r;9XV;b-y8 zQ(KoJ$H3Rl&D6tqf&2y}G? zr!RVP_D{EgvisNw#MCZ8tSbAEK#|9p{DgdjYD6uWT9{sXhz|i4{s+E%fxrk;=2ItO z`5w;0?jp`Dw_bw7^nxG(a0$_cKVQDOU4cT414QQVkzj{0|Kn*SMumFWbj?_{9|p3m zFFYaKgg1IvqO4aoVT4cOyjBa{=spU z=@TxjsrV5H6-THZh7v(}ji2K7JGF7mB2&4C({z(VYB#)KgsYEZgN3p-O+%#sY{u*= zSQoILyYw>Yt?v&=yLp}Sx*LW>aJ?mf@3u)JC}nP2-4}clK?W@=;eVpQKLbi9wc}!O zCT`3-r&p`-ArdYt$vHEdG)$M=Wt-m}dl>9I2NbPyEI_D!nfkd;hctB$)ge zuRig?4X(!kXF8OEJWH#j_}PPh^;Sjmz`}ymImid)awA1@e+SJbBp8|&NU07#e6aoB zVIZBjeuXMTwo-_0X0TR6IP{*Vlp&-t$cp-O-UgG008Rr=eGf`&nuv~}jC2+@0_t}2 z$LAwj4nDf))cwMx4=u1BSYUAkVTL|ZXMRY_rTw+`k=@gX(!!8`=I}f^lWqjMrL~%I zJi1N>kt!ivdWha7RtcB;CHOoP=X|kg(~^#43W|QBY7{kF~jkc64a_C96)Obw2mgddHHHj!(~X>kH4R6wlIC3JZNn+ zwtfmsI6MP1rAwAeW7K+IG#^6i$KYQ)PE7V>A~Cj929Q>$83-;L0`Y4;)6UnpCg>uJ zUkFar@9PE+4<6rW0FC zUc3IWEa(pOsQKw>IN2Kx*SWICPHtjZ+^oc_mX8no9!t-*7$%bP;-Q(<>2Yll=NzVv zf3SthKREq{HZlTUcPw4Q?2R8eSY)c__i(N_Ay+FJ!0tU*6BClY9mNxZM6f=nMHY36h?aL!_dlTNHtu{>L&Qsp%lxrI z96FOF1e#v+*XO5(fcomAK(o}?rM3$s8h|t?>Jd+Nz2xxCASDq} zCH(jmJrYSv*s$lNK*!N4B7Eg7{bq!O`#-mPd-3>TT$H8Kco^ry|GhlLCh#@savI;r z{6w1llXH4#i+~s&bCl)<$y-tRV7qvp>xWz#%DEeu3Tk=?<2Zb;Ui$74CDmfZP4$jJ`XN{4hS>2c(P0 zW+%uG9omy~0_1iwpIv%nu`JyGXJ|O;@YQy1q-Ao$n9NIN!|w2AN-{40{yuwxQY%RX zy`2nXN17cdM@4(bgFNAIFa5v5P^h@>_FVD~_R>w>AXh+IxKfB|Y8h!Ed_RcAfA)v2 zeyO>G|LnfQ+m&B@iQ)8wG?|s0LWoaVkAe2^$cv&gFHznD@|azjd-9f3o#O(6c}#!4 zQ=Y>!&jmE~Ajn}@Go1L%Y{Wl<5g@EX(P@`sLUJJCxs>(|4yrb}7u-HoGKjsVi>eYk z{MdW=m^Q@W=(zQVM1LCXM8KxzKcwW=?{6Y_nA6Qj~(4XnTD9-3l@{K_l!L=2Ga^g(Mp)soZV{aQxRbenuUhQSZ;zhChd zoD)&k!_GSKP`5Ip1yP@IzkkhWM7e6=m$yRG4deY%c$9_#26P&|F0bjJm}8NSV4?wI zBTF&U?z4_-lSYLzE&5>T=Gn=PW2^{7Zotc>$!Y-<^Sx^9B*Yyuj2^vNEIz8mvDJZ{ z;>E}S0L+yTl&o~=s65J$m+%RN_IAu)vOab6O(**Hen8#|^6$O0nu&9Uzn2bPT^{jl z$q2`S&D!Rdf#B7_EoA!GS&J@5N|-|xHs ztDl*?;E}{x}jb^SoXd;Kk3%ZX)NBIb}$l!#_Ak#X8TP(5Br&M`V z=_ZOA&bwN=h`DHy4o!aYv+UB^TKhMcjBHqjuCuwc0b5=Y#9-e1xdyqayw8v%bj#{-bO$=AJBLC0c7Q&xa8oG=HwQ-tvPn=ZrGCJ%G=j#N zt`koE#@9p61={j6n&l(d*BRny4|w-Nvd}uxPz74ss|)YHx&|_AUIZ}Z%A{LF_O$!| z0IHB411vHP)AJ6TrkL08ob22J>;pSA9~{6q0P0kmU31(yh>{vD&Jns6xe!ICdU~&w zoNAvg=2is-QWSKXIGlTRZyNqAt~mFb!e3E~CO$-$t<>dxH>470I|d?8#4jq&3{ZOF z*4>kDCj9Z!v9LDe;LyALSNuHCdb&7z&HAO1dRlGPgZJRLMr4ynAXhg`DHPo!)fOGk zQg9`9e%B7tk%3fH{wW0Feia+h!f13B%ZFveM$I5T-~~KmsK5@Sm=mtzC-Lp@9;-iE zVnc@!aK^Lpevr%1>ZwkvHlRJ+g(wWy`1cqm`x{2f25NP1;r<}W9X@PQC#!UOm$|J> z@={`HeoWr-<&_Y1`_VrVPQ$?=|7ud3$Bt_+q+d@CT1|>ALhtwr#oWOKFm|ecQfmv8 z-8@aqpE`=-=_NaWla%@G;hv1?$R?W>#@0RlO*W%2YHp+~W4OOYa;|`%^NlF2$ab=w z^cq;gxYdxLj9mSha8}+GYX2xWUEw*BNE1AI1aBS7P6uBP9y&_pv?wW3ipP&F_O zZ4R}6K~4~z5(Q!^MbaBUxQ$!Y@!)&^s?Qg9CKrOBff*-KjjYH4F^?&Z1uLa-a>#EZ zNkECD8GBeoE=+(UlK6Ao#9V|)ZYSJ(wgey6FADu1@P(}DbE&=>wG(V2-n!5p5aU(( zxh*ex9N3I*{pmJ<6Fgtv(1u<%+!w9RRkw^4A&-Gm`O3()~U2a4@` zi>KQRq+OE%Q}39`aH8(twdrqHjnnPk^i4b2T2Z%PyRwh3imHNMCMTCDb7al{|CKzc z4YFh23wSVmiS;MbfhnOGm`v1^jh>nv$2>%LjVn2s&dRP_hqf6;=cAj&E?@MXT`9H` zd*XP?PkrwSzq|(a!X_)J&nL5cT&z~YTN#=P-9H#<#TbwJmE4iy&N0?(xL10r4n!t zQmQi1wNm_Mp5AJxikIHh`v0v<1^^J;+ztF8i({|SDEfPgQcMU?{0$}6T}`42FnU7& zy@m0KeN?;wq!4IPm^Tl?RRTrDCJ*lt*+WCHXr%;*xTzM8rLyP2{Toc>$ZR@gu=c5T z^si6i^=k>Eesg2tBJxT$8>Two*{SeLj(eP&j-(u%u)juba-885?VfUGOW8CNPR0Ab zmpE?w8R^K9$T%)&ezN87^~JrNT?Y9QTPG={N>6}8c)?_hzYn-JbbdOX)Qf=8PGZnJ z)C5Qig> zH#~rfbz;v3>JiddyVwh+(bUO0_sVGfaY(<}%J#2)ocqeq3JSB{g*!APzSaMdjE+s{ zAf}hOIyWE2|8LLgwWVLj<0&O!J%8OO`Dal3)2|x_U1e!+;STSyUNF!%IhEP$W3R8z za-JB^c#HmMBK%U87r35InNgWxjMm8jNvv#OH_EFYe^7(jsGgcC1Pt{x6GxmdNSSuP zPa|8X7A&Awy?V6h<9f;MN0n+qZ}Iez9Lf5BOKAAdan4OA*GN99i53D)T<9fp$d5wa zYKe+6e5Anf(Rf;T&sq7$Foce=eMN?R+^J~`YfbC768n=jXNKg6>=w#ug~Q>OVk2d- z8i9`hl1_kP;U%1ri&n&2oMhp$jC1#%aL32^=}d=<{734>Yny+iK14o!XK3No9QH6r z{Xt4{?y0|83G6|YC$`Z5gM)m5qr7s7{f_8LAk;WK21}MmXj^6TIZLE@Z9)h_YRhu$G|d(+B5N`zVv{TGg$*hjLfeUVwa`BWe)Ln4U#^H>#iZqHqRn zs-<$H->H|Ai<&oSg-wI~0nVUz0D3wL&?mGRR!0FkAhV`Ji_gE_LttVp#i!akPZp?4 z%EHO{YdrnCH_7T^CucxZwDdO8iMc(8;1Q?h;!lbr)uT%9=rqT|d}(j!vmpL@{uWQ0 zWU#_ljES%Gzu-*)S|=%dHSSo0EDS(4_pBTctav?q5MEe{i43rdwGee7WY(XY)c)LSEkXB-qD5D&iL`(iX(o>NutI^rO5VTL)~kMhNXCJ^hf48n2^SG-Vvf=) z4#?Tlesex|``_^IUBM=kFT>+|D9$lZ|N80Kw;^ndw+w@0Sn_~l(VtL{6EuFXL_2F< zeFRwASh34<{)X~H0K<5Lw;Kl15-$bZl>hr!G7?q9-e>^{NvjjNB|ZkodW&g&f$z}l zcEzscd?H`{pCcJ~6&d`7Flc^y+K)m($x#u8#5{g*> ztg1&vevD{K~zxHfMRGg<`9 zn@k8o__$H$02<|nSWCv9LZ3<`n{z$k>a6BBucA<7_=3qPg&l4mdZtSAdp>pUhvT zfo1(d1AGDq1;jECVR){&7ITL@x2y41=Y9S)qHsE^Dq5wNC%@T zvhtYir7QL4c>$FZNMLZtkkY&bQTX0}y#QV4iPvGmFsi;3ftai@pJDI|puVP*0z^rW z%jR#onoM@8dk_H=v*jItzH_ttYk9=aLDy({zD9Zc=p}IgbYNzE^fRf5@*kH|RNd@q z-KkH2fZ_)V-2$3pTmn@4g)N#*4I__TPWaqRu%@K~5FzO-KIdl}WEg9S-B9g`W1e{R zb~A6&%f*qHffF?Rdt~3g`1hyOp}rPll!^^VloA$|d5H_?;0yt1If8{Nc25)Ig#&?T zNdB(4y)j_2a_9Yu*j}(HUrOwHy0T^cjx%^_~8A#1|6=J#v zjVCBPbGu3ZDlub9TOcw*!_{EKA4U>@8n*y1UFkP>%J0;Dx=8F|VB(M;{s!I^$W)kR zHf5rhn+0sQuMwtD$|Vb7Pj5daOp^GZb6MNm&=BapB6eA1{^igiz5*BE`(Nt-+_4{h z+W4yr2QjB*4S=hWhobtr_ilLW>;Eg(3hB3iPuG^fIF(-M>Ohloi!0EpkkTuyyQx5a z#AVr*1B%bt#^JyzKTxRwAQ`ZCmMZQ!A}rwnpr;GP0J2nf*i!NZ(G@OyN@(Yc15FYb zUysm03@V+ow=SZ=H5?8CpZ(uWAAm-SVb@rSl&KIPb{dL zTjL?8OBm_#i8qoe#T8hO!OZzH-(hJlnZb(ssPJqmKyMn`zaqPcs(Vncy0DT+298?) z#R6EP^Qcdff6oHsjpgWg;eU*g0&PR0Mm|6(->at6DzJ@7y{Cg{*a7^>eQupzVWsntoD6H=w- za{d5EAfeNP`U1Ee|9k389g2&e0VkzNpWutgh}azY>+}6RI^SKW{-j!b5q{xv5+}#b z86Yu-LtBe=bOIrzx+|5Bm=6j79S!$b?1Gc5TEi~gjgfWXASE7^3D}2#@$LJ6UTp9{^?eZ6K@!*#<_qijhK6l5{U-G1aapteI zfKl@FF0b}W1)^m@$BYGR)3Pf(NPtB=tCImN;q6K~NBRTrxq6LN8hWww6=1fM1 zC2WKT83HyE(4v0;L@RS>q~Xc=_?yj>|1+V@Wk;`CNwyO$4X>w5re#$0OD;% z;=kHJ-(#Qte-@253r#OYKj<{FSQ6Fsm{$a@gcCeD&L=&V*Cf(o^7N{`uE> zF(I99c$>G_0AKrN2EL&~mO~DB`oMw;jf6^UB#W~*<1Pdu$i!$t3uFQhNUr>nV#vi~c({?l?lNs7+ttm!Lp(5gR?6EO zV1jWR$+>r|=MqEA7*U-4`fU3w$&@9-EzySISZ#!0Ry}7XIOuD~Z5jA2+5I}`> z&Ln)Oq%O-OEVhxcd>oI^I|K~S*08QAp!+M;sp9=bI z)j%p6{ofF??NsEb%^&TXz;->kK`6j4p-jK+(rOSp!xOd!nZMX-E!7GE&759YQ?cdFhd8;wEsIH{r1p1z+ zRYpHy_1r2qOtsT;Hs}`mKwyCVl0|Gm_<+*y!}+VEmvQO`Y>$Czmfnx}{sRGG&G;EB z7AB}%X=rYo?4nofl)DqjwP^o&SN?B>cpTYbDkVG^VCLWCkKVvuA(Y|*>Rbz$%BCQ@ z;eZ<=hK~@pe^#-2jFn$>I-Evr6@A>$u;sVQVdSRgKEL?tjK|@^{_3x})rI(kF4pem z;IRId(~HO0z#Y50?~8d}90;!$tOs2VOeBA{KNWKin#Udq#$Gb7Eqrq4=JWdKRV~ft z#9%=&;qRd&=kCoA`O&{oY6S!u@WMt$FaQyRnVg_NhvTgX0a96hqVrNY;I*mF67scu z7%bpOb!Rcv+bkJi9xHVnKa<;r9}{=kbcrR$7e3FV#S(|SdKN^(5|DY<6DciB}5?Dx37#_NW8Wk)sHuv zl)Tyj_<66F{uG%@IbqesdVLYA@+x9Xi&jRWeU@PZ8j_=}^G&;?mAQDH()K~kcRx0| zhP9pG)Di@vbEEXLH9b@sXW`3?L!L-z;qk6?b(DACAW;VKAu{@(^w!40LsfEq*^65Dksn+lZI0I)~e}8 zol{EZ0d&xvq9cVa=|V?mlMSD~!GjXqv6b^fYwNJ}R*mur(oZGU7}|2x@i0_BQAr)^*e|u#;YVmyU|ndO#6Ff#Rt0ZyV=9SmdhLJPiLOmL*EYLu>U6(TgJN zy8W-c_kc;Xb-kFjN#!8#VK}>35sp$kAdX)q@!+w%Pt3LSy4pH;r|2S}`80E0KTB0?iR&@&GK_tz)?&=W%ErbD z9*3)6i8ulfVUK?wwFzNm&CT(vAG%RtW8NEY?fOk-@5Wwhk^Kb?jUfk(JzWHclL_64Zacrp<|4RnY$wn^ho~oNw=M-$(m~fO>xQ%aHL_&^ zTKRrBBdvLnb8JSizfvCAPgooOv{lrbi^Png=D0_dle;yL@n_;jMv4sZ}7u)R?`q|57xyW zDFwn;IsVlpO&HT52}zBV;?ZE$j{S>^ZgH|MP!c`(Z_?eEUP2h63xu(LOwzM+lXnw9~l z@)pBb*ez({Z%4=QN878MS?l)G2<8I0c#yNl{xl{g3e}KpZchD zNBVHdXGCm*JCG{cyaT@I9pn<=!tatzYZ{}0%_j@9-0S2u2&=`hZmJoLE~fbWI6GZ4 zUI9j!)iLHY#lqP`PE9k?E><6L+l6b;2kl7%$p8w#b8{a|==3)R$Ys}-y z^64HLjfqY#nh>ot^r#fT&}il)@UW%1L(S!C)%rr$gWn2WLWf~jS4Zk4d*55vh1kep z`jzL<_lw2ziYMZ1^J#7B*V<@`8H%(9tTV73WS7#_0y-LiyW`M|nh!bUzVTSlbJse&{m6GezG~{M|F!Cmo!b56qbIq2;kZ}}qHd@WVM{Xg z9e?`X_5+m9_A##o%a#?l@RGoaLz857)zkXrWp{C1cJmBk)yYxQBHVnIAc!PFNrzDLZF zZDeBx&45~<-R&pzjqBVkj`U$kCO=!8;xS6h`(oeHFD@WC%%GP=lJy2=khoN4HLElp zuE{Rj6(X-4V`RJe`@cf;Z|!o2(}$yHFun2MPL_k#epb_qt+VU;lYzFj$i+2y@tA=? zzJ+ovD@Ng0H{KGp^@8cpN#j|X;VPAPCgOBeHw^y~C&xeX5T=qJPZPrKGr*@st2s_7 zgfm{Xgy!WV=~@-Yeg|y~k&Wb3huoNVRm%5{o>`g3h(w?BH==0lA@uzUfdhf!Q zpA}bb0kfmMS_E#+0W-U#*fzBp+HSj`IT7r{&bsnHl}}CrWBn&0D>L}Omn2Lt&-MHcUUKKgWoDXvwvv7(%6F-H+h(<3*A85Sn*C`#!&fQU4Hilcr2t->%UmT zK5E>4d48}AwK{)Xv>vo_MV!n026C2NU@BZd?Ljy{utN3hw-;w~-8AIn)jU(PVVmMY&E*JB#YH~lG`7#T67hb+kf<|7 z(a=c#R*TYa$Wc0@R~bk5bL58DMm0wIR-?k=Zctrz_nUvL{Cq`VwPLYP8lvur?&p(j zaf0vlA>JH)H`3W@x0(b7l<+>djeBb8B`~pEv+wT*KEUU${D6veBqB2i{cG=6a1L@K zc7?}riN8A)og!Ypdg(*zUM(kSMPQWk|)=_Nc-GQ|_{d%Z} zhs8j^Du-cv6=!@OPS{)H>5xq-O%hFh#_z$HsoDCEZ;Ebu z8|;Z2U8UY%5VmaNm+W1Sue3?u^Yw2XF(zoDFj_08356QG&oIcLu-2$eOxxtx~N;o5-+K2VG7mL@;-eSwMSwNQcX|EB%AH}}~m+&2_9i`j# z>37p`k&AX{`62nX-AGxR&aNs+?PEw08Rje0coBx25<;!!c0avzH9KF5Yli(d4REkz zQ+U9il@&j9!5wzAPeihkpp-OqP~t$f3^)VQYq zk>YxV1C4n`o)vguGjS}jS-BeIDeb>~lQ4if?J-o`Bc)+S^{Il{Jbb_O5(j%lwjt)s!m3PM=cG-Jh zZOkZM3%w*zp+9y0&*jZJv$phYfFlZpUKc0( zQD3YqIVLvTCSPV9oJsAG>K%6$APbpo*RB5i?MiB7v9+2r1V8qf8hDr>*4 z5*)r>Ap;ETNyOT=@sd`JMKgJVw}Yr-0$^v#k~i;Gt{)G>_aF1M#j@Xn4muE0I0 zxwr>E^hf`Yc%Bq(T)71F;`mc3IPi17zga=~^wrV@PSj($?k4y9H`reMY`tHV{{Zu$ zaon2w$6TLFz^z%fmqaN2{wg(CeiQkz?D3E3GQ4#62*!yJj9O*d0xoSOEkC6-(~i(6 zRnO^Q$?f4uRvMsHD4##7#;4$glbU}YVUgRWeQDWMbDXH~u8WzogBv@Zwdfp6X_?Db z4i7o4d*E_FcF=7T0@tk$ReYIM>-n7@<+EOEq;;)VEGk)*y-dJ7vxG#C7=Uz$*a`rlO-TNw#l_MTPenc1$LJ-21V-)ey zwS<;Q?Ur6Bgv|bPjC4+gMrNwhnD7queQ8(WKv2kxe%6or77!*2;1dX(x-{PXEyK#G zc;E%ZZcy)y1Xfb)LQvuAVA!4t_WH2kISAZv^3&C4ny39xVV?#J?Q?!B%za*(?m=vT zD#1Bh+r@vzE#j7VY9y@cK-s;CMP8WSr`PG0d;lN4ANx463(`@59O+crfoL4hQmzdG zKnUFxY>Uj!EZC`!5?_(OHi}ANw!Vx_U&^Wui*-fIj?d9$N9MkKFw7*^}?5hu+?Njv+T z;`}d3^LTcrf+ggf5N-IY!`j4;jMoTlh*+uP9B~1?sE)a`qt-JlQzIaYrc=?bI@c-`cLB5-;ox8urhukT%^0Ml}(do z&mu$b4yzxW`V#mE_o7!^q0sVq@6Z0NmF8lwXN3Wl>hWlGmaf)yF7s!GUJbVu8Eye*EP&nn*{vC|>#2ziwV=iT(QnzRl^x z%6;BI9*f*`Fs__IYw1MAu#3DTew@zON~V|~%g+%PO^%NJ*JLn} zqt_Ko-;7a^Cr65JD9SCK*w%6amD0RzNbHRtN9bT*sHiMiLQxGC$MELI0A)xb43?+S6D=a5(6+(tWpO8P&qx#Si#Lm_v zwPji-)7uWSPu_<0-cx+rF(ny%7VByq0>o-ZPD*p)sEzIy>ScxQF+1WCRgZ1&pWS2W z=<0Mfh+@}f+Y6Ckl81>6M_9J%j=^9N=rY8v@}#B5`>hfmv>zn@ZZ@BX=3qkRi-)PvR8zc+-`v*^1r9ViG)q5%%z*GUV6^9#V>NO> zxmu{cw2<|V`>dZyxhg?r4S zVcKu=CA%sEUbL7NnnpcrNb!p&NrZJd!?J$1loU89!FYc{i2N#wluXRldpTOux{^8i z_DtmRua6AN-c#i$wutW8pi0gY_Yb(G5-Wjy8@DQjDqgyi=hl`!uNEv+0zj|BJ!Wht znQ>o0;&1T-0D@hnx&J8m>gb4QpE*20&21nDv{7!8vf?3s=t%;KT0_3qU@VM;J6u!^ zNob30_?gs%c#w?JIb(gD^~xr_jr}EeK}>c~r3FUJWFx5W!-%(I`WsD;Z(gEuire!6 zcn%aj)h1p@mjDFEy7G6{8Du@@ZH&)9q#~jcU+wF&e3W#Qpfu0GM@N#AtDd1-ER`2_ zt$KHy`ufKnRKj>S%nO_>w3+P?>jAHI5!Vm zt0f({`hQfEF82d*+hC3Bx|bzpqoZrEB+esdD{kSr4-Hhbw>yh$p+Q=U4;wjU2R2^c#yeowQ+qGPL+Q(*06;$fCq#$s)r@ZolJ~+%U4lakBRwGmxNhMpOgLCAsDloSnynbzB^&lcuUPLbQk z;>IbA`Mh?7JE(Puj?mE8$cDPeJN@!--AS4Tm$dG6AL^P?x{5ed#`-KOzxAdfpS6=M zr6D%9h0zu!#s0!(yp|{dk092%8DX4K2Wg6Cdakq)XS*_Zl}jN9lvR3M{o2A_5i~C= zxT|s8UuYRr@7=JVr|FpGa^$sNv)a)@9^B>VZbi)l_5FH>kCe}>X`la#1z7AD(BXmt zI4!4)BpurJ*R^hLg~%qAMQxv9z8N|ubN}QuwWPb(*6HhLj*L^nrh1;mcM99_+7&b` zVZ}Dp6F0PX^-#G1rGCMkQSXZ@V+*nx&XeDunlqabVLvtwTrcT`)H)ZI6&Nm$54Bi7 zHvNKq>d7Pjg{9zhJ8rN<8GA_OyPik*>md&@LK`jZnKulURjONq|xM{48u`ejR`9?B@*ONG(@NFDh~ zMl^It)skb`&zb9M|8GfvON<7T;D( zn@f#sI`q96Z!YZYxh2@`WIkEdq1zu+=+jmWnN2s0))q_g`NqZ`g|d2c$j}OKIP_J6m5(C0@(X9x&N8RIAxj zZV`LNwC=$^97Cel2KEJAmMf&yjR1tUVO5>ax;ah$#F44#LR!sg#UEyuGFp=eajdc6 zvOaRwIEpp5Yon^jzuyTXV=gwjHt}Y=rFSFP2tY2z$%zRv_>C`otM!NcY%J>$!gX1B zY0Bd;F=KDGBb;~nT-1o{JLf;ENEv*O{v}J)S@Almu9&(L!B|+#o)MZ&wjCF+B0~;y z2^Y$}dnV(IGdXRTI#jFza@y4ITvyA`V%js7%g=;dzP>WB-5IU7HdTvfLan{Gj*c>| zS?}*m4;JnkP(mrd>m3&&wVpKz1S%IUi)a~2y@(12zq)kew%&?Y?PeGLF>a$y0#hw@ z`8-gq+IOLH5R1!fuv)bUsateM;w$Ghg5k%*6e40#s#a1%>v?g0@G#}eD%~sJ(c_qS zk{F7j8Fs6yfK&C1>P><;vS=FW-27*s6@Ut+d;_M3t5o$uVxPatB+8+?ANfExXk^Rp z{E&Ea_#DWM=-z*h?lO#yZ#Gm}oB%KrHzmpa0dN4t8+3{3j>yU}#$YPW;Ak)_}VzsNX5a7H7-(jQtt0hs=F^Umhv3zTpQ1GAuisVDm>#S(s(FGWF*d>v3p?E-z2+cWZ(MnSF2TXvv$z{@co_B`oS6rWDS7P ztY@Fslh&mrS~Ra60;HNYr@XHYcH$z0Y)<|_A;A_@T)q{yI0oaYu?44B*fbQGte5zm z!@$A>@1N@sYuSLu^i%+y9{_GNM!^VaCg=%DuanMF8K8jiIJ_gP*_N=;1$6V8xyWsiyw* zKaE$|#!~5ha^sC&#mWWV%1AOt%?<0qx4qjrtI0i5f==m`p$b03diY&LmS6q7mMdUh3Ce!nt(knSH}-my34G(PAhmYGc3RcSi^Ap+ z^vXJ;e}%%2*!?;ewmgrvxHI=xl~{s_wi9t$i*%Li`A@cJdW`miVcs75Z{%vsJ~^9s z*UYT+Zsy^2#K?}YyBqe+d+l0S>CGOekGwrT0J66nsV(U()Mqd+<5MJ2DzyblQr1d& zEJxFp@e8E^^d|}BzE!P9Zu1z8cJPb{EZyDl>D%4&gz6xh)<2o5SsTDOe8r4DAd+2o z{75qR+eloM`a6~av{=ob2;}x{=p1U>8d_=8dX2DytV3;^L%jgL|NY&K6Cf75vAsEA zt8#wLR01>B!Wg!<{Q;qK%b6I(&mtr0W>n+1p>y$R> zZ;X%?3wZBQ%@F3 zW$ysJKd~!b4?G%3xU$?{?BCW&IDDUXsa% zXyK0@UAam+#2sr695931EPzqcL*HKKScP}(HcN_ohxDbr=AkGI@CpHJGXWgkE*iun z75Tt0`A|A{=Rj@R_903xb2!X+0v(^$llH0Uww8 zeboT(DFlWTa&gw&dRAj4{j9TfedxGq!N1 z#hQDt%NAAxAoKVPqd691!-r(qI~eRfP>y}reSje)W+`vd)4C#P<(g*fV7Aa2EA?== zL1W5|3~Nk!>}8gjje%G?Omko3aEanY1@)+{JKTScHzE?n^)g&EXx6XuK zCDh@%oU9EqZ-lW1GHsRuhVE2kHCZM<6{9dJPSW{0Q}JZT4*(AzT?DFG{gNpLGZ4M) zRiQqHms^Ofgf^-C^a`!)@|M%}<6vK6XGPJKRLsJHoq_zv#xin+`m-m-0E17558ry@ zsCfEE7*wsrA^^5#jc8Fk>~yG=KYntQX;Jw`!0s(YgmYe;4w_1MB(-J0_pH4SBx@=K75vO;|5mvu?CEg?_2@a=LiO-*}?mKP; zXx%eham}&%rWZ`r{1WpG$gEl>YIBIX^|zatmhDQIBai zNB25isKZK66l9@;3^;mi^TTBlkEQ>|!;Yn(9@tFi5%b}Ueiu)!*Vpm8$bs@U*@rE( zsYD?|nMf!QGW>8)c1Xy1(xR*exTHx9-VN5pxWh*k^DEiF%n|DZ7-08EOzWH96UW)D zoxsa}E{~0Cewh~!twFPBUR@IV78~WVxGF#9yJd>{PO(=}H=IHQ$CodV#g-I}9_>5L(0`eGx8M5(l{Wu5G-$#DAN=4kjL?f`h-C>< z5}QR75P?A*Cyjjfo}woc%q@@|YyKJ`TG$8VxdD+xZ;iy3AAvybvpb=qhC2&zv`zt| zN1a?MoO)7nA+nX1^2UM{3`8Y(9%ioi6 ztmL^Fr~4ZLRbJKLGg)j&(5#WB%N~ueE*MF)H0HRhDNmbKwV%@EkX{*%90RA9&PqpF zC@TrvcoQ`m`k9cN46V*M{SsX5rgbqEqHVIFZ4^91KG}*<&mV`9%cL;gd;iRAL*V+* z*K0k&IJsH?QfLUYE#f|Rv$Z&m@A@S|$og;0$USfI1J-y?(5N!vK-aWCmv3$Uo)E;Ydo^s5meNUABUQ5S5Ef1FpJj#-@^>6lxt z_VSEg{W&$`*z!)zx4w2Kfs^^+K6~%0y;{&KzKW|aUvuWxU3<-wpjH}quwb~a67@)5 z0>q!yxnX3_yBG2CYkF#|m?QYob9qI&b+|rZhXp>O$Xf|o%UNf*uo42f;L#X*P_SVD zIeaq0^zwGJ6=^mJJqYfi?KD1L_+AP(e)&wLGBOU}GLW3!!RO(eFP*EGf(WwtS&EGG z;|aLAOJ`*AjdTJTcTS&KYCg0mLGfKD+<-9dd+v1rP1+)bw9lHDt8-h~VgSAwy_YkP z3(Cy@h@AR|+l{J4Yy&eR9~y`~XMKH*kdh_y#YIi?9<>cWZV0OU#+$J%a{LrsD1DPs z@#?UEY+AG6l*4)P)QvM+Ag{%^qWz2B=Sd8S0TCTNH1m{l!_3i}3co*)cWH>A;mM*w z$_-pgH61u4b84m8*iRc^=|1*`#$%>MZqnoCnqsl!M}}FuT^BCzG3tI5s$l2@AJD(H zB`AzGE{G#NR|5T;E#_75A5c6kdcoQI^qa!a2qSe1f)6r}E16FB%o8JEq^uMF@2xi7 zX~263COrg|h)X;dZlWj3O&)RdYIVs8lLio3=3r}5T2MINtS$PIi3G}{k#bX;vHM4xAV@BOgm^oPmznUjwVf^?+M z`7nSEH%+!-jeKgaNz(-iDRsO*x;+b95NQ z(J(LYllSDL@ig5fj~H5F63h3zfS4y_Ybbnb>W$qtlq7+FfE=h6xNwsd_I9)g*G2Qi zJP-RR$cX75k>cmj!Sr}=5i+y}Jp+jit6Ki#U$$xy%7N9WEhe6=whN0vJ|KTa`Xie% z(2JO{ms&~aUa@{@Z(69aq5W+_1SHm+zz%_nc)Oo??T^rK$e|s9U8dxC9w5V243jI= z&^^Y-kL!DX>cuC z-@n_5UH?Pdo93m;^FzB%qM0cmbRPaiJRFS`0)zjT-yu_cR1u#x9Aya!^6BWwqH()n&dkr61TR$r} zU&-gizw2wAzO{?g>0&pWAIwQ$G^~4M3)lfiIG_-#ns^gvA=vRMRy|~qI>Y1(Rpc=Aw9yc!geDInfU&eO&?xc895l}S7BBQ{1)1vQfE zv-&CpZMKqCz|3AO$4K(o8J)+LGoRP#R^yyz={>9TO)i&z^kTGnJ6y?l_2)ea*o9s4 z$nhJUdu@|3^HncaF)cFQv+?g}!=t!W1t(@G#_&(eYA+_u7~`7?hhJ6mA_qXhMJ3#g zhxLR%bPucxx4JIYafNr-7N+;8o5jc+(?H2L^779Qb1 zdmk_zz|67l!R_P%(8ufxD{*=8yX3Okt&4gWyu}IAy?f6uw60HytUz35zI>CIbn3dR z{lHRdO~)i;gFqAC++o0M#dq%iF!i1BY`^W>#NJA+qE^t>s=arWn5|N3m)739c2E>G zVirLwwdW79NlR(XO6?d?dju`DV*J1T-S_=`o)_N7bzR?c9OrQ!2c!oSVS9g75hYb( z%KlxrjcfGp`yrR8ut>Rjg#LwEMum~|ijmIW0Yqw@Fk>{Z7-$ARoYbB0f;l%LcgD8P zzKHl@@c7AyfD=9(dj~RbL*vBm=(j0W24aa(@hRuzuhGdnaGtuPu|vA<1nT=*_oPWx z6!k(-w8)|{)(+KrJ_vY*LWPcla93nY2m1(P2 zUhF4JTu;RX+3k0bJ3mhmuMgNDC(ZjNwvms~li&ut>Es_3^5`3erm=o@>jz!B>&BFr z0id`s|KM1jKPq72WJlnLMa;7&o*8_fQwJ&@gpI~ggZZP5XctQ2M54RDJ-^zKlZ-bQfb{ToZ zn69rjS^=Lp=zMVHw9#pp1Ry^>{4QSGETW)VH zuM5T0Feu)XU5GM-q8premEG|qo>lfFh!5T4AcF&AV+XM&wY|b z(qm$km!Xegn%a#@ZQ`vx3HOJJT^{^m)gFjC9%!&^EB_q429Ab+i)fnBX=)MSQ!#{NkM-1XO9v2iaf> zp=^?D!OH?Ok|}~IUJCCi?&ezSf}`&HvVf5+YZaysrzx&nFSB(kA{7w|_OJ>Fpp3R# z{rv)8r=G;G zE4=Q#bsDss+x3}FqTheP$vxKB?QMfm`g}$xDdb7U`ke1f&kIrhhH$o*l+bJ;`jQ*l ztsX^Bg_F(;G`1&9bC{_5SQ};{29LLpM*oES|2Z+trC#;7-FevX@;d-{_8+rN%3sT3 z$^z8pXQ_}m`-whoMJV-6G$bCS!x})+-Z$T@?E#*JbOWDVI$lQ`~$o(=yvX0sg zuBRkSEiY-kl2F#@QN`Xcn1ohJ9t>tOPA z!qF`MbOaAcBl6n7HNKVKh0spUQJ}e^(*RxBMiKX2nfxJ*8If&6S30hY034nV&UK&2 zI*GvQA%W#`oA;gV5bR=+7?B_-6>^@1u<@d?$se5DoEdD6bTo#}7(t@TWfk(R>635u z3o>b4amcZp)*+n0);wE}AQ)4_eLqN^AsV~_sM&TSX8A>UTmWl7h(ZdOqx1GD317>1 zAz&ouzz@Ica&9QdNUSdZ*CH)T{^B24TV^SP{Ou>)CLQw*`0^EA%-hxWixw-a=+@zC z^VDrk_I6W9o-W!Dr3#&;idQ9Jt@+}%G{SmF2zRMa*{;9jfpo%qpYZ#+FuJ`=>G

fl1SAjHU>y&C)xp(ZHnCJDDi_KYdKHya!qG<5CKbPG?m}9Y+Yl4nWJf?ytDB3*L}Nz&*IurJl=GF zdnVD(#}uee6yd63ICVcI${KbBcB$m?Wp%)l!)7j6Z~3*IfxJ@??BKPh7XMy=XdMCj zEWkRtZjR4xBJ`HI?-JuPO4{w%;s5d&C-rpV$6XbYi`&7*=;ysmLT?4!mpt%ln5s0Z zL1wZDE#JW8!4qz0E=eLiB1=NDbjqCDgf_&BFhDhj9aflgMD4`Ss&G>lW3A#U5ljkV~0zvIFS z5zKjeAipck{rkFE6=XxU!B#8 zO2kY+nNK50G@3gybS0JMw}|^cGK9i`Cd(hzFO+Wd-B`uZ@H;`tpGB@@YTwZ_Po@S^ zWsONr{+5g<3vCHMO_s(i;iDzovQ8;GQ~2k5ZBwGq&^?a96{O|wS7}o35Yk}y!w{|u zk&45RySE9Znz{n2y5rMz$>(E$D<~eSzs$oG5m7zr=3hHS8AXxtd&o@uEX1*Rcu@*d zTvUBJO#pI+H!9!X;5&;c%T{b@G5)9zXwwUwrr zn%=#cR|5P2Ge8G=25W!yxE5z}lEUu3?-0rl({m^qIyzhJK$56G;v&o-luYY8XlUg; z66f2xT=s(-g2|(K!vJOAtgiZc2mIshBmz}a`S6yc8!P3ccKBzoM;*^p)So>+QCk%q zWey+6l8QkXfG=ZAu--iNDzA78KeaN>+|C_4zT0(h=0P%fs5dG(?Dx@+A`U$Ly||2c z4^@dGe&--2_D+ZD%ni!App=vC7wJY8Kt)BYZ^@fp{4q8^0C?ZEBkUY^i(RfZK`xx)Ne14(O8i5HY)PU;Tsn2R2F) z*Z^PabNo+Lmu|tiPd)sOQHVS`?$ztnd#B8Q3St%s0_!guz6e6_1d7t>W9P`Rx^z9h zBUt16D6fpY8$rOI;A^7!857!QU>}Ik^zpO?O18=a0^12a@LA-Rr%+O}n278;pKFcm zR<}?qs)l;}=DG56{mt?-hI=#Ik^9YjkA25<>;rXr6BFw=-z3wJit2Lc^3X4dF!K7{+yd7Tlx+!-B0{iS#B4n0oPHl>afz>iQ#h~R##IJ>6 zpT}VfHokQ+UB^~=7%h^JRTX!95zMBv(7ZjrgI5K!MNGOJ2NHMW4%nq=r-!U$tZ(Ff zwEU8-ejhxk0C>&ErSt_=6<@A)Q~B>mpD@`W4Fw-3q(2S&-V7hA+IwOQlySDKt%d+(C>F<%In&MB zYL5Pms+AJ(w+*QwK>v>mz+|okIQe>csAguo05WfJ4Zu1F^suKBeAo{-F{yv9?I%-? z>rkaM{cU9Cy@84rN66mUgO|p7tsRhz_l#+=Y;G_yHFE;FTQipE=cwn%BC)icgp#5s z*EOi3N=P!vna;r#jWOYj^NJ^+;2HrdzPt*g(yvFz4|*-BEVT^`<&o67oM$ZWS7n z#~A5^#C87sN9Ey4n59_5{a5{rJjXO4Sz_rYyNflvQ^hS`!&x?`4(lur2bZ&keHKDg zch^rwUw+&FjcEcBE*P*Cb4A^o2(9HzrUPhC8=#HZ?jDi>*5+80^4}gOgaEToh=(ZL zo?)4ZTE$u>20$nIFK?grKFXLwiV=!d#O?u~1D60YDj=#^2zu^`EEbDd0DtF3=5m2J%yoUO57*B(@0D~@)g`rXRs zPhGN`{NpE-sJ?d&pkx$`ZaWwH>bHS+P@P%~0%uzU?U<7uwWjbX(D<#(aWecMP1Xg%4);oDi zJO8@?a?BVZJ4E589Qmomr-KZ_P(oE8h+~}SGW3eRhs(oC@ZK6HzkqShj-CSOG`x1` zKu+U?D@}l}JNIuSY5>G_6epLK*n9ygV@~s)I-OGAEK5rBuDM&!E;xxU=8jd^2I@2` zw7?lQj;Z_nQk+*HPDrvh~KEEsDFb{1QeSx+&2t|lW*Ni|I;-YSdO587$yr5 z3c==ohrSztDo06rw3IlgKX#8KP-D?M-Y!UNUAZ4V_Pcd`PyVLb*7 z{fY79=!d5q7iXVnR8!vFe=j{38R}qPV1t zeQ%kYscFm(V??zT`ZCe|x%_@sKte<(Cx&`!Sxd%4_zhg~HN3OQx39Fw=e0Rt0-$3a zHj}mQHPPMNtZA;@kw&mBOImR=rc5BjEDR-_FPI#f?W5stya9zYWK6Ak=e%4a@58dD zSUKm1wEgZ}H*t<>di*aO#msa+Mt=aa9EL}+QN;gG@P{4UI3G9D; ze*c#sC_oS2m%BY3X^|jOe$Teh1~$?j6H}SQGCGid-O`O&b{XY zOq0ickVe?()_%tPLg<>!A@kO==hqP=!hEo8d`Hh*zXm!OoQ_xfdD8YZsDr9KqXp0m zyzV$Zv4$BEL`-}t0M0MQ|7}-w?<*kG62nT1Z8q`)13d11F^ENVW%!q%x<>bpu9-Ef zYPIx$LpS47uF75~!iH3m%sS`8wb#mv@U-JupoHSGGn2OsU4e9><2BwPFbcKraryv^s z1#RB|)ri)ekoz*oBHqj0luRkIim&btFxEy(dA6B~!Elo&ZFiI`JREo+;FB*tU-tb> zuRTj232xHL>vsW(nG zVi@%T#2~Ro$oOjEJwbolgw=^|QBAWrLoHW|mKa120oiQCUD@S9p9nul4=ECaBy{}x zmW8+^fsO!tS+M$ITzDnDuUNi-&|PZ&&&MyT31ClBWK+1?o_f{xZ`IY5F}nzCDryln z3Z_8TRVS84lQvwk*5@M@pdTS89g~WA69cp8;~Q|p4=m-Q*JYKsN}uZ4y+Ey-9W(Xxy&s}EF6ne{7gST19!c<$3G=oLgR=*`pRmyI5t#!WuW z!vMw3+Pb;yzUY77G9NL94z!frByk{UR~WslO0i4mF62UotwYA&jG61^oG}44hIq7U*<4_GFyVM72yPN(fv-$^jal zo2@385$waQmA7+tQqN26U7IG|@%!zwjCa!6yUJ)18Sf9Ko|!n#g7uTt@{3#~gK61T zZ^;-F?>R)7>1@1MI#xA)|0Nb7dXF*r@WkcBmY0o`4f5X@fl2%zwO(e{uN?HZJ7LmpP} ztvz!pafrJ*839BdlGF#y5X;=XyQuYW+)a;2?yZ{-3sIN9)w>tpf=+@Upg%dMI@OEU z`$Qgf6L)KG(E`A3LG8I$;~zX;ze$_8hyLIAV&5d++GFe&me8r7DYS13XAo8$(DrB) zdyAa)_-NSj6*!GA<$X1hljP%WCwApx-l=%++t>WWd)DgG(@h*)6k$77MBDVy-Nhn6 z;d#o;1wRa+s`h*1r?Lt5xe5?_e1TSihX_U_4&Eea{d|n!9OQF`{qKnTjzdv|uoTh= z5_j!qPOvt>Gqy-?ZuXdjX7xw~Vjhr)(9+R3X=a-@um{1^yfq4_ZLPoYZ8bgfm_q^j6mC}YTx(Ie{!O7JbGs13i3YOGYr3RdZKnMw)F$> zFq*b37}O9+;UZRl_Aoyt)EbI!)cS`!?YtXr#>j!-n*JH!IQZXXha6%U zA$hF>>wepm^D8O^+VG-K@_9F27Y3{%Lb~yzbCDkY?^AYWGo2omhHP9&_zzfkk|)O) zGHlqMFr4%Xq)GAPI!aS{-XZ@4w0CqF4A4+A{s$0a{R9lj4yYhxM4<%ij{?>AlTc@{ zT9ODCd=brh0AGDAf)fH76JhOSO4o@-NZ)gs@A9y<5Ol!=5$5a8vCWhYKA%$%2jJm6 z5qH&vE%3Q`!5!>lJ8?`iU^{dy7*M$xa86tj{$c!te}UABs({97NjGO%bUoZyJJ!(K zd+pBcBhmcFHuF~u2VI1HI07nWm8Y`xDTqi|ArDY9T-WNjt)o2o+me@_c?6ki(eN=q zo)GD!C0bjKgn7t4q$gg>{jh#o=$qPniA0=yV_|+>Un|-409blgvgnY*GkddfHIMA| z*GiS7EBFyf>gA!2tG@h0@lY~g|5MstZwUl@WtA@ckn6feT!wh>oz6LB1<_`EW~5_8 zd`Q1}iO-^}vpB5#fx^agiF>?ndE{t(f;8}cM{qVjgMM(-?AlX*^WJ7aa}1IoZJmGp zikA7VJCOMAWT%}NV>GvzyBaH3jR_&u15N8GXrpEGzV5JLdU)iCy(p>8q}!wb&jd?w zjY!2*V=`{zoHJ4g3sv|9%oTGL-HR5t!2QqfK=G`0z3o2(A&k1`LiG-CIqP9!@bf)d zlr%~bMw`>riSYDha+NoAJJ4k7bgs(kBrCu`S4dx%D-7@ci2klU7vY50(nq;~wgUiN{=R=-h14%hN=s@>|n(s%`(2@?)p9)+h%sM|^PG z`l*euT;0mg+n?J7r}El5adJ#5^N8tMr49&X)xt|Il*E zl1D4qRLfr_Y5n6YR+nx&!AiRaf1ed+B=*=SRuVuOr>14_qrA^ZY7m}5EgzwNx?qN6 zPxl^yE#>V1*eS2K*Za&lb$DB9E7?Yd&@T1KF=@r(kSt*Y*|4$Xye4Wg9Ano{hUCg@ zQrSA0s1CeC9Ih@>+4hYlY9VUYEiN>+VeD*xZ0_4JA4~?!#A$?H75`a4rvSNW?l0!! z;S9p;Lqf7bzJzjtrh(#mFkA~p)t>#|$bF{|un3t3hqIh2LxzoEuXUpTT;3Z$eUD_% zQ$mK*{FS)Rs62`!)|dXecL>rZ#Oo=L$W0xOv_UX3lQH#(Go4XZ_Q$n@C~OQIu;zK3I_t-`lbcOi7&~{&aZWnC}(vnU?!Q8 zz&D~iI)RFtJT660>DZqfhR*(KW#F%)sU{LOOtRu(UrnaHtym64yo6>rFG&AvQ19+0 z;Ncy8$q$((0>r)Ae|!S~#&0?cN$bzu#qmxq22d^08c)+(K)ePb@J71S%T%VF$u`5+ zF`-V*A5oWD=q~A;9*j+$iG;dk`HsT0sKZ-3{{!AXef744hIcdd6ca+doxbA!33xIt z{E*vJ`)hNQGGu?f%?i+uwVK=v;fTUr>xSGq_0JffYIvFU7Eo{RiW-|F_frO30Y2i& z*f~v@;+548i(2G1{u|XnC+n}EA?Nvg?p{ysy(`93ESvm=9+U0eiv+fW?fkGUDC*aA zz?_Y$J_Bg|V%+IAc@@+=Q;Ae_nuIE%uLn>UF}o_#_0sjth)^Bg-;5qkM&_7qt{EGE zsnQNiY;z=fyVMwVieBO`39qg-vF)yyMuv8{y8QESdVj_;nVm%uK%tNhm3P_Qc?TkF zoxiQnIK+J&ZV8uZharisbUH)-I7whTCXZ_odJy}QMvv>3l6TTkh%KEY!zDo`aI^89 zAJlrfc?7L=txJK{@1K3Q2Zu+Ss5Mg6D5oB0HbHS_{bwO%?KH_ZnaOHl{$druzd+bI z^};`M8qIf97{C45{xMm!;`t-+UXQ?=pGn-CBHJoK2@@5#L{M8(l8bAyhk4kIn;)~j zlm{$y<_N>Iz8h{|jk07)!Ex-bNpYg4z1TZ*+ zY^zz6m{LQaD`G0RhfKWVMVvsyt z>)%`Oy?0}j2bMw1U+v01NRWVRCZhO(0-M8!a=!nj_POs$0ZX>bX;KDaxuqm8H~Y2D{>|wMYW$)Y zQ}lDN?D&ZDNaJT-uy!I*r32@9!cetGhJdD6x)fbKXT5lgQFY3g_J?md{BV8Ww6Vfn zV6_En3yYw1r*wxfT+$41u*ECp03nkvBlOn7V{{w>lmYDvDIy5uZ*z9y*`h;@#m&}i z8Pda4=n5V<^_9>OZV+t{P9MF=<~J~GKdzmF7TkInW;g4q_yFA#r3W2?Mo#*m$F$I~ zsB`eLD?G3QZf9Zl#+98J;sx+Jywdw{9zqG_DVG-n7^;l&REHf8yc=p5%M?Mvs zrXQ}Q0!);oH7_ac-nwd{tx;MCzgPA!R^Ja1kzBiO;UA7&pugtMIsNID9d8kLY2Af} z*4+e z3J5Z`eCi!e%eSTXm#3p`(Oiq@7VJ$LGs}^BgKNo$6#MomC-~!7Q<@=Ev~T+^iSKSG ze+%*-USqSP!fenS6(N_(6$1PlQC+Ga<|^b8$V<098ywif(b|>unHxd{a)VL6bM&0_ zX-|f177Sg35%%@+ahS(wJT-Tilb!m79^ALMs+Nojlw^jPhRQ3Z>wSOBT#YP#^|$ly z`a*>wo3Qjcb$xF&_vuKwzwnuGQt>n2KB>3A!=S87#3@4bg3erY#zxrgTtpqFyW2$L zQ~BCEka)N5KKZ=ge(!YLOgppuYZ4abu@3_kvE3|b)GB#v(sq0pr>qgmuR^tS>bCcV zVf}&>^k##sR|3GE>9v`R5clX=@kxTl*&cr)U0&IPPiR>RD88KMKLZzfY8`&w>so|X zRCv@!3;*&rQ3g>4U~5g^B00=)JtI&c6VYb+)7RTGIhm5OWE&Fi(q5>c*O7Hq8NvLu zo#d@L=v@>uD)qEg&KlK?Lc)%TMjJ0@?l1Q|6>KTq2+jx3T?)MNl1}sN8ZXT2qJlZ0V+;~C4jtiVPsTF?BV#=6fH-Q*y+>j= zf{IDOMld(oA8y-leli5BC9Va(p}b90=>8$WS-A2;;uq*-rAJEM8EK6J$S&KJJw+U5 zv&y#&Xg0GWzNB~8q(}A`Hy3pF(SRW?mBOk@YRIy&}ZMxTy0cX z3wzQ8JtMRHM_aZpy_?{NT{>Zg0|KKxz$Mw{mGyB9y21hzMBkLe{O>yfBfW^TvyTky z%q#@`<0n$i*ikD01e)^CWe=$@ho)~Az+|34DFA}vyfM`8xLO~gAEON4a+E+h3JD@a zTx9J;?1WTA{oynK5#Ailh%!ZxBvg5*qFXW$cUc$P6jA5#h9MD>(Bs9k>Do7L5GI*-HYse7|fp{Q7C`|5ixq!_WAgBAQbdGQy9 zq2pToMPp9Muh?4K{CT^Q5ld-PHF;}9*iez1Et-X%5<-ZoAX|*|5UU-W znMHM@;E?COr`Ruf&V0G+_8gmTuE0b$oqpqhcHPLh7tukcZ(^hOO0yV4{*Ex|leyh( zJwjd3G4@rQ11dDTWJ>&7_aTR}3g3^f-MJhAE>~K(7mVEBirAfWUT}+yA6A=kU5I<) z9vK5JRlFG-9%b!BCIf!s!Igc4Krr%qknXB?X^j^L$t@iFUQ%*gsfWC0|K`r)LaO7r z4P#Dg5~-m1?I{#bO&pN+k?1vVNy3NXrF6`~UZm>{Tr2S+VE!9V-I*+1B>7FEi=?1B;O7 zeFof!a(LuxT0)FHjP3NWHjo^EIc?la1w-z)bV))wTa~;S4yNQfM#u|=y#|>h9M@GC0HL|MG6*m=)h@I zve>*l`vZSnv6?!?OGX7qrV`dSB4Y5h>acFQ`4KEmdWoN@YS=UM2_}d(ZTbably>B| zsvQX?m9E8se^>Qg=TytT^X|KzoBkkmdZ`f+#Kwez{+Ih>$MC=AP#kQUwnU=B`3B#? zH8ynY$kSHBr?AW&eU7GguCyENp!YIqO}+0UJI%?t33 zBs&ckV%T~fIKpv4>ay24`ETTLXZt)mb*T88Qh$l`%0w;)%IdKZCdN?oqv6eAUFe%7 zgWLS;kEXJ3PA5KA`w!`a`|Ic9W@HY(!9Cl>I89Nq0y3pLTLZ9CXa8cHI8v;+OXWVJ z%Rg5VFoNb(rl?Rb&V)iE={f$-plJjTwhG*`F|B)>Z&QAeWD2SL{ndRm=R8j{2cGnP z!294Hw(8T5z5{Jk=3OWsBuPrfQ4oyrR4QgSh~>Z()5BTXe7LUJ$C}9LPG?EZ<6;bR zyR={%_&b@7HvDyquLmne{*VKyiWtrrajyLz7hoRcNMhdvn|Ipja-R+eq1_(e{!`EJ z6a5SFkWPL7(cs03Gvo(LB2%)Vu2sx>M$-eRoXGpUjq||%?`6=Qn}$wJ4LTWkE=T-U z_6u~3jz!*tk3>A9dylb1kvgk~=M+zz8xM?`EPIsWDhMN%HS9#MfnB`p+wgb)d9h;? zauzWI0q8n{?`0GHWAgqx$Bniy(Kzu+xA4z#9#G=&BZ?#iHUNqdZTW0gZ$_>iL*-$u zfm+y9u=+L_r2=O8lWm7*##n+RiSh}iTei*B&HU!oQWlv43ddEs<$F_Qm@6UHfc_GgR5zx_UV2{l3uAXv@A)R0B{XR@dd~AL+s2l;DD)GVSP>~k#gfN!v(%t z>im+6SXqz4X8{IdzDHjsXDWVSBoU{gn>RqNpqCQ!qSr*DyMroru3`Ho{SoO$;yp=_ zHuK*D^CZzF2epXMmzcT}>*tH_45FXXLQ@4}vX4X&@o zaeDM9?k?V4;u!zz~Oy%^^=@)Zc27Z;`Y4tKMxb)_0}Y)ySA}c5$mnqah@W2ldPDLza{fw zu$Z3}P!E)TB*CbQ{G3ZOdLy6d5@k)*N70_^SpcT}`xO+&H-vZL)}VDifL&d|DAOoC z{slglq)Ka-A2Si7#}vq*#!HJ?sd%NmaAXjHBT2WmZ&y;z`}CpL$bGJpBtVp9k3=P( zEl3XoIQnqacm%1^RTGC*j0`Aq0q!?hZ+C^aFsmYiT_EZZYDk8zLfq;>VF0IaUoYxC zDky41Ay*r?ukZPPUwOz)%rzgA*YuhjDwV45u7M$0X_b4?Go=jf_`vFTPV$QuwSqtV z;mv9V*?ca#kR&~e_dnYFqbqmxztPf==~nW^3V(}*8v=OrWfX(oTx6EiE2td*Gp5|K zZ{nm85(SSR+!x-FYS^zrUDfC!wBHfsmiM31QLc$|blvkF6RD+Hc27z>x?4P|3?4m8 z9}s%C^7o-V2~vRCJpxW|OhxUDp`IlqukPO;;0n&bLGVEZ(AVY zG048`2j18&1LK5Tj%7Go$dOBp;dwZwsJ5sDNbUEJ^2rmU0qQ{8G4w}ta(ayL>PNH# zDVLA+b)-(7DOy!W6+iEH%nAG2o{ERINIH;=_z(glBpQQKy}Wl|wJ{&dR@8A+trSef z$aSgB=i$8ZJVmu@=xq!pZFDQJee>_+wJQ}Ongq}zL_ZRDhwA2)s1@+)Sdf`FeS7W@ zRn)`{cO=hgNp(I8G5=%J>IHoSGR&N4<|Tz3>L^4{80>{$c_AgH6T$Q^YeNY#2w8M3 zDj#(UgTvoUY)NeLxc3ZmTl3|w{y^;m_Y{qQeBE*P`3D!7HR>eA<8lK_Wk7xAV0yqB z_MrBi0T+(JZ7m^uhx|kjAj%Z|y!yeQOiQ#i^k|uoV80_f|w!JT4ofj+2W2i-p(eDRr0Y|{C~g~^#w=|8qXwjjIOacw$cgF-|dge=Cj3%&%6 z1Uh-<=wtBov9w!%LGG$e3NT4~P1Tmsp}u0J#n2)ll_5X6WTFitn3 z^-5FyM*giK+}e%@vtcSvA;)T7{cs-mn(U5#72}LS4cz1kYLhe`J-}8SQOX@)1JU%? z#d9{z)PKT(&EvcmiL_ij`Co4|ta{%+aEHnrg39#riq)#^b@CdwIRd%r-5)AptG4#}blX|yHyna=cjRfFl>INpdc0?7 zuha2WQj9rP+D#>^Cb8n%l7XmhuMdtu>y`VDUn8eMj{FoSTzBY0sIasUHbJCleOrDB!Ep+xN<8V&D+^6f@B&l zJsBOY$c3M*vTlz0-T|A%gguiKa=F`1xgoe8pR~Ry#YX4vTDm zpZKGc$U?*#RX+zaWGKDXHlXjpf=Fxcg{}%D;{Zcs z;b*#pw5{*z!JS2Ur4b_n1m3C=6;R9zx=2DayIW_kQgKf__U%F;*bGF`&N^6pJ4V`< z&0|>0&BkKAG`!Zo1Rn0LI<+|p3nW0+z0!wRXro;awUkZ-RnlxLAYcZSgY1gO?RcC7 z#0QtYk&EP`z@*k+s`n5J@>rWqc}dh^pqx+=_c2F&JkqG~vKVIxjg(;%`@2YC@D~f= zBfxmU+T*h9#2`JQH-+LCToxa1@z^n879QO!6!P}U@w2D>;h2JV9~X{W*TJg3w)YU& zl7n#GRY;R6K@dUU9Y}&W-%QmW4Zif; zsh!~KRO@Cg9@nU{;WaB)u^bm3Ojq3a{#M~Fo5aA{=;Nlmt*_J6!`2e%q^FX9_PN3@ zEYQ#_HcJfK0EZo4+!bfRLSc1C(SO_h?>F34T|-0BRI_5xGK~M`T_{(^gM}PDi>fDd ztpWAnHMqArNm7ota3&eL6NU zc}PzFU(8Y=vqD9cRgT0wf8F|qCt3H)(3hAK+JDA^*b@#}>#hF0SbXCtY=X(qKkGok?7>7MpjZu^Jb|82#^&eK zCd~7PLnqYz+XdqHT<{6ZhzVL^4v{T)i0!U90{~lmky`wMHA9NIJ=g6rv~HLZMj7%m zutj@F4um87XN)Jd&fC-*fLJ=AyirDGak#X*I@lV@yF`qJ^O z1&AJ^)cc+C1gI4hM8wE5_J2L9LL$!0eP1t+b%vm|=54$!sT>@oHZis9+fLah#YV8I<6{%j&Tcd4o-fya77Y2w_J$yHTt!pHgNRg>bo2VBf z`k{Jo#;WKeWB}p9G5^H=&&i_KP)o4K^u6?W#5*t!yrqtHMJrkJrPS_&+>!%N76-pv zvWQTss(M>X+nR-@+n_rEjIfaRoylrbEmyKU)RrmPEPgDlhk0>`c5kLT#l-nZv`TuY zWvnPHo7*}jFJMWvKhTour$wJD;zRZm%);xZ=og5+R4Q4yRTB)qzVbr}BLXh!j_L2a zye?M^-;T=e`JT)F*|R3o1-#kpVWrtpP=tJyM%y3$%hK~}x2hWF91unK_iG#%LSk+1ZNPzDUH6&|9cVYL}eS``C-w7VmANnYJtk*AwT&7;Ngs8dL5zWO5$IR6PgR2 z|Dcl>yV`!lm*@3yv4}3}nrzn#f2`34n7S&}KWGkzhlm}jf4{p(+)ZX>ABxhV1aRtU z*uLGP9J(kPk0OZ)L(`!R4D>GP?3yXee7RD+KQiy==VAiEx*;|QH5>D0Zs1KgeZ4i2 z&)?5`ah=Id5RhW@=T)cA)I#qf_Ow4*Wq1-Hn-;vaKRTvK$$HDxyJu*s5TCELJ@=n18-5Pe|1)xev^nT~$1(96hDy^5@aReqA zJbk?ZaE*Ir5{WDKxH_iE8$RHY^wxe*fH~FjoWwpUq83pqNWIqHR4voKV?L~r)KjY; zMM*j*%k3IJ=XBaBPaWTTbHNHYQ%SF82lwlIM^qF0J6PsPgs1lKu424fuD4`K*pk_! zUV8Lca~J*6S$H0yeb&q-d6BoMgya$pP=l1EEnOZ)7*GEQ49LCBq|?r7-tCxc3H8cs z?Kjzh?GSc={3hSZ(!MP?q?+sQIPeLj1QgYrUeZRAnPZO6NS)pqz4_5Lv|o^#u2WA*_+%hVu}er>-0Z&$jv zN`xiH1}&R25c9D>lF|#``N6yTUs6M2yZtIo0)YKa<}2j$Q<={zzeR!hM26m~aiXgV z7Ml0`X=AwOn=oB&7kM;ZTeQcy<%c^zuOgj!1Ih9dNv+_>tQGD2^H8;c;d`lDItvZV z{32f?GD5xx(q;4s5Os^CJgwA7PIB&kBoJ=~0f;|f+2gV(L1>FkEv5+9B0{ad08qNt z9PKKek_Uj5)w(=y8WAluUFra=3q$^G#dt94&KDxoQ+_Qrfb2(0!2Fdpf~j7&g}jD} zY94=h&--qL-u7!`k;n}b^eV~|L7VoLS$=`2`UUL4mB~6LQMMTho}Z=4JFcxyJmeZpB2r>w4NxMm{ zycDNjcE5ADiZ%Ia7QX|X?0A0L6g`FFk=CewiRb$GyCMbw0a%|9$+#uw(DBcACm*8u zCWN+Urvl+iUd*P?k6(gEbX*oewN*cDN#`Zamp!H9C6ry@kv;%D>e_36bY-=2C@eMd zc6R-@Tjbo)ceu;HZbyL>BnN*6lk{8n`>+jg&e!^Bb8-f4NQ`!Q7N;aq(-!}X-sR5U z)S{05+8wLRL(eS?rPn}iT>Vls2vS(s+N*pLP}#1!KfQBOsT(vcZxmG7v0ZR@soazE zWVEVj+hXvr8~G;U$!o$O2yEhz*PaR+GwCddSV+{$6urANGOQZ(YN@&6^M`oj&wKIT zL!vHj>E_fwQJ54L;FTe^8MKQ(35U`sG>Ew{gnBsEBKaOZ*j1xw@sb_PnWy2%eAhx7 zI$xXF!x#VP=^Iuz5L#pKbyCsWvV(1}D>3Ju#&mE+3!E%WNz%(5SaO21-0=G7&tB^% zaoC$l`$?5dv~W}0b@G*q7}k4mb>eAsQP5*hccklb11Hms{WAS|uYq1v;XC<`IM^KX z4b|d;Y3Iq_OwkuDDQ8*Ii3x9`hVH<-6>vU-ug}QtZZsi_V`s{q?C&qRpcL_KcOM99 z^*Lrv3I#g1XRG*VI9_SO*^?9M2(FELOK+FzcdIsMd0UH>k2YW34t_k6-<|pU*2U1% zb}qB$EoOxKh(Crs*Mwn}Iagi^tlnIEuDUaqph5Z0S1a&4#>#@UgtR645xHLn@30Wn z9qwPBn$l=&EA4e<|C9GQ0L57n5RjT+aEJ4Zj+hp7T-+ffkh-q;?$rxx_Nr)azdQS{ z=6tC5%U`j1F9biWERVaKXOT7CGP? zxx;Jkplf$l?79o_lKP>bB6;1g#hb@`V}KBM#c`V~LhaRM$301|+XE5PrPWWx4?@p1 z1_L%0*a~I>JRJ8H9X%W-8*Y2^1CoKQSrX&bO%Qr{^vvXJI@6UII&J80e#zKHyT6^=ujQb;S_@%P_f6NY5_+e zjma}tBhrq}eLDBaZ{fP(d+o#X9s#zG0{l92Cxdb$0~`x2;W~0@zRNpyx&uAG+S4W2 zFV}yC`8?PqEEwH<52(ysSvt6G&=gDewcJppc3pIBgITg z<+l0N4Xj&$yH`TT-KuzwoOg!<=Ra+p7&M*n9K_MOtK6;YaRLQNtOm$QvY0LZfKFrC zGDUH9@BKC0|9G7{WI|-BtlR1-tf^a5U+}E$A6=q4w~q;R{Q!fYjfoaSEWWh4{_>i1 zQMquEt@)n>Ii_F_G8uU0^^W45Pt|Py*WQ|G(Gey3XayIrshB zxBEW#4?}%x-4~Ys%`n^mnPEG}a&jsjv%C>#c?o+#K92j2z%hpNajh?Zgj`w|=^;3| zmz2sO+LKTx)!uBO=C;9@y;#)T9qIJ6hAfwQGvM&u4b$M0b>~peB|A#ME&1`1(wtn| z8Qxu_6=m5TLSk9-VW^5yiSCW zYtp{03NDiMh|+@82RqeGOwO7b&hA!Zo-;IO^<*`v&lEEBkf?SsPCc+~8MK< z{v#4JL(b!^PrA}XZoqD}_G$1z<#J9pDGec>Xk(l&WNLY&8%ADIJ)>AA_Uh!60Y0j) zLE@E|ZmIR<`Ks+|@6%h-g~8WPOk^6X2?Vv7bXHDTIYmq|mAtee)AW>+VkKa(=7Zbi zIOT8&3Llw3xYIc6Rc>DWaL}i~$FKch=dF0TfY*z*#Of6qW|m_IshT_A*7CJFcpEmQ zh%Yao`dpI$j#%N^WT6-@?447Q z&{e43@S3-QLrC&(t(sxucQLlM2~LgtoVCIIyzn)D1Kz%Jn4?7Jw>ED>;RS7xE`rZs zQy-dy;|>w_$n6vVF^<@L;|8r%_k~v&zD_y2Y>EvH7|{OpP&hJS+Xfj~$s5Urq2}R8Fh!d@>Yc$=WUja6L-uK??&X(ZZZ-_%QZHNl#-F~=$l)UID=RGHmtE@d z2{V4=5OO|t%K}U**Cu9dEnza9rN>sw^8`sR`r4B#pl5_gaaG&oaeTZK{8w(_cV+C> z!zUV0XoG30tatFIp~`JZ_=IYPT#4+Zs0U%GoN1!#smz$%*rZQ{F9y6P3zg0E@9x=? zwdnc@^e*fousxT(B?>*0zQp28f0mV+WW2m7-cwU)unknK4<)BOdD zol_1}&Shm(@2%OE>UtEK6kTO9qa$Uj*5Jh{hVWAoqx7w%m!6yw!+b)HDB0?>88VKi zVdHVKx6Y~yj(ZSIfW!VqJjSb3{}7cJ)-V>*9Z&S8LH4k$@#K zB`ytaSpRAx+zB4gJ}U-GWYOpg5NbR9(q_OGtdiW*B$5ek)P(oWf8L;(AbzlKKlrJf ze`A#Mhb>ife4(DkD%Jh_>yn>_U6+(}_l|_GorIeAji)u52C9ZDi0L|JjQn~jMm*do zslHd$tQ!wB_PRb7B(=wN!&rRYp55kaVYGir5-I8D_?iP*JDt>fs4H621Xp0oL?95v z(noI+H-8S`dA}1vvkYqwZC=q-?);(1GAgFqpL5N&UHt|3XN||pEv>dp+cAEQ--4UI zzV|v0bJQfO!RTJAyFl%3eyy3N|n(4q$nJ<~5BGNN+BPRIIQ^ zYN!tJn(N=nWD@*3i4)ZwTRT4E*lCG*oFt?tnowZXI;Y~$mgm72moM2tv+pF(aI(l+ zw8hi@z6Jd^N^VWI@hE+%C|Z)++@&zUPc@?a?51YcG0NU=O~jcp4Iqudo}sJgO?^Fl zz~%f6<5+vJj?1i=0dM~bY^o0P>2Ugw)8h}VC7;R|3Kp6=A{w9iWt8*CGHX1+rqMaS zDKGZDLf7khwTrNG%Ka6W+0nds%k)$1{xIj1!AM`QGch4k+4iG_xFvpvpZt-q9Wik4 zDhpAu#NQQpeQMG>C!kaPw!^zC2tm*bqo!in5>O(8##n+s7`iGQmfy9Qg6~p019@YQ zXt%-xYiZBR?)}V|JErH9aSsHoloPwV`G}wT6d#N-3JNC{NA^up(|D>M{|pZcv<1Q* z^=K}z&gUOR+`-1c3D`CrABu>Z<9d+0nhl9whM&2~T$pR?!3t|x54>L_?=rP{%NI)w0vy(*p^ z#q*1bzr;xiy;kz7eevXU-d#%4^80BTnuJm4+mm!?xZlM`!4kIhq`4lUfu30d0=@S_ zF`sHD<_DQ}(WK=5t>p;d@I8_aoB1_<6+y3#jj-!o#ei%L1<2s9l8Z6^LD|hd@#w(l z29%7)D0Lm*a%&d5pC-rlR2({pcos(#}CW{OXnW`?ZF!6!yE1ukNO`iJTw=!nPD0SZL7~T89cqXkk!*o zxNY>}0a_+n#6;}{_1$f%Gk!#2Ezw+f)afbWzSY4OAVFebS@IyX@ZY@v%S1$cRPL?l zFlX(?T>K~ejShb=o6`M|PrTG!YAjZYH=HXwgXb_$<%|B+sSxrbL%F^|U1%kj*!SI| z;>`i0cUZtib6f#B-;WRby#`J5Y8dS$tWlQ=!F%n6G;BZyUtEGt=;9FAc#Qy;Dr%2)

NwKyU7vtkZQnN%%L0OD^nGru%Hm02S#4PBCRv&~PiEdndCuql81oCj&oll&Uv-Ri}PJUKff1)^Snjh?p)B$f254vUM zUTrRLGO?3h&TFg@dXDwyFS^+&Pgmr;yY4~D=OlUAg56%;-NMKkbhyk0a{OpH3ax}v zf-x1e3>i;HNUqi=EJl9Nw))8M3F3oPu++rbWI)ubyT3c0VtPyj80B1RQ}ebxkddKp zjLf67c4PgZ^}Mpr^pZdL$U1-OgG)`mPn46Bbz69VcEgXLk_HHsv~@fmCgt(6kHg-y ziBSHymd{m|W6R;#t=$J2lCW|1?Kj}{!O3dumsP_)Xr)lD)AGpo9={FhwN&msW=eR& zuOOo%-rJ{VY)tce;bVI979p3UqlSyDRv3poZtrn{_Bih}^n3==1})2`S2uP}!zV@q zpgc#Q4UCzfaRgOj^!#NkBHRX<$Sp)gref$Xx-m>&~ja3^S^G#Sb!G7n$GRg7Ad5_`_$cI&^nN$tAkPGvrnLZ(Gt> z6JA-eqd1A!wCc|ITP)D$Eeos5EHh8&h4sjawAbt%$l16LwD-{4>Xdh!Ljwq=%L0&E2ss9FkZ+h`J#3c7VT+Ry-L&0wPknSX)9QUhEytrF0r z^s0wlizr2R(zmO6cq)c)r=t7oF1HE?>DD8;Cd^Oj<`27Ydnh#O;?|b%<)-r2T~eBh z{!$ZEqM~=WNpZ~U%&fc6#b*S6=G;1x)RN(~MD&j2@F``1Y5nxi*RlbxRh2x#S`c+) zY6NHjHOI&s=m)!m@YKf^4C&7@ju`y<8jcXWXo;#D9)-Nnv2p#Jz% zY)AD^{6g?-n8TXVMvGubj31{9pP1ZhjU}TuQO8JCBP;VK9kqbAYbP+&-rhpDfi=mw zYr6+tJi$hlxi#R9gO`&<-8zfZAR-s%7j}6$Fci^T)1g(oSd;LwutDHwUna31&A|fC zaYplp{l$GFC6J$orC_@cxdWoqc@}TI`ZNdYeDo_nDh|lLFu9-da1$=G3|g9ppwGb* zIVHQtbr)pfr6k%jIjg|KU(;<(?qsLu;jvpDyvj^b!r6dyj7xWw*Y z%92Sl0wuBYtx1)y-C(#;=NYt8Bp$LYBNk0HvEowQ>bV=I&jDoxv>MAB)RV3ccKPe^sX}NRr9jQxF=)p?fRnmD?xKDXq*&L%! z&fO231q=23n>^0%MrW|0{^_(IcTbt^*mW|!Tiv}A_grWGA#jX@qi5GjDDkI%q-t#M zR=ia2mZjowwYs$C+%RKV*7=EYrd<`R-9)%9!t-Dwm&&uBk+mr=m!4u|7l7k$kh5OZ zM^reWt3sU8#uf-c8?Kob z+l_@M=3=NJTwt!!*#7fqwG71lnXNe4;k zevTWNIGN%znFK-edL{%$2yBuiGb3ZFlE;)6IdKVMuvhjH zrwqiQl^U@(sq0dc>09_V)1|$9z}1O6HEo!!1lKso7rdT1KpoC*T%ORco0b0+l=u`I zZXeimGs?lb^H#EqxJFA#iPhofLrv^QI%K~6}vzSX%ULQQTHILm`{|Vay?odF5;6@!EaU$Zk0p@>|GaZp!sCU?x(in<;gLF;WlGU_XH09XSf^b*Lz&#e0yxX!PXVrUmD6&J02!LfjH#f?=q&!*!#qD2kP`17$>atQ@f zNA4ZgO%^=@g<{q?tc~9lD+iv-u`>9snWRuC(i!@=E83nxg7nG!lofkzIcP}Xni%l3 zuJnF#boSxGRG$VQfQwT4Hv&hx0VVcvbJ+8WN2~MwSZFpjcy4>yGAQ&oCDIZ(4m5Td zF)>IEIZ2UXk^2n{LKH)tLoF8F=9y8SE+N>EZrub1#x=qm)yekJmUva{*0nY@%n*(Izz3#{;){<(bt619VlQr>ZpU5>qGPe3PS5OIR|KD30&Px5$DrdD`?FD%I%Gen=-kt zX@xsAXMGXp*)~BGVTX9xAATo%d3?1Ly-U2$3ExRVgHb%FQnfk}VAVqz$-rwq4OEg` z+t#np2mk6or-g3vf)o8(co|yB0jNM4gGaz^sy>P>+BDiNt73zD5E7y>kbzZI-n`crgIvCv=GU|AKtsG5Q%pBZ_-e zBYHVFXzwI&+*S~Bw=SOMt&jMj1F3HjwrH62V~JT&2Kh&`7O&zT)7IerTNVNj(cLH` zu*i}{H2`ATX{N{yhnG9`_ZR8h6b*b#FRh8{7VXzcb7awI7X}}eMBt$587kwP*>nsb z7Z*5qxS`hI71nW9&o92J#ZU2VC4ym5APaU+maF9-mhrzih?2U=_0z^=3F0#>R$rh@ zhmOFY*k9bOKMf0d1w@8ylo%F0i%aw3VM@M+$R78X_ix7o!MXs73rss}lPId&?+dYE z7vut>q4==84W`34}clO<}UY5w`SbhE?r>j7oNI5|^z`wcQ z1z=}7Vnb%dL$IO21Mm0Qg>(LkT{?*NW}sgrWn+jVrSecMx^;QkU!cgT8s?}^Zo<=0 zE=qK0a8}DqiFr&T;X#fs=@ct$pvSqQx+W3(*Y#&;i&#JIZ5jL`YMvw2U(uJ-7a|V_ z>`6uHbwvADOlIFjd=GvtT83XnFIm*U{4HotKt&avrfB2XLo+pK0THqsv_Yhw#tvN`DW33RaUF5U6>0)59ShDb46`!dKN-N{pgG zN4_SfQoFq#pZI8WD?SrEisx`7~nk7rZcAoOI%8shE%+j22S29ab42`0#XM2Z^h*)VR9RGtC;_-6nz#P z<6rzVP`FN6%*Ed%l5)R1G{4Oyb|4rG*n^Yu(r{j7D=_cd79FEs?o_&Ywd`f4v!HK{0LA(xFuK+?? zjtb4vxMnpsW?xo-c!$DTAhl8e1*)(x!S1R={@_p!j?Hy#N_PUO{fit0YK zV7y_%xRg&%{)Y#Eb(}L4LoygMOl06?^!Y@H!xj9&pzbfV=pTSN>HzMh9Hit`^D6Z` z^C-)x9;C6Czcv%QhC5wy9a_mivC#wVsuF?jdP^TTQk1@^vyZYiRsc(Sg_q+|@se2^ zaQIsD{l$44`aoxU^GT@{u3a&BnzD5Yoi}b(`$Y;--Sz!qR1Q?TogY6A(4NXV1bpAN zq2A*_iO2=rL2C5hy19f#8}O-bH>+1%gr}?nVf9>VHC_>X5XwSgwM8EyK*8)z? z%iF?RVy@A)uv>_K9LCxCztO6tvzP(XlP{NlcOqZW%B*P?erY&ZZ!^O9>Ah-cSdGIB zh4wm{ukAy?asE@4*20X-Ov?q{te2LCU1p~$g>7~Of$ln>5G3m&CP(c&=k~$PGrn2r zo%=Du!s)-bksnE^V4!q1rRk%bEsyzu$J8NO>1#>iTU<0f|FQ`Uv z(rHoIbpF&)#-s%KWheQMk*vNhNDcE2&XbN_WDa~BDs8aRK)2`zF_C6{YA0`9GY|>L<*4XCR75yOc5U&U)>_@^tly7&g*eBt>`r4 zj5*-6A0;bH&L^^xUcpWWHdOx~XOnaBFKr)uhCV>9!)IVX6#NqWc}ek2t}}E_&rv0C zr>~Y4XDs%DH(oIT_3QH!%HCCFw=LMuGoH5^OH^cO_C8U;`0+s^f#9w{IEsIC;w_l^ zmMMrOh+$~uo3h+GIutL3|AYiz0dP}UTRp|~VWmU+Wx zGRvozz_a*APJUze!<_X}v;`aKUW(RAIOw^O<&7juP6CTJE1*%C&6(IFMT_Tyx1p5~ z%0WHy&T)r0&Lwv#iU8S+EaLnmk6x{7{mmIFRY`}Hw>?cHfd~`5F6ql!6o45#r z2HOh^HYw3*uLWdh-xdk9hh*raMTir7%Q?tMi!nNXlt zSaYOK!1CavNjhQS709Q7>$UIk>44>Jq5CcXw^Z~q7QxGq1`)=RzIVu3aJcjAi`ziV zLsoJaJGzm(8>sBd;>%BIAlMB32|+~*k7?zm&+QpdG9y7q zx9^U03!E;^JnbOA8OiJ0TX9AXFy!Xxd5!c{Yb6m4r3^eW6|~Y#AlfxPLVHOGHBwzm zt=21M@PQb4nloMmD4`?w{S2`9cNFTvSYGJnKMc<7B)oS2nz4_f&_0U&OlFhRCowDM zZf-`vQo+)>$aAvADb-`8tQ~p1XNfzy^ylPReNoy zX^-(t+-*5uY58LQ8w^nd!o39ZeSRhLAA!b!<`|9F@>W=7nPfq-1VWvnk3AjLu+)82 z3xRa{Om=YO#H-f+-^7ER+Ak(ssaYss;zO1>X=)kACE5- z@Cdp{+3)W(=)e_1_l-r4Y{9#ga|(W&5tn0g*Bh9GZ+$zoJ#Z49=~;5AS_U=*s$t3C z@U$P}Y-zF6nkfulX7Fb6F7WnY@&=4^T+~fONiSfA+fF#C0{LEtWb5WVY~3q?iD)`) zb#a14Yu9xc?6Y1(eXp6pXG)@|YYJ<@9D~Q{zY6UqQ@ZXJ2+#J9t<-e+ZM(EMN!tvd zLJQZlNzl1JrV*hD7xBm&ER=u^vDDoB1)|jeA%CYSwfpAGAsPqfctgw6eLM?qLs!+v z@fac)=!1gYTFQ$Da?s?Q`ae!M44C1-d5@1I&7fS3Zj5^no_6y*o%*w^wAl zLr?}!y-+(&5$i`kR})aKuj~}XQD4~EDota4Bq>`y+efDV3T(g2Z z|JM3|*aJS_O>eCL8m8F{yp)I@L5%qS6e;UjB~PbMa?a{Q^jn6#u>c__(s4Mi zqU~KeAjH;v4|tXt(T>9pm1r=va8wwYD!N}vHB}>UaTK=|F$5I~2qWd&oBO?xJ%BU( zGgy#zI~-++XE7MA;vaUN^)}!=LH{9eKMoRwgwzjEX8{``5*F2#=Z+bCMzg5np$%Nz zAlw1m#y$m-)udoG%*eNO*!*Z#6su%6;}BCGgU5}x#R491KX`o3i|ji7%{$2P&&UKi z{Dbg6Ap-6(;9W@vpPfmpFCZPfLJUOl_k`F z1H@&_xL7Q}#RvquF-jg5&#$*pl903Sf@-Ac&o*`L(;z4D0lHe!cCzE(J0HujvWcs? z{W&#E&-5YXy~07~Sf8b1lay}ktGTX;PjQcbnc_DseFcAQ)BUWz|CY->=S%=4<2YvT zvdM=bZ(E)80YV$@XC03#)QVY1bGfX0blCp<; zki>)*Uq}&m<@1eFoW1V!eFt@oHcGJRH+%9w?~4+<|G+JE5;nx7E# z-CSq-gXe#5=4AYnP5$@hAkQCB{1@B(8N*`!VDaCZCPx2|;lDQ*Ab&!U zMYK@j|A5>l2qcOx6$An)>LM=ELy7+dRVVkrJfeB!-(Q(PfdN3e+J=a-OAayr52te3 AMF0Q* literal 0 HcmV?d00001 diff --git a/webapp/image_pool/f739cc0a8bc1c3d17cc3dcc4fc5ff70b8266998b-flask-project.png b/webapp/image_pool/f739cc0a8bc1c3d17cc3dcc4fc5ff70b8266998b-flask-project.png new file mode 100644 index 0000000000000000000000000000000000000000..1887100d316b86091a567aaefa61b21192f63b86 GIT binary patch literal 2223 zcmV;g2vGNlP)O% zEf%6tAz~B+yJCH?zlb%6ir5u=u=}EjVgtd3KB$QG@y3Q;4O}eO@?-iG|6hz zs8QV8l$4ZTS`-!*Rt{S^mFLf&n`h6SZ!o{rh(h=+xBIIN)suP{Ul^x=JZKuC>mp@ZrPd8-91d z{l+(l;e_j?0JmS*8G2CGo-FXKTD3A=yLJ`exzd(8tsgpcsArGou%+RD5p|@fE0O8Pw*w=OPc zKyq?&Ox?P5OP%4XR;@BMYSf4nf!rzg!-o&%(W6JELx&D=jE@p+QfHP2awK6Sm#3VS})akC-)UR%F0oEbVsf+9k|ofC0*m z7%&?FY?un5+qZ9*-=d8l!;zgkcS@TuId<%r0M4~x!-itBW5*YY#cv+T$Z3?$Bvcu6xsu%jwKGTfB$|{vt~`X&&=h2#ub)aIKk4T zONFt^moN7X=L~-D-o3?%aKJ=hBLD+{3_6agAOl2?9zD#tbLRvIfCe}KIdI^BI2DN* zZFvTC^Z{Ijw%FHYDbG5tEGKEB5k+m`RHH|aj?38nt}gpi!xr#C>pTix#T*1X^78Ve z17SAYjRVS@Idja!i4!B~;v5VfK&7XrdjnwWbm`K?96o$lHgHG=S?-M=KmHfn0B*A! z+lj`2?^P$~8Q_r@FJ8zySO_r8s{pRd<{o`@@*6j9NVH+RkcST+N`G($-Yr9>I z&ZO+64J9ZFC)$OJ1Dvf@zrr57TL<_Qym0sK-Dc3BK~k8L^qpU^I})a6FE8x6Awz}; zdvOq*qg{Ip5+DOMEU#0ijyZGYjMUqf8J3?rs}K zc&=Z+zO(^!zJ2>Pbj@hb$>@?u0r2hHx229`kM^3Z0UUL(d)TmH zX33Hz;uMP)FP8AgmZ}bf&1~8*zr$E`*!_c9i86G)m#~V1^E=h5RTGCIfgvtdPMrie^hb^y>21(pgSMP{AtWw1o9fUG=JFo)Zrip^ z90}V*CWNU0+t{HU`q)JuTYfTa+BA7jXjKLxfP}*%gkU>CWG<&4?%1qey;|7JZ-?n= zeS-!KBoZKuxjJvVcI^aMo6$Dw)v-7aFIuq_2*ba9`xdv33j^F{edETBiQc|_`vff7^A1os{p#Ggv)rSzWy=-` zheQK_R6U)VSk_UfLz*^iD!^e|oryMn{j&SlrcE1TA1jl1+R3NgJ}oUx^j({LTmSz3 zz4{Um-e})JGJ#2^Qci*p0Mqt&V zMT=yWK}HSZiYr&IUX=qQraw&vli3coiOGFXo@E36_3Kx&ckkW;?;jv+PtbW<&rn^E z!$7ZyVC(T}&z?OccVWKfzPNJ#{(V`YKrDbr7HqpHMt;e#-^rO5(pAA_xSPyH`B$il z1~$^GSFgC|&!0aR+ZOBRC^o`QDRul6uSCnSIKXX&+ov#I-1j*>a{(_e$Bw_dBsw^8 zr&vNb)3KiKy99JMU(m|CcI{dwNe;zjc94f9b3#)oCFcZwAzlArMFF;#eaM?PZ*-6T xF96TZ&(F`K6y2v+4sV5&zae%}`STwE1^{{O6Vv+Zs+s@*002ovPDHLkV1fvXNC^M{ literal 0 HcmV?d00001 diff --git a/webapp/requirements.txt b/webapp/requirements.txt new file mode 100644 index 0000000..a83ed36 --- /dev/null +++ b/webapp/requirements.txt @@ -0,0 +1,12 @@ +#Flask==1.1.2 +#Werkzeug==1.0.1 +#markupsafe==2.0.1 +#gunicorn +Flask==1.1.2 +Werkzeug==1.0.1 +Jinja2==3.0.3 +MarkupSafe==2.0.1 +itsdangerous==2.0.1 +Flask-SQLAlchemy==2.5.1 +gunicorn==25.0.0 +psycopg2-binary==2.9.9 \ No newline at end of file diff --git a/webapp/static/css/bootstrap.min.css b/webapp/static/css/bootstrap.min.css new file mode 100644 index 0000000..ed3905e --- /dev/null +++ b/webapp/static/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/webapp/static/css/bootstrap.min.united.css b/webapp/static/css/bootstrap.min.united.css new file mode 100644 index 0000000..c839ae0 --- /dev/null +++ b/webapp/static/css/bootstrap.min.united.css @@ -0,0 +1,7 @@ +@import url("//fonts.googleapis.com/css?family=Ubuntu");/*! + * Bootswatch v3.2.0 + * Homepage: http://bootswatch.com + * Copyright 2012-2014 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Ubuntu",Tahoma,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333333;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#dd4814;text-decoration:none}a:hover,a:focus{color:#97310e;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100% \9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Ubuntu",Tahoma,"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#aea79f}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#aea79f}.text-primary{color:#dd4814}a.text-primary:hover{color:#ae3910}.text-success{color:#468847}a.text-success:hover{color:#356635}.text-info{color:#3a87ad}a.text-info:hover{color:#2d6987}.text-warning{color:#c09853}a.text-warning:hover{color:#a47e3c}.text-danger{color:#b94a48}a.text-danger:hover{color:#953b39}.bg-primary{color:#fff;background-color:#dd4814}a.bg-primary:hover{background-color:#ae3910}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eeeeee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #aea79f}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#aea79f}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #dddddd}.table .table{background-color:#ffffff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:14px;line-height:1.42857143;color:#333333}.form-control{display:block;width:100%;height:38px;padding:8px 12px;font-size:14px;line-height:1.42857143;color:#333333;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#aea79f;opacity:1}.form-control:-ms-input-placeholder{color:#aea79f}.form-control::-webkit-input-placeholder{color:#aea79f}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eeeeee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:38px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:54px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:54px;line-height:54px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:47.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center}.input-lg+.form-control-feedback{width:54px;height:54px;line-height:54px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;border-color:#468847;background-color:#dff0d8}.has-success .form-control-feedback{color:#468847}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;border-color:#c09853;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#c09853}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;border-color:#b94a48;background-color:#f2dede}.has-error .form-control-feedback{color:#b94a48}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:29px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:19.62px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#ffffff;background-color:#aea79f;border-color:#aea79f}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#978e83;border-color:#92897e}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#aea79f;border-color:#aea79f}.btn-default .badge{color:#aea79f;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#dd4814;border-color:#dd4814}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#ae3910;border-color:#a5360f}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#dd4814;border-color:#dd4814}.btn-primary .badge{color:#dd4814;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#38b44a;border-color:#38b44a}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#2c8d3a;border-color:#298537}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#38b44a;border-color:#38b44a}.btn-success .badge{color:#38b44a;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#772953;border-color:#772953}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#511c39;border-color:#491933}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#772953;border-color:#772953}.btn-info .badge{color:#772953;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#efb73e;border-color:#efb73e}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#e7a413;border-color:#dd9d12}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#efb73e;border-color:#efb73e}.btn-warning .badge{color:#efb73e;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#df382c;border-color:#df382c}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#bc271c;border-color:#b3251b}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#df382c;border-color:#df382c}.btn-danger .badge{color:#df382c;background-color:#ffffff}.btn-link{color:#dd4814;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#97310e;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#aea79f;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#dd4814}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#dd4814}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#aea79f}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#aea79f;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{position:absolute;z-index:-1;opacity:0;filter:alpha(opacity=0)}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:54px;line-height:54px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:8px 12px;font-size:14px;font-weight:normal;line-height:1;color:#333333;text-align:center;background-color:#eeeeee;border:1px solid #cccccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:14px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#aea79f}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#aea79f;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#dd4814}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#777777;background-color:#ffffff;border:1px solid #dddddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#dd4814}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:6px;margin-bottom:6px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:6px;margin-bottom:6px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#dd4814;border-color:#bf3e11}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-default .navbar-text{color:#ffffff}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:#97310e}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#ae3910}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#97310e}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#97310e}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#bf3e11}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#ae3910;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#97310e}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#ae3910}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#772953;border-color:#511c39}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#3e152b}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#511c39}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#3e152b}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#3e152b}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#5c2040}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#511c39;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#511c39}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#511c39}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#3e152b}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#511c39}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#cccccc}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#aea79f}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 12px;line-height:1.42857143;text-decoration:none;color:#dd4814;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#97310e;background-color:#eeeeee;border-color:#dddddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#aea79f;background-color:#f5f5f5;border-color:#dddddd;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#aea79f;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#aea79f;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#aea79f}.label-default[href]:hover,.label-default[href]:focus{background-color:#978e83}.label-primary{background-color:#dd4814}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#ae3910}.label-success{background-color:#38b44a}.label-success[href]:hover,.label-success[href]:focus{background-color:#2c8d3a}.label-info{background-color:#772953}.label-info[href]:hover,.label-info[href]:focus{background-color:#511c39}.label-warning{background-color:#efb73e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#e7a413}.label-danger{background-color:#df382c}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#bc271c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#aea79f;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#dd4814;background-color:#ffffff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eeeeee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#dd4814}.thumbnail .caption{padding:9px;color:#333333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{background-color:#fcf8e3;border-color:#fbeed5;color:#c09853}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#ffffff;text-align:center;background-color:#dd4814;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{color:#aea79f;min-width:30px;background-color:transparent;background-image:none;box-shadow:none}.progress-bar-success{background-color:#38b44a}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#772953}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#efb73e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#df382c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555555}a.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#aea79f}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#aea79f}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#dd4814;border-color:#dd4814}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#fad1c3}.list-group-item-success{color:#468847;background-color:#dff0d8}a.list-group-item-success{color:#468847}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}.list-group-item-info{color:#3a87ad;background-color:#d9edf7}a.list-group-item-info{color:#3a87ad}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}.list-group-item-warning{color:#c09853;background-color:#fcf8e3}a.list-group-item-warning{color:#c09853}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}.list-group-item-danger{color:#b94a48;background-color:#f2dede}a.list-group-item-danger{color:#b94a48}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#dd4814}.panel-primary>.panel-heading{color:#ffffff;background-color:#dd4814;border-color:#dd4814}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dd4814}.panel-primary>.panel-heading .badge{color:#dd4814;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dd4814}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#468847}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#3a87ad}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#fbeed5}.panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#fbeed5}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#c09853}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#fbeed5}.panel-danger{border-color:#eed3d7}.panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#eed3d7}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#b94a48}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#eed3d7}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate3d(0, -25%, 0);transform:translate3d(0, -25%, 0);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:rgba(0,0,0,0.9);border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,0.9)}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,0.9)}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,0.9)}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:rgba(0,0,0,0.9)}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:rgba(0,0,0,0.9)}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,0.9)}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,0.9)}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,0.9)}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;background-color:#ffffff;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar-default .badge{background-color:#fff;color:#dd4814}.navbar-inverse .badge{background-color:#fff;color:#772953} \ No newline at end of file diff --git a/webapp/static/img/flask-powered.png b/webapp/static/img/flask-powered.png new file mode 100644 index 0000000000000000000000000000000000000000..9d20f17cbc1fc174738611c3d96cc199427a50f7 GIT binary patch literal 4890 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%0AWBw}L_NJ*%;8%$*ZL}%LYk&b(wEh^y zkC<$u0oC_^ileL7Yc&eURTj(h)Z(j!zIT(UxdtWx6>i^w)NTI&rr6Ya?(0=l2r#ku znuhROcM*J@Q6aLjpnhu-+Fw=-FI>j}nF6d_*K3Lu7g7k@F_^2ldOM#<)@W|owqD)U zWn4;;6-6!GV9jxf;symU8?mzO!pH#hfdYsCRPG=zy<7Wc>XUQK1SPhC+-8@u=vg;T zI-a!qBo-pj1n>t+)jAC>iok7Shq^@hKu8frhOK#T)oKo)EE8;UO2u4~+$iHFw-Z_6 z*8+<+(TVTPUA`>YDt}94BLG>CPl|6ArY|x|s_u0W994F{j3>(*qnYNmHJZ-}X+Nh+ ztT}}>opSz?;r{@_Xf_kp2#?KOSk389<;QV`BBtJ^;PkTzBa$iR(YT+?mj3{3L{isG zA{d@<4LTby^<)rksrwo=y0<+*5IcheR0{~ZvR`qK4j|ITp5t5uZBgw;mg)Xs1eAbB zdKG4DwZsGBf%MlsUajjLOj7M2OaT0;3Of@?O-WmzISfenq~5;h7^nqFk`FX!ZFR4JzLtOwO5=S>&fW8jn5^rUosc;Q zN%okdv3b$~K_h}{T$&Ah%mC^K_NJz>Km-EDAey53rP$0v0!~a~mv2>Q344T(igz@& zy86QH{{T)z@=YF>R^^CcDsh3DtS?wADnnBi{jK{}5c3sX8E?YEtQ^S#W8#>oRthm0 z#a3-%lnU&2{sm2|;g$pu6zFYay9t$MGnlTod?bcr5daZOTc8h5;0dLhjUxn!#IH0J z&peeJ06J6#fFl)E*t&@uK;kL`#t9SNnc3RmDs%gd0|jui(>%o?JwU*mNg}3q9syuu zJ!+oD#dSbX%w=l5(1u}2KKxUQh$|y$IFUldLXk7vRV*7=&}%GNw8?u&g!iu1U$D!& zN}C&k2*pQ-*<0^-a+{2ZTHT-{dF*GUD)ptX!q{}Uc7jS70QCdnt#7q$^y9kR1aLvM%^LX5`w(v1 zQ^8@958kT3glR6@XS7f>`a;~CRz>?wr@F}2(6nH5H1YbYmBqKH2gEG0f{y4U9;UqY z>o+Zr=G$Z>;E-z9h3iv6sTVdV=tfLeq8A3T*tl+ss^&tl7!>^KuJU;%5GEu08sNY{ z-2Y2ij!;w zB2G-?cBW&b5TL6P%Sd};ag0f(y}4MJp424?#2JcY1(a!EOwR|kT+w)DqgQO)S5&qz zSo>8nw-<#ZcBg4IcXaLru;FC-Ia%*le+n}d0Beh-D z_=(l&!Zw{l4i4f?Q3&KuBi^gua28839B_Wr8=XW?9qPfhO5@eg%_W1A#8s`t4>^`H z0g8~|sU+vUK(<-3IG}4|X#>;=_@+ezb0iVdGf=~L$RJj)fj@_7MbFhD`TX15Bnq8X z!>VR|PwCYTcPWCSpo)5?#$vEwsKF2c^#PIdM6qqLb8?V4#VM_mAxI{2Xb54D2FZ-k zU|9!wf%0lumH_G36rkonW!inIp+?ilJw52sO2_TU?-a!nKix5!M%RfW>4?Z z>uD~hmHSUaPVnKS^CMQRCyvyyCUc15f#N{@-qgw-i%(}mb!YU*KxmHi3ue&1NziGK z0z!}pHHl*N{VNu-z^TbnYkNbhwRcV#-FeNi)~&ZH+U~z=Z7c7Ss&u5UeM~5qUN6HKluro^*T$MjTVjV-ME2(^s=_{ zJ*uXk#@^oJe^M_g`gaH;;AXJu^m{u+Wya%o`#4YKHTLytw*f*e7cI*~3g$*;{p9hq zVx9^)m^d8_P-=H9lK==jNv;>Cpr8t|QwGM`n&~;)^p1f6UJ>tw?)3@U^Z)}q{ zU71e;c&pl#U?Xk;3MYKgTu{ivacBPk-&(HLuBtbbJh?p26iaQE1=c62toESMKuBns z8-!cSgH5gIXHtjskX?$eKJXiHKAN@+HO`ep0P=PEsi#ldPP~hLL>!I2biVa zxNsF!gl7OzCtwL^f&{2BG3`r%x6(xBb4@_OO9QkFM>9(sK=hbn?Mfs#F5afbaI``f zC5Y(}%}Dg(*&&Z6p;3ym6Oq=fsA61Y0}>)4f4w%<{{Z#~H(2Eqdzr?{-vx^-d@0`zG;8z8q{FVb8zOJ zo>8cpjU~HG_w^gf48oFW3*(wgm-bn*%%nhKdHZzvtgD_OuO)&DQp2i>c7fXVuG(r= z(-y`SB5JU5-DqnUOR2gN3o!y%5$Qdn{%fu2JTFafCCR!-pH>3W^>d=rah;Q z)t9UA-6op)Y4ta6UB3egAxGrXKT6$vJr0XcVXl_a>1`L_I1m@}MqOI*v3FF=$(Hie z!1kI(isP-Zr?8E*NRmLrQ2zj@%O5S3E#m{d8@JnE&^6k-X{KA2Y%||15qI3%6aH$K zmiD&Y)#~2UhROuq8IM5~vNX2F)eD6=_pZL~65`taStIIRK&lIl{i|wpcG;0{Tid%%g_h`Puht1KAm#yc(iuKTep7Ivgu;MTUOX85+wW6TK1jwCf3`4#LG56wN{CY zVqEZT%1Yc+1348=_lDfGp|_z@cpRU#dP|y(CA&i8lWt&`Jk+kh;jQG52rbfS-qprD zi|(^`X2K_<2&AdAzyAOcbXy$yK{H;DQ>WC;!tS?Al6_hGR#EV+aYDOo2|I|KkG*PR zr#m#Es?})7+ou#dv1JD1B~KQuRdDbdQ= zyq6pgR@qqmiY(PSsa%Ykm(^qeXd#aO@Rh!?`;17O-�{{W{PYPn@v);PTl-9C*U%Y?S$B~;0Z^ZLPR)$+FQ?wP|ZMOE_k z4{*Ms`vLj|1^RA1jc8l&eK59{H5b?xJ4OjLck(Ue=}5UBxKDbEE=HgW%XS9#J4jTfhHJjH7 z2>y};&-tcWvTU8cX8xp_ww3q1OIj-eJJMXU5p#}{99EpLU~T|bCmpE9n%<*x1dw>l zMOvFol7U-toKW01Jits5zywu`+H0Y<+fcB1-B6llVmCPaRV9qx)ou;<6#Xq9YKBsZ z%ob;%GgeK9P(UGvekv`>4_-(-Rkfv3gaOKmk|APb^gh*M{lM4YFQz6cEV(dQSF}Z1 z`2-Np(pUV_yt|;X+qPtKPAfsZD#vQ^#S`2fQ^5LSM-**oO4f?}HP1>nF+97-;zdjvONuxOW_JRaEL0 zNqxabc%x0;m#u`hCJBR1ySD6vxYp3*DOr=Vc)cqjVW}`^Ud(1EZoJ~9HOz{bpAIfp=Hqk2FU?73o zaZ6xlHwfzy%|qSD+DSc)22+?kl2>$gr56AI!G?QLZ{7(@g-^Jl^DYF-NbB!Lq6s9* z+vTyECf*d5lkYrH-FqW$)XaVjD`*FDvnV7@GZ?v8Bw>*%J;{pV36n7#4rYjL0D?D1 zSf$-mZ=jSu)X}{mrN;`XT6piV5uj;QR;dqhPjyqLmCf*|-*ib(8^;&?W@bNx8Iusz~+}cCRJZ7MZq|UJX*kIhZ*3Ac5E*|&Dn98AtC>sh#oX)POeSCb=rkNBlpxE#A&d9>}d zKoJ72{u|<@{({I1YFU_c3svuUD=HTKO}mhI7(X1<#MbG7Z7N*3zDN+TC~aA{r?_vT z1Rx#^nz>QNF?C)MsJ2y#$YF>znr-cPKA)Udt{0`jkp^N!nfa!(hi18SD_KGGg%kOv zR&GB}62MG}&tPbkT4XE4=M!G`*|X)Q)XQW71u3pLMi&_k#yBdGS4)e+UJbaFM?u;S zX>Q|aAb@@A-+rWxJ;z|Iinst|{%b#6ENXP1UACg@Cg73B-mZrijvJs70i4vez!U<6 z4{CWxS$W(JMDb9`3;;PZ(yGl?Bo*|aB74%IOF>R~t0vhvNZFad**2YMfnuP$UgPz1xsDcW_O-L-t+$^5;+t-k=ed)#usSS=IDs~)TANi`K zZR%M0Y$KVP;_C<1CY$9cCA_hoov43Lxry4U2Q!(fNUro-GM`a78KVUt5^_ax(=a9o zIHj8|Ju*G1)ElN324IdTt!b~`CG6T_tI1Oom9p3jN6kM)YgKmVlWO4g7=mC^$F7#$ zd9_x(7n$vzk|_>a;}dq_WA1BjTjAH$6*W4$V&eb;Y$rc8PUnGYboRj)Ek8_1{{S^i zV!KcQLr5Ts;&zS8$9~l}wD&a9x2=Fr5N3mF$N_QBG+cD2eO9iA!kUbco&URBw2Y zL>A4(TdTlv-mz}#FWmt7o{`LAm2rU}mL3kyE-}CghND4^W*^vfoGTqzA jK(}$CU;=SgJU3H#>usTPw{ex@p`$xyH~MtL+|&Qr+jrk1 literal 0 HcmV?d00001 diff --git a/webapp/static/js/bootstrap.min.js b/webapp/static/js/bootstrap.min.js new file mode 100644 index 0000000..9bcd2fc --- /dev/null +++ b/webapp/static/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth

',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/webapp/static/js/jquery.min.js b/webapp/static/js/jquery.min.js new file mode 100644 index 0000000..644d35e --- /dev/null +++ b/webapp/static/js/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="
",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + +Flask Example + + +{% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for category, message in messages %} +
+ {{ message }} +
+ {% endfor %} + {% endif %} +{% endwith %} + + +
+ +

{% block page_title %}{% endblock %}

+ +

{% block body %}{% endblock %}

+ +
+ + +
+
+Developed by XD-DENG +Flask powered +
+ + + diff --git a/webapp/templates/page_401.html b/webapp/templates/page_401.html new file mode 100644 index 0000000..f25672a --- /dev/null +++ b/webapp/templates/page_401.html @@ -0,0 +1,6 @@ +{% extends "layout.html" %} +{% block page_title %}Unauthorized(401){% endblock %} +{% block body %} + {{ super() }} + You're not allowed to access. +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/page_403.html b/webapp/templates/page_403.html new file mode 100644 index 0000000..2fecf7f --- /dev/null +++ b/webapp/templates/page_403.html @@ -0,0 +1,6 @@ +{% extends "layout.html" %} +{% block page_title %}Forbidden(403){% endblock %} +{% block body %} + {{ super() }} + This operation is forbidden. +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/page_404.html b/webapp/templates/page_404.html new file mode 100644 index 0000000..c5e2cd6 --- /dev/null +++ b/webapp/templates/page_404.html @@ -0,0 +1,6 @@ +{% extends "layout.html" %} +{% block page_title %}Not Found (404){% endblock %} +{% block body %} + {{ super() }} + The resource can not be found. +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/page_405.html b/webapp/templates/page_405.html new file mode 100644 index 0000000..e2b1ab1 --- /dev/null +++ b/webapp/templates/page_405.html @@ -0,0 +1,6 @@ +{% extends "layout.html" %} +{% block page_title %}Method not allowd (405){% endblock %} +{% block body %} + {{ super() }} + The method of your request is not allowed. +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/page_413.html b/webapp/templates/page_413.html new file mode 100644 index 0000000..a870d7c --- /dev/null +++ b/webapp/templates/page_413.html @@ -0,0 +1,6 @@ +{% extends "layout.html" %} +{% block page_title %}Request if too big(413){% endblock %} +{% block body %} + {{ super() }} + Please check the file size you're uploading. +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/private_page.html b/webapp/templates/private_page.html new file mode 100644 index 0000000..fe6eb48 --- /dev/null +++ b/webapp/templates/private_page.html @@ -0,0 +1,76 @@ +{% extends "layout.html" %} +{% block page_title %}Private Page{% endblock %} +{% block body %} + {{ super() }} + +

You can take notes here. Only yourself can access them. They will be removed when your account is removed.

+ +
+ +

Add Note

+
+ +
+
+ + +
+
+
+ +
+ + {% if notes %} +

Your Notes

+ + + + + + + + + + {% for note_id, timestamp, note, act in notes %} + + + + + + + + {% endfor %} +
Note IDTimestampNoteAction
{{ note_id }} {{ timestamp }} {{ note }} Delete
+ {% endif %} + +
+

Upload Image

+
+

+ +

+ + {% if images %} +

Your Images

+ + + + + + + + + + {% for image_id, timestamp, image_name, act in images %} + + + + + + + + {% endfor %} +
Image IDTimestampImage NameAction
{{ image_id }} {{ timestamp }} {{ image_name }} Delete
+ {% endif %} + +{% endblock %} \ No newline at end of file diff --git a/webapp/templates/public_page.html b/webapp/templates/public_page.html new file mode 100644 index 0000000..d716900 --- /dev/null +++ b/webapp/templates/public_page.html @@ -0,0 +1,7 @@ +{% extends "layout.html" %} +{% block page_title %}Public Page{% endblock %} +{% block body %} + {{ super() }} + Cinque Terre + You can access this no matter whether you have logged in. +{% endblock %} \ No newline at end of file diff --git a/webapp/tests/db_test.py b/webapp/tests/db_test.py new file mode 100644 index 0000000..0404599 --- /dev/null +++ b/webapp/tests/db_test.py @@ -0,0 +1,10 @@ +# tests/db_test.py +# Simple test for the list_users database function +import pytest +from database import list_users + +def test_list_users(): + users = list_users() + assert isinstance(users, list) + # Optionally, check for a known user if you have one, e.g.: + # assert 'ADMIN' in users diff --git a/webapp/tests/test_app.py b/webapp/tests/test_app.py new file mode 100644 index 0000000..18646e2 --- /dev/null +++ b/webapp/tests/test_app.py @@ -0,0 +1,19 @@ +import pytest +from app import app + + +# set up a test client for the Flask app. +# configure the app for testing and provides a client to make requests. +@pytest.fixture +def client(): + app.config['TESTING'] = True + with app.test_client() as client: + yield client + + +# test checks that the home page ('/') loads successfully +# and contains the word 'Welcome' in the response. +def test_home_page(client): + response = client.get('/') # Send GET request to home page + assert response.status_code == 200 # Page should load successfully + assert b"Welcome" in response.data # Page should contain 'Welcome'