@odigos/aws-cdk 0.0.14 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -3826,7 +3826,7 @@
3826
3826
  },
3827
3827
  "name": "@odigos/aws-cdk",
3828
3828
  "readme": {
3829
- "markdown": "# Odigos CDK constructs for AWS\n\nInstrument AWS Lambda functions and ECS Fargate services with OpenTelemetry, from your own CDK app.\n\n```bash\nnpm install @odigos/aws-cdk # TypeScript / JavaScript\npip install odigos-aws-cdk # Python\n```\n\n| | Lambda | ECS Fargate |\n|---|---|---|\n| Construct | `OdigosLambdaInstrumentation` | `OdigosFargateInstrumentation` |\n| Mechanism | a layer, plus an exec wrapper or loader variable | agents staged into a shared task volume by a run-to-completion container |\n| Languages | python, nodejs, java, ruby | java, python, nodejs, dotnet, php, ruby |\n| Where telemetry goes | a collector in the same Lambda sandbox, which forwards | your destination, from the application process |\n| Language detection | from the function's declared runtime | none — you state the language |\n\nBoth write `ODIGOS_IAC` and never the connector's ownership marker: instrumented by Odigos, owned by you.\n\n# AWS Lambda\n\n```ts\nimport { OdigosLambdaInstrumentation } from '@odigos/aws-cdk';\n\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [apiFn, workerFn],\n});\n```\n\n```python\nfrom odigos_aws_cdk import OdigosLambdaInstrumentation\n\nOdigosLambdaInstrumentation(self, \"Odigos\",\n destination={\"endpoint\": \"otlp.example.com:4317\"},\n functions=[api_fn, worker_fn],\n)\n```\n\nThat attaches the layer for each function's language and architecture, sets the exec wrapper that loads\nthe OpenTelemetry SDK, and hands the in-Lambda collector its whole configuration.\n\n## How the telemetry actually leaves the function\n\nYour function's SDK **does not** export to your destination. It exports to an OpenTelemetry collector\nrunning inside the same Lambda sandbox, on localhost. The collector forwards to your destination *after*\nthe handler has already returned its response.\n\nThat indirection is the whole point. A slow or unreachable destination costs billed duration, not caller\nlatency — and the collector's `decouple` processor is what holds the sandbox open until the export queue\ndrains, so a low-traffic function does not lose its telemetry to the freeze.\n\nConsequently `OTEL_EXPORTER_OTLP_ENDPOINT` is deliberately never set. If you set it yourself you put the\nexport back on the invocation's critical path.\n\n## Endpoint grammar\n\n`endpoint` is OTLP/**gRPC** as bare `host:port` (conventionally 4317). `httpEndpoint` is OTLP/**HTTP** as a\nscheme-qualified URL (conventionally 4318). Exactly one. They select different collector exporters with\ndifferent endpoint grammars, so a scheme in `endpoint` — or its absence in `httpEndpoint` — throws at synth\nrather than producing a collector that starts and silently delivers nothing. A gRPC endpoint on port 4318\n(or an HTTP one on 4317) is the likeliest version of that mistake, and is reported as a synth warning.\n\n## Choosing a layer source\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [fn],\n layerSource: OdigosLayerSource.IN_ACCOUNT,\n});\n```\n\n| | `ODIGOS_PUBLIC` (default) | `IN_ACCOUNT` |\n|---|---|---|\n| What it synthesizes | a layer ARN | an `AWS::Serverless::Application` (nested stack) per language/arch |\n| Layer owner | the Odigos AWS account | **your** account, created by your stack |\n| Resolution | synth time, from a table baked into this package | deploy time, from the Serverless Application Repository |\n| Environment-agnostic stacks | not supported — needs a concrete region | works |\n| Deploy speed | unchanged | slower on first deploy |\n\nBoth install identical bytes. `IN_ACCOUNT` exists for organisations whose policy forbids attaching a\nLambda layer owned by another AWS account. It needs the deploying principal to be allowed\n`serverlessrepo:CreateCloudFormationTemplate` and `serverlessrepo:GetApplication`.\n\nIf you mirror the layer somewhere yourself, pass `layerVersion` and neither path is used.\n\n## Versioning\n\n**The package version is the layer version.** `@odigos/aws-cdk@0.2.0` resolves to the layer built and\npublished by Odigos release `v0.2.0`, and pins the SAR application to semantic version `0.2.0` — which is\nimmutable, so it means the same bytes forever.\n\nNothing resolves at deploy time in the default path, so upgrading the layer is `npm update` and a\n`cdk diff` that shows the change. An instrumentation layer moving on its own, under a deployment that\nchanged nothing, is not a property you want.\n\n## Handler mode vs. web-server mode\n\n`OdigosInstrumentationMode.HANDLER` (the default) is for a normal Lambda handler. It sets\n`AWS_LAMBDA_EXEC_WRAPPER`.\n\n`OdigosInstrumentationMode.WEB_SERVER` is for a function running a web server behind the\n[AWS Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter). The adapter owns the exec\nwrapper, so this mode does not touch it and loads instrumentation through the language's own loader\nvariable instead.\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [webFn],\n mode: OdigosInstrumentationMode.WEB_SERVER,\n // NODE_OPTIONS the function already needs — ours is appended, not substituted.\n existingLoaderValue: '--max-old-space-size=2048',\n});\n```\n\nThere is no auto-detection, deliberately. Detecting the adapter means inspecting the function's other\nlayers, which at synth time are frequently unresolved tokens; a detector that was right most of the time\nwould silently break the functions it got wrong. **Applying `HANDLER` to a web-adapter function\noverwrites the adapter's wrapper and the function stops serving.**\n\n`existingLoaderValue` has to be passed explicitly because CDK's `lambda.Function` exposes no way to read\nback an environment variable set elsewhere in your app. Omit it and the loader variable is set to the\nOdigos value alone — for `NODE_OPTIONS` that can mean losing a flag your app needs to boot.\n\nRuby has no verified web-server loader and is rejected at synth in this mode.\n\n## Java handler interfaces\n\nThe Java layer ships four wrapper scripts, one per handler interface, and this is a correctness switch\nrather than a detail level:\n\n```ts\njavaHandlerDistro: OdigosJavaHandlerDistro.OTEL_STREAM_HANDLER\n```\n\n| Distro | For |\n|---|---|\n| `OTEL_HANDLER` (default) | `RequestHandler` |\n| `OTEL_PROXY_HANDLER` | API Gateway proxy events (enriched) |\n| `OTEL_SQS_HANDLER` | SQS events (enriched) |\n| `OTEL_STREAM_HANDLER` | `RequestStreamHandler` |\n\n`OTEL_HANDLER` installs a `RequestHandler` implementation. A `RequestStreamHandler` function has a\ndifferent signature entirely, so wrapping it with the default **breaks the invocation** — it does not\nmerely produce thinner spans.\n\n## Signals\n\n**Traces only, by default.** Metrics and logs are opt-in:\n\n```ts\ndestination: {\n endpoint: 'otlp.example.com:4317',\n metrics: true, // off unless you ask\n logs: true, // off unless you ask\n}\n```\n\nThey are opt-in because the cost of a signal the destination does not implement falls on the function:\nevery batch is refused and the in-Lambda collector retries it on an exponential backoff, inside billed\nduration. Traces are what nearly every destination accepts; the other two are a decision about your\ndestination, so they are made deliberately.\n\nA disabled signal gets no collector pipeline **and** the SDK is told not to produce it\n(`OTEL_METRICS_EXPORTER=none`). Both halves matter: a signal with no pipeline is refused at the receiver on\nevery batch, so suppressing it at the source is what stops the error loop. An enabled signal's variable\nstays unset, because `otlp` is already the SDK default.\n\n`traces: false` with neither of the others on throws at synth — a collector with no pipeline fails to\nstart, which would leave the function instrumented and silent.\n\n**If Odigos also manages this function in manual mode, the signals have to match.** The connector renders\nthe collector configuration from the destination configured in Odigos and compares the whole string, so a\ntraces-only function judged against an all-three destination is reported as drifted on the\ncollector-export component. Enable the same set on both sides.\n\n## Instrumenting a whole stack\n\n```ts\nAspects.of(stack).add(new OdigosInstrumentationAspect(stack, {\n destination: { endpoint: 'otlp.example.com:4317' },\n}));\n```\n\n`skipUnsupportedRuntimes` defaults to `true` for the aspect: it visits every function in the scope,\nincluding ones whose runtime has no OpenTelemetry Lambda layer (`dotnet*`, `provided.*` for Go and custom\nruntimes). Each skip is a synth warning rather than a silent no-op. The construct defaults it to `false`,\nbecause explicitly asking to instrument a Go function is a mistake worth failing on.\n\n## Credentials in `headers`\n\n`destination.headers` is rendered into `OPENTELEMETRY_COLLECTOR_CONFIG_URI`, which is a plain Lambda\nenvironment variable — readable by anyone with `lambda:GetFunctionConfiguration` and visible in the\nconsole. For a long-lived credential, prefer a destination that authenticates by network position, or\nterminate at a collector you control.\n\n## How Odigos recognises the function\n\nThese constructs write `ODIGOS_IAC` on every function they instrument, recording the layer ARN they attached\nand the package version that attached it. That variable is what Odigos reads to attribute the function to\nitself; without it a function reports as `Absent` — \"awaiting your deployment\" — however completely the layer,\nwrapper and collector configuration are applied. There is nothing to switch on.\n\nThe recorded layer ARN matters beyond attribution: it is what the connector checks the function against, so a\nversion you pinned is respected instead of being reported as drift the day Odigos publishes a newer one. It\nworks in `IN_ACCOUNT` mode too, where the ARN is a deploy-time reference your own code has no way to obtain.\n\nWhat these constructs never write is `ODIGOS_MANAGED`. That is the connector's own record of a mutation *it*\nperformed, including the `prevEnv` snapshot it restores from on rollback, and it is written only when you hand\na function to the connector by enabling it as an automatic-mode source. A CDK stack has no such snapshot to\noffer — nothing was mutated, your stack *is* the function's definition — so writing it would claim a rollback\nthat was never recorded. Do not add it by hand.\n\n## Service names\n\nLeft unset, `OTEL_SERVICE_NAME` is the function's physical name when your stack names it explicitly, and\nthe construct id otherwise. The fallback exists because a name CloudFormation generates is a `Ref` to the\nfunction, and a function referencing itself in its own environment is a dependency cycle CloudFormation\nrejects at deploy time.\n\nThe connector compares `OTEL_SERVICE_NAME` against the workload's name in Odigos, which is the real AWS\nfunction name — so for a function whose name is generated, pass `serviceName` explicitly or it is reported\nas drifted. `serviceName` applies to **every** function a construct instruments, so use one construct per\nfunction when you want per-function names.\n\n## Do not also instrument these functions with the Odigos connector\n\nThe Odigos AWS connector instruments **live** functions by mutating them, and reconciles them back to its\nown desired state on every pass. A function instrumented here *and* enabled as an automatic-mode connector\nsource ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts\nthe connector's, and every round trip publishes a new function version.\n\nPick one per function. Discovery-only (manual) mode is the combination that works: Odigos watches and\nreports, your stack owns the configuration. That is what `ODIGOS_IAC` expresses — instrumented by Odigos,\nowned by you — and it is why these constructs never write the connector's ownership marker.\n\n# ECS Fargate\n\n```ts\nimport { OdigosFargateInstrumentation, OdigosFargateLanguage } from '@odigos/aws-cdk';\n\nconst odigos = new OdigosFargateInstrumentation(this, 'Odigos', {\n destination: { httpEndpoint: 'https://otlp.example.com:4318' },\n});\n\nodigos.instrument({\n container: apiContainer, // the ecs.ContainerDefinition to instrument\n language: OdigosFargateLanguage.JAVA,\n service: apiService, // read OTEL_SERVICE_NAME off the ECS service\n});\n```\n\n```python\nfrom odigos_aws_cdk import OdigosFargateInstrumentation, OdigosFargateLanguage\n\nodigos = OdigosFargateInstrumentation(self, \"Odigos\",\n destination={\"http_endpoint\": \"https://otlp.example.com:4318\"},\n)\nodigos.instrument(\n container=api_container,\n language=OdigosFargateLanguage.JAVA,\n service=api_service,\n)\n```\n\n## What it does to the task definition\n\nFour moves, which are one mechanism and only work together:\n\n1. a bare-name task volume, `odigos-agent` — on Fargate an ephemeral-storage bind mount scoped to the task\n (there is no tmpfs);\n2. a **non-essential** `odigos-agent` container that copies the language agents out of the agents bundle\n into that volume and exits 0;\n3. the volume mounted read-only at `/var/odigos` in your container, which `DependsOn` the staging container\n with condition `SUCCESS` — legal only against a non-essential container, which is why (2) is\n non-essential;\n4. the language's activation environment, the OTLP export environment and the `ODIGOS_IAC` marker on your\n container.\n\nMarker presence alone is a false green here. A container can carry a complete, correct activation\nenvironment while the staging container is gone — the application then starts, finds nothing at\n`/var/odigos`, and exports nothing while reporting as instrumented. That is why all four are one construct.\n\n## Where the telemetry goes\n\nStraight to your destination, from inside the application process. **This is the substantive difference\nfrom Lambda**, where the SDK hands batches to a collector in the same sandbox and the export happens after\nthe response has already been returned. A Fargate task has no such collector, so a slow or unreachable\ndestination is felt by the application's own exporter.\n\n## Naming the service\n\n`OTEL_SERVICE_NAME` **must equal the workload's name in Odigos, which for a Fargate workload is the ECS\nservice name** — not the task definition family and not the container name. A different value is reported\nas instrumentation drift rather than treated as a naming preference, so there is no default: pass `service`\nto read the name off an `ecs.FargateService`, or `serviceName` when the service is defined elsewhere.\n\nThe service's physical name has to be one you set. A name CloudFormation generates is a `Ref` to the\nservice, and the task definition that service runs cannot reference it — CloudFormation rejects the cycle\nat deploy time — so a generated name throws at synth pointing you at `serviceName`.\n\n## Languages, and stating them\n\n| | Activated through | Needs `runtimeVersion` |\n|---|---|---|\n| `JAVA` | `JAVA_TOOL_OPTIONS` | no |\n| `PYTHON` | `PYTHONPATH` | no |\n| `NODEJS` | `NODE_OPTIONS` | no |\n| `DOTNET` | `CORECLR_*` / `DOTNET_*` (glibc only) | no |\n| `PHP` | `PHP_INI_SCAN_DIR` | **yes** — major.minor, e.g. `\"8.3\"` |\n| `RUBY` | `RUBYOPT` | **yes** — major.minor, e.g. `\"3.3\"` |\n\nThere is no aspect and no detection, and unlike Lambda that is not a matter of taste. A function declares\nits runtime; a container declares an image. A language guessed from an image would silently mis-instrument\nwhatever it got wrong — a Java agent staged into a Python container leaves it uninstrumented, and a\n`JAVA_TOOL_OPTIONS` on a JVM-less image is simply ignored, so nothing fails loudly enough to notice.\n\nphp and ruby need `runtimeVersion` because their agents are laid down per runtime version in the bundle,\nand the version selects the path their activation variable points at. It must be exactly `major.minor`;\nanything else names a directory that does not exist, and the container starts with no agent loaded.\n\n**Go cannot be instrumented on Fargate at all.** Its only zero-code instrumentation is eBPF, and Fargate\nforbids the privileged containers and host PID an eBPF agent needs. Use the OpenTelemetry Go SDK.\n\n## Loader variables your container already sets\n\nThe construct reads the value your container was created with and **appends** to it, joined by the\nseparator the language's own pattern specifies — a space for `JAVA_TOOL_OPTIONS` and `NODE_OPTIONS`, a\ncolon for `PYTHONPATH`:\n\n```ts\ntaskDefinition.addContainer('App', {\n image,\n environment: { JAVA_TOOL_OPTIONS: '-Xmx512m' },\n});\n// becomes: -Xmx512m -javaagent:/var/odigos/java/javaagent.jar\n```\n\nPass `existingLoaderValue` when the value is not visible at synth — set by an `environmentFiles` entry,\nbaked into the image's own `ENV`, or supplied through `secrets`.\n\n`PHP_INI_SCAN_DIR` and `RUBYOPT` are the exception: Odigos compares them **exactly**, so they are set\noutright and a value already there is reported as a synth warning rather than merged. Fold what your\napplication needs into the value Odigos sets.\n\n## Transport\n\nEach language's agent has a preferred transport, and giving the destination **both** endpoints lets each\none take it:\n\n```ts\ndestination: {\n endpoint: 'otlp.example.com:4317', // OTLP/gRPC, bare host:port\n httpEndpoint: 'https://otlp.example.com:4318', // OTLP/HTTP, scheme-qualified\n}\n```\n\nEvery agent in the bundle prefers `http/protobuf`. java, python, nodejs and dotnet honour\n`OTEL_EXPORTER_OTLP_PROTOCOL` and fall back to gRPC when that is all the destination offers; **php and\nruby cannot** — their community SDKs are `http/protobuf`-only, so instrumenting one against a gRPC-only\ndestination throws at synth rather than deploying a task that exports nothing.\n\nEndpoint and protocol are one decision, and are compared as one. Pairing an endpoint with the other\nprotocol fails at runtime as a connection reset that points nowhere near the cause, so an endpoint on the\nother protocol's standard port (4317 with `http/protobuf`, 4318 with `grpc`) is a synth warning.\n\nUnlike Lambda, `destination.headers` is rendered into `OTEL_EXPORTER_OTLP_HEADERS` on the container. The\nconnector does not set or compare that variable when it instruments a Fargate task itself, so it is\nneither reconciled nor reported as drift — it is here because a task with no collector of its own has\nnowhere else to hold a credential. Same exposure caveat as Lambda: `ecs:DescribeTaskDefinition` and the\nconsole can read it.\n\n## Signals\n\nSame defaults as Lambda — traces on, metrics and logs opt-in — and the same requirement that they match\nwhat Odigos has configured for the destination. All three `OTEL_*_EXPORTER` variables are written\nexplicitly here, unlike Lambda where an enabled signal's variable is left unset, because the connector's\nFargate check compares all three by value.\n\n## A task definition with more than one application\n\nSix applications in six languages in one task definition is a real shape. Call `instrument()` once per\ncontainer; there is **one** staging container for the whole task definition, and its command is built\nlazily from the union of every instrumented container's agents, in ascending directory order — which is\nexactly what the connector compares it against.\n\n```ts\nodigos.instrumentAll([\n { container: apiContainer, language: OdigosFargateLanguage.JAVA, service: svc },\n { container: workerContainer, language: OdigosFargateLanguage.PYTHON, service: svc },\n]);\n```\n\nAWS caps a task definition at 10 containers and the staging container needs one of them; a definition\nalready at the limit fails at synth rather than on `RegisterTaskDefinition`.\n\n## The agents image\n\nThe staging container pulls `registry.odigos.io/odigos-fargate-agents` at this package's release tag — a\nmulti-arch manifest list, so amd64 and Graviton tasks both get a matching image. **It is pulled by your\ntask's execution role at every task start**, so a task in a private subnet with no NAT and no registry\nendpoint cannot pull it. Mirror it into a registry your tasks can reach and pass `agentsImage`:\n\n```ts\nagentsImage: '111122223333.dkr.ecr.eu-west-1.amazonaws.com/odigos-fargate-agents:v0.0.13',\n```\n\nA mirror has to be the same bundle — the activation environment names exact paths inside it. The bundle is\nLinux-only and glibc-based: a Windows task definition throws at synth, and musl (Alpine) images have no\n.NET native profiler in it.\n\n## Do not also instrument these services with the connector\n\nSame rule as Lambda, with ECS's own cost. The connector instruments a live service by registering a new\ntask-definition revision and updating the service to it. A service instrumented here *and* enabled as an\nautomatic-mode source is owned by both: each `cdk deploy` reasserts your stack's definition, each\nreconcile reasserts the connector's, and every round trip registers a revision and rolls the service.\nDiscovery-only (manual) mode is the combination that works.\n\n# API\n\n| Export | |\n|---|---|\n| `OdigosLambdaInstrumentation` | the Lambda construct; `instrument(fn)`, `instrumentAll(fns)` |\n| `OdigosInstrumentationAspect` | applies it to every function in a scope |\n| `OdigosFargateInstrumentation` | the Fargate construct; `instrument(target)`, `instrumentAll(targets)` |\n| `OdigosFargateTarget` | one container to instrument: `container`, `language`, `service` / `serviceName`, `runtimeVersion`, `existingLoaderValue` |\n| `OdigosFargateLanguage` | `JAVA` \\| `PYTHON` \\| `NODEJS` \\| `DOTNET` \\| `PHP` \\| `RUBY` |\n| `OdigosDestination` | where telemetry goes; exactly one endpoint on Lambda, either or both on Fargate |\n| `OdigosLayerSource` | `ODIGOS_PUBLIC` \\| `IN_ACCOUNT` |\n| `OdigosInstrumentationMode` | `HANDLER` \\| `WEB_SERVER` |\n| `OdigosJavaHandlerDistro` | the four Java wrappers |\n| `renderCollectorConfig` | the Lambda collector config renderer, if you want to inspect what gets set |\n| `sidecarCommand`, `evaluateAppendPattern` | the Fargate staging command and loader-value rendering |\n| `LAYER_ARNS`, `ODIGOS_VERSION` | the baked layer table and the release it came from |\n| `FARGATE_AGENTS_IMAGE`, `FARGATE_DISTROS_VERSION` | the agents image this build stages, and the distros release its recipes mirror |\n\n## License\n\nApache-2.0.\n"
3829
+ "markdown": "# Odigos CDK constructs for AWS\n\nInstrument AWS Lambda functions and ECS Fargate services with OpenTelemetry, from your own CDK app.\n\n```bash\nnpm install @odigos/aws-cdk # TypeScript / JavaScript\npip install odigos-aws-cdk # Python\n```\n\n| | Lambda | ECS Fargate |\n|---|---|---|\n| Construct | `OdigosLambdaInstrumentation` | `OdigosFargateInstrumentation` |\n| Mechanism | a layer, plus an exec wrapper or loader variable | agents staged into a shared task volume by a run-to-completion container |\n| Languages | python, nodejs, java, ruby | java, python, nodejs, dotnet, php, ruby |\n| Where telemetry goes | a collector in the same Lambda sandbox, which forwards | your destination, from the application process |\n| Language detection | from the function's declared runtime | none — you state the language |\n\nBoth write `ODIGOS_IAC` and never the connector's ownership marker: instrumented by Odigos, owned by you.\n\n# AWS Lambda\n\n```ts\nimport { OdigosLambdaInstrumentation } from '@odigos/aws-cdk';\n\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [apiFn, workerFn],\n});\n```\n\n```python\nfrom odigos_aws_cdk import OdigosLambdaInstrumentation\n\nOdigosLambdaInstrumentation(self, \"Odigos\",\n destination={\"endpoint\": \"otlp.example.com:4317\"},\n functions=[api_fn, worker_fn],\n)\n```\n\nThat attaches the layer for each function's language and architecture, sets the exec wrapper that loads\nthe OpenTelemetry SDK, and hands the in-Lambda collector its whole configuration.\n\n## How the telemetry actually leaves the function\n\nYour function's SDK **does not** export to your destination. It exports to an OpenTelemetry collector\nrunning inside the same Lambda sandbox, on localhost. The collector forwards to your destination *after*\nthe handler has already returned its response.\n\nThat indirection is the whole point. A slow or unreachable destination costs billed duration, not caller\nlatency — and the collector's `decouple` processor is what holds the sandbox open until the export queue\ndrains, so a low-traffic function does not lose its telemetry to the freeze.\n\nConsequently `OTEL_EXPORTER_OTLP_ENDPOINT` is deliberately never set. If you set it yourself you put the\nexport back on the invocation's critical path.\n\n## Endpoint grammar\n\n`endpoint` is OTLP/**gRPC** as bare `host:port` (conventionally 4317). `httpEndpoint` is OTLP/**HTTP** as a\nscheme-qualified URL (conventionally 4318). Exactly one. They select different collector exporters with\ndifferent endpoint grammars, so a scheme in `endpoint` — or its absence in `httpEndpoint` — throws at synth\nrather than producing a collector that starts and silently delivers nothing. A gRPC endpoint on port 4318\n(or an HTTP one on 4317) is the likeliest version of that mistake, and is reported as a synth warning.\n\n## Choosing a layer source\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [fn],\n layerSource: OdigosLayerSource.IN_ACCOUNT,\n});\n```\n\n| | `ODIGOS_PUBLIC` (default) | `IN_ACCOUNT` |\n|---|---|---|\n| What it synthesizes | a layer ARN | an `AWS::Serverless::Application` (nested stack) per language/arch |\n| Layer owner | the Odigos AWS account | **your** account, created by your stack |\n| Resolution | synth time, from a table baked into this package | deploy time, from the Serverless Application Repository |\n| Environment-agnostic stacks | not supported — needs a concrete region | works |\n| Deploy speed | unchanged | slower on first deploy |\n\nBoth install identical bytes. `IN_ACCOUNT` exists for organisations whose policy forbids attaching a\nLambda layer owned by another AWS account. It needs the deploying principal to be allowed\n`serverlessrepo:CreateCloudFormationTemplate` and `serverlessrepo:GetApplication`.\n\nIf you mirror the layer somewhere yourself, pass `layerVersion` and neither path is used.\n\n## Versioning\n\n**The package version is the layer version.** `@odigos/aws-cdk@0.2.0` resolves to the layer built and\npublished by Odigos release `v0.2.0`, and pins the SAR application to semantic version `0.2.0` — which is\nimmutable, so it means the same bytes forever.\n\nNothing resolves at deploy time in the default path, so upgrading the layer is `npm update` and a\n`cdk diff` that shows the change. An instrumentation layer moving on its own, under a deployment that\nchanged nothing, is not a property you want.\n\n## Handler mode vs. web-server mode\n\n`OdigosInstrumentationMode.HANDLER` (the default) is for a normal Lambda handler. It sets\n`AWS_LAMBDA_EXEC_WRAPPER`.\n\n`OdigosInstrumentationMode.WEB_SERVER` is for a function running a web server behind the\n[AWS Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter). The adapter owns the exec\nwrapper, so this mode does not touch it and loads instrumentation through the language's own loader\nvariable instead.\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [webFn],\n mode: OdigosInstrumentationMode.WEB_SERVER,\n // NODE_OPTIONS the function already needs — ours is appended, not substituted.\n existingLoaderValue: '--max-old-space-size=2048',\n});\n```\n\nThere is no auto-detection, deliberately. Detecting the adapter means inspecting the function's other\nlayers, which at synth time are frequently unresolved tokens; a detector that was right most of the time\nwould silently break the functions it got wrong. **Applying `HANDLER` to a web-adapter function\noverwrites the adapter's wrapper and the function stops serving.**\n\n`existingLoaderValue` has to be passed explicitly because CDK's `lambda.Function` exposes no way to read\nback an environment variable set elsewhere in your app. Omit it and the loader variable is set to the\nOdigos value alone — for `NODE_OPTIONS` that can mean losing a flag your app needs to boot.\n\nRuby has no verified web-server loader and is rejected at synth in this mode.\n\n## Java handler interfaces\n\nThe Java layer ships four wrapper scripts, one per handler interface, and this is a correctness switch\nrather than a detail level:\n\n```ts\njavaHandlerDistro: OdigosJavaHandlerDistro.OTEL_STREAM_HANDLER\n```\n\n| Distro | For |\n|---|---|\n| `OTEL_HANDLER` (default) | `RequestHandler` |\n| `OTEL_PROXY_HANDLER` | API Gateway proxy events (enriched) |\n| `OTEL_SQS_HANDLER` | SQS events (enriched) |\n| `OTEL_STREAM_HANDLER` | `RequestStreamHandler` |\n\n`OTEL_HANDLER` installs a `RequestHandler` implementation. A `RequestStreamHandler` function has a\ndifferent signature entirely, so wrapping it with the default **breaks the invocation** — it does not\nmerely produce thinner spans.\n\n## Signals\n\n**Traces only, by default.** Metrics and logs are opt-in:\n\n```ts\ndestination: {\n endpoint: 'otlp.example.com:4317',\n metrics: true, // off unless you ask\n logs: true, // off unless you ask\n}\n```\n\nThey are opt-in because the cost of a signal the destination does not implement falls on the function:\nevery batch is refused and the in-Lambda collector retries it on an exponential backoff, inside billed\nduration. Traces are what nearly every destination accepts; the other two are a decision about your\ndestination, so they are made deliberately.\n\nA disabled signal gets no collector pipeline **and** the SDK is told not to produce it\n(`OTEL_METRICS_EXPORTER=none`). Both halves matter: a signal with no pipeline is refused at the receiver on\nevery batch, so suppressing it at the source is what stops the error loop. An enabled signal's variable\nstays unset, because `otlp` is already the SDK default.\n\n`traces: false` with neither of the others on throws at synth — a collector with no pipeline fails to\nstart, which would leave the function instrumented and silent.\n\n**If Odigos also manages this function in manual mode, the signals have to match.** The connector renders\nthe collector configuration from the destination configured in Odigos and compares the whole string, so a\ntraces-only function judged against an all-three destination is reported as drifted on the\ncollector-export component. Enable the same set on both sides.\n\n## Instrumenting a whole stack\n\n```ts\nAspects.of(stack).add(new OdigosInstrumentationAspect(stack, {\n destination: { endpoint: 'otlp.example.com:4317' },\n}));\n```\n\n`skipUnsupportedRuntimes` defaults to `true` for the aspect: it visits every function in the scope,\nincluding ones whose runtime has no OpenTelemetry Lambda layer (`dotnet*`, `provided.*` for Go and custom\nruntimes). Each skip is a synth warning rather than a silent no-op. The construct defaults it to `false`,\nbecause explicitly asking to instrument a Go function is a mistake worth failing on.\n\n## Credentials in `headers`\n\n`destination.headers` is rendered into `OPENTELEMETRY_COLLECTOR_CONFIG_URI`, which is a plain Lambda\nenvironment variable — readable by anyone with `lambda:GetFunctionConfiguration` and visible in the\nconsole. For a long-lived credential, prefer a destination that authenticates by network position, or\nterminate at a collector you control.\n\n## How Odigos recognises the function\n\nThese constructs write `ODIGOS_IAC` on every function they instrument, recording the layer ARN they attached\nand the package version that attached it. That variable is what Odigos reads to attribute the function to\nitself; without it a function reports as `Absent` — \"awaiting your deployment\" — however completely the layer,\nwrapper and collector configuration are applied. There is nothing to switch on.\n\nThe recorded layer ARN matters beyond attribution: it is what the connector checks the function against, so a\nversion you pinned is respected instead of being reported as drift the day Odigos publishes a newer one. It\nworks in `IN_ACCOUNT` mode too, where the ARN is a deploy-time reference your own code has no way to obtain.\n\nWhat these constructs never write is `ODIGOS_MANAGED`. That is the connector's own record of a mutation *it*\nperformed, including the `prevEnv` snapshot it restores from on rollback, and it is written only when you hand\na function to the connector by enabling it as an automatic-mode source. A CDK stack has no such snapshot to\noffer — nothing was mutated, your stack *is* the function's definition — so writing it would claim a rollback\nthat was never recorded. Do not add it by hand.\n\n## Service names\n\nLeft unset, `OTEL_SERVICE_NAME` is the function's physical name when your stack names it explicitly, and\nthe construct id otherwise. The fallback exists because a name CloudFormation generates is a `Ref` to the\nfunction, and a function referencing itself in its own environment is a dependency cycle CloudFormation\nrejects at deploy time.\n\nThe connector compares `OTEL_SERVICE_NAME` against the workload's name in Odigos, which is the real AWS\nfunction name — so for a function whose name is generated, pass `serviceName` explicitly or it is reported\nas drifted. `serviceName` applies to **every** function a construct instruments, so use one construct per\nfunction when you want per-function names.\n\n## Do not also instrument these functions with the Odigos connector\n\nThe Odigos AWS connector instruments **live** functions by mutating them, and reconciles them back to its\nown desired state on every pass. A function instrumented here *and* enabled as an automatic-mode connector\nsource ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts\nthe connector's, and every round trip publishes a new function version.\n\nPick one per function. Discovery-only (manual) mode is the combination that works: Odigos watches and\nreports, your stack owns the configuration. That is what `ODIGOS_IAC` expresses — instrumented by Odigos,\nowned by you — and it is why these constructs never write the connector's ownership marker.\n\n# ECS Fargate\n\n```ts\nimport { OdigosFargateInstrumentation, OdigosFargateLanguage } from '@odigos/aws-cdk';\n\nconst odigos = new OdigosFargateInstrumentation(this, 'Odigos', {\n destination: { httpEndpoint: 'https://otlp.example.com:4318' },\n});\n\nodigos.instrument({\n container: apiContainer, // the ecs.ContainerDefinition to instrument\n language: OdigosFargateLanguage.JAVA,\n service: apiService, // read OTEL_SERVICE_NAME off the ECS service\n});\n```\n\n```python\nfrom odigos_aws_cdk import OdigosFargateInstrumentation, OdigosFargateLanguage\n\nodigos = OdigosFargateInstrumentation(self, \"Odigos\",\n destination={\"http_endpoint\": \"https://otlp.example.com:4318\"},\n)\nodigos.instrument(\n container=api_container,\n language=OdigosFargateLanguage.JAVA,\n service=api_service,\n)\n```\n\n## What it does to the task definition\n\nFour moves, which are one mechanism and only work together:\n\n1. a bare-name task volume, `odigos-agent` — on Fargate an ephemeral-storage bind mount scoped to the task\n (there is no tmpfs);\n2. a **non-essential** `odigos-agent` container that copies the language agents out of the agents bundle\n into that volume and exits 0;\n3. the volume mounted read-only at `/var/odigos` in your container, which `DependsOn` the staging container\n with condition `SUCCESS` — legal only against a non-essential container, which is why (2) is\n non-essential;\n4. the language's activation environment, the OTLP export environment and the `ODIGOS_IAC` marker on your\n container.\n\nMarker presence alone is a false green here. A container can carry a complete, correct activation\nenvironment while the staging container is gone — the application then starts, finds nothing at\n`/var/odigos`, and exports nothing while reporting as instrumented. That is why all four are one construct.\n\n## Where the telemetry goes\n\nStraight to your destination, from inside the application process. **This is the substantive difference\nfrom Lambda**, where the SDK hands batches to a collector in the same sandbox and the export happens after\nthe response has already been returned. A Fargate task has no such collector, so a slow or unreachable\ndestination is felt by the application's own exporter.\n\n## Naming the service\n\n`OTEL_SERVICE_NAME` **must equal the workload's name in Odigos, which for a Fargate workload is the ECS\nservice name** — not the task definition family and not the container name. A different value is reported\nas instrumentation drift rather than treated as a naming preference, so there is no default: pass `service`\nto read the name off an `ecs.FargateService`, or `serviceName` when the service is defined elsewhere.\n\nThe service's physical name has to be one you set. A name CloudFormation generates is a `Ref` to the\nservice, and the task definition that service runs cannot reference it — CloudFormation rejects the cycle\nat deploy time — so a generated name throws at synth pointing you at `serviceName`.\n\n## Languages, and stating them\n\n| | Activated through | Needs `runtimeVersion` |\n|---|---|---|\n| `JAVA` | `JAVA_TOOL_OPTIONS` | no |\n| `PYTHON` | `PYTHONPATH` | no |\n| `NODEJS` | `NODE_OPTIONS` | no |\n| `DOTNET` | `CORECLR_*` / `DOTNET_*` (glibc only) | no |\n| `PHP` | `PHP_INI_SCAN_DIR` | **yes** — major.minor, e.g. `\"8.3\"` |\n| `RUBY` | `RUBYOPT` | **yes** — major.minor, e.g. `\"3.3\"` |\n\nThere is no aspect and no detection, and unlike Lambda that is not a matter of taste. A function declares\nits runtime; a container declares an image. A language guessed from an image would silently mis-instrument\nwhatever it got wrong — a Java agent staged into a Python container leaves it uninstrumented, and a\n`JAVA_TOOL_OPTIONS` on a JVM-less image is simply ignored, so nothing fails loudly enough to notice.\n\nphp and ruby need `runtimeVersion` because their agents are laid down per runtime version in the bundle,\nand the version selects the path their activation variable points at. It must be exactly `major.minor`;\nanything else names a directory that does not exist, and the container starts with no agent loaded.\n\n**Go cannot be instrumented on Fargate at all.** Its only zero-code instrumentation is eBPF, and Fargate\nforbids the privileged containers and host PID an eBPF agent needs. Use the OpenTelemetry Go SDK.\n\n## Loader variables your container already sets\n\nThe construct reads the value your container was created with and **appends** to it, joined by the\nseparator the language's own pattern specifies — a space for `JAVA_TOOL_OPTIONS` and `NODE_OPTIONS`, a\ncolon for `PYTHONPATH`:\n\n```ts\ntaskDefinition.addContainer('App', {\n image,\n environment: { JAVA_TOOL_OPTIONS: '-Xmx512m' },\n});\n// becomes: -Xmx512m -javaagent:/var/odigos/java/javaagent.jar\n```\n\nPass `existingLoaderValue` when the value is not visible at synth — set by an `environmentFiles` entry,\nbaked into the image's own `ENV`, or supplied through `secrets`.\n\n`PHP_INI_SCAN_DIR` and `RUBYOPT` are the exception: Odigos compares them **exactly**, so they are set\noutright and a value already there is reported as a synth warning rather than merged. Fold what your\napplication needs into the value Odigos sets.\n\n## Transport\n\nEach language's agent has a preferred transport, and giving the destination **both** endpoints lets each\none take it:\n\n```ts\ndestination: {\n endpoint: 'otlp.example.com:4317', // OTLP/gRPC, bare host:port\n httpEndpoint: 'https://otlp.example.com:4318', // OTLP/HTTP, scheme-qualified\n}\n```\n\nEvery agent in the bundle prefers `http/protobuf`. java, python, nodejs and dotnet honour\n`OTEL_EXPORTER_OTLP_PROTOCOL` and fall back to gRPC when that is all the destination offers; **php and\nruby cannot** — their community SDKs are `http/protobuf`-only, so instrumenting one against a gRPC-only\ndestination throws at synth rather than deploying a task that exports nothing.\n\nEndpoint and protocol are one decision, and are compared as one. Pairing an endpoint with the other\nprotocol fails at runtime as a connection reset that points nowhere near the cause, so an endpoint on the\nother protocol's standard port (4317 with `http/protobuf`, 4318 with `grpc`) is a synth warning.\n\nUnlike Lambda, `destination.headers` is rendered into `OTEL_EXPORTER_OTLP_HEADERS` on the container. The\nconnector does not set or compare that variable when it instruments a Fargate task itself, so it is\nneither reconciled nor reported as drift — it is here because a task with no collector of its own has\nnowhere else to hold a credential. Same exposure caveat as Lambda: `ecs:DescribeTaskDefinition` and the\nconsole can read it.\n\n## Signals\n\nSame defaults as Lambda — traces on, metrics and logs opt-in — and the same requirement that they match\nwhat Odigos has configured for the destination. All three `OTEL_*_EXPORTER` variables are written\nexplicitly here, unlike Lambda where an enabled signal's variable is left unset, because the connector's\nFargate check compares all three by value.\n\n## A task definition with more than one application\n\nSix applications in six languages in one task definition is a real shape. Call `instrument()` once per\ncontainer; there is **one** staging container for the whole task definition, and its command is built\nlazily from the union of every instrumented container's agents, in ascending directory order — which is\nexactly what the connector compares it against.\n\n```ts\nodigos.instrumentAll([\n { container: apiContainer, language: OdigosFargateLanguage.JAVA, service: svc },\n { container: workerContainer, language: OdigosFargateLanguage.PYTHON, service: svc },\n]);\n```\n\nAWS caps a task definition at 10 containers and the staging container needs one of them; a definition\nalready at the limit fails at synth rather than on `RegisterTaskDefinition`.\n\n## The agents image\n\nThe staging container pulls `registry.odigos.io/odigos-fargate-agents` at this package's release tag — a\nmulti-arch manifest list, so amd64 and Graviton tasks both get a matching image. **It is pulled by your\ntask's execution role at every task start**, so a task in a private subnet with no NAT and no registry\nendpoint cannot pull it. Mirror it into a registry your tasks can reach and pass `agentsImage`:\n\n```ts\nagentsImage: '111122223333.dkr.ecr.eu-west-1.amazonaws.com/odigos-fargate-agents:v0.0.13',\n```\n\nA mirror has to be the same bundle — the activation environment names exact paths inside it. The bundle is\nLinux-only and glibc-based: a Windows task definition throws at synth, and musl (Alpine) images have no\n.NET native profiler in it.\n\n**Whatever image you stage from is recorded in the marker**, as `image`, and Odigos holds the task\ndefinition to *that* rather than to the bundle the connector's own build pins. Two consequences worth\nknowing: a mirror is judged against itself instead of reading as drift, and upgrading this package ahead of\nthe connector is not drift either — the service stays conformant until you re-deploy, exactly as a Lambda\nfunction pinned to an older layer does. What *is* reported is two containers in one task definition\nrecording different images: there is one staging container and it cannot serve two bundles.\n\n## Do not also instrument these services with the connector\n\nSame rule as Lambda, with ECS's own cost. The connector instruments a live service by registering a new\ntask-definition revision and updating the service to it. A service instrumented here *and* enabled as an\nautomatic-mode source is owned by both: each `cdk deploy` reasserts your stack's definition, each\nreconcile reasserts the connector's, and every round trip registers a revision and rolls the service.\nDiscovery-only (manual) mode is the combination that works.\n\n# API\n\n| Export | |\n|---|---|\n| `OdigosLambdaInstrumentation` | the Lambda construct; `instrument(fn)`, `instrumentAll(fns)` |\n| `OdigosInstrumentationAspect` | applies it to every function in a scope |\n| `OdigosFargateInstrumentation` | the Fargate construct; `instrument(target)`, `instrumentAll(targets)` |\n| `OdigosFargateTarget` | one container to instrument: `container`, `language`, `service` / `serviceName`, `runtimeVersion`, `existingLoaderValue` |\n| `OdigosFargateLanguage` | `JAVA` \\| `PYTHON` \\| `NODEJS` \\| `DOTNET` \\| `PHP` \\| `RUBY` |\n| `OdigosDestination` | where telemetry goes; exactly one endpoint on Lambda, either or both on Fargate |\n| `OdigosLayerSource` | `ODIGOS_PUBLIC` \\| `IN_ACCOUNT` |\n| `OdigosInstrumentationMode` | `HANDLER` \\| `WEB_SERVER` |\n| `OdigosJavaHandlerDistro` | the four Java wrappers |\n| `renderCollectorConfig` | the Lambda collector config renderer, if you want to inspect what gets set |\n| `sidecarCommand`, `evaluateAppendPattern` | the Fargate staging command and loader-value rendering |\n| `LAYER_ARNS`, `ODIGOS_VERSION` | the baked layer table and the release it came from |\n| `FARGATE_AGENTS_IMAGE`, `FARGATE_DISTROS_VERSION` | the agents image this build stages, and the distros release its recipes mirror |\n\n## License\n\nApache-2.0.\n"
3830
3830
  },
3831
3831
  "repository": {
3832
3832
  "directory": "cdk",
@@ -4019,7 +4019,7 @@
4019
4019
  },
4020
4020
  "locationInModule": {
4021
4021
  "filename": "src/fargate.ts",
4022
- "line": 267
4022
+ "line": 277
4023
4023
  },
4024
4024
  "parameters": [
4025
4025
  {
@@ -4045,7 +4045,7 @@
4045
4045
  "kind": "class",
4046
4046
  "locationInModule": {
4047
4047
  "filename": "src/fargate.ts",
4048
- "line": 261
4048
+ "line": 271
4049
4049
  },
4050
4050
  "methods": [
4051
4051
  {
@@ -4056,7 +4056,7 @@
4056
4056
  },
4057
4057
  "locationInModule": {
4058
4058
  "filename": "src/fargate.ts",
4059
- "line": 293
4059
+ "line": 303
4060
4060
  },
4061
4061
  "name": "instrument",
4062
4062
  "parameters": [
@@ -4075,7 +4075,7 @@
4075
4075
  },
4076
4076
  "locationInModule": {
4077
4077
  "filename": "src/fargate.ts",
4078
- "line": 331
4078
+ "line": 341
4079
4079
  },
4080
4080
  "name": "instrumentAll",
4081
4081
  "parameters": [
@@ -4107,7 +4107,7 @@
4107
4107
  "kind": "interface",
4108
4108
  "locationInModule": {
4109
4109
  "filename": "src/fargate.ts",
4110
- "line": 85
4110
+ "line": 91
4111
4111
  },
4112
4112
  "name": "OdigosFargateInstrumentationOptions",
4113
4113
  "properties": [
@@ -4121,7 +4121,7 @@
4121
4121
  "immutable": true,
4122
4122
  "locationInModule": {
4123
4123
  "filename": "src/fargate.ts",
4124
- "line": 93
4124
+ "line": 99
4125
4125
  },
4126
4126
  "name": "destination",
4127
4127
  "type": {
@@ -4132,14 +4132,14 @@
4132
4132
  "abstract": true,
4133
4133
  "docs": {
4134
4134
  "default": "- the released `registry.odigos.io/odigos-fargate-agents` image for this package version",
4135
- "remarks": "Defaults to the multi-arch image this package's release published, at that release's immutable tag.\nOverride it to mirror the image into a registry your tasks can reach — the image is pulled by YOUR\ntask's execution role at every task start, so a task in a private subnet with no NAT and no\ninterface endpoint cannot pull the default.\n\nA mirror must be the same bundle: the activation environment set below names exact paths inside it.",
4135
+ "remarks": "Defaults to the multi-arch image this package's release published, at that release's immutable tag.\nOverride it to mirror the image into a registry your tasks can reach — the image is pulled by YOUR\ntask's execution role at every task start, so a task in a private subnet with no NAT and no\ninterface endpoint cannot pull the default.\n\nA mirror must be the same bundle: the activation environment set below names exact paths inside it.\n\nWhatever you pass is RECORDED in the `ODIGOS_IAC` marker, and the connector holds the task definition\nto the recorded image rather than to the bundle its own build pins — so a mirror is judged against\nitself, and this does not have to be kept in step with the connector's version to stay conformant.",
4136
4136
  "stability": "stable",
4137
4137
  "summary": "The agents bundle the staging container copies the language agents out of."
4138
4138
  },
4139
4139
  "immutable": true,
4140
4140
  "locationInModule": {
4141
4141
  "filename": "src/fargate.ts",
4142
- "line": 107
4142
+ "line": 117
4143
4143
  },
4144
4144
  "name": "agentsImage",
4145
4145
  "optional": true,
@@ -4158,7 +4158,7 @@
4158
4158
  "immutable": true,
4159
4159
  "locationInModule": {
4160
4160
  "filename": "src/fargate.ts",
4161
- "line": 118
4161
+ "line": 128
4162
4162
  },
4163
4163
  "name": "debug",
4164
4164
  "optional": true,
@@ -4183,7 +4183,7 @@
4183
4183
  "kind": "interface",
4184
4184
  "locationInModule": {
4185
4185
  "filename": "src/fargate.ts",
4186
- "line": 191
4186
+ "line": 201
4187
4187
  },
4188
4188
  "name": "OdigosFargateInstrumentationProps",
4189
4189
  "properties": [
@@ -4198,7 +4198,7 @@
4198
4198
  "immutable": true,
4199
4199
  "locationInModule": {
4200
4200
  "filename": "src/fargate.ts",
4201
- "line": 197
4201
+ "line": 207
4202
4202
  },
4203
4203
  "name": "targets",
4204
4204
  "optional": true,
@@ -4289,7 +4289,7 @@
4289
4289
  "kind": "interface",
4290
4290
  "locationInModule": {
4291
4291
  "filename": "src/fargate.ts",
4292
- "line": 124
4292
+ "line": 134
4293
4293
  },
4294
4294
  "name": "OdigosFargateTarget",
4295
4295
  "properties": [
@@ -4303,7 +4303,7 @@
4303
4303
  "immutable": true,
4304
4304
  "locationInModule": {
4305
4305
  "filename": "src/fargate.ts",
4306
- "line": 129
4306
+ "line": 139
4307
4307
  },
4308
4308
  "name": "container",
4309
4309
  "type": {
@@ -4320,7 +4320,7 @@
4320
4320
  "immutable": true,
4321
4321
  "locationInModule": {
4322
4322
  "filename": "src/fargate.ts",
4323
- "line": 137
4323
+ "line": 147
4324
4324
  },
4325
4325
  "name": "language",
4326
4326
  "type": {
@@ -4338,7 +4338,7 @@
4338
4338
  "immutable": true,
4339
4339
  "locationInModule": {
4340
4340
  "filename": "src/fargate.ts",
4341
- "line": 185
4341
+ "line": 195
4342
4342
  },
4343
4343
  "name": "existingLoaderValue",
4344
4344
  "optional": true,
@@ -4357,7 +4357,7 @@
4357
4357
  "immutable": true,
4358
4358
  "locationInModule": {
4359
4359
  "filename": "src/fargate.ts",
4360
- "line": 172
4360
+ "line": 182
4361
4361
  },
4362
4362
  "name": "runtimeVersion",
4363
4363
  "optional": true,
@@ -4376,7 +4376,7 @@
4376
4376
  "immutable": true,
4377
4377
  "locationInModule": {
4378
4378
  "filename": "src/fargate.ts",
4379
- "line": 162
4379
+ "line": 172
4380
4380
  },
4381
4381
  "name": "service",
4382
4382
  "optional": true,
@@ -4395,7 +4395,7 @@
4395
4395
  "immutable": true,
4396
4396
  "locationInModule": {
4397
4397
  "filename": "src/fargate.ts",
4398
- "line": 151
4398
+ "line": 161
4399
4399
  },
4400
4400
  "name": "serviceName",
4401
4401
  "optional": true,
@@ -4930,6 +4930,6 @@
4930
4930
  "symbolId": "src/types:OdigosLayerSource"
4931
4931
  }
4932
4932
  },
4933
- "version": "0.0.14",
4934
- "fingerprint": "eXW2kcI443e8XtE7aA9wNkGzqU5uCVrtQgst7XvbbSE="
4933
+ "version": "0.0.16",
4934
+ "fingerprint": "pvjcSr/Q7i2ERY7MnFXzW6blKkBUD8Km216xADkW2Uk="
4935
4935
  }
package/README.md CHANGED
@@ -411,6 +411,13 @@ A mirror has to be the same bundle — the activation environment names exact pa
411
411
  Linux-only and glibc-based: a Windows task definition throws at synth, and musl (Alpine) images have no
412
412
  .NET native profiler in it.
413
413
 
414
+ **Whatever image you stage from is recorded in the marker**, as `image`, and Odigos holds the task
415
+ definition to *that* rather than to the bundle the connector's own build pins. Two consequences worth
416
+ knowing: a mirror is judged against itself instead of reading as drift, and upgrading this package ahead of
417
+ the connector is not drift either — the service stays conformant until you re-deploy, exactly as a Lambda
418
+ function pinned to an older layer does. What *is* reported is two containers in one task definition
419
+ recording different images: there is one staging container and it cannot serve two bundles.
420
+
414
421
  ## Do not also instrument these services with the connector
415
422
 
416
423
  Same rule as Lambda, with ECS's own cost. The connector instruments a live service by registering a new
package/lib/fargate.d.ts CHANGED
@@ -23,6 +23,10 @@ export interface OdigosFargateInstrumentationOptions {
23
23
  *
24
24
  * A mirror must be the same bundle: the activation environment set below names exact paths inside it.
25
25
  *
26
+ * Whatever you pass is RECORDED in the `ODIGOS_IAC` marker, and the connector holds the task definition
27
+ * to the recorded image rather than to the bundle its own build pins — so a mirror is judged against
28
+ * itself, and this does not have to be kept in step with the connector's version to stay conformant.
29
+ *
26
30
  * @default - the released `registry.odigos.io/odigos-fargate-agents` image for this package version
27
31
  */
28
32
  readonly agentsImage?: string;
package/lib/fargate.js CHANGED
@@ -41,11 +41,17 @@ const MARKER_VERSION = 1;
41
41
  * rather than "awaiting your deployment" — however completely the rest of the wiring is applied. A task
42
42
  * definition holding two applications needs it on both.
43
43
  *
44
- * The `lang` field is the load-bearing one here (where Lambda's is `layer`). The connector's conformance
45
- * check reconstructs the container's expected activation environment from the recorded language, so it is
46
- * what makes "is this container correctly instrumented" answerable at all — and it is cross-checked
47
- * against the language the connector resolves independently, which is how an image swapped underneath the
48
- * instrumentation is caught.
44
+ * The `lang` field is load-bearing. The connector's conformance check reconstructs the container's
45
+ * expected activation environment from the recorded language, so it is what makes "is this container
46
+ * correctly instrumented" answerable at all — and it is cross-checked against the language the connector
47
+ * resolves independently, which is how an image swapped underneath the instrumentation is caught.
48
+ *
49
+ * `image` is the other one, and it is the Fargate counterpart of what Lambda records as `layer`. The
50
+ * connector compares the staging container's image against the one recorded HERE rather than against the
51
+ * bundle its own build happens to pin, so a package released ahead of the connector is not reported as
52
+ * drift on every task in the account the day it lands. Recording it is also what makes `agentsImage`
53
+ * safe: a mirrored image is judged against itself instead of against a registry the customer deliberately
54
+ * moved away from.
49
55
  *
50
56
  * It is NOT `ODIGOS_MANAGED`, and this construct never writes that one. That is the connector's own
51
57
  * record of a mutation IT performed, whose payload is the snapshot it restores from on rollback. A CDK
@@ -361,13 +367,14 @@ class OdigosFargateInstrumentation extends constructs_1.Construct {
361
367
  source: 'cdk',
362
368
  version: layers_1.ODIGOS_VERSION || 'unreleased',
363
369
  lang: (0, fargate_recipes_1.languageKeyOf)(target.language),
370
+ image: this.agentsImage,
364
371
  });
365
372
  return env;
366
373
  }
367
374
  }
368
375
  exports.OdigosFargateInstrumentation = OdigosFargateInstrumentation;
369
376
  _a = JSII_RTTI_SYMBOL_1;
370
- OdigosFargateInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosFargateInstrumentation", version: "0.0.14" };
377
+ OdigosFargateInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosFargateInstrumentation", version: "0.0.16" };
371
378
  /**
372
379
  * The value the container was created with for an environment variable, or undefined.
373
380
  *
@@ -397,4 +404,4 @@ function renderOtlpHeaders(headers) {
397
404
  const keys = Object.keys(headers).sort();
398
405
  return keys.map((k) => `${k}=${headers[k]}`).join(',');
399
406
  }
400
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYXJnYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQThEO0FBQzlELDJDQUEyQztBQUMzQywyQ0FBdUM7QUFDdkMseURBQW9FO0FBQ3BFLGlEQU02QjtBQUM3QiwrQ0FBb0Q7QUFDcEQsdURBUzJCO0FBRzNCLGtFQUFrRTtBQUNsRSxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO0FBQzdDLHNGQUFzRjtBQUN0RixNQUFNLHVCQUF1QixHQUFHLDBCQUEwQixDQUFDO0FBQzNELHdHQUF3RztBQUN4RyxNQUFNLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDO0FBQ3hELHNFQUFzRTtBQUN0RSxNQUFNLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDO0FBQ3hELHFFQUFxRTtBQUNyRSxNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixDQUFDO0FBQ3RELDhEQUE4RDtBQUM5RCxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDO0FBQzVDLDhDQUE4QztBQUM5QyxNQUFNLG1CQUFtQixHQUFHLHNCQUFzQixDQUFDO0FBQ25ELE1BQU0sb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFDckQsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztBQUMvQyxxREFBcUQ7QUFDckQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDO0FBRTdCOzs7R0FHRztBQUNILE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUV6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUVwQyxnRkFBZ0Y7QUFDaEYsTUFBTSxvQkFBb0IsR0FBRyxhQUFhLENBQUM7QUFFM0M7Ozs7R0FJRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBOEhsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUMsRUFBRSxjQUFjO1lBQ2pCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsT0FBTyxFQUFFLHVCQUFjLElBQUksWUFBWTtZQUN2QyxJQUFJLEVBQUUsSUFBQSwrQkFBYSxFQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7U0FDckMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOztBQXpTSCxvRUEwU0M7OztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsaUJBQWlCLENBQUMsU0FBa0MsRUFBRSxJQUFZO0lBQ3pFLE1BQU0sR0FBRyxHQUFJLFNBQW9FLENBQUMsV0FBVyxDQUFDO0lBQzlGLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDcEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdkQsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsaUJBQWlCLENBQUMsT0FBbUM7SUFDNUQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9ucywgTGF6eSwgU3RhY2ssIFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgZWNzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBFWFBPUlRFUl9OT05FLCByZXNvbHZlZFNpZ25hbHMgfSBmcm9tICcuL2NvbGxlY3Rvci1jb25maWcnO1xuaW1wb3J0IHtcbiAgRkFSR0FURV9BR0VOVFNfRElSLFxuICBGQVJHQVRFX0FHRU5UU19JTUFHRSxcbiAgRkFSR0FURV9NQVhfQ09OVEFJTkVSUyxcbiAgRkFSR0FURV9TSURFQ0FSX0NPTlRBSU5FUl9OQU1FLFxuICBGQVJHQVRFX1ZPTFVNRV9OQU1FLFxufSBmcm9tICcuL2dlbmVyYXRlZC9mYXJnYXRlJztcbmltcG9ydCB7IE9ESUdPU19WRVJTSU9OIH0gZnJvbSAnLi9nZW5lcmF0ZWQvbGF5ZXJzJztcbmltcG9ydCB7XG4gIEZhcmdhdGVSZWNpcGUsXG4gIGV2YWx1YXRlQXBwZW5kUGF0dGVybixcbiAgZXhwb3J0VGFyZ2V0Rm9yLFxuICBmYXJnYXRlUmVzb3VyY2VBdHRyaWJ1dGVzLFxuICBsYW5ndWFnZUtleU9mLFxuICBwb3J0UHJvdG9jb2xNaXNtYXRjaCxcbiAgcmVjaXBlRm9yLFxuICBzaWRlY2FyQ29tbWFuZCxcbn0gZnJvbSAnLi9mYXJnYXRlLXJlY2lwZXMnO1xuaW1wb3J0IHsgT2RpZ29zRGVzdGluYXRpb24sIE9kaWdvc0ZhcmdhdGVMYW5ndWFnZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKiogU2VydmljZSBuYW1lIHJlcG9ydGVkIG9uIGV2ZXJ5IHNwYW4sIG1ldHJpYyBhbmQgbG9nIHJlY29yZC4gKi9cbmNvbnN0IEVOVl9TRVJWSUNFX05BTUUgPSAnT1RFTF9TRVJWSUNFX05BTUUnO1xuLyoqIFJlc291cmNlIGF0dHJpYnV0ZXMgYWRkZWQgdG8gZXZlcnkgcmVjb3JkOiBjbG91ZCBwcm92aWRlciwgcGxhdGZvcm0gYW5kIHJlZ2lvbi4gKi9cbmNvbnN0IEVOVl9SRVNPVVJDRV9BVFRSSUJVVEVTID0gJ09URUxfUkVTT1VSQ0VfQVRUUklCVVRFUyc7XG4vKiogV2hlcmUgdGhlIGFnZW50IGV4cG9ydHMgT1RMUC4gT24gRmFyZ2F0ZSB0aGlzIGlzIHRoZSByZWFsIGRlc3RpbmF0aW9uLCBub3QgYSBsb2NhbGhvc3QgY29sbGVjdG9yLiAqL1xuY29uc3QgRU5WX09UTFBfRU5EUE9JTlQgPSAnT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UJztcbi8qKiBUaGUgdHJhbnNwb3J0IGZvciB0aGUgZW5kcG9pbnQgYWJvdmUuIFRoZSB0d28gYXJlIG9uZSBkZWNpc2lvbi4gKi9cbmNvbnN0IEVOVl9PVExQX1BST1RPQ09MID0gJ09URUxfRVhQT1JURVJfT1RMUF9QUk9UT0NPTCc7XG4vKiogUGVyLXJlcXVlc3QgaGVhZGVycywgaW4gcHJhY3RpY2UgdGhlIGRlc3RpbmF0aW9uJ3MgY3JlZGVudGlhbC4gKi9cbmNvbnN0IEVOVl9PVExQX0hFQURFUlMgPSAnT1RFTF9FWFBPUlRFUl9PVExQX0hFQURFUlMnO1xuLyoqIFJhaXNlcyBhZ2VudCB2ZXJib3NpdHkgaW50byB0aGUgY29udGFpbmVyJ3MgbG9nIHN0cmVhbS4gKi9cbmNvbnN0IEVOVl9PVEVMX0xPR19MRVZFTCA9ICdPVEVMX0xPR19MRVZFTCc7XG4vKiogVGhlIHRocmVlIHBlci1zaWduYWwgZXhwb3J0ZXIgc3dpdGNoZXMuICovXG5jb25zdCBFTlZfVFJBQ0VTX0VYUE9SVEVSID0gJ09URUxfVFJBQ0VTX0VYUE9SVEVSJztcbmNvbnN0IEVOVl9NRVRSSUNTX0VYUE9SVEVSID0gJ09URUxfTUVUUklDU19FWFBPUlRFUic7XG5jb25zdCBFTlZfTE9HU19FWFBPUlRFUiA9ICdPVEVMX0xPR1NfRVhQT1JURVInO1xuLyoqIFZhbHVlIGEgc3VwcG9ydGVkIHNpZ25hbCdzIGV4cG9ydGVyIGlzIHNldCB0by4gKi9cbmNvbnN0IEVYUE9SVEVSX09UTFAgPSAnb3RscCc7XG5cbi8qKlxuICogU2NoZW1hIHZlcnNpb24gb2YgdGhlIG1hcmtlciBwYXlsb2FkLiBNdXN0IG1hdGNoIGBhcGkuSWFDTWFya2VyVmVyc2lvbmAgaW4gdGhlIGNvbm5lY3RvciDigJQgaXQgaXMgd2hhdFxuICogdGVsbHMgdGhlIGNvbm5lY3RvciBob3cgdG8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgb2JqZWN0LCBzbyBhIGJ1bXBlZCB2ZXJzaW9uIHRoZXJlIGlzIGEgY2hhbmdlIGhlcmUuXG4gKi9cbmNvbnN0IE1BUktFUl9WRVJTSU9OID0gMTtcblxuLyoqXG4gKiBgT0RJR09TX0lBQ2Ag4oCUIHRoZSBtYXJrZXIgcmVjb3JkaW5nIHRoYXQgdGhpcyBjb250YWluZXIgd2FzIGluc3RydW1lbnRlZCBieSBPZGlnb3MgSWFDIHRvb2xpbmcsIGJ5XG4gKiB3aGljaCBwYWNrYWdlIHZlcnNpb24sIGFuZCBmb3Igd2hpY2ggbGFuZ3VhZ2UuXG4gKlxuICogSXQgaXMgUEVSIENPTlRBSU5FUiwgYW5kIGl0IGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgbWFrZXMgT2RpZ29zIHJlcG9ydCBhIGNvbnRhaW5lciBhcyBpbnN0cnVtZW50ZWRcbiAqIHJhdGhlciB0aGFuIFwiYXdhaXRpbmcgeW91ciBkZXBsb3ltZW50XCIg4oCUIGhvd2V2ZXIgY29tcGxldGVseSB0aGUgcmVzdCBvZiB0aGUgd2lyaW5nIGlzIGFwcGxpZWQuIEEgdGFza1xuICogZGVmaW5pdGlvbiBob2xkaW5nIHR3byBhcHBsaWNhdGlvbnMgbmVlZHMgaXQgb24gYm90aC5cbiAqXG4gKiBUaGUgYGxhbmdgIGZpZWxkIGlzIHRoZSBsb2FkLWJlYXJpbmcgb25lIGhlcmUgKHdoZXJlIExhbWJkYSdzIGlzIGBsYXllcmApLiBUaGUgY29ubmVjdG9yJ3MgY29uZm9ybWFuY2VcbiAqIGNoZWNrIHJlY29uc3RydWN0cyB0aGUgY29udGFpbmVyJ3MgZXhwZWN0ZWQgYWN0aXZhdGlvbiBlbnZpcm9ubWVudCBmcm9tIHRoZSByZWNvcmRlZCBsYW5ndWFnZSwgc28gaXQgaXNcbiAqIHdoYXQgbWFrZXMgXCJpcyB0aGlzIGNvbnRhaW5lciBjb3JyZWN0bHkgaW5zdHJ1bWVudGVkXCIgYW5zd2VyYWJsZSBhdCBhbGwg4oCUIGFuZCBpdCBpcyBjcm9zcy1jaGVja2VkXG4gKiBhZ2FpbnN0IHRoZSBsYW5ndWFnZSB0aGUgY29ubmVjdG9yIHJlc29sdmVzIGluZGVwZW5kZW50bHksIHdoaWNoIGlzIGhvdyBhbiBpbWFnZSBzd2FwcGVkIHVuZGVybmVhdGggdGhlXG4gKiBpbnN0cnVtZW50YXRpb24gaXMgY2F1Z2h0LlxuICpcbiAqIEl0IGlzIE5PVCBgT0RJR09TX01BTkFHRURgLCBhbmQgdGhpcyBjb25zdHJ1Y3QgbmV2ZXIgd3JpdGVzIHRoYXQgb25lLiBUaGF0IGlzIHRoZSBjb25uZWN0b3IncyBvd25cbiAqIHJlY29yZCBvZiBhIG11dGF0aW9uIElUIHBlcmZvcm1lZCwgd2hvc2UgcGF5bG9hZCBpcyB0aGUgc25hcHNob3QgaXQgcmVzdG9yZXMgZnJvbSBvbiByb2xsYmFjay4gQSBDREtcbiAqIHN0YWNrIGhhcyBubyBzdWNoIHNuYXBzaG90IHRvIG9mZmVyLCBiZWNhdXNlIG5vdGhpbmcgd2FzIG11dGF0ZWQg4oCUIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbiBiZWxvdyBJU1xuICogdGhlIGNvbnRhaW5lcidzIGRlZmluaXRpb24uIFdyaXRpbmcgaXQgYnkgaGFuZCB3b3VsZCBjbGFpbSBhIHJvbGxiYWNrIG5vYm9keSByZWNvcmRlZCwgYW5kIHRoZVxuICogY29ubmVjdG9yIHdvdWxkIHRoZW4ganVkZ2UgdGhlIGNvbnRhaW5lciBhZ2FpbnN0IHZhbHVlcyB0aGF0IGRvIG5vdCBleGlzdC5cbiAqL1xuY29uc3QgRU5WX0lBQ19NQVJLRVIgPSAnT0RJR09TX0lBQyc7XG5cbi8qKiBDb25zdHJ1Y3QgaWQgb2YgdGhlIHN0YWdpbmcgY29udGFpbmVyIGluc2lkZSB0aGUgdGFzayBkZWZpbml0aW9uJ3Mgc2NvcGUuICovXG5jb25zdCBTSURFQ0FSX0NPTlNUUlVDVF9JRCA9ICdPZGlnb3NBZ2VudCc7XG5cbi8qKlxuICogTWVtb3J5IHJlc2VydmF0aW9uIGZvciB0aGUgc3RhZ2luZyBjb250YWluZXIgb24gYW4gRUMyLW9ubHkgdGFzayBkZWZpbml0aW9uLCB3aGVyZSBFQ1MgcmVxdWlyZXMgZXZlcnlcbiAqIGNvbnRhaW5lciB0byBkZWNsYXJlIGl0cyBvd24gaWYgdGhlIHRhc2sgZG9lcyBub3QuIE5ldmVyIHNldCBvbiBhIEZhcmdhdGUgdGFzayBkZWZpbml0aW9uIOKAlCBzZWUgdGhlXG4gKiBjYWxsIHNpdGUuXG4gKi9cbmNvbnN0IFNJREVDQVJfRUMyX01FTU9SWV9NSUIgPSA2NDtcblxuLyoqXG4gKiBPcHRpb25zIHNoYXJlZCBieSBldmVyeSBjb250YWluZXIgdGhpcyBjb25zdHJ1Y3QgaW5zdHJ1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hlcmUgdGhlIGluc3RydW1lbnRlZCBjb250YWluZXJzIGV4cG9ydCB0ZWxlbWV0cnkgdG8uXG4gICAqXG4gICAqIFVubGlrZSBMYW1iZGEsIEJPVEggdHJhbnNwb3J0cyBtYXkgYmUgc2V0IGFuZCBvZnRlbiBzaG91bGQgYmU6IGEgRmFyZ2F0ZSB0YXNrIGhhcyBubyBjb2xsZWN0b3Igb2YgaXRzXG4gICAqIG93biwgc28gZWFjaCBsYW5ndWFnZSdzIGFnZW50IGV4cG9ydHMgdG8gdGhpcyBkZXN0aW5hdGlvbiBpdHNlbGYgYW5kIHRha2VzIHRoZSB0cmFuc3BvcnQgaXQgcHJlZmVycy5cbiAgICogcGhwIGFuZCBydWJ5IGNhbiBvbmx5IHNwZWFrIE9UTFAvSFRUUCBhdCBhbGwuXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbjogT2RpZ29zRGVzdGluYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBhZ2VudHMgYnVuZGxlIHRoZSBzdGFnaW5nIGNvbnRhaW5lciBjb3BpZXMgdGhlIGxhbmd1YWdlIGFnZW50cyBvdXQgb2YuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBtdWx0aS1hcmNoIGltYWdlIHRoaXMgcGFja2FnZSdzIHJlbGVhc2UgcHVibGlzaGVkLCBhdCB0aGF0IHJlbGVhc2UncyBpbW11dGFibGUgdGFnLlxuICAgKiBPdmVycmlkZSBpdCB0byBtaXJyb3IgdGhlIGltYWdlIGludG8gYSByZWdpc3RyeSB5b3VyIHRhc2tzIGNhbiByZWFjaCDigJQgdGhlIGltYWdlIGlzIHB1bGxlZCBieSBZT1VSXG4gICAqIHRhc2sncyBleGVjdXRpb24gcm9sZSBhdCBldmVyeSB0YXNrIHN0YXJ0LCBzbyBhIHRhc2sgaW4gYSBwcml2YXRlIHN1Ym5ldCB3aXRoIG5vIE5BVCBhbmQgbm9cbiAgICogaW50ZXJmYWNlIGVuZHBvaW50IGNhbm5vdCBwdWxsIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBBIG1pcnJvciBtdXN0IGJlIHRoZSBzYW1lIGJ1bmRsZTogdGhlIGFjdGl2YXRpb24gZW52aXJvbm1lbnQgc2V0IGJlbG93IG5hbWVzIGV4YWN0IHBhdGhzIGluc2lkZSBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgcmVsZWFzZWQgYHJlZ2lzdHJ5Lm9kaWdvcy5pby9vZGlnb3MtZmFyZ2F0ZS1hZ2VudHNgIGltYWdlIGZvciB0aGlzIHBhY2thZ2UgdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgYWdlbnRzSW1hZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJhaXNlIGFnZW50IHZlcmJvc2l0eSAoYE9URUxfTE9HX0xFVkVMPWRlYnVnYCkgb24gZXZlcnkgaW5zdHJ1bWVudGVkIGNvbnRhaW5lci5cbiAgICpcbiAgICogVXNlZnVsIHdoaWxlIHdpcmluZyB1cCBhIGRlc3RpbmF0aW9uLCBleHBlbnNpdmUgdG8gbGVhdmUgb24g4oCUIGFuZCBpdCBpcyBjb21wYXJlZDogdGhlIGNvbm5lY3RvclxuICAgKiBleHBlY3RzIHRoZSB2YXJpYWJsZSBBQlNFTlQgdW5sZXNzIGRlYnVnIHRlbGVtZXRyeSBpcyBlbmFibGVkIGZvciB0aGUgY29ubmVjdG9yIHRvbywgc28gbGVhdmluZyB0aGlzXG4gICAqIG9uIGNhbiBpdHNlbGYgYmUgcmVwb3J0ZWQgYXMgZHJpZnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT25lIGNvbnRhaW5lciB0byBpbnN0cnVtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9kaWdvc0ZhcmdhdGVUYXJnZXQge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGNvbnRhaW5lci4gSXRzIHRhc2sgZGVmaW5pdGlvbiBpcyB0YWtlbiBmcm9tIGl0LCBzbyB0aGUgc3RhZ2luZyBjb250YWluZXIsIHRoZSBzaGFyZWRcbiAgICogdm9sdW1lIGFuZCB0aGUgc3RhcnR1cCBkZXBlbmRlbmN5IGFyZSBhZGRlZCB0byB0aGUgcmlnaHQgb25lIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXI6IGVjcy5Db250YWluZXJEZWZpbml0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2Ugd2hvc2UgYWdlbnQgdG8gc3RhZ2UgYW5kIGFjdGl2YXRlLlxuICAgKlxuICAgKiBTdGF0ZWQgcmF0aGVyIHRoYW4gZGV0ZWN0ZWQg4oCUIGEgY29udGFpbmVyIGRlY2xhcmVzIGFuIGltYWdlLCBub3QgYSBydW50aW1lLCBhbmQgcmVzb2x2aW5nIGEgbGFuZ3VhZ2VcbiAgICogZnJvbSBhbiBpbWFnZSBtZWFucyBwdWxsaW5nIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2U6IE9kaWdvc0ZhcmdhdGVMYW5ndWFnZTtcblxuICAvKipcbiAgICogYE9URUxfU0VSVklDRV9OQU1FYCBmb3IgdGhpcyBjb250YWluZXIuXG4gICAqXG4gICAqIFRISVMgTVVTVCBNQVRDSCBUSEUgV09SS0xPQUQnUyBOQU1FIElOIE9ESUdPUywgd2hpY2ggZm9yIGEgRmFyZ2F0ZSB3b3JrbG9hZCBpcyB0aGUgRUNTIFNFUlZJQ0UgbmFtZSDigJRcbiAgICogbm90IHRoZSB0YXNrIGRlZmluaXRpb24gZmFtaWx5IGFuZCBub3QgdGhlIGNvbnRhaW5lciBuYW1lLiBBIGRpZmZlcmVudCB2YWx1ZSBpcyByZXBvcnRlZCBhc1xuICAgKiBpbnN0cnVtZW50YXRpb24gZHJpZnQgcmF0aGVyIHRoYW4gdHJlYXRlZCBhcyBhIG5hbWluZyBwcmVmZXJlbmNlLlxuICAgKlxuICAgKiBQYXNzIGBzZXJ2aWNlYCBpbnN0ZWFkIHRvIHJlYWQgaXQgb2ZmIHRoZSBzZXJ2aWNlLCBvciBzZXQgdGhpcyB3aGVuIHRoZSBzZXJ2aWNlIGlzIGRlZmluZWQgZWxzZXdoZXJlXG4gICAqIChhIGRpZmZlcmVudCBzdGFjaywgVGVycmFmb3JtLCB0aGUgY29uc29sZSkuIE9uZSBvZiB0aGUgdHdvIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRha2VuIGZyb20gYHNlcnZpY2VgXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEVDUyBzZXJ2aWNlIHRoYXQgcnVucyB0aGlzIHRhc2sgZGVmaW5pdGlvbiwgdXNlZCBvbmx5IHRvIHJlYWQgaXRzIG5hbWUuXG4gICAqXG4gICAqIEl0cyBwaHlzaWNhbCBuYW1lIGhhcyB0byBiZSBvbmUgeW91ciBzdGFjayBTRVQsIG5vdCBvbmUgQ2xvdWRGb3JtYXRpb24gZ2VuZXJhdGVzOiBhIGdlbmVyYXRlZCBuYW1lIGlzXG4gICAqIGEgYFJlZmAgdG8gdGhlIHNlcnZpY2UsIGFuZCBhIHNlcnZpY2UncyBvd24gdGFzayBkZWZpbml0aW9uIHJlZmVyZW5jaW5nIGl0IGlzIGEgZGVwZW5kZW5jeSBjeWNsZVxuICAgKiBDbG91ZEZvcm1hdGlvbiByZWplY3RzIGF0IGRlcGxveSB0aW1lLiBBIGdlbmVyYXRlZCBuYW1lIHRocm93cyBhdCBzeW50aCBwb2ludGluZyBhdCBgc2VydmljZU5hbWVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBzZXJ2aWNlTmFtZWAgbXVzdCBiZSBnaXZlbiBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlPzogZWNzLkJhc2VTZXJ2aWNlO1xuXG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24ncyBydW50aW1lIHZlcnNpb24gYXMgYG1ham9yLm1pbm9yYCDigJQgZm9yIGV4YW1wbGUgYFwiOC4zXCJgLlxuICAgKlxuICAgKiBSZXF1aXJlZCBmb3IgcGhwIGFuZCBydWJ5LCB3aG9zZSBhZ2VudHMgYXJlIGxhaWQgZG93biBwZXIgcnVudGltZSB2ZXJzaW9uIGluIHRoZSBidW5kbGUsIGFuZCB0aGVcbiAgICogdmVyc2lvbiBzZWxlY3RzIHRoZSBwYXRoIHRoZWlyIGFjdGl2YXRpb24gdmFyaWFibGVzIHBvaW50IGF0LiBJZ25vcmVkIGJ5IGV2ZXJ5IG90aGVyIGxhbmd1YWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmU7IHJlcXVpcmVkIGZvciBwaHAgYW5kIHJ1YnlcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWVWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhpcyBjb250YWluZXIgYWxyZWFkeSBuZWVkcyBpbiBpdHMgbG9hZGVyIHZhcmlhYmxlIChgSkFWQV9UT09MX09QVElPTlNgLCBgTk9ERV9PUFRJT05TYCBvclxuICAgKiBgUFlUSE9OUEFUSGApLCB3aGljaCB0aGUgT2RpZ29zIGZyYWdtZW50IGlzIGpvaW5lZCB0byByYXRoZXIgdGhhbiByZXBsYWNpbmcuXG4gICAqXG4gICAqIE9ubHkgbmVlZGVkIGFzIGFuIE9WRVJSSURFLiBUaGUgY29uc3RydWN0IHJlYWRzIHRoZSB2YWx1ZSB0aGUgY29udGFpbmVyIHdhcyBjcmVhdGVkIHdpdGggYW5kIGFwcGVuZHNcbiAgICogdG8gaXQsIHNvIGEgY29udGFpbmVyIHRoYXQgc2V0cyBpdHMgb3duIGBKQVZBX1RPT0xfT1BUSU9OU2AgaW4gYGFkZENvbnRhaW5lcmAga2VlcHMgaXQuIFBhc3MgdGhpcyB3aGVuXG4gICAqIHRoZSB2YWx1ZSBpcyBub3QgdmlzaWJsZSBhdCBzeW50aCDigJQgc2V0IGJ5IGFuIGBlbnZpcm9ubWVudEZpbGVzYCBlbnRyeSwgaW5qZWN0ZWQgYnkgdGhlIGltYWdlJ3Mgb3duXG4gICAqIGBFTlZgLCBvciBzdXBwbGllZCB0aHJvdWdoIGBzZWNyZXRzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSByZWFkIGZyb20gdGhlIGNvbnRhaW5lcidzIG93biBlbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgZXhpc3RpbmdMb2FkZXJWYWx1ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wcyBmb3Ige0BsaW5rIE9kaWdvc0ZhcmdhdGVJbnN0cnVtZW50YXRpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9kaWdvc0ZhcmdhdGVJbnN0cnVtZW50YXRpb25Qcm9wcyBleHRlbmRzIE9kaWdvc0ZhcmdhdGVJbnN0cnVtZW50YXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIENvbnRhaW5lcnMgdG8gaW5zdHJ1bWVudCBvbiBjb25zdHJ1Y3Rpb24uIE1vcmUgY2FuIGJlIGFkZGVkIHdpdGggYGluc3RydW1lbnQoKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0cz86IE9kaWdvc0ZhcmdhdGVUYXJnZXRbXTtcbn1cblxuLyoqIFBlci10YXNrLWRlZmluaXRpb24gc3RhdGU6IHRoZSBzdGFnaW5nIGNvbnRhaW5lciwgYW5kIHdoYXQgaXQgaGFzIGJlZW4gYXNrZWQgdG8gc3RhZ2UuICovXG5pbnRlcmZhY2UgVGFza0RlZmluaXRpb25TdGF0ZSB7XG4gIHJlYWRvbmx5IHNpZGVjYXI6IGVjcy5Db250YWluZXJEZWZpbml0aW9uO1xuICByZWFkb25seSBhZ2VudERpcnM6IFNldDxzdHJpbmc+O1xufVxuXG4vKipcbiAqIEluc3RydW1lbnRzIEVDUyBGYXJnYXRlIGNvbnRhaW5lcnMgd2l0aCB0aGUgT2RpZ29zIE9wZW5UZWxlbWV0cnkgYWdlbnRzLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBvZGlnb3MgPSBuZXcgT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvbih0aGlzLCAnT2RpZ29zJywge1xuICogICBkZXN0aW5hdGlvbjogeyBodHRwRW5kcG9pbnQ6ICdodHRwczovL290bHAuZXhhbXBsZS5jb206NDMxOCcgfSxcbiAqIH0pO1xuICogb2RpZ29zLmluc3RydW1lbnQoe1xuICogICBjb250YWluZXI6IGFwaUNvbnRhaW5lcixcbiAqICAgbGFuZ3VhZ2U6IE9kaWdvc0ZhcmdhdGVMYW5ndWFnZS5KQVZBLFxuICogICBzZXJ2aWNlOiBhcGlTZXJ2aWNlLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAjIyBXaGF0IGl0IGRvZXMgdG8gdGhlIHRhc2sgZGVmaW5pdGlvblxuICpcbiAqIEZvdXIgbW92ZXMsIHdoaWNoIGFyZSBvbmUgbWVjaGFuaXNtIGFuZCBvbmx5IHdvcmsgdG9nZXRoZXIg4oCUIHRoZSBFQ1MgYWRhcHRhdGlvbiBvZiB0aGUgT2Rpa29zXG4gKiBpbml0LWNvbnRhaW5lciBtb3VudCBtZXRob2Q6XG4gKlxuICogIDEuIGEgYmFyZS1uYW1lIHRhc2sgdm9sdW1lIChgb2RpZ29zLWFnZW50YCksIHdoaWNoIG9uIEZhcmdhdGUgaXMgYW4gZXBoZW1lcmFsLXN0b3JhZ2UgYmluZCBtb3VudFxuICogICAgIHNjb3BlZCB0byB0aGUgdGFzaztcbiAqICAyLiBhIE5PTi1FU1NFTlRJQUwgYG9kaWdvcy1hZ2VudGAgY29udGFpbmVyIHRoYXQgY29waWVzIHRoZSBsYW5ndWFnZSBhZ2VudHMgb3V0IG9mIHRoZSBhZ2VudHMgYnVuZGxlXG4gKiAgICAgaW50byB0aGF0IHZvbHVtZSBhbmQgZXhpdHMgMDtcbiAqICAzLiB0aGUgdm9sdW1lIG1vdW50ZWQgcmVhZC1vbmx5IGF0IGAvdmFyL29kaWdvc2AgaW4gZWFjaCBpbnN0cnVtZW50ZWQgY29udGFpbmVyLCB3aGljaCBkZXBlbmRzIG9uIHRoZVxuICogICAgIHN0YWdpbmcgY29udGFpbmVyIHdpdGggY29uZGl0aW9uIGBTVUNDRVNTYCDigJQgb25seSB2YWxpZCBhZ2FpbnN0IGEgbm9uLWVzc2VudGlhbCBjb250YWluZXIsIHdoaWNoIGlzXG4gKiAgICAgd2h5ICgyKSBpcyBub24tZXNzZW50aWFsO1xuICogIDQuIHRoZSBsYW5ndWFnZSdzIGFjdGl2YXRpb24gZW52aXJvbm1lbnQsIHRoZSBPVExQIGV4cG9ydCBlbnZpcm9ubWVudCwgYW5kIHRoZSBgT0RJR09TX0lBQ2AgbWFya2VyIG9uXG4gKiAgICAgZWFjaCBpbnN0cnVtZW50ZWQgY29udGFpbmVyLlxuICpcbiAqIFRoZXJlIGlzIE9ORSBzdGFnaW5nIGNvbnRhaW5lciBwZXIgdGFzayBkZWZpbml0aW9uIGhvd2V2ZXIgbWFueSBsYW5ndWFnZXMgdGhlIHRhc2sgaG9sZHM7IGl0cyBjb21tYW5kXG4gKiBpcyB0aGUgdW5pb24gb2YgZXZlcnkgaW5zdHJ1bWVudGVkIGNvbnRhaW5lcidzIGFnZW50IGRpcmVjdG9yaWVzLCBhbmQgaXQgaXMgYnVpbHQgbGF6aWx5IHNvIGNvbnRhaW5lcnNcbiAqIGluc3RydW1lbnRlZCBsYXRlciBhcmUgaW5jbHVkZWQuXG4gKlxuICogIyMgV2hlcmUgdGhlIHRlbGVtZXRyeSBnb2VzXG4gKlxuICogU3RyYWlnaHQgdG8geW91ciBkZXN0aW5hdGlvbiwgZnJvbSBpbnNpZGUgdGhlIGFwcGxpY2F0aW9uIHByb2Nlc3MuIFRoaXMgaXMgdGhlIHN1YnN0YW50aXZlIGRpZmZlcmVuY2VcbiAqIGZyb20gTGFtYmRhOiB0aGVyZSBpcyBubyBjb2xsZWN0b3IgaW4gdGhlIHRhc2sgdG8gaGFuZCBhIGJhdGNoIHRvLCBzbyBhIHNsb3cgb3IgdW5yZWFjaGFibGUgZGVzdGluYXRpb25cbiAqIGlzIGZlbHQgYnkgdGhlIGFwcGxpY2F0aW9uJ3Mgb3duIGV4cG9ydGVyIHJhdGhlciB0aGFuIGFic29yYmVkIGFmdGVyIGEgcmVzcG9uc2UgaGFzIGJlZW4gcmV0dXJuZWQuXG4gKlxuICogIyMgV2hhdCBpdCBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgZG9cbiAqXG4gKiBUaGVyZSBpcyBubyBhc3BlY3QgdGhhdCBzd2VlcHMgYSBzY29wZSwgYXMgdGhlcmUgaXMgZm9yIExhbWJkYS4gQW4gYXNwZWN0IHRoZXJlIHdvcmtzIGJlY2F1c2UgYVxuICogZnVuY3Rpb24gREVDTEFSRVMgaXRzIHJ1bnRpbWU7IGEgY29udGFpbmVyIGRlY2xhcmVzIGFuIGltYWdlLCBhbmQgYSBsYW5ndWFnZSBndWVzc2VkIGZyb20gYW4gaW1hZ2UgbmFtZVxuICogd291bGQgc2lsZW50bHkgbWlzLWluc3RydW1lbnQgdGhlIG9uZXMgaXQgZ290IHdyb25nIOKAlCBzdGFnaW5nIGEgSmF2YSBhZ2VudCBpbnRvIGEgUHl0aG9uIGNvbnRhaW5lclxuICogbGVhdmVzIGl0IHVuaW5zdHJ1bWVudGVkLCBhbmQgYSBgSkFWQV9UT09MX09QVElPTlNgIG9uIGEgSlZNLWxlc3MgaW1hZ2UgaXMgc2ltcGx5IGlnbm9yZWQsIHNvIG5vdGhpbmdcbiAqIGZhaWxzIGxvdWRseSBlbm91Z2ggdG8gbm90aWNlLlxuICpcbiAqICMjIERvIG5vdCBhbHNvIGluc3RydW1lbnQgdGhlc2Ugc2VydmljZXMgd2l0aCB0aGUgY29ubmVjdG9yXG4gKlxuICogVGhlIGNvbm5lY3RvciBpbnN0cnVtZW50cyBsaXZlIHNlcnZpY2VzIGJ5IHJlZ2lzdGVyaW5nIGEgbmV3IHRhc2stZGVmaW5pdGlvbiByZXZpc2lvbiBhbmQgdXBkYXRpbmcgdGhlXG4gKiBzZXJ2aWNlIHRvIGl0LCByZWNvbmNpbGluZyB0byBpdHMgb3duIGRlc2lyZWQgc3RhdGUgb24gZXZlcnkgcGFzcy4gQSBzZXJ2aWNlIGluc3RydW1lbnRlZCBoZXJlIGFuZCBhbHNvXG4gKiBlbmFibGVkIGFzIGEgY29ubmVjdG9yIHNvdXJjZSBlbmRzIHVwIG93bmVkIGJ5IGJvdGg6IGVhY2ggYGNkayBkZXBsb3lgIHJlYXNzZXJ0cyB0aGUgc3RhY2snc1xuICogZGVmaW5pdGlvbiwgZWFjaCByZWNvbmNpbGUgcmVhc3NlcnRzIHRoZSBjb25uZWN0b3IncywgYW5kIGV2ZXJ5IHJvdW5kIHRyaXAgcmVnaXN0ZXJzIGEgcmV2aXNpb24gYW5kXG4gKiByb2xscyB0aGUgc2VydmljZS4gQ2hvb3NlIG9uZSBwZXIgc2VydmljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9kaWdvc0ZhcmdhdGVJbnN0cnVtZW50YXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE9kaWdvc0ZhcmdhdGVJbnN0cnVtZW50YXRpb25PcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGFnZW50c0ltYWdlOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFza0RlZmluaXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFRhc2tEZWZpbml0aW9uU3RhdGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1bWVudGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9kaWdvc0ZhcmdhdGVJbnN0cnVtZW50YXRpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5vcHRpb25zID0gcHJvcHM7XG5cbiAgICBjb25zdCBpbWFnZSA9IHByb3BzLmFnZW50c0ltYWdlID8/IEZBUkdBVEVfQUdFTlRTX0lNQUdFO1xuICAgIGlmICghaW1hZ2UpIHtcbiAgICAgIC8vIEVtcHR5IG9ubHkgaW4gYSBjaGVja291dCBidWlsdCBiZWZvcmUgdGhlIGZpcnN0IHJlbGVhc2UuIEZhaWxpbmcgaGVyZSBpcyB0aGUgcG9pbnQ6IHRoZVxuICAgICAgLy8gYWx0ZXJuYXRpdmUgaXMgYSB0YXNrIGRlZmluaXRpb24gd2hvc2Ugc3RhZ2luZyBjb250YWluZXIgbmFtZXMgYSB0YWcgdGhhdCBkb2VzIG5vdCBleGlzdCwgd2hpY2hcbiAgICAgIC8vIHN1cmZhY2VzIGFzIGEgdGFzayB0aGF0IHdpbGwgbm90IHN0YXJ0LCBhdCBkZXBsb3kgdGltZSwgaW4gYSBwbGFjZSB0aGF0IHNheXMgbm90aGluZyBhYm91dCB3aHkuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdPZGlnb3M6IHRoaXMgYnVpbGQgb2YgQG9kaWdvcy9hd3MtY2RrIGhhcyBubyBGYXJnYXRlIGFnZW50cyBpbWFnZSBiYWtlZCBpbiDigJQgaXQgd2FzIGJ1aWx0ICcgK1xuICAgICAgICAgICdiZWZvcmUgdGhlIGZpcnN0IHJlbGVhc2UuIFVzZSBhIHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHBhc3MgYGFnZW50c0ltYWdlYCAnICtcbiAgICAgICAgICAnZXhwbGljaXRseS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hZ2VudHNJbWFnZSA9IGltYWdlO1xuXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgcHJvcHMudGFyZ2V0cyA/PyBbXSkge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KHRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc3RydW1lbnRzIG9uZSBjb250YWluZXIuIElkZW1wb3RlbnQg4oCUIGluc3RydW1lbnRpbmcgdGhlIHNhbWUgY29udGFpbmVyIHR3aWNlIGlzIGEgbm8tb3AgcmF0aGVyIHRoYW5cbiAgICogYSBkb3VibGVkIGxvYWRlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBpbnN0cnVtZW50KHRhcmdldDogT2RpZ29zRmFyZ2F0ZVRhcmdldCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRhcmdldC5jb250YWluZXI7XG4gICAgY29uc3Qga2V5ID0gY29udGFpbmVyLm5vZGUucGF0aDtcbiAgICBpZiAodGhpcy5pbnN0cnVtZW50ZWQuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXNrRGVmaW5pdGlvbiA9IGNvbnRhaW5lci50YXNrRGVmaW5pdGlvbjtcbiAgICBjb25zdCByZWNpcGUgPSByZWNpcGVGb3IodGFyZ2V0Lmxhbmd1YWdlLCB0YXJnZXQucnVudGltZVZlcnNpb24pO1xuICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gdGhpcy5yZXNvbHZlU2VydmljZU5hbWUodGFyZ2V0KTtcblxuICAgIHRoaXMuY2hlY2tUYXNrRGVmaW5pdGlvbih0YXNrRGVmaW5pdGlvbiwgY29udGFpbmVyKTtcbiAgICB0aGlzLmluc3RydW1lbnRlZC5hZGQoa2V5KTtcblxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy50YXNrRGVmaW5pdGlvblN0YXRlKHRhc2tEZWZpbml0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGRpciBvZiByZWNpcGUuYWdlbnREaXJzKSB7XG4gICAgICBzdGF0ZS5hZ2VudERpcnMuYWRkKGRpcik7XG4gICAgfVxuXG4gICAgLy8gUmVhZC1vbmx5OiB0aGUgYWdlbnRzIGFyZSBvbmx5IHJlYWQgaGVyZSwgYW5kIHRoZSBzdGFnaW5nIGNvbnRhaW5lciBvd25zIHRoZSB3cml0ZXMuXG4gICAgY29udGFpbmVyLmFkZE1vdW50UG9pbnRzKHtcbiAgICAgIHNvdXJjZVZvbHVtZTogRkFSR0FURV9WT0xVTUVfTkFNRSxcbiAgICAgIGNvbnRhaW5lclBhdGg6IEZBUkdBVEVfQUdFTlRTX0RJUixcbiAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgIH0pO1xuICAgIC8vIFNVQ0NFU1MsIG5vdCBTVEFSVDogdGhlIGFnZW50IGZpbGVzIGhhdmUgdG8gYmUgb24gZGlzayBiZWZvcmUgdGhlIGFwcGxpY2F0aW9uIHByb2Nlc3MgYmVnaW5zLCBhbmRcbiAgICAvLyB0aGUgc3RhZ2luZyBjb250YWluZXIgZXhpdHMgYXMgc29vbiBhcyB0aGV5IGFyZS5cbiAgICBjb250YWluZXIuYWRkQ29udGFpbmVyRGVwZW5kZW5jaWVzKHtcbiAgICAgIGNvbnRhaW5lcjogc3RhdGUuc2lkZWNhcixcbiAgICAgIGNvbmRpdGlvbjogZWNzLkNvbnRhaW5lckRlcGVuZGVuY3lDb25kaXRpb24uU1VDQ0VTUyxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudmlyb25tZW50Rm9yKHRhcmdldCwgcmVjaXBlLCBzZXJ2aWNlTmFtZSkpKSB7XG4gICAgICBjb250YWluZXIuYWRkRW52aXJvbm1lbnQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBJbnN0cnVtZW50cyBldmVyeSB0YXJnZXQgaW4gdGhlIGxpc3QuICovXG4gIHB1YmxpYyBpbnN0cnVtZW50QWxsKHRhcmdldHM6IE9kaWdvc0ZhcmdhdGVUYXJnZXRbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudCh0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGFzayBkZWZpbml0aW9uJ3Mgc3RhZ2luZyBjb250YWluZXIgYW5kIHZvbHVtZSwgY3JlYXRlZCBvbmNlIGFuZCBzaGFyZWQgYnkgZXZlcnkgY29udGFpbmVyIGluIGl0LlxuICAgKlxuICAgKiBUaGUgY29tbWFuZCBpcyBhIGxhenkgbGlzdCByYXRoZXIgdGhhbiBhIGxpdGVyYWwgYmVjYXVzZSB0aGUgdW5pb24gaXQgcmVuZGVycyBpcyBub3Qga25vd24gdW50aWxcbiAgICogc3ludGhlc2lzOiBhIHRhc2sgZGVmaW5pdGlvbiBob2xkaW5nIGEgSmF2YSBhbmQgYSBQeXRob24gYXBwbGljYXRpb24gaXMgaW5zdHJ1bWVudGVkIGJ5IHR3b1xuICAgKiBgaW5zdHJ1bWVudCgpYCBjYWxscywgYW5kIHRoZSBzaW5nbGUgc3RhZ2luZyBjb250YWluZXIgaGFzIHRvIHN0YWdlIGJvdGguIFRoZSBjb25uZWN0b3IgY29tcGFyZXMgdGhpc1xuICAgKiBjb21tYW5kIGFnYWluc3QgZXhhY3RseSB0aGF0IHVuaW9uLCBzbyBhIHN0YWxlIG9uZSBpcyByZXBvcnRlZCBhcyBkcmlmdCBvbiB0aGUgd2hvbGUgdGFzayBkZWZpbml0aW9uXG4gICAqIGFuZCBsZWF2ZXMgb25lIG9mIHRoZSBjb250YWluZXJzIHdpdGggbm8gYWdlbnQgb24gZGlzay5cbiAgICovXG4gIHByaXZhdGUgdGFza0RlZmluaXRpb25TdGF0ZSh0YXNrRGVmaW5pdGlvbjogZWNzLlRhc2tEZWZpbml0aW9uKTogVGFza0RlZmluaXRpb25TdGF0ZSB7XG4gICAgY29uc3Qga2V5ID0gdGFza0RlZmluaXRpb24ubm9kZS5wYXRoO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy50YXNrRGVmaW5pdGlvbnMuZ2V0KGtleSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuXG4gICAgLy8gQSBiYXJlLW5hbWUgdm9sdW1lIOKAlCBubyBob3N0LCBkb2NrZXIgb3IgRUZTIGNvbmZpZ3VyYXRpb24g4oCUIGlzIGEgRmFyZ2F0ZSBlcGhlbWVyYWwtc3RvcmFnZSBiaW5kXG4gICAgLy8gbW91bnQgc2NvcGVkIHRvIHRoZSB0YXNrLCB3aGljaCBpcyBleGFjdGx5IHRoZSBzaGFyZWQgc3RhZ2luZyBhcmVhIG5lZWRlZCBhbmQgdGhlIG9ubHkga2luZCBGYXJnYXRlXG4gICAgLy8gb2ZmZXJzICh0aGVyZSBpcyBubyB0bXBmcykuXG4gICAgdGFza0RlZmluaXRpb24uYWRkVm9sdW1lKHsgbmFtZTogRkFSR0FURV9WT0xVTUVfTkFNRSB9KTtcblxuICAgIGNvbnN0IGFnZW50RGlycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHNpZGVjYXIgPSB0YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoU0lERUNBUl9DT05TVFJVQ1RfSUQsIHtcbiAgICAgIGNvbnRhaW5lck5hbWU6IEZBUkdBVEVfU0lERUNBUl9DT05UQUlORVJfTkFNRSxcbiAgICAgIGltYWdlOiBlY3MuQ29udGFpbmVySW1hZ2UuZnJvbVJlZ2lzdHJ5KHRoaXMuYWdlbnRzSW1hZ2UpLFxuICAgICAgLy8gTm9uLWVzc2VudGlhbCBpcyBub3QgYSBwcmVmZXJlbmNlOiBpdCBpcyB3aGF0IG1ha2VzIHRoZSBTVUNDRVNTIGRlcGVuZGVuY3kgYWJvdmUgbGVnYWwsIGFuZCBpdCBpc1xuICAgICAgLy8gd2hhdCBzdG9wcyBhIGNvcGllciB0aGF0IGhhcyBmaW5pc2hlZCBpdHMgam9iIGZyb20gZmFpbGluZyB0aGUgd2hvbGUgdGFzayBieSBleGl0aW5nLlxuICAgICAgZXNzZW50aWFsOiBmYWxzZSxcbiAgICAgIGNvbW1hbmQ6IExhenkubGlzdCh7IHByb2R1Y2U6ICgpID0+IHNpZGVjYXJDb21tYW5kKFsuLi5hZ2VudERpcnNdKSB9KSxcbiAgICAgIC8vIEZhcmdhdGUgYWxsb2NhdGVzIG1lbW9yeSBhdCB0aGUgdGFzayBsZXZlbCwgc28gdGhlIHN0YWdpbmcgY29udGFpbmVyIGRlY2xhcmVzIG5vbmUgdGhlcmUg4oCUIHdoaWNoXG4gICAgICAvLyBrZWVwcyB0aGUgcmVuZGVyZWQgY29udGFpbmVyIGJ5dGUtaWRlbnRpY2FsIHRvIHdoYXQgdGhlIGNvbm5lY3RvciB3cml0ZXMuIEFuIEVDMi1vbmx5IHRhc2tcbiAgICAgIC8vIGRlZmluaXRpb24gd2l0aG91dCB0YXNrLWxldmVsIG1lbW9yeSByZXF1aXJlcyBldmVyeSBjb250YWluZXIgdG8gZGVjbGFyZSBpdHMgb3duLCBzbyBvbmUgaXMgc2V0XG4gICAgICAvLyBmb3IgdGhhdCBjYXNlIGFsb25lLiBBIHNvZnQgcmVzZXJ2YXRpb24sIGFuZCBnZW5lcm91czogdGhlIGNvbnRhaW5lciBpcyBidXN5Ym94IHJ1bm5pbmcgYGNwYC5cbiAgICAgIG1lbW9yeVJlc2VydmF0aW9uTWlCOiB0YXNrRGVmaW5pdGlvbi5pc0ZhcmdhdGVDb21wYXRpYmxlID8gdW5kZWZpbmVkIDogU0lERUNBUl9FQzJfTUVNT1JZX01JQixcbiAgICB9KTtcbiAgICAvLyBXcml0YWJsZSBoZXJlIOKAlCB0aGlzIGlzIHRoZSBjb250YWluZXIgdGhhdCBwdXRzIHRoZSBmaWxlcyB0aGVyZS4gYHJlYWRPbmx5YCBpcyByZXF1aXJlZCBieSBDREsnc1xuICAgIC8vIE1vdW50UG9pbnQgc3RydWN0IHdoZXJlIHRoZSBjb25uZWN0b3Igc2ltcGx5IG9taXRzIGl0OyBmYWxzZSBpcyB3aGF0IGFuIG9taXR0ZWQgdmFsdWUgbWVhbnMsIGFuZCB0aGVcbiAgICAvLyBjb25uZWN0b3IncyB0YXNrLWxldmVsIGNoZWNrIGNvbXBhcmVzIHRoZSBzdGFnaW5nIGNvbnRhaW5lcidzIGltYWdlLCBlc3NlbnRpYWxpdHkgYW5kIGNvbW1hbmQsIG5vdFxuICAgIC8vIGl0cyBtb3VudHMsIHNvIHNwZWxsaW5nIG91dCB0aGUgZGVmYXVsdCBpcyBub3QgZHJpZnQuXG4gICAgc2lkZWNhci5hZGRNb3VudFBvaW50cyh7XG4gICAgICBzb3VyY2VWb2x1bWU6IEZBUkdBVEVfVk9MVU1FX05BTUUsXG4gICAgICBjb250YWluZXJQYXRoOiBGQVJHQVRFX0FHRU5UU19ESVIsXG4gICAgICByZWFkT25seTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmVkIGhlcmUsIHdpdGggdGhlIHN0YWdpbmcgY29udGFpbmVyLCBzbyBpdCBpcyBhZGRlZCBvbmNlIHBlciB0YXNrIGRlZmluaXRpb24gaG93ZXZlciBtYW55XG4gICAgLy8gY29udGFpbmVycyBhcmUgaW5zdHJ1bWVudGVkIGluIGl0IOKAlCBhbmQgY291bnRlZCBhdCBzeW50aCwgc28gY29udGFpbmVycyBhZGRlZCBhZnRlciB0aGlzIGNhbGwgYXJlXG4gICAgLy8gaW5jbHVkZWQuIEFXUyByZWplY3RzIGEgUmVnaXN0ZXJUYXNrRGVmaW5pdGlvbiBvdmVyIHRoZSBsaW1pdCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHN1cmZhY2UgYXMgYVxuICAgIC8vIGRlcGxveSBmYWlsdXJlIGFib3V0IGEgY29udGFpbmVyIGNvdW50IHdpdGggbm90aGluZyB0byBzYXkgYWJvdXQgd2hpY2ggY29udGFpbmVyIGlzIHRoZSBleHRyYSBvbmUuXG4gICAgdGFza0RlZmluaXRpb24ubm9kZS5hZGRWYWxpZGF0aW9uKHtcbiAgICAgIHZhbGlkYXRlOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSB0YXNrRGVmaW5pdGlvbi5ub2RlLmNoaWxkcmVuLmZpbHRlcigoYykgPT4gYyBpbnN0YW5jZW9mIGVjcy5Db250YWluZXJEZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcnMubGVuZ3RoID4gRkFSR0FURV9NQVhfQ09OVEFJTkVSU1xuICAgICAgICAgID8gW1xuICAgICAgICAgICAgYE9kaWdvczogdGFzayBkZWZpbml0aW9uICR7dGFza0RlZmluaXRpb24ubm9kZS5pZH0gd291bGQgaGF2ZSAke2NvbnRhaW5lcnMubGVuZ3RofSBgICtcbiAgICAgICAgICAgICAgICBgY29udGFpbmVycywgb3ZlciB0aGUgQVdTIG1heGltdW0gb2YgJHtGQVJHQVRFX01BWF9DT05UQUlORVJTfS4gT25lIG9mIHRoZW0gaXMgdGhlIGAgK1xuICAgICAgICAgICAgICAgICdvZGlnb3MtYWdlbnQgc3RhZ2luZyBjb250YWluZXIgdGhpcyBpbnN0cnVtZW50YXRpb24gYWRkcy4nLFxuICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0YXRlOiBUYXNrRGVmaW5pdGlvblN0YXRlID0geyBzaWRlY2FyLCBhZ2VudERpcnMgfTtcbiAgICB0aGlzLnRhc2tEZWZpbml0aW9ucy5zZXQoa2V5LCBzdGF0ZSk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIGBPVEVMX1NFUlZJQ0VfTkFNRWAgZm9yIGEgdGFyZ2V0LCBhbmQgdGhlIG9uZSB2YWx1ZSBhIGNhbGxlciBjYW5ub3QgYmUgYWxsb3dlZCB0byBsZWF2ZSB0byBhIGRlZmF1bHQuXG4gICAqXG4gICAqIFRoZSBjb25uZWN0b3IgY29tcGFyZXMgaXQgYWdhaW5zdCB0aGUgd29ya2xvYWQncyBuYW1lIGluIE9kaWdvcywgd2hpY2ggaXMgdGhlIEVDUyBTRVJWSUNFIG5hbWUsIHNvXG4gICAqIGd1ZXNzaW5nIOKAlCB0aGUgdGFzayBkZWZpbml0aW9uIGZhbWlseSwgdGhlIGNvbnRhaW5lciBuYW1lLCB0aGUgY29uc3RydWN0IGlkIOKAlCB3b3VsZCBwcm9kdWNlIGEgc3RhY2tcbiAgICogdGhhdCBkZXBsb3lzIGNsZWFubHkgYW5kIHRoZW4gcmVwb3J0cyBhcyBkcmlmdGVkIG9uIGEgY29tcG9uZW50IG5vdGhpbmcgaW4gdGhlIHN0YWNrIG1ha2VzIHZpc2libGUuXG4gICAqXG4gICAqIFJlYWQgZnJvbSB0aGUgTDEsIG5vdCBmcm9tIGBzZXJ2aWNlLnNlcnZpY2VOYW1lYDogdGhlIEwyIHByb3BlcnR5IGlzIGEgdG9rZW4gdGhhdCByZXNvbHZlcyB0byBhIGBSZWZgXG4gICAqIHRvIHRoZSBzZXJ2aWNlIGV2ZW4gd2hlbiB0aGUgc3RhY2sgc2V0IHRoZSBuYW1lIGV4cGxpY2l0bHksIGFuZCBhIGBSZWZgIGhlcmUgaXMgd29yc2UgdGhhbiB1c2VsZXNzIOKAlFxuICAgKiB0aGUgdGFzayBkZWZpbml0aW9uIHdvdWxkIHJlZmVyZW5jZSB0aGUgc2VydmljZSB0aGF0IHJlZmVyZW5jZXMgaXQsIHdoaWNoIENsb3VkRm9ybWF0aW9uIHJlamVjdHMgYXMgYVxuICAgKiBkZXBlbmRlbmN5IGN5Y2xlIGF0IGRlcGxveSB0aW1lLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlU2VydmljZU5hbWUodGFyZ2V0OiBPZGlnb3NGYXJnYXRlVGFyZ2V0KTogc3RyaW5nIHtcbiAgICBpZiAodGFyZ2V0LnNlcnZpY2VOYW1lKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0LnNlcnZpY2VOYW1lO1xuICAgIH1cbiAgICBpZiAoIXRhcmdldC5zZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBPZGlnb3M6IGluc3RydW1lbnRpbmcgY29udGFpbmVyIFwiJHt0YXJnZXQuY29udGFpbmVyLmNvbnRhaW5lck5hbWV9XCIgbmVlZHMgYSBzZXJ2aWNlIG5hbWUuIGAgK1xuICAgICAgICAgICdPVEVMX1NFUlZJQ0VfTkFNRSBtdXN0IGVxdWFsIHRoZSB3b3JrbG9hZFxcJ3MgbmFtZSBpbiBPZGlnb3MsIHdoaWNoIGZvciBhIEZhcmdhdGUgd29ya2xvYWQgaXMgJyArXG4gICAgICAgICAgJ3RoZSBFQ1MgU0VSVklDRSBuYW1lIOKAlCBub3QgdGhlIHRhc2sgZGVmaW5pdGlvbiBmYW1pbHkuIFBhc3MgYHNlcnZpY2VgIHRvIHJlYWQgaXQgb2ZmIHRoZSAnICtcbiAgICAgICAgICAnc2VydmljZSwgb3IgYHNlcnZpY2VOYW1lYCB3aGVuIHRoZSBzZXJ2aWNlIGxpdmVzIG91dHNpZGUgdGhpcyBzdGFjay4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgY2ZuID0gdGFyZ2V0LnNlcnZpY2Uubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZWNzLkNmblNlcnZpY2UgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBjZm4gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFN0YWNrLm9mKHRhcmdldC5zZXJ2aWNlKS5yZXNvbHZlKGNmbi5zZXJ2aWNlTmFtZSk7XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gJ3N0cmluZycgJiYgcmVzb2x2ZWQgIT09ICcnICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocmVzb2x2ZWQpKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBPZGlnb3M6IHRoZSBzZXJ2aWNlIGZvciBjb250YWluZXIgXCIke3RhcmdldC5jb250YWluZXIuY29udGFpbmVyTmFtZX1cIiBoYXMgbm8gZXhwbGljaXQgcGh5c2ljYWwgYCArXG4gICAgICAgICduYW1lLCBzbyBDbG91ZEZvcm1hdGlvbiBnZW5lcmF0ZXMgb25lIOKAlCBhbmQgYSBnZW5lcmF0ZWQgbmFtZSBpcyBhIGBSZWZgIHRvIHRoZSBzZXJ2aWNlLCB3aGljaCAnICtcbiAgICAgICAgJ2Nhbm5vdCBnbyBpbnRvIHRoZSB0YXNrIGRlZmluaXRpb24gdGhhdCBzZXJ2aWNlIHJ1bnMgKENsb3VkRm9ybWF0aW9uIHJlamVjdHMgdGhlIGN5Y2xlKS4gU2V0ICcgK1xuICAgICAgICAnYHNlcnZpY2VOYW1lYCBvbiB0aGUgRUNTIHNlcnZpY2UsIG9yIHBhc3MgYHNlcnZpY2VOYW1lYCBoZXJlIHRvIHN0YXRlIHRoZSBuYW1lIE9kaWdvcyBrbm93cyAnICtcbiAgICAgICAgJ3RoZSB3b3JrbG9hZCBieS4nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRoZSB0YXNrIGRlZmluaXRpb24gY2FuIGNhcnJ5IHRoZSBzdGFnZWQtYWdlbnQgbWV0aG9kIGF0IGFsbCwgYW5kIHdhcm5zIGFib3V0IHRoZSB0aGluZ3MgdGhhdFxuICAgKiBhcmUgbGVnYWwgYnV0IGFsbW9zdCBjZXJ0YWlubHkgYSBtaXN0YWtlLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1Rhc2tEZWZpbml0aW9uKHRhc2tEZWZpbml0aW9uOiBlY3MuVGFza0RlZmluaXRpb24sIGNvbnRhaW5lcjogZWNzLkNvbnRhaW5lckRlZmluaXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRhc2tEZWZpbml0aW9uLmlzRmFyZ2F0ZUNvbXBhdGlibGUpIHtcbiAgICAgIC8vIE5vdCBmYXRhbCDigJQgdGhlIG1lY2hhbmlzbSBpcyBhIHZvbHVtZSBhbmQgYSBjb3BpZXIsIHdoaWNoIHdvcmsgb24gdGhlIEVDMiBsYXVuY2ggdHlwZSB0b28uIEJ1dFxuICAgICAgLy8gdGhlIGNvbm5lY3RvciBkaXNjb3ZlcnMgYW5kIGp1ZGdlcyBgYXdzLmZhcmdhdGUtdGFza2Agd29ya2xvYWRzLCBzbyBhbiBFQzItb25seSB0YXNrIGRlZmluaXRpb25cbiAgICAgIC8vIGlzIGluc3RydW1lbnRlZCBoZXJlIGFuZCBpbnZpc2libGUgdGhlcmUuXG4gICAgICBBbm5vdGF0aW9ucy5vZihjb250YWluZXIpLmFkZFdhcm5pbmdWMihcbiAgICAgICAgJ0BvZGlnb3MvYXdzLWNkazpub3RGYXJnYXRlQ29tcGF0aWJsZScsXG4gICAgICAgIGBPZGlnb3M6IHRhc2sgZGVmaW5pdGlvbiAke3Rhc2tEZWZpbml0aW9uLm5vZGUuaWR9IGlzIG5vdCBGYXJnYXRlLWNvbXBhdGlibGUuIFRoZSBzdGFnaW5nIGAgK1xuICAgICAgICAgICdjb250YWluZXIgYW5kIHNoYXJlZCB2b2x1bWUgd2lsbCBzdGlsbCB3b3JrIG9uIHRoZSBFQzIgbGF1bmNoIHR5cGUsIGJ1dCBPZGlnb3MgZGlzY292ZXJzICcgK1xuICAgICAgICAgICd0aGVzZSBhcyBgYXdzLmZhcmdhdGUtdGFza2Agd29ya2xvYWRzIGFuZCB3aWxsIG5vdCByZXBvcnQgb24gYW4gRUMyLW9ubHkgdGFzay4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjZm4gPSB0YXNrRGVmaW5pdGlvbi5ub2RlLmRlZmF1bHRDaGlsZCBhcyBlY3MuQ2ZuVGFza0RlZmluaXRpb24gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBjZm4/LnJ1bnRpbWVQbGF0Zm9ybSBhcyBlY3MuQ2ZuVGFza0RlZmluaXRpb24uUnVudGltZVBsYXRmb3JtUHJvcGVydHkgfCB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3NGYW1pbHkgPSBwbGF0Zm9ybT8ub3BlcmF0aW5nU3lzdGVtRmFtaWx5O1xuICAgIGlmICh0eXBlb2Ygb3NGYW1pbHkgPT09ICdzdHJpbmcnICYmICFUb2tlbi5pc1VucmVzb2x2ZWQob3NGYW1pbHkpICYmICFvc0ZhbWlseS5zdGFydHNXaXRoKCdMSU5VWCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBPZGlnb3M6IHRhc2sgZGVmaW5pdGlvbiAke3Rhc2tEZWZpbml0aW9uLm5vZGUuaWR9IGRlY2xhcmVzIG9wZXJhdGluZ1N5c3RlbUZhbWlseSBgICtcbiAgICAgICAgICBgXCIke29zRmFtaWx5fVwiLiBUaGUgT2RpZ29zIEZhcmdhdGUgYWdlbnRzIGJ1bmRsZSBpcyBMaW51eC1vbmx5IGFuZCBnbGliYy1iYXNlZCwgc28gYSBXaW5kb3dzIGAgK1xuICAgICAgICAgICd0YXNrIGRlZmluaXRpb24gY2Fubm90IGJlIGluc3RydW1lbnRlZCBhdCBhbGwuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IGFwcGxpZWQgdG8gb25lIGluc3RydW1lbnRlZCBjb250YWluZXIuXG4gICAqXG4gICAqIE1pcnJvcnMgYGluc3RydW1lbnRDb250YWluZXJgIGluIHRoZSBjb25uZWN0b3IsIGluY2x1ZGluZyB0aGUgT1JERVIgb2YgZGVjaXNpb25zOiB0aGUgYWdlbnQncyBvd25cbiAgICogYWN0aXZhdGlvbiB2YXJpYWJsZXMgZmlyc3QsIHRoZW4gaWRlbnRpdHksIHRoZW4gZXhwb3J0LCB0aGVuIHRoZSBtYXJrZXIuIEV2ZXJ5IHZhcmlhYmxlIGhlcmUgaGFzIGFcbiAgICogY291bnRlcnBhcnQgaW4gdGhlIGNvbm5lY3RvcidzIGBjb250YWluZXJEaWZmYCwgd2hpY2ggaXMgd2hhdCBhIGN1c3RvbWVyJ3MgY29uZm9ybWFuY2UgcmVwb3J0IGlzXG4gICAqIGJ1aWx0IGZyb20g4oCUIHNvIG9uZSB0aGF0IGlzIGFic2VudCwgb3Igc3BlbGxlZCBkaWZmZXJlbnRseSwgaXMgcmVwb3J0ZWQgYXMgYSBuYW1lZCBicm9rZW4gY29tcG9uZW50XG4gICAqIHJhdGhlciB0aGFuIHBhc3NpbmcgcXVpZXRseS5cbiAgICovXG4gIHByaXZhdGUgZW52aXJvbm1lbnRGb3IoXG4gICAgdGFyZ2V0OiBPZGlnb3NGYXJnYXRlVGFyZ2V0LFxuICAgIHJlY2lwZTogRmFyZ2F0ZVJlY2lwZSxcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICApOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCB7IGRlc3RpbmF0aW9uLCBkZWJ1ZyB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRhcmdldC5jb250YWluZXI7XG4gICAgY29uc3QgZW52OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhyZWNpcGUuc3RhdGljRW52KSkge1xuICAgICAgLy8gVGhlc2UgYXJlIHNldCBvdXRyaWdodCwgbm90IG1lcmdlZCDigJQgUEhQX0lOSV9TQ0FOX0RJUiBhbmQgUlVCWU9QVCBhcmUgY29tcGFyZWQgZXhhY3RseSwgc28gdGhlcmVcbiAgICAgIC8vIGlzIG5vIHJvb20gdG8gZm9sZCBhIGNvbnRhaW5lcidzIG93biB2YWx1ZSBpbi4gU2lsZW50bHkgZGlzY2FyZGluZyBvbmUgaXMgdGhlIGZhaWx1cmUgd29ydGhcbiAgICAgIC8vIG5hbWluZzogUlVCWU9QVCBjb21tb25seSBjYXJyaWVzIGZsYWdzIGFuIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGJvb3QuXG4gICAgICBjb25zdCBleGlzdGluZyA9IGNvbnRhaW5lckVudlZhbHVlKGNvbnRhaW5lciwgayk7XG4gICAgICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCAmJiBleGlzdGluZyAhPT0gdikge1xuICAgICAgICBBbm5vdGF0aW9ucy5vZihjb250YWluZXIpLmFkZFdhcm5pbmdWMihcbiAgICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnN0YXRpY0Vudk92ZXJ3cml0dGVuJyxcbiAgICAgICAgICBgT2RpZ29zOiBjb250YWluZXIgXCIke2NvbnRhaW5lci5jb250YWluZXJOYW1lfVwiIGFscmVhZHkgc2V0cyAke2t9PVwiJHtleGlzdGluZ31cIiwgd2hpY2ggdGhlIGAgK1xuICAgICAgICAgICAgYCR7cmVjaXBlLmxhbmd1YWdlfSBhZ2VudCdzIGFjdGl2YXRpb24gcmVwbGFjZXMgd2l0aCBcIiR7dn1cIi4gT2RpZ29zIGNvbXBhcmVzIHRoaXMgdmFyaWFibGUgYCArXG4gICAgICAgICAgICAnZXhhY3RseSwgc28gaXQgY2Fubm90IG1lcmdlIHRoZSB0d28g4oCUIGZvbGQgd2hhdCB5b3VyIGFwcGxpY2F0aW9uIG5lZWRzIGludG8gdGhlIHZhbHVlICcgK1xuICAgICAgICAgICAgJ09kaWdvcyBzZXRzLCBvciBsZWF2ZSB0aGlzIGNvbnRhaW5lciB1bmluc3RydW1lbnRlZC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZW52W2tdID0gdjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFwcGVuZCBvZiByZWNpcGUuYXBwZW5kRW52KSB7XG4gICAgICAvLyBSZWJ1aWx0IGZyb20gdGhlIGNvbnRhaW5lcidzIE9SSUdJTkFMIHZhbHVlIHNvIG91cnMgaXMgam9pbmVkIHJhdGhlciB0aGFuIGFzc2lnbmVkIG92ZXIgaXQg4oCUIGFuZFxuICAgICAgLy8gc28gdGhhdCBhIHJlLXN5bnRoIG5ldmVyIGFjY3VtdWxhdGVzIG91ciBmcmFnbWVudCB0d2ljZS4gVGhlIHNlcGFyYXRvciBjb21lcyBmcm9tIHRoZSBwYXR0ZXJuLFxuICAgICAgLy8gbm90IGZyb20gYW4gYXNzdW1wdGlvbjogYSBzcGFjZSBmb3IgdGhlICpfT1BUSU9OUyB2YXJpYWJsZXMsIGEgY29sb24gZm9yIFBZVEhPTlBBVEguXG4gICAgICBjb25zdCBleGlzdGluZyA9IHRhcmdldC5leGlzdGluZ0xvYWRlclZhbHVlID8/IGNvbnRhaW5lckVudlZhbHVlKGNvbnRhaW5lciwgYXBwZW5kLm5hbWUpID8/ICcnO1xuICAgICAgZW52W2FwcGVuZC5uYW1lXSA9IGV2YWx1YXRlQXBwZW5kUGF0dGVybihhcHBlbmQucGF0dGVybiwgZXhpc3RpbmcpO1xuICAgIH1cblxuICAgIGVudltFTlZfU0VSVklDRV9OQU1FXSA9IHNlcnZpY2VOYW1lO1xuICAgIGVudltFTlZfUkVTT1VSQ0VfQVRUUklCVVRFU10gPSBmYXJnYXRlUmVzb3VyY2VBdHRyaWJ1dGVzKFN0YWNrLm9mKGNvbnRhaW5lcikucmVnaW9uKTtcblxuICAgIGNvbnN0IGV4cG9ydFRhcmdldCA9IGV4cG9ydFRhcmdldEZvcihyZWNpcGUsIGRlc3RpbmF0aW9uKTtcbiAgICBlbnZbRU5WX09UTFBfRU5EUE9JTlRdID0gZXhwb3J0VGFyZ2V0LmVuZHBvaW50O1xuICAgIGVudltFTlZfT1RMUF9QUk9UT0NPTF0gPSBleHBvcnRUYXJnZXQucHJvdG9jb2w7XG4gICAgY29uc3QgbWlzbWF0Y2ggPSBwb3J0UHJvdG9jb2xNaXNtYXRjaChleHBvcnRUYXJnZXQuZW5kcG9pbnQsIGV4cG9ydFRhcmdldC5wcm90b2NvbCk7XG4gICAgaWYgKG1pc21hdGNoKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZihjb250YWluZXIpLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnBvcnRQcm90b2NvbE1pc21hdGNoJywgYE9kaWdvczogJHttaXNtYXRjaH1gKTtcbiAgICB9XG5cbiAgICAvLyBBbGwgdGhyZWUgYXJlIHdyaXR0ZW4gZXhwbGljaXRseSwgdW5saWtlIExhbWJkYSwgd2hlcmUgYW4gZW5hYmxlZCBzaWduYWwncyB2YXJpYWJsZSBpcyBsZWZ0IHVuc2V0XG4gICAgLy8gYmVjYXVzZSBgb3RscGAgaXMgYWxyZWFkeSB0aGUgU0RLIGRlZmF1bHQuIFRoZSBjb25uZWN0b3IncyBGYXJnYXRlIGNoZWNrIGNvbXBhcmVzIGFsbCB0aHJlZSBieVxuICAgIC8vIHZhbHVlLCBzbyBhbiBvbWl0dGVkIG9uZSByZWFkcyBhcyBkcmlmdCBvbiB0aGUgZXhwb3J0IGNvbXBvbmVudC5cbiAgICBjb25zdCBlbmFibGVkID0gcmVzb2x2ZWRTaWduYWxzKGRlc3RpbmF0aW9uKTtcbiAgICBpZiAoIWVuYWJsZWQudHJhY2VzICYmICFlbmFibGVkLm1ldHJpY3MgJiYgIWVuYWJsZWQubG9ncykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnT2RpZ29zIGRlc3RpbmF0aW9uIGFjY2VwdHMgbm8gdGVsZW1ldHJ5IHNpZ25hbHMsIHNvIHRoZSBhZ2VudCB3b3VsZCBiZSBsb2FkZWQgYW5kIHByb2R1Y2UgJyArXG4gICAgICAgICAgJ25vdGhpbmcuIE5vdGUgdGhhdCBtZXRyaWNzIGFuZCBsb2dzIGFyZSBPRkYgYnkgZGVmYXVsdCDigJQgd2l0aCBgdHJhY2VzOiBmYWxzZWAgdGhlIGRlc3RpbmF0aW9uICcgK1xuICAgICAgICAgICdoYXMgbm90aGluZyBsZWZ0IHVubGVzcyB5b3UgYWxzbyBwYXNzIGBtZXRyaWNzOiB0cnVlYCBvciBgbG9nczogdHJ1ZWAuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGVudltFTlZfVFJBQ0VTX0VYUE9SVEVSXSA9IGVuYWJsZWQudHJhY2VzID8gRVhQT1JURVJfT1RMUCA6IEVYUE9SVEVSX05PTkU7XG4gICAgZW52W0VOVl9NRVRSSUNTX0VYUE9SVEVSXSA9IGVuYWJsZWQubWV0cmljcyA/IEVYUE9SVEVSX09UTFAgOiBFWFBPUlRFUl9OT05FO1xuICAgIGVudltFTlZfTE9HU19FWFBPUlRFUl0gPSBlbmFibGVkLmxvZ3MgPyBFWFBPUlRFUl9PVExQIDogRVhQT1JURVJfTk9ORTtcblxuICAgIGNvbnN0IGhlYWRlcnMgPSByZW5kZXJPdGxwSGVhZGVycyhkZXN0aW5hdGlvbi5oZWFkZXJzKTtcbiAgICBpZiAoaGVhZGVycykge1xuICAgICAgZW52W0VOVl9PVExQX0hFQURFUlNdID0gaGVhZGVycztcbiAgICB9XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGVudltFTlZfT1RFTF9MT0dfTEVWRUxdID0gJ2RlYnVnJztcbiAgICB9XG5cbiAgICBlbnZbRU5WX0lBQ19NQVJLRVJdID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdjogTUFSS0VSX1ZFUlNJT04sXG4gICAgICBzb3VyY2U6ICdjZGsnLFxuICAgICAgdmVyc2lvbjogT0RJR09TX1ZFUlNJT04gfHwgJ3VucmVsZWFzZWQnLFxuICAgICAgbGFuZzogbGFuZ3VhZ2VLZXlPZih0YXJnZXQubGFuZ3VhZ2UpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudjtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB2YWx1ZSB0aGUgY29udGFpbmVyIHdhcyBjcmVhdGVkIHdpdGggZm9yIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciB1bmRlZmluZWQuXG4gKlxuICogYENvbnRhaW5lckRlZmluaXRpb25gIGtlZXBzIGl0cyBlbnZpcm9ubWVudCBwcml2YXRlIGFuZCBvZmZlcnMgYGFkZEVudmlyb25tZW50YCBidXQgbm8gcmVhZGVyLCBzbyB0aGlzXG4gKiByZWFjaGVzIGZvciB0aGUgZmllbGQuIFRoYXQgaXMgYSBjb250YWluZWQgaGFjayB3aXRoIGEgc3BlY2lmaWMgYWx0ZXJuYXRpdmU6IHdpdGhvdXQgaXQsIGFwcGVuZGluZyB0byBhXG4gKiBsb2FkZXIgdmFyaWFibGUgd291bGQgbWVhbiBBU1NJR05JTkcgb3ZlciBpdCwgYW5kIGEgY29udGFpbmVyIHdob3NlIGBOT0RFX09QVElPTlNgIGNhcnJpZXMgYSBmbGFnIGl0c1xuICogYXBwbGljYXRpb24gbmVlZHMgdG8gYm9vdCB3b3VsZCBzdG9wIGJvb3RpbmcgdGhlIG1vbWVudCBpdCB3YXMgaW5zdHJ1bWVudGVkLiBgZXhpc3RpbmdMb2FkZXJWYWx1ZWAgb25cbiAqIHRoZSB0YXJnZXQgaXMgdGhlIGRvY3VtZW50ZWQgZXNjYXBlIGhhdGNoIGlmIHRoaXMgZXZlciBzdG9wcyB3b3JraW5nOyBhIHNoYXBlIHRoYXQgaXMgbm90IGEgcGxhaW4gb2JqZWN0XG4gKiBkZWdyYWRlcyB0byBcIm5vdGhpbmcgdGhlcmVcIiwgd2hpY2ggaXMgdGhlIHNhbWUgYW5zd2VyIGFzIGFuIHVuaW5zdHJ1bWVudGVkIGNvbnRhaW5lci5cbiAqL1xuZnVuY3Rpb24gY29udGFpbmVyRW52VmFsdWUoY29udGFpbmVyOiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvbiwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW52ID0gKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIHsgZW52aXJvbm1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IH0pLmVudmlyb25tZW50O1xuICBpZiAoIWVudiB8fCB0eXBlb2YgZW52ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBlbnZbbmFtZV07XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVuZGVycyBgT1RFTF9FWFBPUlRFUl9PVExQX0hFQURFUlNgIOKAlCBhIGNvbW1hLXNlcGFyYXRlZCBga2V5PXZhbHVlYCBsaXN0LCBrZXlzIHNvcnRlZCBzbyB0aGUgcmVuZGVyZWRcbiAqIHZhbHVlIGlzIGJ5dGUtc3RhYmxlIGFjcm9zcyBzeW50aHMgYW5kIGFuIHVuY2hhbmdlZCBkZXN0aW5hdGlvbiBuZXZlciBsb29rcyBsaWtlIGEgY2hhbmdlLlxuICovXG5mdW5jdGlvbiByZW5kZXJPdGxwSGVhZGVycyhoZWFkZXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGlmICghaGVhZGVycykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29ydCgpO1xuICByZXR1cm4ga2V5cy5tYXAoKGspID0+IGAke2t9PSR7aGVhZGVyc1trXX1gKS5qb2luKCcsJyk7XG59XG4iXX0=
407
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYXJnYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQThEO0FBQzlELDJDQUEyQztBQUMzQywyQ0FBdUM7QUFDdkMseURBQW9FO0FBQ3BFLGlEQU02QjtBQUM3QiwrQ0FBb0Q7QUFDcEQsdURBUzJCO0FBRzNCLGtFQUFrRTtBQUNsRSxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO0FBQzdDLHNGQUFzRjtBQUN0RixNQUFNLHVCQUF1QixHQUFHLDBCQUEwQixDQUFDO0FBQzNELHdHQUF3RztBQUN4RyxNQUFNLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDO0FBQ3hELHNFQUFzRTtBQUN0RSxNQUFNLGlCQUFpQixHQUFHLDZCQUE2QixDQUFDO0FBQ3hELHFFQUFxRTtBQUNyRSxNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixDQUFDO0FBQ3RELDhEQUE4RDtBQUM5RCxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDO0FBQzVDLDhDQUE4QztBQUM5QyxNQUFNLG1CQUFtQixHQUFHLHNCQUFzQixDQUFDO0FBQ25ELE1BQU0sb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFDckQsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztBQUMvQyxxREFBcUQ7QUFDckQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDO0FBRTdCOzs7R0FHRztBQUNILE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUV6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUVwQyxnRkFBZ0Y7QUFDaEYsTUFBTSxvQkFBb0IsR0FBRyxhQUFhLENBQUM7QUFFM0M7Ozs7R0FJRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBa0lsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0RHO0FBQ0gsTUFBYSw0QkFBNkIsU0FBUSxzQkFBUztJQU16RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXdDO1FBQ2hGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFKRixvQkFBZSxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO1FBQ3pELGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUloRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVyQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLDhCQUFvQixDQUFDO1FBQ3hELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLDBGQUEwRjtZQUMxRixrR0FBa0c7WUFDbEcsa0dBQWtHO1lBQ2xHLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEZBQTRGO2dCQUMxRix5RkFBeUY7Z0JBQ3pGLGFBQWEsQ0FDaEIsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV6QixLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFVBQVUsQ0FBQyxNQUEyQjtRQUMzQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ25DLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUM7UUFDaEQsTUFBTSxNQUFNLEdBQUcsSUFBQSwyQkFBUyxFQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2RCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsdUZBQXVGO1FBQ3ZGLFNBQVMsQ0FBQyxjQUFjLENBQUM7WUFDdkIsWUFBWSxFQUFFLDZCQUFtQjtZQUNqQyxhQUFhLEVBQUUsNEJBQWtCO1lBQ2pDLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsb0dBQW9HO1FBQ3BHLG1EQUFtRDtRQUNuRCxTQUFTLENBQUMsd0JBQXdCLENBQUM7WUFDakMsU0FBUyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3hCLFNBQVMsRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUMsT0FBTztTQUNwRCxDQUFDLENBQUM7UUFFSCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzdGLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRUQsNENBQTRDO0lBQ3JDLGFBQWEsQ0FBQyxPQUE4QjtRQUNqRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLG1CQUFtQixDQUFDLGNBQWtDO1FBQzVELE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQsa0dBQWtHO1FBQ2xHLHNHQUFzRztRQUN0Ryw4QkFBOEI7UUFDOUIsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSw2QkFBbUIsRUFBRSxDQUFDLENBQUM7UUFFeEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLG9CQUFvQixFQUFFO1lBQ2hFLGFBQWEsRUFBRSx3Q0FBOEI7WUFDN0MsS0FBSyxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDeEQsb0dBQW9HO1lBQ3BHLHdGQUF3RjtZQUN4RixTQUFTLEVBQUUsS0FBSztZQUNoQixPQUFPLEVBQUUsa0JBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBQSxnQ0FBYyxFQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckUsbUdBQW1HO1lBQ25HLDZGQUE2RjtZQUM3RixrR0FBa0c7WUFDbEcsZ0dBQWdHO1lBQ2hHLG9CQUFvQixFQUFFLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7U0FDOUYsQ0FBQyxDQUFDO1FBQ0gsbUdBQW1HO1FBQ25HLHVHQUF1RztRQUN2RyxxR0FBcUc7UUFDckcsd0RBQXdEO1FBQ3hELE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFDckIsWUFBWSxFQUFFLDZCQUFtQjtZQUNqQyxhQUFhLEVBQUUsNEJBQWtCO1lBQ2pDLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FBQztRQUVILG9HQUFvRztRQUNwRyxvR0FBb0c7UUFDcEcsb0dBQW9HO1FBQ3BHLHFHQUFxRztRQUNyRyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNoQyxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUNiLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUNwRyxPQUFPLFVBQVUsQ0FBQyxNQUFNLEdBQUcsZ0NBQXNCO29CQUMvQyxDQUFDLENBQUM7d0JBQ0EsMkJBQTJCLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLFVBQVUsQ0FBQyxNQUFNLEdBQUc7NEJBQ2hGLHVDQUF1QyxnQ0FBc0IsdUJBQXVCOzRCQUNwRiwyREFBMkQ7cUJBQ2hFO29CQUNELENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDVCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLEdBQXdCLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQzFELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNLLGtCQUFrQixDQUFDLE1BQTJCO1FBQ3BELElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUNiLG9DQUFvQyxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsMEJBQTBCO2dCQUMxRiwrRkFBK0Y7Z0JBQy9GLDJGQUEyRjtnQkFDM0Ysc0VBQXNFLENBQ3pFLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBMEMsQ0FBQztRQUMzRSxNQUFNLFFBQVEsR0FBRyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25HLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3JGLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHNDQUFzQyxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsNkJBQTZCO1lBQy9GLGdHQUFnRztZQUNoRywrRkFBK0Y7WUFDL0YsOEZBQThGO1lBQzlGLGtCQUFrQixDQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNLLG1CQUFtQixDQUFDLGNBQWtDLEVBQUUsU0FBa0M7UUFDaEcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hDLGlHQUFpRztZQUNqRyxrR0FBa0c7WUFDbEcsNENBQTRDO1lBQzVDLHlCQUFXLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksQ0FDcEMsc0NBQXNDLEVBQ3RDLDJCQUEyQixjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsMENBQTBDO2dCQUN6RiwyRkFBMkY7Z0JBQzNGLGdGQUFnRixDQUNuRixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBaUQsQ0FBQztRQUNsRixNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUUsZUFBNEUsQ0FBQztRQUNuRyxNQUFNLFFBQVEsR0FBRyxRQUFRLEVBQUUscUJBQXFCLENBQUM7UUFDakQsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNuRyxNQUFNLElBQUksS0FBSyxDQUNiLDJCQUEyQixjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsa0NBQWtDO2dCQUNqRixJQUFJLFFBQVEsa0ZBQWtGO2dCQUM5RixnREFBZ0QsQ0FDbkQsQ0FBQztRQUNKLENBQUM7SUFFSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxjQUFjLENBQ3BCLE1BQTJCLEVBQzNCLE1BQXFCLEVBQ3JCLFdBQW1CO1FBRW5CLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ25DLE1BQU0sR0FBRyxHQUE4QixFQUFFLENBQUM7UUFFMUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDdEQsbUdBQW1HO1lBQ25HLDhGQUE4RjtZQUM5Rix1RUFBdUU7WUFDdkUsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLHlCQUFXLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksQ0FDcEMsc0NBQXNDLEVBQ3RDLHNCQUFzQixTQUFTLENBQUMsYUFBYSxrQkFBa0IsQ0FBQyxLQUFLLFFBQVEsZUFBZTtvQkFDMUYsR0FBRyxNQUFNLENBQUMsUUFBUSxzQ0FBc0MsQ0FBQyxtQ0FBbUM7b0JBQzVGLHdGQUF3RjtvQkFDeEYsc0RBQXNELENBQ3pELENBQUM7WUFDSixDQUFDO1lBQ0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNiLENBQUM7UUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxtR0FBbUc7WUFDbkcsaUdBQWlHO1lBQ2pHLHVGQUF1RjtZQUN2RixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsbUJBQW1CLElBQUksaUJBQWlCLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFBLHVDQUFxQixFQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUNwQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsR0FBRyxJQUFBLDJDQUF5QixFQUFDLG1CQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJGLE1BQU0sWUFBWSxHQUFHLElBQUEsaUNBQWUsRUFBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUQsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUMvQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLElBQUEsc0NBQW9CLEVBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEYsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLHlCQUFXLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxzQ0FBc0MsRUFBRSxXQUFXLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUVELG9HQUFvRztRQUNwRyxpR0FBaUc7UUFDakcsbUVBQW1FO1FBQ25FLE1BQU0sT0FBTyxHQUFHLElBQUEsa0NBQWUsRUFBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekQsTUFBTSxJQUFJLEtBQUssQ0FDYiw0RkFBNEY7Z0JBQzFGLGdHQUFnRztnQkFDaEcsd0VBQXdFLENBQzNFLENBQUM7UUFDSixDQUFDO1FBQ0QsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxnQ0FBYSxDQUFDO1FBQzFFLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsZ0NBQWEsQ0FBQztRQUM1RSxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGdDQUFhLENBQUM7UUFFdEUsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDcEMsQ0FBQztRQUVELEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ25DLENBQUMsRUFBRSxjQUFjO1lBQ2pCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsT0FBTyxFQUFFLHVCQUFjLElBQUksWUFBWTtZQUN2QyxJQUFJLEVBQUUsSUFBQSwrQkFBYSxFQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDcEMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQ3hCLENBQUMsQ0FBQztRQUVILE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7QUExU0gsb0VBMlNDOzs7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLFNBQWtDLEVBQUUsSUFBWTtJQUN6RSxNQUFNLEdBQUcsR0FBSSxTQUFvRSxDQUFDLFdBQVcsQ0FBQztJQUM5RixJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3ZELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE9BQW1DO0lBQzVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIExhenksIFN0YWNrLCBUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgRVhQT1JURVJfTk9ORSwgcmVzb2x2ZWRTaWduYWxzIH0gZnJvbSAnLi9jb2xsZWN0b3ItY29uZmlnJztcbmltcG9ydCB7XG4gIEZBUkdBVEVfQUdFTlRTX0RJUixcbiAgRkFSR0FURV9BR0VOVFNfSU1BR0UsXG4gIEZBUkdBVEVfTUFYX0NPTlRBSU5FUlMsXG4gIEZBUkdBVEVfU0lERUNBUl9DT05UQUlORVJfTkFNRSxcbiAgRkFSR0FURV9WT0xVTUVfTkFNRSxcbn0gZnJvbSAnLi9nZW5lcmF0ZWQvZmFyZ2F0ZSc7XG5pbXBvcnQgeyBPRElHT1NfVkVSU0lPTiB9IGZyb20gJy4vZ2VuZXJhdGVkL2xheWVycyc7XG5pbXBvcnQge1xuICBGYXJnYXRlUmVjaXBlLFxuICBldmFsdWF0ZUFwcGVuZFBhdHRlcm4sXG4gIGV4cG9ydFRhcmdldEZvcixcbiAgZmFyZ2F0ZVJlc291cmNlQXR0cmlidXRlcyxcbiAgbGFuZ3VhZ2VLZXlPZixcbiAgcG9ydFByb3RvY29sTWlzbWF0Y2gsXG4gIHJlY2lwZUZvcixcbiAgc2lkZWNhckNvbW1hbmQsXG59IGZyb20gJy4vZmFyZ2F0ZS1yZWNpcGVzJztcbmltcG9ydCB7IE9kaWdvc0Rlc3RpbmF0aW9uLCBPZGlnb3NGYXJnYXRlTGFuZ3VhZ2UgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIFNlcnZpY2UgbmFtZSByZXBvcnRlZCBvbiBldmVyeSBzcGFuLCBtZXRyaWMgYW5kIGxvZyByZWNvcmQuICovXG5jb25zdCBFTlZfU0VSVklDRV9OQU1FID0gJ09URUxfU0VSVklDRV9OQU1FJztcbi8qKiBSZXNvdXJjZSBhdHRyaWJ1dGVzIGFkZGVkIHRvIGV2ZXJ5IHJlY29yZDogY2xvdWQgcHJvdmlkZXIsIHBsYXRmb3JtIGFuZCByZWdpb24uICovXG5jb25zdCBFTlZfUkVTT1VSQ0VfQVRUUklCVVRFUyA9ICdPVEVMX1JFU09VUkNFX0FUVFJJQlVURVMnO1xuLyoqIFdoZXJlIHRoZSBhZ2VudCBleHBvcnRzIE9UTFAuIE9uIEZhcmdhdGUgdGhpcyBpcyB0aGUgcmVhbCBkZXN0aW5hdGlvbiwgbm90IGEgbG9jYWxob3N0IGNvbGxlY3Rvci4gKi9cbmNvbnN0IEVOVl9PVExQX0VORFBPSU5UID0gJ09URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVCc7XG4vKiogVGhlIHRyYW5zcG9ydCBmb3IgdGhlIGVuZHBvaW50IGFib3ZlLiBUaGUgdHdvIGFyZSBvbmUgZGVjaXNpb24uICovXG5jb25zdCBFTlZfT1RMUF9QUk9UT0NPTCA9ICdPVEVMX0VYUE9SVEVSX09UTFBfUFJPVE9DT0wnO1xuLyoqIFBlci1yZXF1ZXN0IGhlYWRlcnMsIGluIHByYWN0aWNlIHRoZSBkZXN0aW5hdGlvbidzIGNyZWRlbnRpYWwuICovXG5jb25zdCBFTlZfT1RMUF9IRUFERVJTID0gJ09URUxfRVhQT1JURVJfT1RMUF9IRUFERVJTJztcbi8qKiBSYWlzZXMgYWdlbnQgdmVyYm9zaXR5IGludG8gdGhlIGNvbnRhaW5lcidzIGxvZyBzdHJlYW0uICovXG5jb25zdCBFTlZfT1RFTF9MT0dfTEVWRUwgPSAnT1RFTF9MT0dfTEVWRUwnO1xuLyoqIFRoZSB0aHJlZSBwZXItc2lnbmFsIGV4cG9ydGVyIHN3aXRjaGVzLiAqL1xuY29uc3QgRU5WX1RSQUNFU19FWFBPUlRFUiA9ICdPVEVMX1RSQUNFU19FWFBPUlRFUic7XG5jb25zdCBFTlZfTUVUUklDU19FWFBPUlRFUiA9ICdPVEVMX01FVFJJQ1NfRVhQT1JURVInO1xuY29uc3QgRU5WX0xPR1NfRVhQT1JURVIgPSAnT1RFTF9MT0dTX0VYUE9SVEVSJztcbi8qKiBWYWx1ZSBhIHN1cHBvcnRlZCBzaWduYWwncyBleHBvcnRlciBpcyBzZXQgdG8uICovXG5jb25zdCBFWFBPUlRFUl9PVExQID0gJ290bHAnO1xuXG4vKipcbiAqIFNjaGVtYSB2ZXJzaW9uIG9mIHRoZSBtYXJrZXIgcGF5bG9hZC4gTXVzdCBtYXRjaCBgYXBpLklhQ01hcmtlclZlcnNpb25gIGluIHRoZSBjb25uZWN0b3Ig4oCUIGl0IGlzIHdoYXRcbiAqIHRlbGxzIHRoZSBjb25uZWN0b3IgaG93IHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIG9iamVjdCwgc28gYSBidW1wZWQgdmVyc2lvbiB0aGVyZSBpcyBhIGNoYW5nZSBoZXJlLlxuICovXG5jb25zdCBNQVJLRVJfVkVSU0lPTiA9IDE7XG5cbi8qKlxuICogYE9ESUdPU19JQUNgIOKAlCB0aGUgbWFya2VyIHJlY29yZGluZyB0aGF0IHRoaXMgY29udGFpbmVyIHdhcyBpbnN0cnVtZW50ZWQgYnkgT2RpZ29zIElhQyB0b29saW5nLCBieVxuICogd2hpY2ggcGFja2FnZSB2ZXJzaW9uLCBhbmQgZm9yIHdoaWNoIGxhbmd1YWdlLlxuICpcbiAqIEl0IGlzIFBFUiBDT05UQUlORVIsIGFuZCBpdCBpcyB0aGUgb25seSB0aGluZyB0aGF0IG1ha2VzIE9kaWdvcyByZXBvcnQgYSBjb250YWluZXIgYXMgaW5zdHJ1bWVudGVkXG4gKiByYXRoZXIgdGhhbiBcImF3YWl0aW5nIHlvdXIgZGVwbG95bWVudFwiIOKAlCBob3dldmVyIGNvbXBsZXRlbHkgdGhlIHJlc3Qgb2YgdGhlIHdpcmluZyBpcyBhcHBsaWVkLiBBIHRhc2tcbiAqIGRlZmluaXRpb24gaG9sZGluZyB0d28gYXBwbGljYXRpb25zIG5lZWRzIGl0IG9uIGJvdGguXG4gKlxuICogVGhlIGBsYW5nYCBmaWVsZCBpcyBsb2FkLWJlYXJpbmcuIFRoZSBjb25uZWN0b3IncyBjb25mb3JtYW5jZSBjaGVjayByZWNvbnN0cnVjdHMgdGhlIGNvbnRhaW5lcidzXG4gKiBleHBlY3RlZCBhY3RpdmF0aW9uIGVudmlyb25tZW50IGZyb20gdGhlIHJlY29yZGVkIGxhbmd1YWdlLCBzbyBpdCBpcyB3aGF0IG1ha2VzIFwiaXMgdGhpcyBjb250YWluZXJcbiAqIGNvcnJlY3RseSBpbnN0cnVtZW50ZWRcIiBhbnN3ZXJhYmxlIGF0IGFsbCDigJQgYW5kIGl0IGlzIGNyb3NzLWNoZWNrZWQgYWdhaW5zdCB0aGUgbGFuZ3VhZ2UgdGhlIGNvbm5lY3RvclxuICogcmVzb2x2ZXMgaW5kZXBlbmRlbnRseSwgd2hpY2ggaXMgaG93IGFuIGltYWdlIHN3YXBwZWQgdW5kZXJuZWF0aCB0aGUgaW5zdHJ1bWVudGF0aW9uIGlzIGNhdWdodC5cbiAqXG4gKiBgaW1hZ2VgIGlzIHRoZSBvdGhlciBvbmUsIGFuZCBpdCBpcyB0aGUgRmFyZ2F0ZSBjb3VudGVycGFydCBvZiB3aGF0IExhbWJkYSByZWNvcmRzIGFzIGBsYXllcmAuIFRoZVxuICogY29ubmVjdG9yIGNvbXBhcmVzIHRoZSBzdGFnaW5nIGNvbnRhaW5lcidzIGltYWdlIGFnYWluc3QgdGhlIG9uZSByZWNvcmRlZCBIRVJFIHJhdGhlciB0aGFuIGFnYWluc3QgdGhlXG4gKiBidW5kbGUgaXRzIG93biBidWlsZCBoYXBwZW5zIHRvIHBpbiwgc28gYSBwYWNrYWdlIHJlbGVhc2VkIGFoZWFkIG9mIHRoZSBjb25uZWN0b3IgaXMgbm90IHJlcG9ydGVkIGFzXG4gKiBkcmlmdCBvbiBldmVyeSB0YXNrIGluIHRoZSBhY2NvdW50IHRoZSBkYXkgaXQgbGFuZHMuIFJlY29yZGluZyBpdCBpcyBhbHNvIHdoYXQgbWFrZXMgYGFnZW50c0ltYWdlYFxuICogc2FmZTogYSBtaXJyb3JlZCBpbWFnZSBpcyBqdWRnZWQgYWdhaW5zdCBpdHNlbGYgaW5zdGVhZCBvZiBhZ2FpbnN0IGEgcmVnaXN0cnkgdGhlIGN1c3RvbWVyIGRlbGliZXJhdGVseVxuICogbW92ZWQgYXdheSBmcm9tLlxuICpcbiAqIEl0IGlzIE5PVCBgT0RJR09TX01BTkFHRURgLCBhbmQgdGhpcyBjb25zdHJ1Y3QgbmV2ZXIgd3JpdGVzIHRoYXQgb25lLiBUaGF0IGlzIHRoZSBjb25uZWN0b3IncyBvd25cbiAqIHJlY29yZCBvZiBhIG11dGF0aW9uIElUIHBlcmZvcm1lZCwgd2hvc2UgcGF5bG9hZCBpcyB0aGUgc25hcHNob3QgaXQgcmVzdG9yZXMgZnJvbSBvbiByb2xsYmFjay4gQSBDREtcbiAqIHN0YWNrIGhhcyBubyBzdWNoIHNuYXBzaG90IHRvIG9mZmVyLCBiZWNhdXNlIG5vdGhpbmcgd2FzIG11dGF0ZWQg4oCUIHRoZSBjb250YWluZXIgZGVmaW5pdGlvbiBiZWxvdyBJU1xuICogdGhlIGNvbnRhaW5lcidzIGRlZmluaXRpb24uIFdyaXRpbmcgaXQgYnkgaGFuZCB3b3VsZCBjbGFpbSBhIHJvbGxiYWNrIG5vYm9keSByZWNvcmRlZCwgYW5kIHRoZVxuICogY29ubmVjdG9yIHdvdWxkIHRoZW4ganVkZ2UgdGhlIGNvbnRhaW5lciBhZ2FpbnN0IHZhbHVlcyB0aGF0IGRvIG5vdCBleGlzdC5cbiAqL1xuY29uc3QgRU5WX0lBQ19NQVJLRVIgPSAnT0RJR09TX0lBQyc7XG5cbi8qKiBDb25zdHJ1Y3QgaWQgb2YgdGhlIHN0YWdpbmcgY29udGFpbmVyIGluc2lkZSB0aGUgdGFzayBkZWZpbml0aW9uJ3Mgc2NvcGUuICovXG5jb25zdCBTSURFQ0FSX0NPTlNUUlVDVF9JRCA9ICdPZGlnb3NBZ2VudCc7XG5cbi8qKlxuICogTWVtb3J5IHJlc2VydmF0aW9uIGZvciB0aGUgc3RhZ2luZyBjb250YWluZXIgb24gYW4gRUMyLW9ubHkgdGFzayBkZWZpbml0aW9uLCB3aGVyZSBFQ1MgcmVxdWlyZXMgZXZlcnlcbiAqIGNvbnRhaW5lciB0byBkZWNsYXJlIGl0cyBvd24gaWYgdGhlIHRhc2sgZG9lcyBub3QuIE5ldmVyIHNldCBvbiBhIEZhcmdhdGUgdGFzayBkZWZpbml0aW9uIOKAlCBzZWUgdGhlXG4gKiBjYWxsIHNpdGUuXG4gKi9cbmNvbnN0IFNJREVDQVJfRUMyX01FTU9SWV9NSUIgPSA2NDtcblxuLyoqXG4gKiBPcHRpb25zIHNoYXJlZCBieSBldmVyeSBjb250YWluZXIgdGhpcyBjb25zdHJ1Y3QgaW5zdHJ1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hlcmUgdGhlIGluc3RydW1lbnRlZCBjb250YWluZXJzIGV4cG9ydCB0ZWxlbWV0cnkgdG8uXG4gICAqXG4gICAqIFVubGlrZSBMYW1iZGEsIEJPVEggdHJhbnNwb3J0cyBtYXkgYmUgc2V0IGFuZCBvZnRlbiBzaG91bGQgYmU6IGEgRmFyZ2F0ZSB0YXNrIGhhcyBubyBjb2xsZWN0b3Igb2YgaXRzXG4gICAqIG93biwgc28gZWFjaCBsYW5ndWFnZSdzIGFnZW50IGV4cG9ydHMgdG8gdGhpcyBkZXN0aW5hdGlvbiBpdHNlbGYgYW5kIHRha2VzIHRoZSB0cmFuc3BvcnQgaXQgcHJlZmVycy5cbiAgICogcGhwIGFuZCBydWJ5IGNhbiBvbmx5IHNwZWFrIE9UTFAvSFRUUCBhdCBhbGwuXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbjogT2RpZ29zRGVzdGluYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBhZ2VudHMgYnVuZGxlIHRoZSBzdGFnaW5nIGNvbnRhaW5lciBjb3BpZXMgdGhlIGxhbmd1YWdlIGFnZW50cyBvdXQgb2YuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBtdWx0aS1hcmNoIGltYWdlIHRoaXMgcGFja2FnZSdzIHJlbGVhc2UgcHVibGlzaGVkLCBhdCB0aGF0IHJlbGVhc2UncyBpbW11dGFibGUgdGFnLlxuICAgKiBPdmVycmlkZSBpdCB0byBtaXJyb3IgdGhlIGltYWdlIGludG8gYSByZWdpc3RyeSB5b3VyIHRhc2tzIGNhbiByZWFjaCDigJQgdGhlIGltYWdlIGlzIHB1bGxlZCBieSBZT1VSXG4gICAqIHRhc2sncyBleGVjdXRpb24gcm9sZSBhdCBldmVyeSB0YXNrIHN0YXJ0LCBzbyBhIHRhc2sgaW4gYSBwcml2YXRlIHN1Ym5ldCB3aXRoIG5vIE5BVCBhbmQgbm9cbiAgICogaW50ZXJmYWNlIGVuZHBvaW50IGNhbm5vdCBwdWxsIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBBIG1pcnJvciBtdXN0IGJlIHRoZSBzYW1lIGJ1bmRsZTogdGhlIGFjdGl2YXRpb24gZW52aXJvbm1lbnQgc2V0IGJlbG93IG5hbWVzIGV4YWN0IHBhdGhzIGluc2lkZSBpdC5cbiAgICpcbiAgICogV2hhdGV2ZXIgeW91IHBhc3MgaXMgUkVDT1JERUQgaW4gdGhlIGBPRElHT1NfSUFDYCBtYXJrZXIsIGFuZCB0aGUgY29ubmVjdG9yIGhvbGRzIHRoZSB0YXNrIGRlZmluaXRpb25cbiAgICogdG8gdGhlIHJlY29yZGVkIGltYWdlIHJhdGhlciB0aGFuIHRvIHRoZSBidW5kbGUgaXRzIG93biBidWlsZCBwaW5zIOKAlCBzbyBhIG1pcnJvciBpcyBqdWRnZWQgYWdhaW5zdFxuICAgKiBpdHNlbGYsIGFuZCB0aGlzIGRvZXMgbm90IGhhdmUgdG8gYmUga2VwdCBpbiBzdGVwIHdpdGggdGhlIGNvbm5lY3RvcidzIHZlcnNpb24gdG8gc3RheSBjb25mb3JtYW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSByZWxlYXNlZCBgcmVnaXN0cnkub2RpZ29zLmlvL29kaWdvcy1mYXJnYXRlLWFnZW50c2AgaW1hZ2UgZm9yIHRoaXMgcGFja2FnZSB2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBhZ2VudHNJbWFnZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmFpc2UgYWdlbnQgdmVyYm9zaXR5IChgT1RFTF9MT0dfTEVWRUw9ZGVidWdgKSBvbiBldmVyeSBpbnN0cnVtZW50ZWQgY29udGFpbmVyLlxuICAgKlxuICAgKiBVc2VmdWwgd2hpbGUgd2lyaW5nIHVwIGEgZGVzdGluYXRpb24sIGV4cGVuc2l2ZSB0byBsZWF2ZSBvbiDigJQgYW5kIGl0IGlzIGNvbXBhcmVkOiB0aGUgY29ubmVjdG9yXG4gICAqIGV4cGVjdHMgdGhlIHZhcmlhYmxlIEFCU0VOVCB1bmxlc3MgZGVidWcgdGVsZW1ldHJ5IGlzIGVuYWJsZWQgZm9yIHRoZSBjb25uZWN0b3IgdG9vLCBzbyBsZWF2aW5nIHRoaXNcbiAgICogb24gY2FuIGl0c2VsZiBiZSByZXBvcnRlZCBhcyBkcmlmdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPbmUgY29udGFpbmVyIHRvIGluc3RydW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zRmFyZ2F0ZVRhcmdldCB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gY29udGFpbmVyLiBJdHMgdGFzayBkZWZpbml0aW9uIGlzIHRha2VuIGZyb20gaXQsIHNvIHRoZSBzdGFnaW5nIGNvbnRhaW5lciwgdGhlIHNoYXJlZFxuICAgKiB2b2x1bWUgYW5kIHRoZSBzdGFydHVwIGRlcGVuZGVuY3kgYXJlIGFkZGVkIHRvIHRoZSByaWdodCBvbmUgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lcjogZWNzLkNvbnRhaW5lckRlZmluaXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSB3aG9zZSBhZ2VudCB0byBzdGFnZSBhbmQgYWN0aXZhdGUuXG4gICAqXG4gICAqIFN0YXRlZCByYXRoZXIgdGhhbiBkZXRlY3RlZCDigJQgYSBjb250YWluZXIgZGVjbGFyZXMgYW4gaW1hZ2UsIG5vdCBhIHJ1bnRpbWUsIGFuZCByZXNvbHZpbmcgYSBsYW5ndWFnZVxuICAgKiBmcm9tIGFuIGltYWdlIG1lYW5zIHB1bGxpbmcgaXQuXG4gICAqL1xuICByZWFkb25seSBsYW5ndWFnZTogT2RpZ29zRmFyZ2F0ZUxhbmd1YWdlO1xuXG4gIC8qKlxuICAgKiBgT1RFTF9TRVJWSUNFX05BTUVgIGZvciB0aGlzIGNvbnRhaW5lci5cbiAgICpcbiAgICogVEhJUyBNVVNUIE1BVENIIFRIRSBXT1JLTE9BRCdTIE5BTUUgSU4gT0RJR09TLCB3aGljaCBmb3IgYSBGYXJnYXRlIHdvcmtsb2FkIGlzIHRoZSBFQ1MgU0VSVklDRSBuYW1lIOKAlFxuICAgKiBub3QgdGhlIHRhc2sgZGVmaW5pdGlvbiBmYW1pbHkgYW5kIG5vdCB0aGUgY29udGFpbmVyIG5hbWUuIEEgZGlmZmVyZW50IHZhbHVlIGlzIHJlcG9ydGVkIGFzXG4gICAqIGluc3RydW1lbnRhdGlvbiBkcmlmdCByYXRoZXIgdGhhbiB0cmVhdGVkIGFzIGEgbmFtaW5nIHByZWZlcmVuY2UuXG4gICAqXG4gICAqIFBhc3MgYHNlcnZpY2VgIGluc3RlYWQgdG8gcmVhZCBpdCBvZmYgdGhlIHNlcnZpY2UsIG9yIHNldCB0aGlzIHdoZW4gdGhlIHNlcnZpY2UgaXMgZGVmaW5lZCBlbHNld2hlcmVcbiAgICogKGEgZGlmZmVyZW50IHN0YWNrLCBUZXJyYWZvcm0sIHRoZSBjb25zb2xlKS4gT25lIG9mIHRoZSB0d28gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFrZW4gZnJvbSBgc2VydmljZWBcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRUNTIHNlcnZpY2UgdGhhdCBydW5zIHRoaXMgdGFzayBkZWZpbml0aW9uLCB1c2VkIG9ubHkgdG8gcmVhZCBpdHMgbmFtZS5cbiAgICpcbiAgICogSXRzIHBoeXNpY2FsIG5hbWUgaGFzIHRvIGJlIG9uZSB5b3VyIHN0YWNrIFNFVCwgbm90IG9uZSBDbG91ZEZvcm1hdGlvbiBnZW5lcmF0ZXM6IGEgZ2VuZXJhdGVkIG5hbWUgaXNcbiAgICogYSBgUmVmYCB0byB0aGUgc2VydmljZSwgYW5kIGEgc2VydmljZSdzIG93biB0YXNrIGRlZmluaXRpb24gcmVmZXJlbmNpbmcgaXQgaXMgYSBkZXBlbmRlbmN5IGN5Y2xlXG4gICAqIENsb3VkRm9ybWF0aW9uIHJlamVjdHMgYXQgZGVwbG95IHRpbWUuIEEgZ2VuZXJhdGVkIG5hbWUgdGhyb3dzIGF0IHN5bnRoIHBvaW50aW5nIGF0IGBzZXJ2aWNlTmFtZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYHNlcnZpY2VOYW1lYCBtdXN0IGJlIGdpdmVuIGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2U/OiBlY3MuQmFzZVNlcnZpY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbidzIHJ1bnRpbWUgdmVyc2lvbiBhcyBgbWFqb3IubWlub3JgIOKAlCBmb3IgZXhhbXBsZSBgXCI4LjNcImAuXG4gICAqXG4gICAqIFJlcXVpcmVkIGZvciBwaHAgYW5kIHJ1YnksIHdob3NlIGFnZW50cyBhcmUgbGFpZCBkb3duIHBlciBydW50aW1lIHZlcnNpb24gaW4gdGhlIGJ1bmRsZSwgYW5kIHRoZVxuICAgKiB2ZXJzaW9uIHNlbGVjdHMgdGhlIHBhdGggdGhlaXIgYWN0aXZhdGlvbiB2YXJpYWJsZXMgcG9pbnQgYXQuIElnbm9yZWQgYnkgZXZlcnkgb3RoZXIgbGFuZ3VhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZTsgcmVxdWlyZWQgZm9yIHBocCBhbmQgcnVieVxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0aGlzIGNvbnRhaW5lciBhbHJlYWR5IG5lZWRzIGluIGl0cyBsb2FkZXIgdmFyaWFibGUgKGBKQVZBX1RPT0xfT1BUSU9OU2AsIGBOT0RFX09QVElPTlNgIG9yXG4gICAqIGBQWVRIT05QQVRIYCksIHdoaWNoIHRoZSBPZGlnb3MgZnJhZ21lbnQgaXMgam9pbmVkIHRvIHJhdGhlciB0aGFuIHJlcGxhY2luZy5cbiAgICpcbiAgICogT25seSBuZWVkZWQgYXMgYW4gT1ZFUlJJREUuIFRoZSBjb25zdHJ1Y3QgcmVhZHMgdGhlIHZhbHVlIHRoZSBjb250YWluZXIgd2FzIGNyZWF0ZWQgd2l0aCBhbmQgYXBwZW5kc1xuICAgKiB0byBpdCwgc28gYSBjb250YWluZXIgdGhhdCBzZXRzIGl0cyBvd24gYEpBVkFfVE9PTF9PUFRJT05TYCBpbiBgYWRkQ29udGFpbmVyYCBrZWVwcyBpdC4gUGFzcyB0aGlzIHdoZW5cbiAgICogdGhlIHZhbHVlIGlzIG5vdCB2aXNpYmxlIGF0IHN5bnRoIOKAlCBzZXQgYnkgYW4gYGVudmlyb25tZW50RmlsZXNgIGVudHJ5LCBpbmplY3RlZCBieSB0aGUgaW1hZ2UncyBvd25cbiAgICogYEVOVmAsIG9yIHN1cHBsaWVkIHRocm91Z2ggYHNlY3JldHNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHJlYWQgZnJvbSB0aGUgY29udGFpbmVyJ3Mgb3duIGVudmlyb25tZW50XG4gICAqL1xuICByZWFkb25seSBleGlzdGluZ0xvYWRlclZhbHVlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvblByb3BzIGV4dGVuZHMgT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogQ29udGFpbmVycyB0byBpbnN0cnVtZW50IG9uIGNvbnN0cnVjdGlvbi4gTW9yZSBjYW4gYmUgYWRkZWQgd2l0aCBgaW5zdHJ1bWVudCgpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRzPzogT2RpZ29zRmFyZ2F0ZVRhcmdldFtdO1xufVxuXG4vKiogUGVyLXRhc2stZGVmaW5pdGlvbiBzdGF0ZTogdGhlIHN0YWdpbmcgY29udGFpbmVyLCBhbmQgd2hhdCBpdCBoYXMgYmVlbiBhc2tlZCB0byBzdGFnZS4gKi9cbmludGVyZmFjZSBUYXNrRGVmaW5pdGlvblN0YXRlIHtcbiAgcmVhZG9ubHkgc2lkZWNhcjogZWNzLkNvbnRhaW5lckRlZmluaXRpb247XG4gIHJlYWRvbmx5IGFnZW50RGlyczogU2V0PHN0cmluZz47XG59XG5cbi8qKlxuICogSW5zdHJ1bWVudHMgRUNTIEZhcmdhdGUgY29udGFpbmVycyB3aXRoIHRoZSBPZGlnb3MgT3BlblRlbGVtZXRyeSBhZ2VudHMuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IG9kaWdvcyA9IG5ldyBPZGlnb3NGYXJnYXRlSW5zdHJ1bWVudGF0aW9uKHRoaXMsICdPZGlnb3MnLCB7XG4gKiAgIGRlc3RpbmF0aW9uOiB7IGh0dHBFbmRwb2ludDogJ2h0dHBzOi8vb3RscC5leGFtcGxlLmNvbTo0MzE4JyB9LFxuICogfSk7XG4gKiBvZGlnb3MuaW5zdHJ1bWVudCh7XG4gKiAgIGNvbnRhaW5lcjogYXBpQ29udGFpbmVyLFxuICogICBsYW5ndWFnZTogT2RpZ29zRmFyZ2F0ZUxhbmd1YWdlLkpBVkEsXG4gKiAgIHNlcnZpY2U6IGFwaVNlcnZpY2UsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICMjIFdoYXQgaXQgZG9lcyB0byB0aGUgdGFzayBkZWZpbml0aW9uXG4gKlxuICogRm91ciBtb3Zlcywgd2hpY2ggYXJlIG9uZSBtZWNoYW5pc20gYW5kIG9ubHkgd29yayB0b2dldGhlciDigJQgdGhlIEVDUyBhZGFwdGF0aW9uIG9mIHRoZSBPZGlrb3NcbiAqIGluaXQtY29udGFpbmVyIG1vdW50IG1ldGhvZDpcbiAqXG4gKiAgMS4gYSBiYXJlLW5hbWUgdGFzayB2b2x1bWUgKGBvZGlnb3MtYWdlbnRgKSwgd2hpY2ggb24gRmFyZ2F0ZSBpcyBhbiBlcGhlbWVyYWwtc3RvcmFnZSBiaW5kIG1vdW50XG4gKiAgICAgc2NvcGVkIHRvIHRoZSB0YXNrO1xuICogIDIuIGEgTk9OLUVTU0VOVElBTCBgb2RpZ29zLWFnZW50YCBjb250YWluZXIgdGhhdCBjb3BpZXMgdGhlIGxhbmd1YWdlIGFnZW50cyBvdXQgb2YgdGhlIGFnZW50cyBidW5kbGVcbiAqICAgICBpbnRvIHRoYXQgdm9sdW1lIGFuZCBleGl0cyAwO1xuICogIDMuIHRoZSB2b2x1bWUgbW91bnRlZCByZWFkLW9ubHkgYXQgYC92YXIvb2RpZ29zYCBpbiBlYWNoIGluc3RydW1lbnRlZCBjb250YWluZXIsIHdoaWNoIGRlcGVuZHMgb24gdGhlXG4gKiAgICAgc3RhZ2luZyBjb250YWluZXIgd2l0aCBjb25kaXRpb24gYFNVQ0NFU1NgIOKAlCBvbmx5IHZhbGlkIGFnYWluc3QgYSBub24tZXNzZW50aWFsIGNvbnRhaW5lciwgd2hpY2ggaXNcbiAqICAgICB3aHkgKDIpIGlzIG5vbi1lc3NlbnRpYWw7XG4gKiAgNC4gdGhlIGxhbmd1YWdlJ3MgYWN0aXZhdGlvbiBlbnZpcm9ubWVudCwgdGhlIE9UTFAgZXhwb3J0IGVudmlyb25tZW50LCBhbmQgdGhlIGBPRElHT1NfSUFDYCBtYXJrZXIgb25cbiAqICAgICBlYWNoIGluc3RydW1lbnRlZCBjb250YWluZXIuXG4gKlxuICogVGhlcmUgaXMgT05FIHN0YWdpbmcgY29udGFpbmVyIHBlciB0YXNrIGRlZmluaXRpb24gaG93ZXZlciBtYW55IGxhbmd1YWdlcyB0aGUgdGFzayBob2xkczsgaXRzIGNvbW1hbmRcbiAqIGlzIHRoZSB1bmlvbiBvZiBldmVyeSBpbnN0cnVtZW50ZWQgY29udGFpbmVyJ3MgYWdlbnQgZGlyZWN0b3JpZXMsIGFuZCBpdCBpcyBidWlsdCBsYXppbHkgc28gY29udGFpbmVyc1xuICogaW5zdHJ1bWVudGVkIGxhdGVyIGFyZSBpbmNsdWRlZC5cbiAqXG4gKiAjIyBXaGVyZSB0aGUgdGVsZW1ldHJ5IGdvZXNcbiAqXG4gKiBTdHJhaWdodCB0byB5b3VyIGRlc3RpbmF0aW9uLCBmcm9tIGluc2lkZSB0aGUgYXBwbGljYXRpb24gcHJvY2Vzcy4gVGhpcyBpcyB0aGUgc3Vic3RhbnRpdmUgZGlmZmVyZW5jZVxuICogZnJvbSBMYW1iZGE6IHRoZXJlIGlzIG5vIGNvbGxlY3RvciBpbiB0aGUgdGFzayB0byBoYW5kIGEgYmF0Y2ggdG8sIHNvIGEgc2xvdyBvciB1bnJlYWNoYWJsZSBkZXN0aW5hdGlvblxuICogaXMgZmVsdCBieSB0aGUgYXBwbGljYXRpb24ncyBvd24gZXhwb3J0ZXIgcmF0aGVyIHRoYW4gYWJzb3JiZWQgYWZ0ZXIgYSByZXNwb25zZSBoYXMgYmVlbiByZXR1cm5lZC5cbiAqXG4gKiAjIyBXaGF0IGl0IGRlbGliZXJhdGVseSBkb2VzIE5PVCBkb1xuICpcbiAqIFRoZXJlIGlzIG5vIGFzcGVjdCB0aGF0IHN3ZWVwcyBhIHNjb3BlLCBhcyB0aGVyZSBpcyBmb3IgTGFtYmRhLiBBbiBhc3BlY3QgdGhlcmUgd29ya3MgYmVjYXVzZSBhXG4gKiBmdW5jdGlvbiBERUNMQVJFUyBpdHMgcnVudGltZTsgYSBjb250YWluZXIgZGVjbGFyZXMgYW4gaW1hZ2UsIGFuZCBhIGxhbmd1YWdlIGd1ZXNzZWQgZnJvbSBhbiBpbWFnZSBuYW1lXG4gKiB3b3VsZCBzaWxlbnRseSBtaXMtaW5zdHJ1bWVudCB0aGUgb25lcyBpdCBnb3Qgd3Jvbmcg4oCUIHN0YWdpbmcgYSBKYXZhIGFnZW50IGludG8gYSBQeXRob24gY29udGFpbmVyXG4gKiBsZWF2ZXMgaXQgdW5pbnN0cnVtZW50ZWQsIGFuZCBhIGBKQVZBX1RPT0xfT1BUSU9OU2Agb24gYSBKVk0tbGVzcyBpbWFnZSBpcyBzaW1wbHkgaWdub3JlZCwgc28gbm90aGluZ1xuICogZmFpbHMgbG91ZGx5IGVub3VnaCB0byBub3RpY2UuXG4gKlxuICogIyMgRG8gbm90IGFsc28gaW5zdHJ1bWVudCB0aGVzZSBzZXJ2aWNlcyB3aXRoIHRoZSBjb25uZWN0b3JcbiAqXG4gKiBUaGUgY29ubmVjdG9yIGluc3RydW1lbnRzIGxpdmUgc2VydmljZXMgYnkgcmVnaXN0ZXJpbmcgYSBuZXcgdGFzay1kZWZpbml0aW9uIHJldmlzaW9uIGFuZCB1cGRhdGluZyB0aGVcbiAqIHNlcnZpY2UgdG8gaXQsIHJlY29uY2lsaW5nIHRvIGl0cyBvd24gZGVzaXJlZCBzdGF0ZSBvbiBldmVyeSBwYXNzLiBBIHNlcnZpY2UgaW5zdHJ1bWVudGVkIGhlcmUgYW5kIGFsc29cbiAqIGVuYWJsZWQgYXMgYSBjb25uZWN0b3Igc291cmNlIGVuZHMgdXAgb3duZWQgYnkgYm90aDogZWFjaCBgY2RrIGRlcGxveWAgcmVhc3NlcnRzIHRoZSBzdGFjaydzXG4gKiBkZWZpbml0aW9uLCBlYWNoIHJlY29uY2lsZSByZWFzc2VydHMgdGhlIGNvbm5lY3RvcidzLCBhbmQgZXZlcnkgcm91bmQgdHJpcCByZWdpc3RlcnMgYSByZXZpc2lvbiBhbmRcbiAqIHJvbGxzIHRoZSBzZXJ2aWNlLiBDaG9vc2Ugb25lIHBlciBzZXJ2aWNlLlxuICovXG5leHBvcnQgY2xhc3MgT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvbk9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWdlbnRzSW1hZ2U6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB0YXNrRGVmaW5pdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgVGFza0RlZmluaXRpb25TdGF0ZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0cnVtZW50ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogT2RpZ29zRmFyZ2F0ZUluc3RydW1lbnRhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBwcm9wcztcblxuICAgIGNvbnN0IGltYWdlID0gcHJvcHMuYWdlbnRzSW1hZ2UgPz8gRkFSR0FURV9BR0VOVFNfSU1BR0U7XG4gICAgaWYgKCFpbWFnZSkge1xuICAgICAgLy8gRW1wdHkgb25seSBpbiBhIGNoZWNrb3V0IGJ1aWx0IGJlZm9yZSB0aGUgZmlyc3QgcmVsZWFzZS4gRmFpbGluZyBoZXJlIGlzIHRoZSBwb2ludDogdGhlXG4gICAgICAvLyBhbHRlcm5hdGl2ZSBpcyBhIHRhc2sgZGVmaW5pdGlvbiB3aG9zZSBzdGFnaW5nIGNvbnRhaW5lciBuYW1lcyBhIHRhZyB0aGF0IGRvZXMgbm90IGV4aXN0LCB3aGljaFxuICAgICAgLy8gc3VyZmFjZXMgYXMgYSB0YXNrIHRoYXQgd2lsbCBub3Qgc3RhcnQsIGF0IGRlcGxveSB0aW1lLCBpbiBhIHBsYWNlIHRoYXQgc2F5cyBub3RoaW5nIGFib3V0IHdoeS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ09kaWdvczogdGhpcyBidWlsZCBvZiBAb2RpZ29zL2F3cy1jZGsgaGFzIG5vIEZhcmdhdGUgYWdlbnRzIGltYWdlIGJha2VkIGluIOKAlCBpdCB3YXMgYnVpbHQgJyArXG4gICAgICAgICAgJ2JlZm9yZSB0aGUgZmlyc3QgcmVsZWFzZS4gVXNlIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSwgb3IgcGFzcyBgYWdlbnRzSW1hZ2VgICcgK1xuICAgICAgICAgICdleHBsaWNpdGx5LicsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFnZW50c0ltYWdlID0gaW1hZ2U7XG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBwcm9wcy50YXJnZXRzID8/IFtdKSB7XG4gICAgICB0aGlzLmluc3RydW1lbnQodGFyZ2V0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdHJ1bWVudHMgb25lIGNvbnRhaW5lci4gSWRlbXBvdGVudCDigJQgaW5zdHJ1bWVudGluZyB0aGUgc2FtZSBjb250YWluZXIgdHdpY2UgaXMgYSBuby1vcCByYXRoZXIgdGhhblxuICAgKiBhIGRvdWJsZWQgbG9hZGVyIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGluc3RydW1lbnQodGFyZ2V0OiBPZGlnb3NGYXJnYXRlVGFyZ2V0KTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGFyZ2V0LmNvbnRhaW5lcjtcbiAgICBjb25zdCBrZXkgPSBjb250YWluZXIubm9kZS5wYXRoO1xuICAgIGlmICh0aGlzLmluc3RydW1lbnRlZC5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhc2tEZWZpbml0aW9uID0gY29udGFpbmVyLnRhc2tEZWZpbml0aW9uO1xuICAgIGNvbnN0IHJlY2lwZSA9IHJlY2lwZUZvcih0YXJnZXQubGFuZ3VhZ2UsIHRhcmdldC5ydW50aW1lVmVyc2lvbik7XG4gICAgY29uc3Qgc2VydmljZU5hbWUgPSB0aGlzLnJlc29sdmVTZXJ2aWNlTmFtZSh0YXJnZXQpO1xuXG4gICAgdGhpcy5jaGVja1Rhc2tEZWZpbml0aW9uKHRhc2tEZWZpbml0aW9uLCBjb250YWluZXIpO1xuICAgIHRoaXMuaW5zdHJ1bWVudGVkLmFkZChrZXkpO1xuXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnRhc2tEZWZpbml0aW9uU3RhdGUodGFza0RlZmluaXRpb24pO1xuICAgIGZvciAoY29uc3QgZGlyIG9mIHJlY2lwZS5hZ2VudERpcnMpIHtcbiAgICAgIHN0YXRlLmFnZW50RGlycy5hZGQoZGlyKTtcbiAgICB9XG5cbiAgICAvLyBSZWFkLW9ubHk6IHRoZSBhZ2VudHMgYXJlIG9ubHkgcmVhZCBoZXJlLCBhbmQgdGhlIHN0YWdpbmcgY29udGFpbmVyIG93bnMgdGhlIHdyaXRlcy5cbiAgICBjb250YWluZXIuYWRkTW91bnRQb2ludHMoe1xuICAgICAgc291cmNlVm9sdW1lOiBGQVJHQVRFX1ZPTFVNRV9OQU1FLFxuICAgICAgY29udGFpbmVyUGF0aDogRkFSR0FURV9BR0VOVFNfRElSLFxuICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgfSk7XG4gICAgLy8gU1VDQ0VTUywgbm90IFNUQVJUOiB0aGUgYWdlbnQgZmlsZXMgaGF2ZSB0byBiZSBvbiBkaXNrIGJlZm9yZSB0aGUgYXBwbGljYXRpb24gcHJvY2VzcyBiZWdpbnMsIGFuZFxuICAgIC8vIHRoZSBzdGFnaW5nIGNvbnRhaW5lciBleGl0cyBhcyBzb29uIGFzIHRoZXkgYXJlLlxuICAgIGNvbnRhaW5lci5hZGRDb250YWluZXJEZXBlbmRlbmNpZXMoe1xuICAgICAgY29udGFpbmVyOiBzdGF0ZS5zaWRlY2FyLFxuICAgICAgY29uZGl0aW9uOiBlY3MuQ29udGFpbmVyRGVwZW5kZW5jeUNvbmRpdGlvbi5TVUNDRVNTLFxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW52aXJvbm1lbnRGb3IodGFyZ2V0LCByZWNpcGUsIHNlcnZpY2VOYW1lKSkpIHtcbiAgICAgIGNvbnRhaW5lci5hZGRFbnZpcm9ubWVudChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEluc3RydW1lbnRzIGV2ZXJ5IHRhcmdldCBpbiB0aGUgbGlzdC4gKi9cbiAgcHVibGljIGluc3RydW1lbnRBbGwodGFyZ2V0czogT2RpZ29zRmFyZ2F0ZVRhcmdldFtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KHRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0YXNrIGRlZmluaXRpb24ncyBzdGFnaW5nIGNvbnRhaW5lciBhbmQgdm9sdW1lLCBjcmVhdGVkIG9uY2UgYW5kIHNoYXJlZCBieSBldmVyeSBjb250YWluZXIgaW4gaXQuXG4gICAqXG4gICAqIFRoZSBjb21tYW5kIGlzIGEgbGF6eSBsaXN0IHJhdGhlciB0aGFuIGEgbGl0ZXJhbCBiZWNhdXNlIHRoZSB1bmlvbiBpdCByZW5kZXJzIGlzIG5vdCBrbm93biB1bnRpbFxuICAgKiBzeW50aGVzaXM6IGEgdGFzayBkZWZpbml0aW9uIGhvbGRpbmcgYSBKYXZhIGFuZCBhIFB5dGhvbiBhcHBsaWNhdGlvbiBpcyBpbnN0cnVtZW50ZWQgYnkgdHdvXG4gICAqIGBpbnN0cnVtZW50KClgIGNhbGxzLCBhbmQgdGhlIHNpbmdsZSBzdGFnaW5nIGNvbnRhaW5lciBoYXMgdG8gc3RhZ2UgYm90aC4gVGhlIGNvbm5lY3RvciBjb21wYXJlcyB0aGlzXG4gICAqIGNvbW1hbmQgYWdhaW5zdCBleGFjdGx5IHRoYXQgdW5pb24sIHNvIGEgc3RhbGUgb25lIGlzIHJlcG9ydGVkIGFzIGRyaWZ0IG9uIHRoZSB3aG9sZSB0YXNrIGRlZmluaXRpb25cbiAgICogYW5kIGxlYXZlcyBvbmUgb2YgdGhlIGNvbnRhaW5lcnMgd2l0aCBubyBhZ2VudCBvbiBkaXNrLlxuICAgKi9cbiAgcHJpdmF0ZSB0YXNrRGVmaW5pdGlvblN0YXRlKHRhc2tEZWZpbml0aW9uOiBlY3MuVGFza0RlZmluaXRpb24pOiBUYXNrRGVmaW5pdGlvblN0YXRlIHtcbiAgICBjb25zdCBrZXkgPSB0YXNrRGVmaW5pdGlvbi5ub2RlLnBhdGg7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnRhc2tEZWZpbml0aW9ucy5nZXQoa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG5cbiAgICAvLyBBIGJhcmUtbmFtZSB2b2x1bWUg4oCUIG5vIGhvc3QsIGRvY2tlciBvciBFRlMgY29uZmlndXJhdGlvbiDigJQgaXMgYSBGYXJnYXRlIGVwaGVtZXJhbC1zdG9yYWdlIGJpbmRcbiAgICAvLyBtb3VudCBzY29wZWQgdG8gdGhlIHRhc2ssIHdoaWNoIGlzIGV4YWN0bHkgdGhlIHNoYXJlZCBzdGFnaW5nIGFyZWEgbmVlZGVkIGFuZCB0aGUgb25seSBraW5kIEZhcmdhdGVcbiAgICAvLyBvZmZlcnMgKHRoZXJlIGlzIG5vIHRtcGZzKS5cbiAgICB0YXNrRGVmaW5pdGlvbi5hZGRWb2x1bWUoeyBuYW1lOiBGQVJHQVRFX1ZPTFVNRV9OQU1FIH0pO1xuXG4gICAgY29uc3QgYWdlbnREaXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgc2lkZWNhciA9IHRhc2tEZWZpbml0aW9uLmFkZENvbnRhaW5lcihTSURFQ0FSX0NPTlNUUlVDVF9JRCwge1xuICAgICAgY29udGFpbmVyTmFtZTogRkFSR0FURV9TSURFQ0FSX0NPTlRBSU5FUl9OQU1FLFxuICAgICAgaW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkodGhpcy5hZ2VudHNJbWFnZSksXG4gICAgICAvLyBOb24tZXNzZW50aWFsIGlzIG5vdCBhIHByZWZlcmVuY2U6IGl0IGlzIHdoYXQgbWFrZXMgdGhlIFNVQ0NFU1MgZGVwZW5kZW5jeSBhYm92ZSBsZWdhbCwgYW5kIGl0IGlzXG4gICAgICAvLyB3aGF0IHN0b3BzIGEgY29waWVyIHRoYXQgaGFzIGZpbmlzaGVkIGl0cyBqb2IgZnJvbSBmYWlsaW5nIHRoZSB3aG9sZSB0YXNrIGJ5IGV4aXRpbmcuXG4gICAgICBlc3NlbnRpYWw6IGZhbHNlLFxuICAgICAgY29tbWFuZDogTGF6eS5saXN0KHsgcHJvZHVjZTogKCkgPT4gc2lkZWNhckNvbW1hbmQoWy4uLmFnZW50RGlyc10pIH0pLFxuICAgICAgLy8gRmFyZ2F0ZSBhbGxvY2F0ZXMgbWVtb3J5IGF0IHRoZSB0YXNrIGxldmVsLCBzbyB0aGUgc3RhZ2luZyBjb250YWluZXIgZGVjbGFyZXMgbm9uZSB0aGVyZSDigJQgd2hpY2hcbiAgICAgIC8vIGtlZXBzIHRoZSByZW5kZXJlZCBjb250YWluZXIgYnl0ZS1pZGVudGljYWwgdG8gd2hhdCB0aGUgY29ubmVjdG9yIHdyaXRlcy4gQW4gRUMyLW9ubHkgdGFza1xuICAgICAgLy8gZGVmaW5pdGlvbiB3aXRob3V0IHRhc2stbGV2ZWwgbWVtb3J5IHJlcXVpcmVzIGV2ZXJ5IGNvbnRhaW5lciB0byBkZWNsYXJlIGl0cyBvd24sIHNvIG9uZSBpcyBzZXRcbiAgICAgIC8vIGZvciB0aGF0IGNhc2UgYWxvbmUuIEEgc29mdCByZXNlcnZhdGlvbiwgYW5kIGdlbmVyb3VzOiB0aGUgY29udGFpbmVyIGlzIGJ1c3lib3ggcnVubmluZyBgY3BgLlxuICAgICAgbWVtb3J5UmVzZXJ2YXRpb25NaUI6IHRhc2tEZWZpbml0aW9uLmlzRmFyZ2F0ZUNvbXBhdGlibGUgPyB1bmRlZmluZWQgOiBTSURFQ0FSX0VDMl9NRU1PUllfTUlCLFxuICAgIH0pO1xuICAgIC8vIFdyaXRhYmxlIGhlcmUg4oCUIHRoaXMgaXMgdGhlIGNvbnRhaW5lciB0aGF0IHB1dHMgdGhlIGZpbGVzIHRoZXJlLiBgcmVhZE9ubHlgIGlzIHJlcXVpcmVkIGJ5IENESydzXG4gICAgLy8gTW91bnRQb2ludCBzdHJ1Y3Qgd2hlcmUgdGhlIGNvbm5lY3RvciBzaW1wbHkgb21pdHMgaXQ7IGZhbHNlIGlzIHdoYXQgYW4gb21pdHRlZCB2YWx1ZSBtZWFucywgYW5kIHRoZVxuICAgIC8vIGNvbm5lY3RvcidzIHRhc2stbGV2ZWwgY2hlY2sgY29tcGFyZXMgdGhlIHN0YWdpbmcgY29udGFpbmVyJ3MgaW1hZ2UsIGVzc2VudGlhbGl0eSBhbmQgY29tbWFuZCwgbm90XG4gICAgLy8gaXRzIG1vdW50cywgc28gc3BlbGxpbmcgb3V0IHRoZSBkZWZhdWx0IGlzIG5vdCBkcmlmdC5cbiAgICBzaWRlY2FyLmFkZE1vdW50UG9pbnRzKHtcbiAgICAgIHNvdXJjZVZvbHVtZTogRkFSR0FURV9WT0xVTUVfTkFNRSxcbiAgICAgIGNvbnRhaW5lclBhdGg6IEZBUkdBVEVfQUdFTlRTX0RJUixcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICB9KTtcblxuICAgIC8vIFJlZ2lzdGVyZWQgaGVyZSwgd2l0aCB0aGUgc3RhZ2luZyBjb250YWluZXIsIHNvIGl0IGlzIGFkZGVkIG9uY2UgcGVyIHRhc2sgZGVmaW5pdGlvbiBob3dldmVyIG1hbnlcbiAgICAvLyBjb250YWluZXJzIGFyZSBpbnN0cnVtZW50ZWQgaW4gaXQg4oCUIGFuZCBjb3VudGVkIGF0IHN5bnRoLCBzbyBjb250YWluZXJzIGFkZGVkIGFmdGVyIHRoaXMgY2FsbCBhcmVcbiAgICAvLyBpbmNsdWRlZC4gQVdTIHJlamVjdHMgYSBSZWdpc3RlclRhc2tEZWZpbml0aW9uIG92ZXIgdGhlIGxpbWl0LCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3VyZmFjZSBhcyBhXG4gICAgLy8gZGVwbG95IGZhaWx1cmUgYWJvdXQgYSBjb250YWluZXIgY291bnQgd2l0aCBub3RoaW5nIHRvIHNheSBhYm91dCB3aGljaCBjb250YWluZXIgaXMgdGhlIGV4dHJhIG9uZS5cbiAgICB0YXNrRGVmaW5pdGlvbi5ub2RlLmFkZFZhbGlkYXRpb24oe1xuICAgICAgdmFsaWRhdGU6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFpbmVycyA9IHRhc2tEZWZpbml0aW9uLm5vZGUuY2hpbGRyZW4uZmlsdGVyKChjKSA9PiBjIGluc3RhbmNlb2YgZWNzLkNvbnRhaW5lckRlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gY29udGFpbmVycy5sZW5ndGggPiBGQVJHQVRFX01BWF9DT05UQUlORVJTXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICBgT2RpZ29zOiB0YXNrIGRlZmluaXRpb24gJHt0YXNrRGVmaW5pdGlvbi5ub2RlLmlkfSB3b3VsZCBoYXZlICR7Y29udGFpbmVycy5sZW5ndGh9IGAgK1xuICAgICAgICAgICAgICAgIGBjb250YWluZXJzLCBvdmVyIHRoZSBBV1MgbWF4aW11bSBvZiAke0ZBUkdBVEVfTUFYX0NPTlRBSU5FUlN9LiBPbmUgb2YgdGhlbSBpcyB0aGUgYCArXG4gICAgICAgICAgICAgICAgJ29kaWdvcy1hZ2VudCBzdGFnaW5nIGNvbnRhaW5lciB0aGlzIGluc3RydW1lbnRhdGlvbiBhZGRzLicsXG4gICAgICAgICAgXVxuICAgICAgICAgIDogW107XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RhdGU6IFRhc2tEZWZpbml0aW9uU3RhdGUgPSB7IHNpZGVjYXIsIGFnZW50RGlycyB9O1xuICAgIHRoaXMudGFza0RlZmluaXRpb25zLnNldChrZXksIHN0YXRlKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogYE9URUxfU0VSVklDRV9OQU1FYCBmb3IgYSB0YXJnZXQsIGFuZCB0aGUgb25lIHZhbHVlIGEgY2FsbGVyIGNhbm5vdCBiZSBhbGxvd2VkIHRvIGxlYXZlIHRvIGEgZGVmYXVsdC5cbiAgICpcbiAgICogVGhlIGNvbm5lY3RvciBjb21wYXJlcyBpdCBhZ2FpbnN0IHRoZSB3b3JrbG9hZCdzIG5hbWUgaW4gT2RpZ29zLCB3aGljaCBpcyB0aGUgRUNTIFNFUlZJQ0UgbmFtZSwgc29cbiAgICogZ3Vlc3Npbmcg4oCUIHRoZSB0YXNrIGRlZmluaXRpb24gZmFtaWx5LCB0aGUgY29udGFpbmVyIG5hbWUsIHRoZSBjb25zdHJ1Y3QgaWQg4oCUIHdvdWxkIHByb2R1Y2UgYSBzdGFja1xuICAgKiB0aGF0IGRlcGxveXMgY2xlYW5seSBhbmQgdGhlbiByZXBvcnRzIGFzIGRyaWZ0ZWQgb24gYSBjb21wb25lbnQgbm90aGluZyBpbiB0aGUgc3RhY2sgbWFrZXMgdmlzaWJsZS5cbiAgICpcbiAgICogUmVhZCBmcm9tIHRoZSBMMSwgbm90IGZyb20gYHNlcnZpY2Uuc2VydmljZU5hbWVgOiB0aGUgTDIgcHJvcGVydHkgaXMgYSB0b2tlbiB0aGF0IHJlc29sdmVzIHRvIGEgYFJlZmBcbiAgICogdG8gdGhlIHNlcnZpY2UgZXZlbiB3aGVuIHRoZSBzdGFjayBzZXQgdGhlIG5hbWUgZXhwbGljaXRseSwgYW5kIGEgYFJlZmAgaGVyZSBpcyB3b3JzZSB0aGFuIHVzZWxlc3Mg4oCUXG4gICAqIHRoZSB0YXNrIGRlZmluaXRpb24gd291bGQgcmVmZXJlbmNlIHRoZSBzZXJ2aWNlIHRoYXQgcmVmZXJlbmNlcyBpdCwgd2hpY2ggQ2xvdWRGb3JtYXRpb24gcmVqZWN0cyBhcyBhXG4gICAqIGRlcGVuZGVuY3kgY3ljbGUgYXQgZGVwbG95IHRpbWUuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVTZXJ2aWNlTmFtZSh0YXJnZXQ6IE9kaWdvc0ZhcmdhdGVUYXJnZXQpOiBzdHJpbmcge1xuICAgIGlmICh0YXJnZXQuc2VydmljZU5hbWUpIHtcbiAgICAgIHJldHVybiB0YXJnZXQuc2VydmljZU5hbWU7XG4gICAgfVxuICAgIGlmICghdGFyZ2V0LnNlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE9kaWdvczogaW5zdHJ1bWVudGluZyBjb250YWluZXIgXCIke3RhcmdldC5jb250YWluZXIuY29udGFpbmVyTmFtZX1cIiBuZWVkcyBhIHNlcnZpY2UgbmFtZS4gYCArXG4gICAgICAgICAgJ09URUxfU0VSVklDRV9OQU1FIG11c3QgZXF1YWwgdGhlIHdvcmtsb2FkXFwncyBuYW1lIGluIE9kaWdvcywgd2hpY2ggZm9yIGEgRmFyZ2F0ZSB3b3JrbG9hZCBpcyAnICtcbiAgICAgICAgICAndGhlIEVDUyBTRVJWSUNFIG5hbWUg4oCUIG5vdCB0aGUgdGFzayBkZWZpbml0aW9uIGZhbWlseS4gUGFzcyBgc2VydmljZWAgdG8gcmVhZCBpdCBvZmYgdGhlICcgK1xuICAgICAgICAgICdzZXJ2aWNlLCBvciBgc2VydmljZU5hbWVgIHdoZW4gdGhlIHNlcnZpY2UgbGl2ZXMgb3V0c2lkZSB0aGlzIHN0YWNrLicsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBjZm4gPSB0YXJnZXQuc2VydmljZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBlY3MuQ2ZuU2VydmljZSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXNvbHZlZCA9IGNmbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU3RhY2sub2YodGFyZ2V0LnNlcnZpY2UpLnJlc29sdmUoY2ZuLnNlcnZpY2VOYW1lKTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSAnc3RyaW5nJyAmJiByZXNvbHZlZCAhPT0gJycgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChyZXNvbHZlZCkpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE9kaWdvczogdGhlIHNlcnZpY2UgZm9yIGNvbnRhaW5lciBcIiR7dGFyZ2V0LmNvbnRhaW5lci5jb250YWluZXJOYW1lfVwiIGhhcyBubyBleHBsaWNpdCBwaHlzaWNhbCBgICtcbiAgICAgICAgJ25hbWUsIHNvIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlcyBvbmUg4oCUIGFuZCBhIGdlbmVyYXRlZCBuYW1lIGlzIGEgYFJlZmAgdG8gdGhlIHNlcnZpY2UsIHdoaWNoICcgK1xuICAgICAgICAnY2Fubm90IGdvIGludG8gdGhlIHRhc2sgZGVmaW5pdGlvbiB0aGF0IHNlcnZpY2UgcnVucyAoQ2xvdWRGb3JtYXRpb24gcmVqZWN0cyB0aGUgY3ljbGUpLiBTZXQgJyArXG4gICAgICAgICdgc2VydmljZU5hbWVgIG9uIHRoZSBFQ1Mgc2VydmljZSwgb3IgcGFzcyBgc2VydmljZU5hbWVgIGhlcmUgdG8gc3RhdGUgdGhlIG5hbWUgT2RpZ29zIGtub3dzICcgK1xuICAgICAgICAndGhlIHdvcmtsb2FkIGJ5LicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIHRhc2sgZGVmaW5pdGlvbiBjYW4gY2FycnkgdGhlIHN0YWdlZC1hZ2VudCBtZXRob2QgYXQgYWxsLCBhbmQgd2FybnMgYWJvdXQgdGhlIHRoaW5ncyB0aGF0XG4gICAqIGFyZSBsZWdhbCBidXQgYWxtb3N0IGNlcnRhaW5seSBhIG1pc3Rha2UuXG4gICAqL1xuICBwcml2YXRlIGNoZWNrVGFza0RlZmluaXRpb24odGFza0RlZmluaXRpb246IGVjcy5UYXNrRGVmaW5pdGlvbiwgY29udGFpbmVyOiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvbik6IHZvaWQge1xuICAgIGlmICghdGFza0RlZmluaXRpb24uaXNGYXJnYXRlQ29tcGF0aWJsZSkge1xuICAgICAgLy8gTm90IGZhdGFsIOKAlCB0aGUgbWVjaGFuaXNtIGlzIGEgdm9sdW1lIGFuZCBhIGNvcGllciwgd2hpY2ggd29yayBvbiB0aGUgRUMyIGxhdW5jaCB0eXBlIHRvby4gQnV0XG4gICAgICAvLyB0aGUgY29ubmVjdG9yIGRpc2NvdmVycyBhbmQganVkZ2VzIGBhd3MuZmFyZ2F0ZS10YXNrYCB3b3JrbG9hZHMsIHNvIGFuIEVDMi1vbmx5IHRhc2sgZGVmaW5pdGlvblxuICAgICAgLy8gaXMgaW5zdHJ1bWVudGVkIGhlcmUgYW5kIGludmlzaWJsZSB0aGVyZS5cbiAgICAgIEFubm90YXRpb25zLm9mKGNvbnRhaW5lcikuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOm5vdEZhcmdhdGVDb21wYXRpYmxlJyxcbiAgICAgICAgYE9kaWdvczogdGFzayBkZWZpbml0aW9uICR7dGFza0RlZmluaXRpb24ubm9kZS5pZH0gaXMgbm90IEZhcmdhdGUtY29tcGF0aWJsZS4gVGhlIHN0YWdpbmcgYCArXG4gICAgICAgICAgJ2NvbnRhaW5lciBhbmQgc2hhcmVkIHZvbHVtZSB3aWxsIHN0aWxsIHdvcmsgb24gdGhlIEVDMiBsYXVuY2ggdHlwZSwgYnV0IE9kaWdvcyBkaXNjb3ZlcnMgJyArXG4gICAgICAgICAgJ3RoZXNlIGFzIGBhd3MuZmFyZ2F0ZS10YXNrYCB3b3JrbG9hZHMgYW5kIHdpbGwgbm90IHJlcG9ydCBvbiBhbiBFQzItb25seSB0YXNrLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNmbiA9IHRhc2tEZWZpbml0aW9uLm5vZGUuZGVmYXVsdENoaWxkIGFzIGVjcy5DZm5UYXNrRGVmaW5pdGlvbiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGNmbj8ucnVudGltZVBsYXRmb3JtIGFzIGVjcy5DZm5UYXNrRGVmaW5pdGlvbi5SdW50aW1lUGxhdGZvcm1Qcm9wZXJ0eSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvc0ZhbWlseSA9IHBsYXRmb3JtPy5vcGVyYXRpbmdTeXN0ZW1GYW1pbHk7XG4gICAgaWYgKHR5cGVvZiBvc0ZhbWlseSA9PT0gJ3N0cmluZycgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChvc0ZhbWlseSkgJiYgIW9zRmFtaWx5LnN0YXJ0c1dpdGgoJ0xJTlVYJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE9kaWdvczogdGFzayBkZWZpbml0aW9uICR7dGFza0RlZmluaXRpb24ubm9kZS5pZH0gZGVjbGFyZXMgb3BlcmF0aW5nU3lzdGVtRmFtaWx5IGAgK1xuICAgICAgICAgIGBcIiR7b3NGYW1pbHl9XCIuIFRoZSBPZGlnb3MgRmFyZ2F0ZSBhZ2VudHMgYnVuZGxlIGlzIExpbnV4LW9ubHkgYW5kIGdsaWJjLWJhc2VkLCBzbyBhIFdpbmRvd3MgYCArXG4gICAgICAgICAgJ3Rhc2sgZGVmaW5pdGlvbiBjYW5ub3QgYmUgaW5zdHJ1bWVudGVkIGF0IGFsbC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgYXBwbGllZCB0byBvbmUgaW5zdHJ1bWVudGVkIGNvbnRhaW5lci5cbiAgICpcbiAgICogTWlycm9ycyBgaW5zdHJ1bWVudENvbnRhaW5lcmAgaW4gdGhlIGNvbm5lY3RvciwgaW5jbHVkaW5nIHRoZSBPUkRFUiBvZiBkZWNpc2lvbnM6IHRoZSBhZ2VudCdzIG93blxuICAgKiBhY3RpdmF0aW9uIHZhcmlhYmxlcyBmaXJzdCwgdGhlbiBpZGVudGl0eSwgdGhlbiBleHBvcnQsIHRoZW4gdGhlIG1hcmtlci4gRXZlcnkgdmFyaWFibGUgaGVyZSBoYXMgYVxuICAgKiBjb3VudGVycGFydCBpbiB0aGUgY29ubmVjdG9yJ3MgYGNvbnRhaW5lckRpZmZgLCB3aGljaCBpcyB3aGF0IGEgY3VzdG9tZXIncyBjb25mb3JtYW5jZSByZXBvcnQgaXNcbiAgICogYnVpbHQgZnJvbSDigJQgc28gb25lIHRoYXQgaXMgYWJzZW50LCBvciBzcGVsbGVkIGRpZmZlcmVudGx5LCBpcyByZXBvcnRlZCBhcyBhIG5hbWVkIGJyb2tlbiBjb21wb25lbnRcbiAgICogcmF0aGVyIHRoYW4gcGFzc2luZyBxdWlldGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBlbnZpcm9ubWVudEZvcihcbiAgICB0YXJnZXQ6IE9kaWdvc0ZhcmdhdGVUYXJnZXQsXG4gICAgcmVjaXBlOiBGYXJnYXRlUmVjaXBlLFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHsgZGVzdGluYXRpb24sIGRlYnVnIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGFyZ2V0LmNvbnRhaW5lcjtcbiAgICBjb25zdCBlbnY6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHJlY2lwZS5zdGF0aWNFbnYpKSB7XG4gICAgICAvLyBUaGVzZSBhcmUgc2V0IG91dHJpZ2h0LCBub3QgbWVyZ2VkIOKAlCBQSFBfSU5JX1NDQU5fRElSIGFuZCBSVUJZT1BUIGFyZSBjb21wYXJlZCBleGFjdGx5LCBzbyB0aGVyZVxuICAgICAgLy8gaXMgbm8gcm9vbSB0byBmb2xkIGEgY29udGFpbmVyJ3Mgb3duIHZhbHVlIGluLiBTaWxlbnRseSBkaXNjYXJkaW5nIG9uZSBpcyB0aGUgZmFpbHVyZSB3b3J0aFxuICAgICAgLy8gbmFtaW5nOiBSVUJZT1BUIGNvbW1vbmx5IGNhcnJpZXMgZmxhZ3MgYW4gYXBwbGljYXRpb24gbmVlZHMgdG8gYm9vdC5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gY29udGFpbmVyRW52VmFsdWUoY29udGFpbmVyLCBrKTtcbiAgICAgIGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkICYmIGV4aXN0aW5nICE9PSB2KSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKGNvbnRhaW5lcikuYWRkV2FybmluZ1YyKFxuICAgICAgICAgICdAb2RpZ29zL2F3cy1jZGs6c3RhdGljRW52T3ZlcndyaXR0ZW4nLFxuICAgICAgICAgIGBPZGlnb3M6IGNvbnRhaW5lciBcIiR7Y29udGFpbmVyLmNvbnRhaW5lck5hbWV9XCIgYWxyZWFkeSBzZXRzICR7a309XCIke2V4aXN0aW5nfVwiLCB3aGljaCB0aGUgYCArXG4gICAgICAgICAgICBgJHtyZWNpcGUubGFuZ3VhZ2V9IGFnZW50J3MgYWN0aXZhdGlvbiByZXBsYWNlcyB3aXRoIFwiJHt2fVwiLiBPZGlnb3MgY29tcGFyZXMgdGhpcyB2YXJpYWJsZSBgICtcbiAgICAgICAgICAgICdleGFjdGx5LCBzbyBpdCBjYW5ub3QgbWVyZ2UgdGhlIHR3byDigJQgZm9sZCB3aGF0IHlvdXIgYXBwbGljYXRpb24gbmVlZHMgaW50byB0aGUgdmFsdWUgJyArXG4gICAgICAgICAgICAnT2RpZ29zIHNldHMsIG9yIGxlYXZlIHRoaXMgY29udGFpbmVyIHVuaW5zdHJ1bWVudGVkLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbnZba10gPSB2O1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYXBwZW5kIG9mIHJlY2lwZS5hcHBlbmRFbnYpIHtcbiAgICAgIC8vIFJlYnVpbHQgZnJvbSB0aGUgY29udGFpbmVyJ3MgT1JJR0lOQUwgdmFsdWUgc28gb3VycyBpcyBqb2luZWQgcmF0aGVyIHRoYW4gYXNzaWduZWQgb3ZlciBpdCDigJQgYW5kXG4gICAgICAvLyBzbyB0aGF0IGEgcmUtc3ludGggbmV2ZXIgYWNjdW11bGF0ZXMgb3VyIGZyYWdtZW50IHR3aWNlLiBUaGUgc2VwYXJhdG9yIGNvbWVzIGZyb20gdGhlIHBhdHRlcm4sXG4gICAgICAvLyBub3QgZnJvbSBhbiBhc3N1bXB0aW9uOiBhIHNwYWNlIGZvciB0aGUgKl9PUFRJT05TIHZhcmlhYmxlcywgYSBjb2xvbiBmb3IgUFlUSE9OUEFUSC5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGFyZ2V0LmV4aXN0aW5nTG9hZGVyVmFsdWUgPz8gY29udGFpbmVyRW52VmFsdWUoY29udGFpbmVyLCBhcHBlbmQubmFtZSkgPz8gJyc7XG4gICAgICBlbnZbYXBwZW5kLm5hbWVdID0gZXZhbHVhdGVBcHBlbmRQYXR0ZXJuKGFwcGVuZC5wYXR0ZXJuLCBleGlzdGluZyk7XG4gICAgfVxuXG4gICAgZW52W0VOVl9TRVJWSUNFX05BTUVdID0gc2VydmljZU5hbWU7XG4gICAgZW52W0VOVl9SRVNPVVJDRV9BVFRSSUJVVEVTXSA9IGZhcmdhdGVSZXNvdXJjZUF0dHJpYnV0ZXMoU3RhY2sub2YoY29udGFpbmVyKS5yZWdpb24pO1xuXG4gICAgY29uc3QgZXhwb3J0VGFyZ2V0ID0gZXhwb3J0VGFyZ2V0Rm9yKHJlY2lwZSwgZGVzdGluYXRpb24pO1xuICAgIGVudltFTlZfT1RMUF9FTkRQT0lOVF0gPSBleHBvcnRUYXJnZXQuZW5kcG9pbnQ7XG4gICAgZW52W0VOVl9PVExQX1BST1RPQ09MXSA9IGV4cG9ydFRhcmdldC5wcm90b2NvbDtcbiAgICBjb25zdCBtaXNtYXRjaCA9IHBvcnRQcm90b2NvbE1pc21hdGNoKGV4cG9ydFRhcmdldC5lbmRwb2ludCwgZXhwb3J0VGFyZ2V0LnByb3RvY29sKTtcbiAgICBpZiAobWlzbWF0Y2gpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKGNvbnRhaW5lcikuYWRkV2FybmluZ1YyKCdAb2RpZ29zL2F3cy1jZGs6cG9ydFByb3RvY29sTWlzbWF0Y2gnLCBgT2RpZ29zOiAke21pc21hdGNofWApO1xuICAgIH1cblxuICAgIC8vIEFsbCB0aHJlZSBhcmUgd3JpdHRlbiBleHBsaWNpdGx5LCB1bmxpa2UgTGFtYmRhLCB3aGVyZSBhbiBlbmFibGVkIHNpZ25hbCdzIHZhcmlhYmxlIGlzIGxlZnQgdW5zZXRcbiAgICAvLyBiZWNhdXNlIGBvdGxwYCBpcyBhbHJlYWR5IHRoZSBTREsgZGVmYXVsdC4gVGhlIGNvbm5lY3RvcidzIEZhcmdhdGUgY2hlY2sgY29tcGFyZXMgYWxsIHRocmVlIGJ5XG4gICAgLy8gdmFsdWUsIHNvIGFuIG9taXR0ZWQgb25lIHJlYWRzIGFzIGRyaWZ0IG9uIHRoZSBleHBvcnQgY29tcG9uZW50LlxuICAgIGNvbnN0IGVuYWJsZWQgPSByZXNvbHZlZFNpZ25hbHMoZGVzdGluYXRpb24pO1xuICAgIGlmICghZW5hYmxlZC50cmFjZXMgJiYgIWVuYWJsZWQubWV0cmljcyAmJiAhZW5hYmxlZC5sb2dzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdPZGlnb3MgZGVzdGluYXRpb24gYWNjZXB0cyBubyB0ZWxlbWV0cnkgc2lnbmFscywgc28gdGhlIGFnZW50IHdvdWxkIGJlIGxvYWRlZCBhbmQgcHJvZHVjZSAnICtcbiAgICAgICAgICAnbm90aGluZy4gTm90ZSB0aGF0IG1ldHJpY3MgYW5kIGxvZ3MgYXJlIE9GRiBieSBkZWZhdWx0IOKAlCB3aXRoIGB0cmFjZXM6IGZhbHNlYCB0aGUgZGVzdGluYXRpb24gJyArXG4gICAgICAgICAgJ2hhcyBub3RoaW5nIGxlZnQgdW5sZXNzIHlvdSBhbHNvIHBhc3MgYG1ldHJpY3M6IHRydWVgIG9yIGBsb2dzOiB0cnVlYC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgZW52W0VOVl9UUkFDRVNfRVhQT1JURVJdID0gZW5hYmxlZC50cmFjZXMgPyBFWFBPUlRFUl9PVExQIDogRVhQT1JURVJfTk9ORTtcbiAgICBlbnZbRU5WX01FVFJJQ1NfRVhQT1JURVJdID0gZW5hYmxlZC5tZXRyaWNzID8gRVhQT1JURVJfT1RMUCA6IEVYUE9SVEVSX05PTkU7XG4gICAgZW52W0VOVl9MT0dTX0VYUE9SVEVSXSA9IGVuYWJsZWQubG9ncyA/IEVYUE9SVEVSX09UTFAgOiBFWFBPUlRFUl9OT05FO1xuXG4gICAgY29uc3QgaGVhZGVycyA9IHJlbmRlck90bHBIZWFkZXJzKGRlc3RpbmF0aW9uLmhlYWRlcnMpO1xuICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICBlbnZbRU5WX09UTFBfSEVBREVSU10gPSBoZWFkZXJzO1xuICAgIH1cblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgZW52W0VOVl9PVEVMX0xPR19MRVZFTF0gPSAnZGVidWcnO1xuICAgIH1cblxuICAgIGVudltFTlZfSUFDX01BUktFUl0gPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB2OiBNQVJLRVJfVkVSU0lPTixcbiAgICAgIHNvdXJjZTogJ2NkaycsXG4gICAgICB2ZXJzaW9uOiBPRElHT1NfVkVSU0lPTiB8fCAndW5yZWxlYXNlZCcsXG4gICAgICBsYW5nOiBsYW5ndWFnZUtleU9mKHRhcmdldC5sYW5ndWFnZSksXG4gICAgICBpbWFnZTogdGhpcy5hZ2VudHNJbWFnZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbnY7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgdmFsdWUgdGhlIGNvbnRhaW5lciB3YXMgY3JlYXRlZCB3aXRoIGZvciBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgdW5kZWZpbmVkLlxuICpcbiAqIGBDb250YWluZXJEZWZpbml0aW9uYCBrZWVwcyBpdHMgZW52aXJvbm1lbnQgcHJpdmF0ZSBhbmQgb2ZmZXJzIGBhZGRFbnZpcm9ubWVudGAgYnV0IG5vIHJlYWRlciwgc28gdGhpc1xuICogcmVhY2hlcyBmb3IgdGhlIGZpZWxkLiBUaGF0IGlzIGEgY29udGFpbmVkIGhhY2sgd2l0aCBhIHNwZWNpZmljIGFsdGVybmF0aXZlOiB3aXRob3V0IGl0LCBhcHBlbmRpbmcgdG8gYVxuICogbG9hZGVyIHZhcmlhYmxlIHdvdWxkIG1lYW4gQVNTSUdOSU5HIG92ZXIgaXQsIGFuZCBhIGNvbnRhaW5lciB3aG9zZSBgTk9ERV9PUFRJT05TYCBjYXJyaWVzIGEgZmxhZyBpdHNcbiAqIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGJvb3Qgd291bGQgc3RvcCBib290aW5nIHRoZSBtb21lbnQgaXQgd2FzIGluc3RydW1lbnRlZC4gYGV4aXN0aW5nTG9hZGVyVmFsdWVgIG9uXG4gKiB0aGUgdGFyZ2V0IGlzIHRoZSBkb2N1bWVudGVkIGVzY2FwZSBoYXRjaCBpZiB0aGlzIGV2ZXIgc3RvcHMgd29ya2luZzsgYSBzaGFwZSB0aGF0IGlzIG5vdCBhIHBsYWluIG9iamVjdFxuICogZGVncmFkZXMgdG8gXCJub3RoaW5nIHRoZXJlXCIsIHdoaWNoIGlzIHRoZSBzYW1lIGFuc3dlciBhcyBhbiB1bmluc3RydW1lbnRlZCBjb250YWluZXIuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5lckVudlZhbHVlKGNvbnRhaW5lcjogZWNzLkNvbnRhaW5lckRlZmluaXRpb24sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVudiA9IChjb250YWluZXIgYXMgdW5rbm93biBhcyB7IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB9KS5lbnZpcm9ubWVudDtcbiAgaWYgKCFlbnYgfHwgdHlwZW9mIGVudiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gZW52W25hbWVdO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYE9URUxfRVhQT1JURVJfT1RMUF9IRUFERVJTYCDigJQgYSBjb21tYS1zZXBhcmF0ZWQgYGtleT12YWx1ZWAgbGlzdCwga2V5cyBzb3J0ZWQgc28gdGhlIHJlbmRlcmVkXG4gKiB2YWx1ZSBpcyBieXRlLXN0YWJsZSBhY3Jvc3Mgc3ludGhzIGFuZCBhbiB1bmNoYW5nZWQgZGVzdGluYXRpb24gbmV2ZXIgbG9va3MgbGlrZSBhIGNoYW5nZS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyT3RscEhlYWRlcnMoaGVhZGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBzdHJpbmcge1xuICBpZiAoIWhlYWRlcnMpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGhlYWRlcnMpLnNvcnQoKTtcbiAgcmV0dXJuIGtleXMubWFwKChrKSA9PiBgJHtrfT0ke2hlYWRlcnNba119YCkuam9pbignLCcpO1xufVxuIl19
@@ -4,13 +4,13 @@
4
4
  * Produced by cdk/scripts/generate.ts from artifacts.json and manifest/layers.json.
5
5
  * Run `npm run generate` (or `npm run build`) to refresh it.
6
6
  *
7
- * Odigos artifact version: v0.0.14
7
+ * Odigos artifact version: v0.0.16
8
8
  */
9
9
  /**
10
10
  * The multi-arch agents bundle the staging container copies from, at the tag this package's release
11
11
  * published. Empty before the first release.
12
12
  */
13
- export declare const FARGATE_AGENTS_IMAGE = "registry.odigos.io/odigos-fargate-agents:v0.0.14";
13
+ export declare const FARGATE_AGENTS_IMAGE = "registry.odigos.io/odigos-fargate-agents:v0.0.16";
14
14
  /** Shared task-volume mount path the language agents are staged into, in every container. */
15
15
  export declare const FARGATE_AGENTS_DIR = "/var/odigos";
16
16
  /** Where the agents bundle holds the agent files; the staging container copies from here to there. */