cdk-preflight 0.0.8 → 0.0.10
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 +2 -2
- package/AGENTS.md +2 -0
- package/docs/rules.md +18 -0
- package/lib/index.js +1 -1
- package/lib/rules.generated.js +201 -3
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -9598,6 +9598,6 @@
|
|
|
9598
9598
|
"symbolId": "src/index:PreflightOptions"
|
|
9599
9599
|
}
|
|
9600
9600
|
},
|
|
9601
|
-
"version": "0.0.
|
|
9602
|
-
"fingerprint": "
|
|
9601
|
+
"version": "0.0.10",
|
|
9602
|
+
"fingerprint": "RGm8AFWpF9k95XnjX37HZ0EYqe7WS72so37eOCYMGCM="
|
|
9603
9603
|
}
|
package/AGENTS.md
CHANGED
|
@@ -79,6 +79,8 @@ bench/ # real-deploy verification (needs an AWS account; no
|
|
|
79
79
|
- Use the engine builtins (`resources_of_type`, `resolve`, `flatten_list`, `object.get`); guard numbers with `to_number` — it is undefined for non-numeric input, which safely skips tokens/refs.
|
|
80
80
|
- `resolve()` resolves a Ref-to-resource to the target's **logical ID as a string**, and resolves template-parameter defaults (measured 2026-09-02, 1.7.0-beta). Two consequences: an `is_string` guard alone does not prove a user literal — add a shape guard (ARN prefix, pattern, known constant) before comparing values; and cross-resource rules need no private API — test the resolved string for membership in `resources_of_type(...)`, then `resolve(<that id>, "Properties....")` reads the target resource (`pf-route53-apex-cname` is the reference implementation).
|
|
81
81
|
- The standard OPA `walk` builtin is NOT available in this engine. Write explicit traversals.
|
|
82
|
+
- **Proving a property absent** (measured 2026-09-02, 1.7.0-beta): `resolve()` is undefined for a missing key AND for an unresolvable value (e.g. `Ref` to a no-default parameter), so `not resolve(...)` misfires on present-but-unresolvable values. The only reliable absence proof is the preprocessed document: `props := input.resources[name].properties; is_object(props); object.get(props, "<Key>", "__pf_absent") == "__pf_absent"`. The `is_object` guard fails closed if the internal shape ever changes. This is the sanctioned exception to "don't depend on `input` internals". Reference implementations: `pf-ecs-container-memory-required`, `pf-ecs-fargate-task-cpu-memory`.
|
|
83
|
+
- `flatten_list()` returns an **empty list for an absent path** — it cannot distinguish "absent" from "present and empty" (measured 2026-09-02). Use the `input.resources` idiom above when the distinction matters (`pf-ecs-container-definitions-empty`).
|
|
82
84
|
- **Deploy-region rules**: the enforce plugin injects a generated module defining `deploy_region` whenever the app-level region is concrete (`deployEnvironmentModule` in `src/private/enforce.ts`; the test harness injects `us-east-1` for fixtures). Rules must read it as `data.cdk_preflight.deploy_region` — the data reference is undefined when not injected, so the rule skips; a bare `deploy_region` variable would be a compile error. Consequences: region-dependent rules are silent in warn mode (`enforce: false` hands rules to the CDK built-in plugin, which we cannot inject into) and in region-agnostic apps; say so in `meta.yaml#repro.evidence`. Reference implementations: `pf-dynamodb-global-table-replica-region`, `pf-dynamodb-kinesis-stream-region`.
|
|
83
85
|
- Helper rules must use a unique `_pf_<rule>_...` prefix (all rules share one package).
|
|
84
86
|
3. `npx projen bundle-rules` then `npx jest test/rules.test.ts test/structure.test.ts` — the duplication guard and fixture checks run here.
|
package/docs/rules.md
CHANGED
|
@@ -29,7 +29,15 @@
|
|
|
29
29
|
| `pf-ec2-sg-port-range` | AWS::EC2::SecurityGroup<br>AWS::EC2::SecurityGroupIngress<br>AWS::EC2::SecurityGroupEgress | Security group TCP/UDP ports must be within 0-65535 and FromPort <= ToPort | none |
|
|
30
30
|
| `pf-ec2-userdata-size` | AWS::EC2::Instance<br>AWS::EC2::LaunchTemplate | EC2 user data is limited to 16384 bytes | none |
|
|
31
31
|
| `pf-ec2-volume-iops` | AWS::EC2::Volume | EBS Iops/Throughput must match the volume type's supported ranges and ratios | none |
|
|
32
|
+
| `pf-ecs-container-definitions-empty` | AWS::ECS::TaskDefinition | ContainerDefinitions must contain at least one container | pending-engine |
|
|
33
|
+
| `pf-ecs-container-memory-over-task` | AWS::ECS::TaskDefinition | A container Memory must not exceed the task-level Memory | none |
|
|
34
|
+
| `pf-ecs-container-memory-required` | AWS::ECS::TaskDefinition | A container needs Memory or MemoryReservation when the task sets no Memory | none |
|
|
35
|
+
| `pf-ecs-container-memory-reservation` | AWS::ECS::TaskDefinition | MemoryReservation must not exceed Memory | none |
|
|
36
|
+
| `pf-ecs-duplicate-container-names` | AWS::ECS::TaskDefinition | Container names must be unique within a task definition | none |
|
|
37
|
+
| `pf-ecs-ephemeral-storage-range` | AWS::ECS::TaskDefinition | EphemeralStorage SizeInGiB must be 21-200 | pending-engine |
|
|
38
|
+
| `pf-ecs-essential-container` | AWS::ECS::TaskDefinition | At least one container must be essential | none |
|
|
32
39
|
| `pf-ecs-fargate-network-mode` | AWS::ECS::TaskDefinition | Fargate task definitions require NetworkMode 'awsvpc' | none |
|
|
40
|
+
| `pf-ecs-fargate-task-cpu-memory` | AWS::ECS::TaskDefinition | FARGATE compatibility requires task-level Cpu and Memory | none |
|
|
33
41
|
| `pf-elbv2-lb-idle-timeout-range` | AWS::ElasticLoadBalancingV2::LoadBalancer | ALB idle_timeout.timeout_seconds must be between 1 and 4000 | none |
|
|
34
42
|
| `pf-elbv2-tg-deregistration-delay-range` | AWS::ElasticLoadBalancingV2::TargetGroup | Target group deregistration_delay.timeout_seconds must be between 0 and 3600 | none |
|
|
35
43
|
| `pf-elbv2-tg-slow-start-range` | AWS::ElasticLoadBalancingV2::TargetGroup | Target group slow_start.duration_seconds must be 0 or between 30 and 900 | none |
|
|
@@ -48,7 +56,17 @@
|
|
|
48
56
|
| `pf-route53-ttl-range` | AWS::Route53::RecordSet | TTL must fit in 32 bits (0..2147483647 seconds) | pending-engine |
|
|
49
57
|
| `pf-route53-weight-range` | AWS::Route53::RecordSet | Weight must be between 0 and 255 | pending-engine |
|
|
50
58
|
| `pf-route53-zonename-trailing-dot` | AWS::Route53::RecordSet | HostedZoneName must end with a trailing dot | none |
|
|
59
|
+
| `pf-s3-accelerate-dotted-name` | AWS::S3::Bucket | Transfer Acceleration rejects bucket names with periods | none |
|
|
60
|
+
| `pf-s3-bucket-policy-action-resource` | AWS::S3::BucketPolicy | Object-level actions need an object-level Resource | none |
|
|
61
|
+
| `pf-s3-bucket-policy-principal` | AWS::S3::BucketPolicy | Bucket policy statements need a Principal | none |
|
|
51
62
|
| `pf-s3-lifecycle-days-order` | AWS::S3::Bucket | Lifecycle archive transitions must come 30+ days after IA, and expiration after every transition | none |
|
|
63
|
+
| `pf-s3-lifecycle-expiration-positive` | AWS::S3::Bucket | ExpirationInDays must be a positive integer | pending-engine |
|
|
64
|
+
| `pf-s3-lifecycle-rule-no-action` | AWS::S3::Bucket | A lifecycle rule needs at least one action | none |
|
|
65
|
+
| `pf-s3-notification-overlapping-filters` | AWS::S3::Bucket | Notification entries must not overlap for the same event type | none |
|
|
66
|
+
| `pf-s3-objectlock-requires-versioning` | AWS::S3::Bucket | ObjectLockConfiguration needs versioning enabled | none |
|
|
67
|
+
| `pf-s3-objectlock-versioning-suspended` | AWS::S3::Bucket | Object Lock forbids suspending versioning | none |
|
|
68
|
+
| `pf-s3-replication-dest-versioning` | AWS::S3::Bucket | The replication destination bucket needs versioning enabled | none |
|
|
52
69
|
| `pf-s3-replication-requires-versioning` | AWS::S3::Bucket | ReplicationConfiguration requires versioning to be enabled on the source bucket | none |
|
|
70
|
+
| `pf-s3-website-redirect-exclusive` | AWS::S3::Bucket | RedirectAllRequestsTo excludes every other website setting | none |
|
|
53
71
|
| `pf-sns-fifo-topic-name` | AWS::SNS::Topic | FIFO topic names must end with '.fifo' (and '.fifo' names require FifoTopic) | none |
|
|
54
72
|
| `pf-sfn-asl-missing-state` | AWS::StepFunctions::StateMachine | ASL Next/Default/Choices must reference a defined state (top-level states; a dangling StartAt is covered by engine rule E3601) | none |
|
package/lib/index.js
CHANGED
|
@@ -17,7 +17,7 @@ const rules_generated_1 = require("./rules.generated");
|
|
|
17
17
|
* Preflight.apply(app);
|
|
18
18
|
*/
|
|
19
19
|
class Preflight {
|
|
20
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-preflight.Preflight", version: "0.0.
|
|
20
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-preflight.Preflight", version: "0.0.10" };
|
|
21
21
|
/**
|
|
22
22
|
* Register the cdk-preflight rules on an App or Stage.
|
|
23
23
|
*/
|
package/lib/rules.generated.js
CHANGED
|
@@ -280,6 +280,83 @@ exports.BUNDLED_RULES = [
|
|
|
280
280
|
],
|
|
281
281
|
"rego": "package cdk_preflight\n\nimport rego.v1\n\n_pf_voliops_fix := \"Match Iops/Throughput to the volume type: gp3 3000-80000 IOPS (max 500/GiB, throughput 125-2000 MiB/s and at most IOPS/4), io1 100-64000 (max 50/GiB), io2 100-256000 (max 1000/GiB); gp2/st1/sc1/standard accept neither property\"\n\n_pf_voliops_url := \"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html\"\n\n_pf_voliops_range := {\"gp3\": [3000, 80000], \"io1\": [100, 64000], \"io2\": [100, 256000]}\n\n_pf_voliops_per_gib := {\"gp3\": 500, \"io1\": 50, \"io2\": 1000}\n\n_pf_voliops_out(n, lo, hi) if n < lo\n\n_pf_voliops_out(n, lo, hi) if n > hi\n\n_pf_voliops_has_iops(name) if resolve(name, \"Properties.Iops\")\n\n# IOPS が型ごとの絶対レンジ外\nviolation contains make_diag_full(\"pf-ec2-volume-iops\", \"ERROR\", name, \"Properties.Iops\",\n\tsprintf(\"Iops %v is outside the supported range %d-%d for %s volumes\", [n, r[0], r[1], vt]),\n\t_pf_voliops_fix, _pf_voliops_url) if {\n\tsome name in resources_of_type(\"AWS::EC2::Volume\")\n\tvt := resolve(name, \"Properties.VolumeType\")\n\tr := _pf_voliops_range[vt]\n\tn := to_number(resolve(name, \"Properties.Iops\"))\n\t_pf_voliops_out(n, r[0], r[1])\n}\n\n# IOPS : サイズ比の超過\nviolation contains make_diag_full(\"pf-ec2-volume-iops\", \"ERROR\", name, \"Properties.Iops\",\n\tsprintf(\"Iops %v exceeds the maximum ratio of %d IOPS per GiB for %s (Size %v GiB allows at most %v)\", [n, ratio, vt, s, s * ratio]),\n\t_pf_voliops_fix, _pf_voliops_url) if {\n\tsome name in resources_of_type(\"AWS::EC2::Volume\")\n\tvt := resolve(name, \"Properties.VolumeType\")\n\tratio := _pf_voliops_per_gib[vt]\n\tn := to_number(resolve(name, \"Properties.Iops\"))\n\ts := to_number(resolve(name, \"Properties.Size\"))\n\tn > s * ratio\n}\n\n# Iops を受け付けない型に Iops を指定\nviolation contains make_diag_full(\"pf-ec2-volume-iops\", \"ERROR\", name, \"Properties.Iops\",\n\tsprintf(\"Iops is not supported for %s volumes (valid only for gp3, io1, io2); EC2 rejects the CreateVolume call\", [vt]),\n\t_pf_voliops_fix, _pf_voliops_url) if {\n\tsome name in resources_of_type(\"AWS::EC2::Volume\")\n\tvt := resolve(name, \"Properties.VolumeType\")\n\tvt in {\"gp2\", \"st1\", \"sc1\", \"standard\"}\n\tresolve(name, \"Properties.Iops\")\n}\n\n# Throughput は gp3 専用\nviolation contains make_diag_full(\"pf-ec2-volume-iops\", \"ERROR\", name, \"Properties.Throughput\",\n\tsprintf(\"Throughput is not supported for %s volumes (valid only for gp3); EC2 rejects the CreateVolume call\", [vt]),\n\t_pf_voliops_fix, _pf_voliops_url) if {\n\tsome name in resources_of_type(\"AWS::EC2::Volume\")\n\tvt := resolve(name, \"Properties.VolumeType\")\n\tis_string(vt)\n\tvt != \"gp3\"\n\tresolve(name, \"Properties.Throughput\")\n}\n\n# gp3 Throughput の絶対レンジ\nviolation contains make_diag_full(\"pf-ec2-volume-iops\", \"ERROR\", name, \"Properties.Throughput\",\n\tsprintf(\"Throughput %v MiB/s is outside the supported range 125-2000 for gp3 volumes\", [t]),\n\t_pf_voliops_fix, _pf_voliops_url) if {\n\tsome name in resources_of_type(\"AWS::EC2::Volume\")\n\tresolve(name, \"Properties.VolumeType\") == \"gp3\"\n\tt := to_number(resolve(name, \"Properties.Throughput\"))\n\t_pf_voliops_out(t, 125, 2000)\n}\n\n# gp3 Throughput : IOPS 比(最大 0.25 MiB/s per IOPS)\nviolation contains make_diag_full(\"pf-ec2-volume-iops\", \"ERROR\", name, \"Properties.Throughput\",\n\tsprintf(\"Throughput %v MiB/s exceeds the maximum ratio of 0.25 MiB/s per provisioned IOPS (%v IOPS allows at most %v)\", [t, n, n / 4]),\n\t_pf_voliops_fix, _pf_voliops_url) if {\n\tsome name in resources_of_type(\"AWS::EC2::Volume\")\n\tresolve(name, \"Properties.VolumeType\") == \"gp3\"\n\tt := to_number(resolve(name, \"Properties.Throughput\"))\n\tn := to_number(resolve(name, \"Properties.Iops\"))\n\tt * 4 > n\n}\n\n# gp3 で Iops 未指定(デフォルト 3000)のときの Throughput 比\nviolation contains make_diag_full(\"pf-ec2-volume-iops\", \"ERROR\", name, \"Properties.Throughput\",\n\tsprintf(\"Throughput %v MiB/s exceeds 750, the maximum for the default 3000 IOPS (0.25 MiB/s per IOPS); provision Iops explicitly or lower the throughput\", [t]),\n\t_pf_voliops_fix, _pf_voliops_url) if {\n\tsome name in resources_of_type(\"AWS::EC2::Volume\")\n\tresolve(name, \"Properties.VolumeType\") == \"gp3\"\n\tnot _pf_voliops_has_iops(name)\n\tt := to_number(resolve(name, \"Properties.Throughput\"))\n\tt > 750\n}\n"
|
|
282
282
|
},
|
|
283
|
+
{
|
|
284
|
+
"id": "pf-ecs-container-definitions-empty",
|
|
285
|
+
"service": "ecs",
|
|
286
|
+
"severity": "ERROR",
|
|
287
|
+
"title": "ContainerDefinitions must contain at least one container",
|
|
288
|
+
"upstream": "pending-engine",
|
|
289
|
+
"resourceTypes": [
|
|
290
|
+
"AWS::ECS::TaskDefinition"
|
|
291
|
+
],
|
|
292
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n_pf_ecscde_url := \"https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html\"\n\n_pf_ecscde_msg := \"RegisterTaskDefinition needs at least one container; the service fails with \\\"Container list cannot be empty\\\"\"\n\n_pf_ecscde_fix := \"Add at least one entry to ContainerDefinitions\"\n\n# The registry schema marks no TaskDefinition property as required, so an\n# absent or empty ContainerDefinitions sails through schema validation and\n# dies at registration. flatten_list returns an empty list for absent and\n# empty alike, so both blocks read the preprocessed document (input.resources)\n# to tell a literal empty list from an unresolvable value such as Fn::If.\n_pf_ecscde_props(name) := props if {\n\tprops := input.resources[name].properties\n\tis_object(props)\n}\n\nviolation contains make_diag_full(\"pf-ecs-container-definitions-empty\", \"ERROR\", name,\n\t\"Properties\",\n\t_pf_ecscde_msg,\n\t_pf_ecscde_fix,\n\t_pf_ecscde_url) if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\tprops := _pf_ecscde_props(name)\n\tobject.get(props, \"ContainerDefinitions\", \"__pf_absent\") == \"__pf_absent\"\n}\n\nviolation contains make_diag_full(\"pf-ecs-container-definitions-empty\", \"ERROR\", name,\n\t\"Properties.ContainerDefinitions\",\n\t_pf_ecscde_msg,\n\t_pf_ecscde_fix,\n\t_pf_ecscde_url) if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\tprops := _pf_ecscde_props(name)\n\traw := object.get(props, \"ContainerDefinitions\", null)\n\tis_array(raw)\n\tcount(raw) == 0\n}\n"
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"id": "pf-ecs-container-memory-over-task",
|
|
296
|
+
"service": "ecs",
|
|
297
|
+
"severity": "ERROR",
|
|
298
|
+
"title": "A container Memory must not exceed the task-level Memory",
|
|
299
|
+
"upstream": "none",
|
|
300
|
+
"resourceTypes": [
|
|
301
|
+
"AWS::ECS::TaskDefinition"
|
|
302
|
+
],
|
|
303
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# A single container's hard Memory limit cannot exceed the task-level Memory.\n# Task Memory arrives as a string (\"512\"); to_number covers both spellings and\n# makes the rule skip when either side is unresolvable or GB-suffixed.\nviolation contains make_diag_full(\"pf-ecs-container-memory-over-task\", \"ERROR\", name,\n\tsprintf(\"Properties.ContainerDefinitions.%d.Memory\", [c.index]),\n\tsprintf(\"Container '%s' sets Memory %v above the task-level Memory %v; RegisterTaskDefinition fails with \\\"The 'memory' setting for container '%s' is greater than for the task\\\"\", [cname, cm, tm, cname]),\n\t\"Lower the container Memory to at most the task-level Memory, or raise the task-level Memory\",\n\t\"https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html\") if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\ttm := to_number(resolve(name, \"Properties.Memory\"))\n\tsome c in flatten_list(name, \"Properties.ContainerDefinitions\")\n\tis_object(c.value)\n\tcm := to_number(object.get(c.value, \"Memory\", null))\n\tcm > tm\n\tcname := object.get(c.value, \"Name\", \"<unnamed>\")\n}\n"
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
"id": "pf-ecs-container-memory-required",
|
|
307
|
+
"service": "ecs",
|
|
308
|
+
"severity": "ERROR",
|
|
309
|
+
"title": "A container needs Memory or MemoryReservation when the task sets no Memory",
|
|
310
|
+
"upstream": "none",
|
|
311
|
+
"resourceTypes": [
|
|
312
|
+
"AWS::ECS::TaskDefinition"
|
|
313
|
+
],
|
|
314
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n_pf_ecsmemreq_url := \"https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html\"\n\n# When the task definition has no task-level Memory, every container must set\n# Memory or MemoryReservation. Proving true absence needs the preprocessed\n# document (input.resources): resolve() is undefined for a missing key and for\n# an unresolvable value alike, so it cannot tell \"absent\" from \"Ref to a\n# parameter\". The is_object guard fails closed if that internal shape changes.\n_pf_ecsmemreq_task_memory_absent(name) if {\n\tprops := input.resources[name].properties\n\tis_object(props)\n\tobject.get(props, \"Memory\", \"__pf_absent\") == \"__pf_absent\"\n}\n\nviolation contains make_diag_full(\"pf-ecs-container-memory-required\", \"ERROR\", name,\n\tsprintf(\"Properties.ContainerDefinitions.%d\", [c.index]),\n\tsprintf(\"Container '%s' sets neither Memory nor MemoryReservation and the task has no task-level Memory; RegisterTaskDefinition fails with \\\"At least one of 'memory' or 'memoryReservation' must be specified\\\"\", [cname]),\n\t\"Set task-level Memory, or give the container Memory or MemoryReservation\",\n\t_pf_ecsmemreq_url) if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\t_pf_ecsmemreq_task_memory_absent(name)\n\tsome c in flatten_list(name, \"Properties.ContainerDefinitions\")\n\tis_object(c.value)\n\tobject.get(c.value, \"Memory\", null) == null\n\tobject.get(c.value, \"MemoryReservation\", null) == null\n\tcname := object.get(c.value, \"Name\", \"<unnamed>\")\n}\n"
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
"id": "pf-ecs-container-memory-reservation",
|
|
318
|
+
"service": "ecs",
|
|
319
|
+
"severity": "ERROR",
|
|
320
|
+
"title": "MemoryReservation must not exceed Memory",
|
|
321
|
+
"upstream": "none",
|
|
322
|
+
"resourceTypes": [
|
|
323
|
+
"AWS::ECS::TaskDefinition"
|
|
324
|
+
],
|
|
325
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# MemoryReservation is a soft floor and Memory a hard ceiling; the service\n# rejects a floor above the ceiling. to_number fails (and the rule skips) when\n# either value is absent or unresolvable.\nviolation contains make_diag_full(\"pf-ecs-container-memory-reservation\", \"ERROR\", name,\n\tsprintf(\"Properties.ContainerDefinitions.%d.MemoryReservation\", [c.index]),\n\tsprintf(\"Container '%s' sets MemoryReservation %v above Memory %v; RegisterTaskDefinition fails with \\\"'memory' must be greater than or equal to 'memoryReservation'\\\"\", [cname, mr, m]),\n\t\"Lower MemoryReservation to at most Memory, or raise Memory\",\n\t\"https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html\") if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\tsome c in flatten_list(name, \"Properties.ContainerDefinitions\")\n\tis_object(c.value)\n\tm := to_number(object.get(c.value, \"Memory\", null))\n\tmr := to_number(object.get(c.value, \"MemoryReservation\", null))\n\tmr > m\n\tcname := object.get(c.value, \"Name\", \"<unnamed>\")\n}\n"
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
"id": "pf-ecs-duplicate-container-names",
|
|
329
|
+
"service": "ecs",
|
|
330
|
+
"severity": "ERROR",
|
|
331
|
+
"title": "Container names must be unique within a task definition",
|
|
332
|
+
"upstream": "none",
|
|
333
|
+
"resourceTypes": [
|
|
334
|
+
"AWS::ECS::TaskDefinition"
|
|
335
|
+
],
|
|
336
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# One diagnostic per duplicated later occurrence; only literal string names\n# can be compared, so a Ref-valued Name skips its pairs.\nviolation contains make_diag_full(\"pf-ecs-duplicate-container-names\", \"ERROR\", name,\n\tsprintf(\"Properties.ContainerDefinitions.%d.Name\", [b.index]),\n\tsprintf(\"Container name '%s' appears more than once; RegisterTaskDefinition fails with \\\"Container names must be unique within a task definition\\\"\", [na]),\n\t\"Give every container in the task definition a distinct Name\",\n\t\"https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html\") if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\tsome a in flatten_list(name, \"Properties.ContainerDefinitions\")\n\tsome b in flatten_list(name, \"Properties.ContainerDefinitions\")\n\ta.index < b.index\n\tna := object.get(a.value, \"Name\", null)\n\tis_string(na)\n\tna == object.get(b.value, \"Name\", null)\n}\n"
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
"id": "pf-ecs-ephemeral-storage-range",
|
|
340
|
+
"service": "ecs",
|
|
341
|
+
"severity": "ERROR",
|
|
342
|
+
"title": "EphemeralStorage SizeInGiB must be 21-200",
|
|
343
|
+
"upstream": "pending-engine",
|
|
344
|
+
"resourceTypes": [
|
|
345
|
+
"AWS::ECS::TaskDefinition"
|
|
346
|
+
],
|
|
347
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n_pf_ecseph_url := \"https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-ephemeralstorage.html\"\n\n# The registry schema carries no minimum/maximum for SizeInGiB, so 21-200 is\n# enforced only at registration time.\nviolation contains make_diag_full(\"pf-ecs-ephemeral-storage-range\", \"ERROR\", name,\n\t\"Properties.EphemeralStorage.SizeInGiB\",\n\tsprintf(\"EphemeralStorage SizeInGiB %v is below 21; RegisterTaskDefinition fails with \\\"EphemeralStorage size should be at least 21\\\"\", [s]),\n\t\"Use a size between 21 and 200 GiB, or drop EphemeralStorage to keep the default 20 GiB\",\n\t_pf_ecseph_url) if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\ts := to_number(resolve(name, \"Properties.EphemeralStorage.SizeInGiB\"))\n\ts < 21\n}\n\nviolation contains make_diag_full(\"pf-ecs-ephemeral-storage-range\", \"ERROR\", name,\n\t\"Properties.EphemeralStorage.SizeInGiB\",\n\tsprintf(\"EphemeralStorage SizeInGiB %v is above 200; RegisterTaskDefinition fails with \\\"EphemeralStorage size should be at most 200\\\"\", [s]),\n\t\"Use a size between 21 and 200 GiB\",\n\t_pf_ecseph_url) if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\ts := to_number(resolve(name, \"Properties.EphemeralStorage.SizeInGiB\"))\n\ts > 200\n}\n"
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"id": "pf-ecs-essential-container",
|
|
351
|
+
"service": "ecs",
|
|
352
|
+
"severity": "ERROR",
|
|
353
|
+
"title": "At least one container must be essential",
|
|
354
|
+
"upstream": "none",
|
|
355
|
+
"resourceTypes": [
|
|
356
|
+
"AWS::ECS::TaskDefinition"
|
|
357
|
+
],
|
|
358
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# Essential defaults to true, so the rule fires only when every container says\n# Essential: false explicitly. A container whose Essential is unresolvable (or\n# a non-boolean) breaks the `every`, and the rule skips — absence of an\n# essential container cannot be proven then.\nviolation contains make_diag_full(\"pf-ecs-essential-container\", \"ERROR\", name,\n\t\"Properties.ContainerDefinitions\",\n\t\"Every container sets Essential: false; RegisterTaskDefinition fails with \\\"Task definition doesn't have any essential container\\\"\",\n\t\"Mark at least one container Essential: true, or omit Essential (it defaults to true)\",\n\t\"https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html\") if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\titems := [c | some c in flatten_list(name, \"Properties.ContainerDefinitions\")]\n\tcount(items) > 0\n\tevery c in items {\n\t\tobject.get(c.value, \"Essential\", null) == false\n\t}\n}\n"
|
|
359
|
+
},
|
|
283
360
|
{
|
|
284
361
|
"id": "pf-ecs-fargate-network-mode",
|
|
285
362
|
"service": "ecs",
|
|
@@ -289,7 +366,18 @@ exports.BUNDLED_RULES = [
|
|
|
289
366
|
"resourceTypes": [
|
|
290
367
|
"AWS::ECS::TaskDefinition"
|
|
291
368
|
],
|
|
292
|
-
"rego": "package cdk_preflight\n\nimport rego.v1\n\n_pf_ecsnm_url := \"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#network_mode\"\n\
|
|
369
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n_pf_ecsnm_url := \"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#network_mode\"\n\n# resolve() cannot tell \"absent\" from \"unresolvable\" (both undefined), so true\n# absence is proven against the preprocessed document; a Ref-valued NetworkMode\n# no longer trips the not-set block.\n_pf_ecsnm_absent(name) if {\n\tprops := input.resources[name].properties\n\tis_object(props)\n\tobject.get(props, \"NetworkMode\", \"__pf_absent\") == \"__pf_absent\"\n}\n\nviolation contains make_diag_full(\"pf-ecs-fargate-network-mode\", \"ERROR\", name,\n\t\"Properties.NetworkMode\",\n\tsprintf(\"NetworkMode is '%s' but task definitions requiring FARGATE compatibility must use 'awsvpc'; RegisterTaskDefinition fails at deploy time\", [nm]),\n\t\"Set NetworkMode to 'awsvpc'\",\n\t_pf_ecsnm_url) if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\trc := resolve(name, \"Properties.RequiresCompatibilities\")\n\tis_array(rc)\n\t\"FARGATE\" in rc\n\tnm := resolve(name, \"Properties.NetworkMode\")\n\tis_string(nm)\n\tnm != \"awsvpc\"\n}\n\n# NetworkMode 未指定でも RegisterTaskDefinition は\n# \"Fargate only supports network mode 'awsvpc'.\" で失敗する(2026-09-01 実 API 確認)\nviolation contains make_diag_full(\"pf-ecs-fargate-network-mode\", \"ERROR\", name,\n\t\"Properties.NetworkMode\",\n\t\"NetworkMode is not set, but task definitions requiring FARGATE compatibility must set it to 'awsvpc'; RegisterTaskDefinition fails at deploy time\",\n\t\"Set NetworkMode to 'awsvpc'\",\n\t_pf_ecsnm_url) if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\trc := resolve(name, \"Properties.RequiresCompatibilities\")\n\tis_array(rc)\n\t\"FARGATE\" in rc\n\t_pf_ecsnm_absent(name)\n}\n"
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
"id": "pf-ecs-fargate-task-cpu-memory",
|
|
373
|
+
"service": "ecs",
|
|
374
|
+
"severity": "ERROR",
|
|
375
|
+
"title": "FARGATE compatibility requires task-level Cpu and Memory",
|
|
376
|
+
"upstream": "none",
|
|
377
|
+
"resourceTypes": [
|
|
378
|
+
"AWS::ECS::TaskDefinition"
|
|
379
|
+
],
|
|
380
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n_pf_ecsfargcm_url := \"https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html\"\n\n# The engine's E3047 checks the Cpu/Memory pairing only when both are present;\n# leaving one out entirely is caught by nothing before registration. True\n# absence needs the preprocessed document (see pf-ecs-container-memory-required\n# for the idiom).\n_pf_ecsfargcm_fargate(name) if {\n\tsome rc in flatten_list(name, \"Properties.RequiresCompatibilities\")\n\trc.value == \"FARGATE\"\n}\n\n_pf_ecsfargcm_absent(name, key) if {\n\tprops := input.resources[name].properties\n\tis_object(props)\n\tobject.get(props, key, \"__pf_absent\") == \"__pf_absent\"\n}\n\nviolation contains make_diag_full(\"pf-ecs-fargate-task-cpu-memory\", \"ERROR\", name,\n\t\"Properties.Cpu\",\n\t\"RequiresCompatibilities includes FARGATE but the task-level Cpu is missing; RegisterTaskDefinition fails with \\\"Fargate requires that 'cpu' be defined at the task level\\\"\",\n\t\"Set task-level Cpu (and Memory) to one of the supported Fargate combinations\",\n\t_pf_ecsfargcm_url) if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\t_pf_ecsfargcm_fargate(name)\n\t_pf_ecsfargcm_absent(name, \"Cpu\")\n}\n\nviolation contains make_diag_full(\"pf-ecs-fargate-task-cpu-memory\", \"ERROR\", name,\n\t\"Properties.Memory\",\n\t\"RequiresCompatibilities includes FARGATE but the task-level Memory is missing; RegisterTaskDefinition fails with \\\"Fargate requires that 'memory' be defined at the task level\\\"\",\n\t\"Set task-level Memory (and Cpu) to one of the supported Fargate combinations\",\n\t_pf_ecsfargcm_url) if {\n\tsome name in resources_of_type(\"AWS::ECS::TaskDefinition\")\n\t_pf_ecsfargcm_fargate(name)\n\t_pf_ecsfargcm_absent(name, \"Memory\")\n}\n"
|
|
293
381
|
},
|
|
294
382
|
{
|
|
295
383
|
"id": "pf-elbv2-lb-idle-timeout-range",
|
|
@@ -495,6 +583,39 @@ exports.BUNDLED_RULES = [
|
|
|
495
583
|
],
|
|
496
584
|
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# CloudFormation looks the zone up by the literal HostedZoneName and does not\n# normalize the trailing dot: the same stack deployed clean with\n# \"zone.example.\" and failed with NotFound for \"zone.example\" (2026-09-02).\nviolation contains make_diag_full(\"pf-route53-zonename-trailing-dot\", \"ERROR\", name,\n\t\"Properties.HostedZoneName\",\n\tsprintf(\"HostedZoneName '%s' is missing the trailing dot, so CloudFormation fails the lookup with \\\"No hosted zone with name ... found\\\"\", [zn]),\n\tsprintf(\"Use '%s.' (with the trailing dot)\", [zn]),\n\t\"https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-recordset.html\") if {\n\tsome name in resources_of_type(\"AWS::Route53::RecordSet\")\n\tzn := resolve(name, \"Properties.HostedZoneName\")\n\tis_string(zn)\n\tzn != \"\"\n\tnot endswith(zn, \".\")\n}\n"
|
|
497
585
|
},
|
|
586
|
+
{
|
|
587
|
+
"id": "pf-s3-accelerate-dotted-name",
|
|
588
|
+
"service": "s3",
|
|
589
|
+
"severity": "ERROR",
|
|
590
|
+
"title": "Transfer Acceleration rejects bucket names with periods",
|
|
591
|
+
"upstream": "none",
|
|
592
|
+
"resourceTypes": [
|
|
593
|
+
"AWS::S3::Bucket"
|
|
594
|
+
],
|
|
595
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# Transfer Acceleration endpoints are DNS-based, so bucket names containing\n# periods are rejected at creation. Only a literal BucketName is checkable;\n# CDK-generated names never contain periods anyway.\nviolation contains make_diag_full(\"pf-s3-accelerate-dotted-name\", \"ERROR\", name,\n\t\"Properties.AccelerateConfiguration.AccelerationStatus\",\n\tsprintf(\"Bucket name '%s' contains periods, which Transfer Acceleration does not support; CreateBucket fails with \\\"S3 Transfer Acceleration is not supported for buckets with periods (.) in their names\\\"\", [bn]),\n\t\"Rename the bucket without periods, or drop AccelerateConfiguration\",\n\t\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/transfer-acceleration.html\") if {\n\tsome name in resources_of_type(\"AWS::S3::Bucket\")\n\tresolve(name, \"Properties.AccelerateConfiguration.AccelerationStatus\") == \"Enabled\"\n\tbn := resolve(name, \"Properties.BucketName\")\n\tis_string(bn)\n\tcontains(bn, \".\")\n}\n"
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
"id": "pf-s3-bucket-policy-action-resource",
|
|
599
|
+
"service": "s3",
|
|
600
|
+
"severity": "ERROR",
|
|
601
|
+
"title": "Object-level actions need an object-level Resource",
|
|
602
|
+
"upstream": "none",
|
|
603
|
+
"resourceTypes": [
|
|
604
|
+
"AWS::S3::BucketPolicy"
|
|
605
|
+
],
|
|
606
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# An object-level action whose statement lists only bucket-level ARNs applies\n# to nothing, and S3 rejects the policy. A bucket-level ARN is provable two\n# ways: a literal arn:...:s3:::name with no \"/\" in the name part, or a value\n# that resolve() turns into the logical ID of an in-template bucket (Ref and\n# Fn::GetAtt Arn both do — the GetAtt of a bucket is its bucket ARN). Fires\n# only when every resource in the statement is provably bucket-level, so\n# unresolvable entries (e.g. Fn::Sub \"${B.Arn}/*\") mute the statement.\n\n_pf_s3bpar_object_action(a) if startswith(lower(a), \"s3:getobject\")\n\n_pf_s3bpar_object_action(a) if startswith(lower(a), \"s3:putobject\")\n\n_pf_s3bpar_object_action(a) if startswith(lower(a), \"s3:deleteobject\")\n\n_pf_s3bpar_object_action(a) if lower(a) in {\"s3:abortmultipartupload\", \"s3:restoreobject\", \"s3:listmultipartuploadparts\"}\n\n_pf_s3bpar_bucket_level(r) if r in resources_of_type(\"AWS::S3::Bucket\")\n\n_pf_s3bpar_bucket_level(r) if {\n\tstartswith(r, \"arn:\")\n\tcontains(r, \":s3:::\")\n\tparts := split(r, \":::\")\n\tcount(parts) == 2\n\tnot contains(parts[1], \"/\")\n}\n\n_pf_s3bpar_actions(name, i) := [a] if {\n\ta := resolve(name, sprintf(\"Properties.PolicyDocument.Statement.%d.Action\", [i]))\n\tis_string(a)\n}\n\n_pf_s3bpar_actions(name, i) := acts if {\n\titems := [it | some it in flatten_list(name, sprintf(\"Properties.PolicyDocument.Statement.%d.Action\", [i]))]\n\tcount(items) > 0\n\tacts := [v | some it in items; v := it.value; is_string(v)]\n}\n\n_pf_s3bpar_resources(name, i) := [r] if {\n\tr := resolve(name, sprintf(\"Properties.PolicyDocument.Statement.%d.Resource\", [i]))\n\tis_string(r)\n}\n\n_pf_s3bpar_resources(name, i) := rs if {\n\titems := [it | some it in flatten_list(name, sprintf(\"Properties.PolicyDocument.Statement.%d.Resource\", [i]))]\n\tcount(items) > 0\n\trs := [v | some it in items; v := resolve(name, sprintf(\"Properties.PolicyDocument.Statement.%d.Resource.%d\", [i, it.index])); is_string(v)]\n\tcount(rs) == count(items)\n}\n\nviolation contains make_diag_full(\"pf-s3-bucket-policy-action-resource\", \"ERROR\", name,\n\tsprintf(\"Properties.PolicyDocument.Statement.%d.Resource\", [st.index]),\n\tsprintf(\"Action '%s' targets objects but the statement's resources are all bucket-level ARNs; S3 rejects the policy with \\\"Action does not apply to any resource(s) in statement\\\"\", [a]),\n\t\"Add the object form of the ARN (append /* or a key pattern) to Resource, or drop the object-level action\",\n\t\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html\") if {\n\tsome name in resources_of_type(\"AWS::S3::BucketPolicy\")\n\tsome st in flatten_list(name, \"Properties.PolicyDocument.Statement\")\n\tis_object(st.value)\n\tsome a in _pf_s3bpar_actions(name, st.index)\n\t_pf_s3bpar_object_action(a)\n\trs := _pf_s3bpar_resources(name, st.index)\n\tcount(rs) > 0\n\tevery r in rs {\n\t\t_pf_s3bpar_bucket_level(r)\n\t}\n}\n"
|
|
607
|
+
},
|
|
608
|
+
{
|
|
609
|
+
"id": "pf-s3-bucket-policy-principal",
|
|
610
|
+
"service": "s3",
|
|
611
|
+
"severity": "ERROR",
|
|
612
|
+
"title": "Bucket policy statements need a Principal",
|
|
613
|
+
"upstream": "none",
|
|
614
|
+
"resourceTypes": [
|
|
615
|
+
"AWS::S3::BucketPolicy"
|
|
616
|
+
],
|
|
617
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# Resource-based policies require Principal (or NotPrincipal) in every\n# statement — unlike identity policies, where cfn-lint-grade checks are\n# tuned. An unresolvable Principal value still counts as present.\nviolation contains make_diag_full(\"pf-s3-bucket-policy-principal\", \"ERROR\", name,\n\tsprintf(\"Properties.PolicyDocument.Statement.%d\", [st.index]),\n\t\"The statement has neither Principal nor NotPrincipal; S3 rejects the policy with \\\"Missing required field Principal\\\"\",\n\t\"Add a Principal (or NotPrincipal) to the statement — bucket policies always name who they apply to\",\n\t\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html\") if {\n\tsome name in resources_of_type(\"AWS::S3::BucketPolicy\")\n\tsome st in flatten_list(name, \"Properties.PolicyDocument.Statement\")\n\tis_object(st.value)\n\tobject.get(st.value, \"Principal\", \"__pf_absent\") == \"__pf_absent\"\n\tobject.get(st.value, \"NotPrincipal\", \"__pf_absent\") == \"__pf_absent\"\n}\n"
|
|
618
|
+
},
|
|
498
619
|
{
|
|
499
620
|
"id": "pf-s3-lifecycle-days-order",
|
|
500
621
|
"service": "s3",
|
|
@@ -506,6 +627,72 @@ exports.BUNDLED_RULES = [
|
|
|
506
627
|
],
|
|
507
628
|
"rego": "package cdk_preflight\n\nimport rego.v1\n\n_pf_s3ord_fix := \"Order the lifecycle days so archive transitions come at least 30 days after IA transitions and expiration comes after every transition\"\n\n_pf_s3ord_url := \"https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html\"\n\nviolation contains make_diag_full(\"pf-s3-lifecycle-days-order\", \"ERROR\", name,\n\tsprintf(\"Properties.LifecycleConfiguration.Rules.%d.Transitions\", [r.index]),\n\tsprintf(\"Transition to %s at %v days is less than 30 days after the %s transition at %v days; S3 requires objects to stay at least 30 days in IA storage\", [sc2, d2, sc1, d1]),\n\t_pf_s3ord_fix, _pf_s3ord_url) if {\n\tsome name in resources_of_type(\"AWS::S3::Bucket\")\n\tsome r in flatten_list(name, \"Properties.LifecycleConfiguration.Rules\")\n\tis_object(r.value)\n\ttrans := object.get(r.value, \"Transitions\", [])\n\tis_array(trans)\n\tsome t1 in trans\n\tis_object(t1)\n\tsc1 := object.get(t1, \"StorageClass\", \"\")\n\tsc1 in {\"STANDARD_IA\", \"ONEZONE_IA\"}\n\traw1 := object.get(t1, \"TransitionInDays\", null)\n\traw1 != null # to_number(null) は 0 になる\n\td1 := to_number(raw1)\n\tsome t2 in trans\n\tis_object(t2)\n\tsc2 := object.get(t2, \"StorageClass\", \"\")\n\tsc2 in {\"GLACIER\", \"DEEP_ARCHIVE\"}\n\traw2 := object.get(t2, \"TransitionInDays\", null)\n\traw2 != null\n\td2 := to_number(raw2)\n\td2 < d1 + 30\n}\n\nviolation contains make_diag_full(\"pf-s3-lifecycle-days-order\", \"ERROR\", name,\n\tsprintf(\"Properties.LifecycleConfiguration.Rules.%d.ExpirationInDays\", [r.index]),\n\tsprintf(\"ExpirationInDays (%v) must be greater than TransitionInDays (%v); S3 rejects lifecycle rules that expire objects before or when they transition\", [e, d]),\n\t_pf_s3ord_fix, _pf_s3ord_url) if {\n\tsome name in resources_of_type(\"AWS::S3::Bucket\")\n\tsome r in flatten_list(name, \"Properties.LifecycleConfiguration.Rules\")\n\tis_object(r.value)\n\trawe := object.get(r.value, \"ExpirationInDays\", null)\n\trawe != null # to_number(null) は 0 になる\n\te := to_number(rawe)\n\ttrans := object.get(r.value, \"Transitions\", [])\n\tis_array(trans)\n\tsome t in trans\n\tis_object(t)\n\trawd := object.get(t, \"TransitionInDays\", null)\n\trawd != null\n\td := to_number(rawd)\n\te <= d\n}\n"
|
|
508
629
|
},
|
|
630
|
+
{
|
|
631
|
+
"id": "pf-s3-lifecycle-expiration-positive",
|
|
632
|
+
"service": "s3",
|
|
633
|
+
"severity": "ERROR",
|
|
634
|
+
"title": "ExpirationInDays must be a positive integer",
|
|
635
|
+
"upstream": "pending-engine",
|
|
636
|
+
"resourceTypes": [
|
|
637
|
+
"AWS::S3::Bucket"
|
|
638
|
+
],
|
|
639
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# The registry schema types ExpirationInDays as a bare integer with no\n# minimum, so 0 and negatives reach the service. Only the Expiration action\n# was bench-verified; other day fields are left alone.\nviolation contains make_diag_full(\"pf-s3-lifecycle-expiration-positive\", \"ERROR\", name,\n\tsprintf(\"Properties.LifecycleConfiguration.Rules.%d.ExpirationInDays\", [r.index]),\n\tsprintf(\"ExpirationInDays is %v; S3 rejects the rule with \\\"'Days' for Expiration action must be a positive integer\\\"\", [d]),\n\t\"Use an ExpirationInDays of 1 or more\",\n\t\"https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-s3-bucket-rule.html\") if {\n\tsome name in resources_of_type(\"AWS::S3::Bucket\")\n\tsome r in flatten_list(name, \"Properties.LifecycleConfiguration.Rules\")\n\tis_object(r.value)\n\traw := object.get(r.value, \"ExpirationInDays\", null)\n\traw != null\n\td := to_number(raw)\n\td <= 0\n}\n"
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
"id": "pf-s3-lifecycle-rule-no-action",
|
|
643
|
+
"service": "s3",
|
|
644
|
+
"severity": "ERROR",
|
|
645
|
+
"title": "A lifecycle rule needs at least one action",
|
|
646
|
+
"upstream": "none",
|
|
647
|
+
"resourceTypes": [
|
|
648
|
+
"AWS::S3::Bucket"
|
|
649
|
+
],
|
|
650
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# The ten action fields, verbatim from the service error. A field whose value\n# is an unresolvable intrinsic still counts as present (fail closed).\n_pf_s3lna_actions := {\n\t\"AbortIncompleteMultipartUpload\",\n\t\"ExpirationDate\",\n\t\"ExpirationInDays\",\n\t\"ExpiredObjectDeleteMarker\",\n\t\"NoncurrentVersionExpiration\",\n\t\"NoncurrentVersionExpirationInDays\",\n\t\"NoncurrentVersionTransition\",\n\t\"NoncurrentVersionTransitions\",\n\t\"Transition\",\n\t\"Transitions\",\n}\n\n_pf_s3lna_has_action(rule) if {\n\tsome k in _pf_s3lna_actions\n\tobject.get(rule, k, \"__pf_absent\") != \"__pf_absent\"\n}\n\nviolation contains make_diag_full(\"pf-s3-lifecycle-rule-no-action\", \"ERROR\", name,\n\tsprintf(\"Properties.LifecycleConfiguration.Rules.%d\", [r.index]),\n\t\"The lifecycle rule specifies no action; S3 rejects it with \\\"At least one of [ExpirationDate,ExpirationInDays,AbortIncompleteMultipartUpload,Transition,...] needs to be specified\\\"\",\n\t\"Add an expiration, transition, or abort-incomplete-multipart-upload action to the rule, or remove the rule\",\n\t\"https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-s3-bucket-rule.html\") if {\n\tsome name in resources_of_type(\"AWS::S3::Bucket\")\n\tsome r in flatten_list(name, \"Properties.LifecycleConfiguration.Rules\")\n\tis_object(r.value)\n\tnot _pf_s3lna_has_action(r.value)\n}\n"
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
"id": "pf-s3-notification-overlapping-filters",
|
|
654
|
+
"service": "s3",
|
|
655
|
+
"severity": "ERROR",
|
|
656
|
+
"title": "Notification entries must not overlap for the same event type",
|
|
657
|
+
"upstream": "none",
|
|
658
|
+
"resourceTypes": [
|
|
659
|
+
"AWS::S3::Bucket"
|
|
660
|
+
],
|
|
661
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# S3 keeps one notification configuration per bucket and rejects it when two\n# entries (across queue/topic/lambda alike) could match the same object event:\n# overlapping event types AND overlapping prefixes AND overlapping suffixes.\n# A missing filter side means \"\" and overlaps everything. Pairs with an\n# unresolvable event or filter value are skipped — overlap cannot be proven.\n\n_pf_s3no_configs(name) := array.concat(array.concat(\n\t[c | some c in flatten_list(name, \"Properties.NotificationConfiguration.QueueConfigurations\")],\n\t[c | some c in flatten_list(name, \"Properties.NotificationConfiguration.TopicConfigurations\")]),\n\t[c | some c in flatten_list(name, \"Properties.NotificationConfiguration.LambdaConfigurations\")])\n\n_pf_s3no_rules(c) := rules if {\n\tf := object.get(c, \"Filter\", null)\n\tis_object(f)\n\tk := object.get(f, \"S3Key\", null)\n\tis_object(k)\n\trules := object.get(k, \"Rules\", [])\n\tis_array(rules)\n}\n\n_pf_s3no_rules(c) := [] if {\n\tobject.get(c, \"Filter\", \"__pf_absent\") == \"__pf_absent\"\n}\n\n_pf_s3no_filter_val(c, kind) := v if {\n\tvs := [x | some r in _pf_s3no_rules(c); is_object(r); lower(object.get(r, \"Name\", \"\")) == kind; x := object.get(r, \"Value\", null)]\n\tcount(vs) > 0\n\tv := vs[0]\n}\n\n_pf_s3no_filter_val(c, kind) := \"\" if {\n\tvs := [x | some r in _pf_s3no_rules(c); is_object(r); lower(object.get(r, \"Name\", \"\")) == kind; x := object.get(r, \"Value\", null)]\n\tcount(vs) == 0\n}\n\n_pf_s3no_pre_overlap(a, b) if startswith(a, b)\n\n_pf_s3no_pre_overlap(a, b) if startswith(b, a)\n\n_pf_s3no_suf_overlap(a, b) if endswith(a, b)\n\n_pf_s3no_suf_overlap(a, b) if endswith(b, a)\n\n# \"s3:ObjectCreated:*\" covers \"s3:ObjectCreated:Put\"; drop the trailing \"*\"\n# and prefix-match.\n_pf_s3no_event_overlap(e1, e2) if e1 == e2\n\n_pf_s3no_event_overlap(e1, e2) if {\n\tendswith(e1, \":*\")\n\tstartswith(e2, substring(e1, 0, count(e1) - 1))\n}\n\n_pf_s3no_event_overlap(e1, e2) if {\n\tendswith(e2, \":*\")\n\tstartswith(e1, substring(e2, 0, count(e2) - 1))\n}\n\nviolation contains make_diag_full(\"pf-s3-notification-overlapping-filters\", \"ERROR\", name,\n\t\"Properties.NotificationConfiguration\",\n\tsprintf(\"Two notification entries for overlapping event types ('%s' and '%s') have overlapping prefix/suffix filters; S3 rejects the configuration with \\\"Configuration is ambiguously defined. Cannot have overlapping suffixes in two rules if the prefixes are overlapping for the same event type.\\\"\", [e1, e2]),\n\t\"Make the prefixes or suffixes disjoint, or merge the two entries into one\",\n\t\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/notification-how-to-filtering.html\") if {\n\tsome name in resources_of_type(\"AWS::S3::Bucket\")\n\tcs := _pf_s3no_configs(name)\n\tsome i, a in cs\n\tsome j, b in cs\n\ti < j\n\te1 := object.get(a.value, \"Event\", null)\n\tis_string(e1)\n\te2 := object.get(b.value, \"Event\", null)\n\tis_string(e2)\n\t_pf_s3no_event_overlap(e1, e2)\n\tp1 := _pf_s3no_filter_val(a.value, \"prefix\")\n\tis_string(p1)\n\tp2 := _pf_s3no_filter_val(b.value, \"prefix\")\n\tis_string(p2)\n\t_pf_s3no_pre_overlap(p1, p2)\n\ts1 := _pf_s3no_filter_val(a.value, \"suffix\")\n\tis_string(s1)\n\ts2 := _pf_s3no_filter_val(b.value, \"suffix\")\n\tis_string(s2)\n\t_pf_s3no_suf_overlap(s1, s2)\n}\n"
|
|
662
|
+
},
|
|
663
|
+
{
|
|
664
|
+
"id": "pf-s3-objectlock-requires-versioning",
|
|
665
|
+
"service": "s3",
|
|
666
|
+
"severity": "ERROR",
|
|
667
|
+
"title": "ObjectLockConfiguration needs versioning enabled",
|
|
668
|
+
"upstream": "none",
|
|
669
|
+
"resourceTypes": [
|
|
670
|
+
"AWS::S3::Bucket"
|
|
671
|
+
],
|
|
672
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# ObjectLockConfiguration on its own does NOT require ObjectLockEnabled —\n# S3 accepts Object Lock on an existing versioned bucket (bench s05b deployed\n# clean). What it does require is versioning. When ObjectLockEnabled is true\n# the bucket is created lock-enabled and versioning comes with it, so the rule\n# fires only when lock-enablement is provably off (key literally absent or\n# literal false) and versioning is provably not enabled.\n_pf_s3olrv_no_lock_enabled(name) if {\n\tprops := input.resources[name].properties\n\tis_object(props)\n\tobject.get(props, \"ObjectLockEnabled\", \"__pf_absent\") == \"__pf_absent\"\n}\n\n_pf_s3olrv_no_lock_enabled(name) if {\n\tcoerce_to_bool(resolve(name, \"Properties.ObjectLockEnabled\")) == false\n}\n\n_pf_s3olrv_bad_versioning(name) if {\n\tprops := input.resources[name].properties\n\tis_object(props)\n\tobject.get(props, \"VersioningConfiguration\", \"__pf_absent\") == \"__pf_absent\"\n}\n\n_pf_s3olrv_bad_versioning(name) if {\n\tresolve(name, \"Properties.VersioningConfiguration.Status\") == \"Suspended\"\n}\n\nviolation contains make_diag_full(\"pf-s3-objectlock-requires-versioning\", \"ERROR\", name,\n\t\"Properties.ObjectLockConfiguration\",\n\t\"ObjectLockConfiguration is set on a bucket whose versioning is not enabled; S3 rejects it with \\\"Versioning must be 'Enabled' on the bucket to apply a Object Lock configuration\\\"\",\n\t\"Set VersioningConfiguration.Status to 'Enabled', or set ObjectLockEnabled: true to create the bucket lock-enabled\",\n\t\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html\") if {\n\tsome name in resources_of_type(\"AWS::S3::Bucket\")\n\tis_object(resolve(name, \"Properties.ObjectLockConfiguration\"))\n\t_pf_s3olrv_no_lock_enabled(name)\n\t_pf_s3olrv_bad_versioning(name)\n}\n"
|
|
673
|
+
},
|
|
674
|
+
{
|
|
675
|
+
"id": "pf-s3-objectlock-versioning-suspended",
|
|
676
|
+
"service": "s3",
|
|
677
|
+
"severity": "ERROR",
|
|
678
|
+
"title": "Object Lock forbids suspending versioning",
|
|
679
|
+
"upstream": "none",
|
|
680
|
+
"resourceTypes": [
|
|
681
|
+
"AWS::S3::Bucket"
|
|
682
|
+
],
|
|
683
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# Object Lock force-enables versioning at creation, so a template that also\n# suspends versioning contradicts itself and the handler's PutBucketVersioning\n# call is rejected. Fires only on a literal \"Suspended\".\nviolation contains make_diag_full(\"pf-s3-objectlock-versioning-suspended\", \"ERROR\", name,\n\t\"Properties.VersioningConfiguration.Status\",\n\t\"ObjectLockEnabled is true but VersioningConfiguration suspends versioning; S3 rejects it with \\\"An Object Lock configuration is present on this bucket, so the versioning state cannot be changed.\\\"\",\n\t\"Set VersioningConfiguration.Status to 'Enabled' (or drop it — Object Lock enables versioning itself)\",\n\t\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html\") if {\n\tsome name in resources_of_type(\"AWS::S3::Bucket\")\n\tcoerce_to_bool(resolve(name, \"Properties.ObjectLockEnabled\")) == true\n\tresolve(name, \"Properties.VersioningConfiguration.Status\") == \"Suspended\"\n}\n"
|
|
684
|
+
},
|
|
685
|
+
{
|
|
686
|
+
"id": "pf-s3-replication-dest-versioning",
|
|
687
|
+
"service": "s3",
|
|
688
|
+
"severity": "ERROR",
|
|
689
|
+
"title": "The replication destination bucket needs versioning enabled",
|
|
690
|
+
"upstream": "none",
|
|
691
|
+
"resourceTypes": [
|
|
692
|
+
"AWS::S3::Bucket"
|
|
693
|
+
],
|
|
694
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# The destination side of what pf-s3-replication-requires-versioning checks on\n# the source. Destination.Bucket is normally Fn::GetAtt/Ref to an in-template\n# bucket; resolve() turns both into the target's logical ID, so the\n# destination's own properties are readable. External destination ARNs resolve\n# to strings that are not logical IDs and skip. Versioning is \"not enabled\"\n# when VersioningConfiguration is literally absent (proven via\n# input.resources, see AGENTS.md) or Status resolves to \"Suspended\"; an\n# unresolvable Status skips.\n_pf_s3rdv_bad_versioning(dest) if {\n\tprops := input.resources[dest].properties\n\tis_object(props)\n\tobject.get(props, \"VersioningConfiguration\", \"__pf_absent\") == \"__pf_absent\"\n}\n\n_pf_s3rdv_bad_versioning(dest) if {\n\tresolve(dest, \"Properties.VersioningConfiguration.Status\") == \"Suspended\"\n}\n\nviolation contains make_diag_full(\"pf-s3-replication-dest-versioning\", \"ERROR\", name,\n\tsprintf(\"Properties.ReplicationConfiguration.Rules.%d.Destination.Bucket\", [r.index]),\n\tsprintf(\"Replication destination bucket '%s' does not have versioning enabled; S3 rejects the configuration with \\\"Destination bucket must have versioning enabled\\\"\", [dest]),\n\t\"Set VersioningConfiguration.Status to 'Enabled' on the destination bucket\",\n\t\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-requirements.html\") if {\n\tsome name in resources_of_type(\"AWS::S3::Bucket\")\n\tsome r in flatten_list(name, \"Properties.ReplicationConfiguration.Rules\")\n\tdest := resolve(name, sprintf(\"Properties.ReplicationConfiguration.Rules.%d.Destination.Bucket\", [r.index]))\n\tis_string(dest)\n\tdest in resources_of_type(\"AWS::S3::Bucket\")\n\t_pf_s3rdv_bad_versioning(dest)\n}\n"
|
|
695
|
+
},
|
|
509
696
|
{
|
|
510
697
|
"id": "pf-s3-replication-requires-versioning",
|
|
511
698
|
"service": "s3",
|
|
@@ -515,7 +702,18 @@ exports.BUNDLED_RULES = [
|
|
|
515
702
|
"resourceTypes": [
|
|
516
703
|
"AWS::S3::Bucket"
|
|
517
704
|
],
|
|
518
|
-
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# Status がリテラルで \"Suspended\"
|
|
705
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# 違反にするのは VersioningConfiguration が文字どおり不在(input.resources で\n# 証明、AGENTS.md 参照)か、Status がリテラルで \"Suspended\" のときだけ。\n# 未解決トークンは OK 扱い(resolve() はキー不在と未解決の両方で undefined に\n# なるため、`not resolve(...)` では不在を証明できない — 2026-09-02 実測)。\n_pf_s3repl_bad_versioning(name) if {\n\tprops := input.resources[name].properties\n\tis_object(props)\n\tobject.get(props, \"VersioningConfiguration\", \"__pf_absent\") == \"__pf_absent\"\n}\n\n_pf_s3repl_bad_versioning(name) if {\n\tresolve(name, \"Properties.VersioningConfiguration.Status\") == \"Suspended\"\n}\n\nviolation contains make_diag_full(\"pf-s3-replication-requires-versioning\", \"ERROR\", name,\n\t\"Properties.ReplicationConfiguration\",\n\t\"ReplicationConfiguration is set but bucket versioning is not enabled; S3 rejects the replication configuration at deploy time (InvalidRequest: Versioning must be 'Enabled' on the bucket)\",\n\t\"Set VersioningConfiguration.Status to 'Enabled' on the source bucket\",\n\t\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-requirements.html\") if {\n\tsome name in resources_of_type(\"AWS::S3::Bucket\")\n\tis_object(resolve(name, \"Properties.ReplicationConfiguration\"))\n\t_pf_s3repl_bad_versioning(name)\n}\n"
|
|
706
|
+
},
|
|
707
|
+
{
|
|
708
|
+
"id": "pf-s3-website-redirect-exclusive",
|
|
709
|
+
"service": "s3",
|
|
710
|
+
"severity": "ERROR",
|
|
711
|
+
"title": "RedirectAllRequestsTo excludes every other website setting",
|
|
712
|
+
"upstream": "none",
|
|
713
|
+
"resourceTypes": [
|
|
714
|
+
"AWS::S3::Bucket"
|
|
715
|
+
],
|
|
716
|
+
"rego": "package cdk_preflight\n\nimport rego.v1\n\n# RedirectAllRequestsTo redirects the whole site, so S3 rejects any sibling\n# website setting alongside it.\nviolation contains make_diag_full(\"pf-s3-website-redirect-exclusive\", \"ERROR\", name,\n\tsprintf(\"Properties.WebsiteConfiguration.%s\", [k]),\n\tsprintf(\"WebsiteConfiguration combines RedirectAllRequestsTo with %s; S3 rejects it with \\\"[IndexDocument, ErrorDocument, RoutingRules] should not be specified if RedirectAllRequestsTo is specified\\\"\", [k]),\n\t\"Keep RedirectAllRequestsTo alone, or drop it and configure the website with IndexDocument/ErrorDocument/RoutingRules\",\n\t\"https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-s3-bucket-websiteconfiguration.html\") if {\n\tsome name in resources_of_type(\"AWS::S3::Bucket\")\n\twc := resolve(name, \"Properties.WebsiteConfiguration\")\n\tis_object(wc)\n\tobject.get(wc, \"RedirectAllRequestsTo\", \"__pf_absent\") != \"__pf_absent\"\n\tsome k in {\"IndexDocument\", \"ErrorDocument\", \"RoutingRules\"}\n\tobject.get(wc, k, \"__pf_absent\") != \"__pf_absent\"\n}\n"
|
|
519
717
|
},
|
|
520
718
|
{
|
|
521
719
|
"id": "pf-sns-fifo-topic-name",
|
|
@@ -540,4 +738,4 @@ exports.BUNDLED_RULES = [
|
|
|
540
738
|
"rego": "package cdk_preflight\n\nimport rego.v1\n\n_pf_sfn_fix := \"Point Next/Default/Choices at an existing state name\"\n\n_pf_sfn_url := \"https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-states.html\"\n\n_pf_sfn_asl(name) := asl if {\n\tdef := resolve(name, \"Properties.DefinitionString\")\n\tis_string(def)\n\tasl := json.unmarshal(def)\n\tis_object(asl)\n}\n\n_pf_sfn_defined(asl) := {sn | some sn, _ in object.get(asl, \"States\", {})}\n\n# NOTE: a dangling StartAt is deliberately NOT checked here — the engine's\n# built-in rule E3601 (ERROR/CFN_LINT) already covers it. Verified against\n# @aws/cloudformation-validate 1.7.0-beta on 2026-09-01: E3601 fires for\n# StartAt only and does not check Next/Default/Choices, which is what this\n# rule adds.\n\nviolation contains make_diag_full(\"pf-sfn-asl-missing-state\", \"ERROR\", name,\n\t\"Properties.DefinitionString\",\n\tsprintf(\"state '%s' references state '%s' via %s, but no state with that name is defined\", [sname, target, key]),\n\t_pf_sfn_fix, _pf_sfn_url) if {\n\tsome name in resources_of_type(\"AWS::StepFunctions::StateMachine\")\n\tasl := _pf_sfn_asl(name)\n\tsome sname, st in object.get(asl, \"States\", {})\n\tis_object(st)\n\tsome key in {\"Next\", \"Default\"}\n\ttarget := object.get(st, key, null)\n\tis_string(target)\n\tnot target in _pf_sfn_defined(asl)\n}\n\nviolation contains make_diag_full(\"pf-sfn-asl-missing-state\", \"ERROR\", name,\n\t\"Properties.DefinitionString\",\n\tsprintf(\"state '%s' has a Choice rule referencing state '%s', but no state with that name is defined\", [sname, target]),\n\t_pf_sfn_fix, _pf_sfn_url) if {\n\tsome name in resources_of_type(\"AWS::StepFunctions::StateMachine\")\n\tasl := _pf_sfn_asl(name)\n\tsome sname, st in object.get(asl, \"States\", {})\n\tis_object(st)\n\tchoices := object.get(st, \"Choices\", [])\n\tis_array(choices)\n\tsome c in choices\n\tis_object(c)\n\ttarget := object.get(c, \"Next\", null)\n\tis_string(target)\n\tnot target in _pf_sfn_defined(asl)\n}\n"
|
|
541
739
|
}
|
|
542
740
|
];
|
|
543
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZXMuZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3J1bGVzLmdlbmVyYXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFhYSxRQUFBLGFBQWEsR0FBc0I7SUFDOUM7UUFDRSxJQUFJLEVBQUUscUNBQXFDO1FBQzNDLFNBQVMsRUFBRSxtQkFBbUI7UUFDOUIsVUFBVSxFQUFFLE9BQU87UUFDbkIsT0FBTyxFQUFFLHlFQUF5RTtRQUNsRixVQUFVLEVBQUUsTUFBTTtRQUNsQixlQUFlLEVBQUU7WUFDZixnQ0FBZ0M7U0FDakM7UUFDRCxNQUFNLEVBQUUsbzJCQUFvMkI7S0FDNzJCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsMkJBQTJCO1FBQ2pDLFNBQVMsRUFBRSxtQkFBbUI7UUFDOUIsVUFBVSxFQUFFLE9BQU87UUFDbkIsT0FBTyxFQUFFLDRFQUE0RTtRQUNyRixVQUFVLEVBQUUsZ0JBQWdCO1FBQzVCLGVBQWUsRUFBRTtZQUNmLGdDQUFnQztTQUNqQztRQUNELE1BQU0sRUFBRSwrNkJBQSs2QjtLQUN4N0I7SUFDRDtRQUNFLElBQUksRUFBRSwrQkFBK0I7UUFDckMsU0FBUyxFQUFFLFlBQVk7UUFDdkIsVUFBVSxFQUFFLE9BQU87UUFDbkIsT0FBTyxFQUFFLHVEQUF1RDtRQUNoRSxVQUFVLEVBQUUsTUFBTTtRQUNsQixlQUFlLEVBQUU7WUFDZiwrQkFBK0I7U0FDaEM7UUFDRCxNQUFNLEVBQUUsNjZCQUE2NkI7S0FDdDdCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsa0RBQWtEO1FBQ3hELFNBQVMsRUFBRSxZQUFZO1FBQ3ZCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLE9BQU8sRUFBRSwyRUFBMkU7UUFDcEYsVUFBVSxFQUFFLE1BQU07UUFDbEIsZUFBZSxFQUFFO1lBQ2YsK0JBQStCO1NBQ2hDO1FBQ0QsTUFBTSxFQUFFLHMvQkFBcy9CO0tBQy8vQjtJQUNEO1FBQ0UsSUFBSSxFQUFFLHFDQUFxQztRQUMzQyxTQUFT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O0tBQ2w1QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLDRCQUE0QjtRQUNsQyxTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxPQUFPO1FBQ25CLE9BQU8sRUFBRSxrR0FBa0c7UUFDM0csVUFBVSxFQUFFLE1BQU07UUFDbEIsZUFBZSxFQUFFO1lBQ2YsaUJBQWlCO1NBQ2xCO1FBQ0QsTUFBTSxFQUFFLHF3RUFBcXdFO0tBQzl3RTtJQUNEO1FBQ0UsSUFBSSxFQUFFLHVDQUF1QztRQUM3QyxTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxPQUFPO1FBQ25CLE9BQU8sRUFBRSxpRkFBaUY7UUFDMUYsVUFBVSxFQUFFLE1BQU07UUFDbEIsZUFBZSxFQUFFO1lBQ2YsaUJBQWlCO1NBQ2xCO1FBQ0QsTUFBTSxFQUFFLHE5QkFBcTlCO0tBQzk5QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLHdCQUF3QjtRQUM5QixTQUFTLEVBQUUsS0FBSztRQUNoQixVQUFVLEVBQUUsT0FBTztRQUNuQixPQUFPLEVBQUUsOEVBQThFO1FBQ3ZGLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLGVBQWUsRUFBRTtZQUNmLGlCQUFpQjtTQUNsQjtRQUNELE1BQU0sRUFBRSw2K0NBQTYrQztLQUN0L0M7SUFDRDtRQUNFLElBQUksRUFBRSwwQkFBMEI7UUFDaEMsU0FBUyxFQUFFLGVBQWU7UUFDMUIsVUFBVSxFQUFFLE9BQU87UUFDbkIsT0FBTyxFQUFFLGdJQUFnSTtRQUN6SSxVQUFVLEVBQUUsTUFBTTtRQUNsQixlQUFlLEVBQUU7WUFDZixrQ0FBa0M7U0FDbkM7UUFDRCxNQUFNLEVBQUUsMitEQUEyK0Q7S0FDcC9EO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIH5+IEdlbmVyYXRlZCBieSBzY3JpcHRzL2J1bmRsZS1ydWxlcy50cyBmcm9tIHJ1bGVzLyoqLiBEbyBub3QgZWRpdCBieSBoYW5kLlxuLy8gfn4gUmVnZW5lcmF0ZSB3aXRoOiBucHggcHJvamVuIGJ1bmRsZS1ydWxlc1xuLyogZXNsaW50LWRpc2FibGUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVuZGxlZFJ1bGVEYXRhIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nO1xuICByZWFkb25seSBzZXZlcml0eTogc3RyaW5nO1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICByZWFkb25seSB1cHN0cmVhbTogc3RyaW5nO1xuICByZWFkb25seSByZXNvdXJjZVR5cGVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcmVnbzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgQlVORExFRF9SVUxFUzogQnVuZGxlZFJ1bGVEYXRhW10gPSBbXG4gIHtcbiAgICBcImlkXCI6IFwicGYtYWdlbnRjb3JlLWdhdGV3YXktand0LWF1dGhvcml6ZXJcIixcbiAgICBcInNlcnZpY2VcIjogXCJiZWRyb2NrLWFnZW50Y29yZVwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJHYXRld2F5cyB3aXRoIEF1dGhvcml6ZXJUeXBlIENVU1RPTV9KV1QgcmVxdWlyZSBBdXRob3JpemVyQ29uZmlndXJhdGlvblwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpCZWRyb2NrQWdlbnRDb3JlOjpHYXRld2F5XCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX2d3and0X2hhc19jb25maWcobmFtZSkgaWYgaXNfb2JqZWN0KHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuQXV0aG9yaXplckNvbmZpZ3VyYXRpb25cXFwiKSlcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWFnZW50Y29yZS1nYXRld2F5LWp3dC1hdXRob3JpemVyXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5BdXRob3JpemVyQ29uZmlndXJhdGlvblxcXCIsXFxuXFx0XFxcIkF1dGhvcml6ZXJUeXBlIGlzIENVU1RPTV9KV1QgYnV0IEF1dGhvcml6ZXJDb25maWd1cmF0aW9uIGlzIG1pc3Npbmc7IHRoZSBDcmVhdGVHYXRld2F5IEFQSSByZXF1aXJlcyBpdCBhbmQgdGhlIGRlcGxveW1lbnQgZmFpbHMgd2l0aCBhIFZhbGlkYXRpb25FeGNlcHRpb25cXFwiLFxcblxcdFxcXCJBZGQgQXV0aG9yaXplckNvbmZpZ3VyYXRpb24uQ3VzdG9tSldUQXV0aG9yaXplciAoZGlzY292ZXJ5VXJsIGFuZCBhbGxvd2VkQXVkaWVuY2UvYWxsb3dlZENsaWVudHMpLCBvciBzd2l0Y2ggQXV0aG9yaXplclR5cGUgdG8gQVdTX0lBTVxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS1jb250cm9sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUdhdGV3YXkuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6QmVkcm9ja0FnZW50Q29yZTo6R2F0ZXdheVxcXCIpXFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5BdXRob3JpemVyVHlwZVxcXCIpID09IFxcXCJDVVNUT01fSldUXFxcIlxcblxcdG5vdCBfcGZfZ3dqd3RfaGFzX2NvbmZpZyhuYW1lKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWFnZW50Y29yZS1ydW50aW1lLW5hbWVcIixcbiAgICBcInNlcnZpY2VcIjogXCJiZWRyb2NrLWFnZW50Y29yZVwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJBZ2VudENvcmUgUnVudGltZSBuYW1lcyBtdXN0IG1hdGNoIFthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9IChubyBoeXBoZW5zKVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJwZW5kaW5nLWVuZ2luZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6QmVkcm9ja0FnZW50Q29yZTo6UnVudGltZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgQ2xvdWRGb3JtYXRpb24g44K544Kt44O844Oe44GvIEFnZW50UnVudGltZU5hbWUg44Gu44OR44K/44O844Oz44KS5oyB44Gf44Gq44GE77yI44Ko44Oz44K444Oz57Sg6YCa44KK44CBXFxuIyAyMDI2LTA5LTAxIOOBqyAxLjcuMC1iZXRhIOOBp+eiuuiqje+8ieOBjOOAgUNyZWF0ZUFnZW50UnVudGltZSBBUEkg44GvXFxuIyBbYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fSDjgpLlvLfliLbjgZnjgovjgILjg4/jgqTjg5Xjg7PlhaXjgorjga4gQ0RLIOmiqOWRveWQjeOBjOWumueVquOBruatu+WboOOAglxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtYWdlbnRjb3JlLXJ1bnRpbWUtbmFtZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuQWdlbnRSdW50aW1lTmFtZVxcXCIsXFxuXFx0c3ByaW50ZihcXFwiQWdlbnRSdW50aW1lTmFtZSAnJXMnIGlzIGludmFsaWQ6IGl0IG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY29udGFpbiBvbmx5IGxldHRlcnMsIGRpZ2l0cywgYW5kIHVuZGVyc2NvcmVzIChtYXggNDggY2hhcmFjdGVycywgaHlwaGVucyBhcmUgbm90IGFsbG93ZWQpOyBDcmVhdGVBZ2VudFJ1bnRpbWUgZmFpbHMgYXQgZGVwbG95IHRpbWVcXFwiLCBbbl0pLFxcblxcdFxcXCJVc2UgYW4gdW5kZXJzY29yZS1zZXBhcmF0ZWQgbmFtZSBzdWNoIGFzICdteV9hZ2VudF9ydW50aW1lJ1xcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS1jb250cm9sL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUFnZW50UnVudGltZS5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpCZWRyb2NrQWdlbnRDb3JlOjpSdW50aW1lXFxcIilcXG5cXHRuIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuQWdlbnRSdW50aW1lTmFtZVxcXCIpXFxuXFx0aXNfc3RyaW5nKG4pXFxuXFx0bm90IHJlZ2V4Lm1hdGNoKGBeW2EtekEtWl1bYS16QS1aMC05X117MCw0N30kYCwgbilcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1jbG91ZGZyb250LWFjbS1jZXJ0LXJlZ2lvblwiLFxuICAgIFwic2VydmljZVwiOiBcImNsb3VkZnJvbnRcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQ2xvdWRGcm9udCB2aWV3ZXIgY2VydGlmaWNhdGVzIG11c3QgbGl2ZSBpbiB1cy1lYXN0LTFcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1jbG91ZGZyb250LWFjbS1jZXJ0LXJlZ2lvblxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLlZpZXdlckNlcnRpZmljYXRlLkFjbUNlcnRpZmljYXRlQXJuXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJDbG91ZEZyb250IHJlcXVpcmVzIHRoZSBBQ00gY2VydGlmaWNhdGUgdG8gYmUgaW4gdXMtZWFzdC0xLCBidXQgdGhlIGNlcnRpZmljYXRlIGlzIGluICVzXFxcIiwgW3JlZ2lvbl0pLFxcblxcdFxcXCJJc3N1ZSBvciBpbXBvcnQgdGhlIGNlcnRpZmljYXRlIGluIHVzLWVhc3QtMSAoZS5nLiBhIGRlZGljYXRlZCB1cy1lYXN0LTEgc3RhY2spIGFuZCByZWZlcmVuY2UgdGhhdCBBUk5cXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY25hbWVzLWFuZC1odHRwcy1yZXF1aXJlbWVudHMuaHRtbCNodHRwcy1yZXF1aXJlbWVudHMtY2VydGlmaWNhdGUtaXNzdWVyXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cXFwiKVxcblxcdGFybiA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5WaWV3ZXJDZXJ0aWZpY2F0ZS5BY21DZXJ0aWZpY2F0ZUFyblxcXCIpXFxuXFx0aXNfc3RyaW5nKGFybilcXG5cXHRzdGFydHN3aXRoKGFybiwgXFxcImFybjpcXFwiKVxcblxcdHBhcnRzIDo9IHNwbGl0KGFybiwgXFxcIjpcXFwiKVxcblxcdGNvdW50KHBhcnRzKSA+PSA2XFxuXFx0cGFydHNbMl0gPT0gXFxcImFjbVxcXCJcXG5cXHRyZWdpb24gOj0gcGFydHNbM11cXG5cXHRyZWdpb24gIT0gXFxcIlxcXCJcXG5cXHRyZWdpb24gIT0gXFxcInVzLWVhc3QtMVxcXCJcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1jbG91ZGZyb250LWFsaWFzZXMtcmVxdWlyZS1jdXN0b20tY2VydGlmaWNhdGVcIixcbiAgICBcInNlcnZpY2VcIjogXCJjbG91ZGZyb250XCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkEgZGlzdHJpYnV0aW9uIHdpdGggQWxpYXNlcyBjYW5ub3QgdXNlIHRoZSBDbG91ZEZyb250IGRlZmF1bHQgY2VydGlmaWNhdGVcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX2NmX2FsaWFzY2VydF91cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXByb3BlcnRpZXMtY2xvdWRmcm9udC1kaXN0cmlidXRpb24tdmlld2VyY2VydGlmaWNhdGUuaHRtbFxcXCJcXG5cXG5fcGZfY2ZfYWxpYXNjZXJ0X2ZpeCA6PSBcXFwiQXR0YWNoIGFuIEFDTSBjZXJ0aWZpY2F0ZSAoQWNtQ2VydGlmaWNhdGVBcm4sIHVzLWVhc3QtMSkgb3IgYW4gSUFNIGNlcnRpZmljYXRlLCB0b2dldGhlciB3aXRoIFNzbFN1cHBvcnRNZXRob2QgYW5kIE1pbmltdW1Qcm90b2NvbFZlcnNpb25cXFwiXFxuXFxuX3BmX2NmX2FsaWFzY2VydF9jb3VudChuYW1lKSA6PSBjb3VudChbMSB8XFxuXFx0c29tZSBfIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuQWxpYXNlc1xcXCIpXFxuXSlcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWNsb3VkZnJvbnQtYWxpYXNlcy1yZXF1aXJlLWN1c3RvbS1jZXJ0aWZpY2F0ZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLlZpZXdlckNlcnRpZmljYXRlXFxcIixcXG5cXHRcXFwiQSBkaXN0cmlidXRpb24gd2l0aCBBbGlhc2VzIGNhbm5vdCB1c2UgdGhlIENsb3VkRnJvbnQgZGVmYXVsdCBjZXJ0aWZpY2F0ZVxcXCIsXFxuXFx0X3BmX2NmX2FsaWFzY2VydF9maXgsIF9wZl9jZl9hbGlhc2NlcnRfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblxcXCIpXFxuXFx0X3BmX2NmX2FsaWFzY2VydF9jb3VudChuYW1lKSA+IDBcXG5cXHRyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5WaWV3ZXJDZXJ0aWZpY2F0ZS5DbG91ZEZyb250RGVmYXVsdENlcnRpZmljYXRlXFxcIikgPT0gdHJ1ZVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWNsb3VkZnJvbnQtY2FjaGVkLW1ldGhvZHMtc3Vic2V0XCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiY2xvdWRmcm9udFwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJDYWNoZWRNZXRob2RzIG11c3QgYmUgYSBzdWJzZXQgb2YgQWxsb3dlZE1ldGhvZHNcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX2NmX21ldGhvZHNfdXJsIDo9IFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1wcm9wZXJ0aWVzLWNsb3VkZnJvbnQtZGlzdHJpYnV0aW9uLWNhY2hlYmVoYXZpb3IuaHRtbFxcXCJcXG5cXG5fcGZfY2ZfbWV0aG9kc19iZWhhdmlvcnMobmFtZSkgOj0gYXJyYXkuY29uY2F0KFxcblxcdFt7XFxcInBhdGhcXFwiOiBcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuRGVmYXVsdENhY2hlQmVoYXZpb3JcXFwiLCBcXFwidmFsdWVcXFwiOiBpdC52YWx1ZX0gfFxcblxcdFxcdHNvbWUgaXQgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5EZWZhdWx0Q2FjaGVCZWhhdmlvclxcXCIpXSxcXG5cXHRbe1xcXCJwYXRoXFxcIjogc3ByaW50ZihcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuQ2FjaGVCZWhhdmlvcnMuJWRcXFwiLCBbaXQuaW5kZXhdKSwgXFxcInZhbHVlXFxcIjogaXQudmFsdWV9IHxcXG5cXHRcXHRzb21lIGl0IGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuQ2FjaGVCZWhhdmlvcnNcXFwiKV0sXFxuKVxcblxcbiMgQ2xvdWRGcm9udCBkZWZhdWx0cyBBbGxvd2VkTWV0aG9kcyB0byBHRVQvSEVBRCB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBvbWl0dGVkLFxcbiMgc28gYW4gb21pdHRlZCBBbGxvd2VkTWV0aG9kcyBzdGlsbCBjb25zdHJhaW5zIHdoYXQgbWF5IGJlIGNhY2hlZC5cXG5fcGZfY2ZfbWV0aG9kc19hbGxvd2VkKGIpIDo9IG9iamVjdC5nZXQoYi52YWx1ZSwgXFxcIkFsbG93ZWRNZXRob2RzXFxcIiwgW1xcXCJHRVRcXFwiLCBcXFwiSEVBRFxcXCJdKVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtY2xvdWRmcm9udC1jYWNoZWQtbWV0aG9kcy1zdWJzZXRcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIiVzLkNhY2hlZE1ldGhvZHNcXFwiLCBbYi5wYXRoXSksXFxuXFx0c3ByaW50ZihcXFwiQ2FjaGVkTWV0aG9kcyBjb250YWlucyAlcywgd2hpY2ggaXMgbm90IGluIEFsbG93ZWRNZXRob2RzICV2XFxcIiwgW21ldGhvZCwgYWxsb3dlZF0pLFxcblxcdFxcXCJFdmVyeSBtZXRob2QgaW4gQ2FjaGVkTWV0aG9kcyBtdXN0IGFsc28gYXBwZWFyIGluIEFsbG93ZWRNZXRob2RzXFxcIixcXG5cXHRfcGZfY2ZfbWV0aG9kc191cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXFxcIilcXG5cXHRzb21lIGIgaW4gX3BmX2NmX21ldGhvZHNfYmVoYXZpb3JzKG5hbWUpXFxuXFx0aXNfb2JqZWN0KGIudmFsdWUpXFxuXFx0Y2FjaGVkIDo9IG9iamVjdC5nZXQoYi52YWx1ZSwgXFxcIkNhY2hlZE1ldGhvZHNcXFwiLCBudWxsKVxcblxcdGlzX2FycmF5KGNhY2hlZClcXG5cXHRhbGxvd2VkIDo9IF9wZl9jZl9tZXRob2RzX2FsbG93ZWQoYilcXG5cXHRpc19hcnJheShhbGxvd2VkKVxcblxcdHNvbWUgbWV0aG9kIGluIGNhY2hlZFxcblxcdG5vdCBtZXRob2QgaW4gYWxsb3dlZFxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWNsb3VkZnJvbnQtZWRnZS1sYW1iZGEtcmVnaW9uXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiY2xvdWRmcm9udFwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJMYW1iZGFARWRnZSBmdW5jdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgZGlzdHJpYnV0aW9uIG11c3QgYmUgaW4gdXMtZWFzdC0xXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9jZl9lZGdlcmVnaW9uX2ZpeCA6PSBcXFwiQ3JlYXRlIHRoZSBMYW1iZGFARWRnZSBmdW5jdGlvbiBpbiB1cy1lYXN0LTEgKGNsb3VkZnJvbnQuZXhwZXJpbWVudGFsLkVkZ2VGdW5jdGlvbiBkb2VzIHRoaXMgZm9yIHlvdSkgYW5kIGFzc29jaWF0ZSB0aGF0IHZlcnNpb24ncyBBUk5cXFwiXFxuXFxuX3BmX2NmX2VkZ2VyZWdpb25fdXJsIDo9IFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvbGFtYmRhLWF0LWVkZ2UtZnVuY3Rpb24tcmVzdHJpY3Rpb25zLmh0bWxcXFwiXFxuXFxuX3BmX2NmX2VkZ2VyZWdpb25fYmVoYXZpb3JzKG5hbWUpIDo9IGFycmF5LmNvbmNhdChcXG5cXHRbe1xcXCJwYXRoXFxcIjogXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLkRlZmF1bHRDYWNoZUJlaGF2aW9yXFxcIn0gfFxcblxcdFxcdHNvbWUgXyBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLkRlZmF1bHRDYWNoZUJlaGF2aW9yXFxcIildLFxcblxcdFt7XFxcInBhdGhcXFwiOiBzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5DYWNoZUJlaGF2aW9ycy4lZFxcXCIsIFtpdC5pbmRleF0pfSB8XFxuXFx0XFx0c29tZSBpdCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLkNhY2hlQmVoYXZpb3JzXFxcIildLFxcbilcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWNsb3VkZnJvbnQtZWRnZS1sYW1iZGEtcmVnaW9uXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCIlcy5MYW1iZGFGdW5jdGlvbkFzc29jaWF0aW9ucy4lZC5MYW1iZGFGdW5jdGlvbkFSTlxcXCIsIFtiLnBhdGgsIGEuaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJMYW1iZGFARWRnZSBmdW5jdGlvbnMgbXVzdCBsaXZlIGluIHVzLWVhc3QtMSwgYnV0IHRoaXMgZnVuY3Rpb24gaXMgaW4gJXNcXFwiLCBbcmVnaW9uXSksXFxuXFx0X3BmX2NmX2VkZ2VyZWdpb25fZml4LCBfcGZfY2ZfZWRnZXJlZ2lvbl91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXFxcIilcXG5cXHRzb21lIGIgaW4gX3BmX2NmX2VkZ2VyZWdpb25fYmVoYXZpb3JzKG5hbWUpXFxuXFx0c29tZSBhIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBzcHJpbnRmKFxcXCIlcy5MYW1iZGFGdW5jdGlvbkFzc29jaWF0aW9uc1xcXCIsIFtiLnBhdGhdKSlcXG5cXHRhcm4gOj0gb2JqZWN0LmdldChhLnZhbHVlLCBcXFwiTGFtYmRhRnVuY3Rpb25BUk5cXFwiLCBudWxsKVxcblxcdGlzX3N0cmluZyhhcm4pXFxuXFx0cGFydHMgOj0gc3BsaXQoYXJuLCBcXFwiOlxcXCIpXFxuXFx0Y291bnQocGFydHMpID49IDdcXG5cXHRwYXJ0c1swXSA9PSBcXFwiYXJuXFxcIlxcblxcdHBhcnRzWzJdID09IFxcXCJsYW1iZGFcXFwiXFxuXFx0cmVnaW9uIDo9IHBhcnRzWzNdXFxuXFx0cmVnaW9uICE9IFxcXCJcXFwiXFxuXFx0cmVnaW9uICE9IFxcXCJ1cy1lYXN0LTFcXFwiXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtY2xvdWRmcm9udC1lZGdlLWxhbWJkYS12ZXJzaW9uXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiY2xvdWRmcm9udFwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJMYW1iZGFARWRnZSBhc3NvY2lhdGlvbnMgbXVzdCByZWZlcmVuY2UgYSB2ZXJzaW9uIEFSTiwgbm90IGFuIGFsaWFzIG9yICRMQVRFU1RcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX2NmX2VkZ2V2ZXJfZml4IDo9IFxcXCJBc3NvY2lhdGUgYSB2ZXJzaW9uIEFSTiAoaW4gdGhlIENESywgZm4uY3VycmVudFZlcnNpb24uZWRnZUFybikgaW5zdGVhZCBvZiB0aGUgdW5xdWFsaWZpZWQgZnVuY3Rpb24gQVJOLCBhbiBhbGlhcywgb3IgJExBVEVTVFxcXCJcXG5cXG5fcGZfY2ZfZWRnZXZlcl91cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXByb3BlcnRpZXMtY2xvdWRmcm9udC1kaXN0cmlidXRpb24tbGFtYmRhZnVuY3Rpb25hc3NvY2lhdGlvbi5odG1sXFxcIlxcblxcbl9wZl9jZl9lZGdldmVyX2JlaGF2aW9ycyhuYW1lKSA6PSBhcnJheS5jb25jYXQoXFxuXFx0W3tcXFwicGF0aFxcXCI6IFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5EZWZhdWx0Q2FjaGVCZWhhdmlvclxcXCJ9IHxcXG5cXHRcXHRzb21lIF8gaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5EZWZhdWx0Q2FjaGVCZWhhdmlvclxcXCIpXSxcXG5cXHRbe1xcXCJwYXRoXFxcIjogc3ByaW50ZihcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuQ2FjaGVCZWhhdmlvcnMuJWRcXFwiLCBbaXQuaW5kZXhdKX0gfFxcblxcdFxcdHNvbWUgaXQgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5DYWNoZUJlaGF2aW9yc1xcXCIpXSxcXG4pXFxuXFxuIyBMYW1iZGEgQVJOcyBzcGxpdCBpbnRvIDcgc2VnbWVudHMgd2hlbiB1bnF1YWxpZmllZFxcbiMgKGFybjpwYXJ0aXRpb246bGFtYmRhOnJlZ2lvbjphY2NvdW50OmZ1bmN0aW9uOm5hbWUpIGFuZCA4IHdoZW4gYSB2ZXJzaW9uIG9yXFxuIyBhbGlhcyBxdWFsaWZpZXIgaXMgYXBwZW5kZWQuIE9ubHkgYW4gYWxsLWRpZ2l0IHF1YWxpZmllciBpcyBhIHZlcnNpb24uXFxuX3BmX2NmX2VkZ2V2ZXJfYXJucyhuYW1lKSA6PSBbe1xcXCJwYXRoXFxcIjogcGF0aCwgXFxcImFyblxcXCI6IGFybiwgXFxcInBhcnRzXFxcIjogcGFydHN9IHxcXG5cXHRzb21lIGIgaW4gX3BmX2NmX2VkZ2V2ZXJfYmVoYXZpb3JzKG5hbWUpXFxuXFx0c29tZSBhIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBzcHJpbnRmKFxcXCIlcy5MYW1iZGFGdW5jdGlvbkFzc29jaWF0aW9uc1xcXCIsIFtiLnBhdGhdKSlcXG5cXHRhcm4gOj0gb2JqZWN0LmdldChhLnZhbHVlLCBcXFwiTGFtYmRhRnVuY3Rpb25BUk5cXFwiLCBudWxsKVxcblxcdGlzX3N0cmluZyhhcm4pXFxuXFx0cGFydHMgOj0gc3BsaXQoYXJuLCBcXFwiOlxcXCIpXFxuXFx0cGFydHNbMF0gPT0gXFxcImFyblxcXCJcXG5cXHRwYXJ0c1syXSA9PSBcXFwibGFtYmRhXFxcIlxcblxcdHBhcnRzWzVdID09IFxcXCJmdW5jdGlvblxcXCJcXG5cXHRwYXRoIDo9IHNwcmludGYoXFxcIiVzLkxhbWJkYUZ1bmN0aW9uQXNzb2NpYXRpb25zLiVkLkxhbWJkYUZ1bmN0aW9uQVJOXFxcIiwgW2IucGF0aCwgYS5pbmRleF0pXFxuXVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtY2xvdWRmcm9udC1lZGdlLWxhbWJkYS12ZXJzaW9uXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSwgaXQucGF0aCxcXG5cXHRcXFwiTGFtYmRhQEVkZ2UgcmVxdWlyZXMgYSB2ZXJzaW9uLXF1YWxpZmllZCBmdW5jdGlvbiBBUk4sIGJ1dCB0aGlzIEFSTiBoYXMgbm8gcXVhbGlmaWVyXFxcIixcXG5cXHRfcGZfY2ZfZWRnZXZlcl9maXgsIF9wZl9jZl9lZGdldmVyX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cXFwiKVxcblxcdHNvbWUgaXQgaW4gX3BmX2NmX2VkZ2V2ZXJfYXJucyhuYW1lKVxcblxcdGNvdW50KGl0LnBhcnRzKSA9PSA3XFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtY2xvdWRmcm9udC1lZGdlLWxhbWJkYS12ZXJzaW9uXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSwgaXQucGF0aCxcXG5cXHRzcHJpbnRmKFxcXCJMYW1iZGFARWRnZSByZXF1aXJlcyBhIHZlcnNpb24tcXVhbGlmaWVkIGZ1bmN0aW9uIEFSTiwgYnV0ICclcycgaXMgYW4gYWxpYXMgb3IgJExBVEVTVFxcXCIsIFtxdWFsaWZpZXJdKSxcXG5cXHRfcGZfY2ZfZWRnZXZlcl9maXgsIF9wZl9jZl9lZGdldmVyX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cXFwiKVxcblxcdHNvbWUgaXQgaW4gX3BmX2NmX2VkZ2V2ZXJfYXJucyhuYW1lKVxcblxcdGNvdW50KGl0LnBhcnRzKSA9PSA4XFxuXFx0cXVhbGlmaWVyIDo9IGl0LnBhcnRzWzddXFxuXFx0bm90IHJlZ2V4Lm1hdGNoKFxcXCJeWzAtOV0rJFxcXCIsIHF1YWxpZmllcilcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1jbG91ZGZyb250LW9yaWdpbi1ncm91cC1tZW1iZXItb3JpZ2luXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiY2xvdWRmcm9udFwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJPcmlnaW4gZ3JvdXAgbWVtYmVycyBtdXN0IHJlZmVyZW5jZSBhbiBvcmlnaW4gZGVjbGFyZWQgaW4gdGhlIGRpc3RyaWJ1dGlvblwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfY2Zfb2dtZW1iZXJfaWRzKG5hbWUpIDo9IHtpZCB8XFxuXFx0c29tZSBpdCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLk9yaWdpbnNcXFwiKVxcblxcdGlkIDo9IG9iamVjdC5nZXQoaXQudmFsdWUsIFxcXCJJZFxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKGlkKVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWNsb3VkZnJvbnQtb3JpZ2luLWdyb3VwLW1lbWJlci1vcmlnaW5cXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLk9yaWdpbkdyb3Vwcy5JdGVtcy4lZC5NZW1iZXJzXFxcIiwgW2cuaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJPcmlnaW4gZ3JvdXAgbWVtYmVyICclcycgZG9lcyBub3QgbWF0Y2ggYW55IG9yaWdpbiBJZCBpbiB0aGUgZGlzdHJpYnV0aW9uXFxcIiwgW29pZF0pLFxcblxcdFxcXCJQb2ludCBldmVyeSBvcmlnaW4gZ3JvdXAgbWVtYmVyIGF0IHRoZSBJZCBvZiBhbiBvcmlnaW4gZGVjbGFyZWQgaW4gT3JpZ2luc1xcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXByb3BlcnRpZXMtY2xvdWRmcm9udC1kaXN0cmlidXRpb24tb3JpZ2luZ3JvdXAuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXFxcIilcXG5cXHRzb21lIGcgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5PcmlnaW5Hcm91cHMuSXRlbXNcXFwiKVxcblxcdG1lbWJlcnMgOj0gb2JqZWN0LmdldChvYmplY3QuZ2V0KGcudmFsdWUsIFxcXCJNZW1iZXJzXFxcIiwge30pLCBcXFwiSXRlbXNcXFwiLCBbXSlcXG5cXHRzb21lIG0gaW4gbWVtYmVyc1xcblxcdG9pZCA6PSBvYmplY3QuZ2V0KG0sIFxcXCJPcmlnaW5JZFxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKG9pZClcXG5cXHRub3Qgb2lkIGluIF9wZl9jZl9vZ21lbWJlcl9pZHMobmFtZSlcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1jbG91ZGZyb250LXR0bC1vcmRlclwiLFxuICAgIFwic2VydmljZVwiOiBcImNsb3VkZnJvbnRcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQ2FjaGUgYmVoYXZpb3IgVFRMcyBtdXN0IHNhdGlzZnkgTWluVFRMIDw9IERlZmF1bHRUVEwgPD0gTWF4VFRMXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9jZl90dGxfZml4IDo9IFxcXCJPcmRlciB0aGUgVFRMcyBhcyBNaW5UVEwgPD0gRGVmYXVsdFRUTCA8PSBNYXhUVExcXFwiXFxuXFxuX3BmX2NmX3R0bF91cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9FeHBpcmF0aW9uLmh0bWxcXFwiXFxuXFxuX3BmX2NmX2JlaGF2aW9ycyhuYW1lKSA6PSBhcnJheS5jb25jYXQoXFxuXFx0W3tcXFwicGF0aFxcXCI6IFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5EZWZhdWx0Q2FjaGVCZWhhdmlvclxcXCIsIFxcXCJ2YWx1ZVxcXCI6IGl0LnZhbHVlfSB8XFxuXFx0XFx0c29tZSBpdCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLkRlZmF1bHRDYWNoZUJlaGF2aW9yXFxcIildLFxcblxcdFt7XFxcInBhdGhcXFwiOiBzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5DYWNoZUJlaGF2aW9ycy4lZFxcXCIsIFtpdC5pbmRleF0pLCBcXFwidmFsdWVcXFwiOiBpdC52YWx1ZX0gfFxcblxcdFxcdHNvbWUgaXQgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5DYWNoZUJlaGF2aW9yc1xcXCIpXSxcXG4pXFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1jbG91ZGZyb250LXR0bC1vcmRlclxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsIGIucGF0aCxcXG5cXHRzcHJpbnRmKFxcXCJNaW5UVEwgKCV2KSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBNYXhUVEwgKCV2KVxcXCIsIFttbiwgbXhdKSxcXG5cXHRfcGZfY2ZfdHRsX2ZpeCwgX3BmX2NmX3R0bF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXFxcIilcXG5cXHRzb21lIGIgaW4gX3BmX2NmX2JlaGF2aW9ycyhuYW1lKVxcblxcdGlzX29iamVjdChiLnZhbHVlKVxcblxcdG1uIDo9IHRvX251bWJlcihvYmplY3QuZ2V0KGIudmFsdWUsIFxcXCJNaW5UVExcXFwiLCBudWxsKSlcXG5cXHRteCA6PSB0b19udW1iZXIob2JqZWN0LmdldChiLnZhbHVlLCBcXFwiTWF4VFRMXFxcIiwgbnVsbCkpXFxuXFx0bW4gPiBteFxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWNsb3VkZnJvbnQtdHRsLW9yZGVyXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSwgYi5wYXRoLFxcblxcdHNwcmludGYoXFxcIk1pblRUTCAoJXYpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIERlZmF1bHRUVEwgKCV2KVxcXCIsIFttbiwgZGZdKSxcXG5cXHRfcGZfY2ZfdHRsX2ZpeCwgX3BmX2NmX3R0bF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXFxcIilcXG5cXHRzb21lIGIgaW4gX3BmX2NmX2JlaGF2aW9ycyhuYW1lKVxcblxcdGlzX29iamVjdChiLnZhbHVlKVxcblxcdG1uIDo9IHRvX251bWJlcihvYmplY3QuZ2V0KGIudmFsdWUsIFxcXCJNaW5UVExcXFwiLCBudWxsKSlcXG5cXHRkZiA6PSB0b19udW1iZXIob2JqZWN0LmdldChiLnZhbHVlLCBcXFwiRGVmYXVsdFRUTFxcXCIsIG51bGwpKVxcblxcdG1uID4gZGZcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1jbG91ZGZyb250LXR0bC1vcmRlclxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsIGIucGF0aCxcXG5cXHRzcHJpbnRmKFxcXCJEZWZhdWx0VFRMICgldikgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gTWF4VFRMICgldilcXFwiLCBbZGYsIG14XSksXFxuXFx0X3BmX2NmX3R0bF9maXgsIF9wZl9jZl90dGxfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblxcXCIpXFxuXFx0c29tZSBiIGluIF9wZl9jZl9iZWhhdmlvcnMobmFtZSlcXG5cXHRpc19vYmplY3QoYi52YWx1ZSlcXG5cXHRkZiA6PSB0b19udW1iZXIob2JqZWN0LmdldChiLnZhbHVlLCBcXFwiRGVmYXVsdFRUTFxcXCIsIG51bGwpKVxcblxcdG14IDo9IHRvX251bWJlcihvYmplY3QuZ2V0KGIudmFsdWUsIFxcXCJNYXhUVExcXFwiLCBudWxsKSlcXG5cXHRkZiA+IG14XFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtY2xvdWRmcm9udC13YWZ2Mi13ZWJhY2wtc2NvcGVcIixcbiAgICBcInNlcnZpY2VcIjogXCJjbG91ZGZyb250XCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkEgV0FGdjIgd2ViIEFDTCBhdHRhY2hlZCB0byBDbG91ZEZyb250IG11c3QgYmUgZ2xvYmFsbHkgc2NvcGVkXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgQSBXQUZ2MiBBUk4gY2FycmllcyBpdHMgc2NvcGUgaW4gdGhlIHJlc291cmNlIHNlZ21lbnQ6XFxuIyAgIGFybjphd3M6d2FmdjI6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpnbG9iYWwvd2ViYWNsL25hbWUvaWQgICAgKENMT1VERlJPTlQpXFxuIyAgIGFybjphd3M6d2FmdjI6YXAtbm9ydGhlYXN0LTE6MTIzNDU2Nzg5MDEyOnJlZ2lvbmFsL3dlYmFjbC8uLi4gKFJFR0lPTkFMKVxcbiMgQ2xvdWRGcm9udCBhY2NlcHRzIG9ubHkgdGhlIGdsb2JhbCBmb3JtLiBDaGVja2luZyB0aGUgcmVnaW9uIGFsb25lIHdvdWxkIG1pc3NcXG4jIGEgUkVHSU9OQUwgd2ViIEFDTCB0aGF0IGhhcHBlbnMgdG8gaGF2ZSBiZWVuIGNyZWF0ZWQgaW4gdXMtZWFzdC0xLCB3aGljaCBpc1xcbiMgdGhlIGVhc3kgbWlzdGFrZSB0byBtYWtlLlxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtY2xvdWRmcm9udC13YWZ2Mi13ZWJhY2wtc2NvcGVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5XZWJBQ0xJZFxcXCIsXFxuXFx0c3ByaW50ZihcXFwiQ2xvdWRGcm9udCBvbmx5IGFjY2VwdHMgYSBnbG9iYWxseSBzY29wZWQgd2ViIEFDTCwgYnV0IHRoaXMgQVJOIGlzIHNjb3BlZCAnJXMnXFxcIiwgW3Njb3BlXSksXFxuXFx0XFxcIkNyZWF0ZSB0aGUgd2ViIEFDTCB3aXRoIHNjb3BlIENMT1VERlJPTlQgaW4gdXMtZWFzdC0xICh3YWZ2Mi5DZm5XZWJBQ0wgd2l0aCBzY29wZTogJ0NMT1VERlJPTlQnKSBhbmQgcmVmZXJlbmNlIHRoYXQgQVJOXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcmVzb3VyY2Utd2FmdjItd2ViYWNsLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblxcXCIpXFxuXFx0YXJuIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLldlYkFDTElkXFxcIilcXG5cXHRpc19zdHJpbmcoYXJuKVxcblxcdHBhcnRzIDo9IHNwbGl0KGFybiwgXFxcIjpcXFwiKVxcblxcdGNvdW50KHBhcnRzKSA+PSA2XFxuXFx0cGFydHNbMF0gPT0gXFxcImFyblxcXCJcXG5cXHRwYXJ0c1syXSA9PSBcXFwid2FmdjJcXFwiXFxuXFx0c2VnbWVudHMgOj0gc3BsaXQocGFydHNbNV0sIFxcXCIvXFxcIilcXG5cXHRzY29wZSA6PSBzZWdtZW50c1swXVxcblxcdHNjb3BlICE9IFxcXCJnbG9iYWxcXFwiXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtZHluYW1vZGItYXR0cmlidXRlLWRlZmluaXRpb25zLXVzYWdlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZHluYW1vZGJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiRXZlcnkgQXR0cmlidXRlRGVmaW5pdGlvbnMgZW50cnkgbXVzdCBiZSB1c2VkIGJ5IGEga2V5IHNjaGVtYVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG4jIER5bmFtb0RCIHJlcXVpcmVzIGFuIGV4YWN0IG1hdGNoOiBldmVyeSBBdHRyaWJ1dGVEZWZpbml0aW9ucyBlbnRyeSBtdXN0IGJlXFxuIyB1c2VkIGJ5IHRoZSB0YWJsZSBrZXkgc2NoZW1hIG9yIGFuIGluZGV4IGtleSBzY2hlbWEuIFRoZSBlbmdpbmUncyBFMzAzOVxcbiMgY2hlY2tzIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gb25seSAoa2V5IGF0dHJpYnV0ZSBub3QgZGVmaW5lZCksIHNvIHRoZVxcbiMgY2xhc3NpYyBcXFwicmVtb3ZlZCBhIEdTSSwgbGVmdCB0aGUgYXR0cmlidXRlIGRlZmluaXRpb25cXFwiIG1pc3Rha2Ugc2FpbHMgdGhyb3VnaC5cXG5cXG5fcGZfZGRiYWR1X3RhYmxlX2tleXMobmFtZSkgOj0ge2EgfFxcblxcdHNvbWUgaXQgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLktleVNjaGVtYVxcXCIpXFxuXFx0YSA6PSBvYmplY3QuZ2V0KGl0LnZhbHVlLCBcXFwiQXR0cmlidXRlTmFtZVxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKGEpXFxufVxcblxcbl9wZl9kZGJhZHVfaW5kZXhfa2V5cyhuYW1lLCBwcm9wKSA6PSB7YSB8XFxuXFx0c29tZSBpeCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgc3ByaW50ZihcXFwiUHJvcGVydGllcy4lc1xcXCIsIFtwcm9wXSkpXFxuXFx0c29tZSBrIGluIG9iamVjdC5nZXQoaXgudmFsdWUsIFxcXCJLZXlTY2hlbWFcXFwiLCBbXSlcXG5cXHRhIDo9IG9iamVjdC5nZXQoaywgXFxcIkF0dHJpYnV0ZU5hbWVcXFwiLCBudWxsKVxcblxcdGlzX3N0cmluZyhhKVxcbn1cXG5cXG5fcGZfZGRiYWR1X3VzZWQobmFtZSkgOj0gKChfcGZfZGRiYWR1X3RhYmxlX2tleXMobmFtZSkgfFxcblxcdF9wZl9kZGJhZHVfaW5kZXhfa2V5cyhuYW1lLCBcXFwiR2xvYmFsU2Vjb25kYXJ5SW5kZXhlc1xcXCIpKSB8XFxuXFx0X3BmX2RkYmFkdV9pbmRleF9rZXlzKG5hbWUsIFxcXCJMb2NhbFNlY29uZGFyeUluZGV4ZXNcXFwiKSlcXG5cXG4jIEFueSB1bnJlc29sdmFibGUgQXR0cmlidXRlTmFtZSBpbiBhIGtleSBzY2hlbWEgbWVhbnMgdGhlIHVzZWQtc2V0IGlzXFxuIyBpbmNvbXBsZXRlLCBzbyB0aGUgcnVsZSBtdXN0IHN0YXkgc2lsZW50IHJhdGhlciB0aGFuIGd1ZXNzLlxcbl9wZl9kZGJhZHVfdW5yZXNvbHZhYmxlKG5hbWUpIGlmIHtcXG5cXHRzb21lIGl0IGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5LZXlTY2hlbWFcXFwiKVxcblxcdG5vdCBpc19zdHJpbmcob2JqZWN0LmdldChpdC52YWx1ZSwgXFxcIkF0dHJpYnV0ZU5hbWVcXFwiLCBudWxsKSlcXG59XFxuXFxuX3BmX2RkYmFkdV91bnJlc29sdmFibGUobmFtZSkgaWYge1xcblxcdHNvbWUgcHJvcCBpbiBbXFxcIkdsb2JhbFNlY29uZGFyeUluZGV4ZXNcXFwiLCBcXFwiTG9jYWxTZWNvbmRhcnlJbmRleGVzXFxcIl1cXG5cXHRzb21lIGl4IGluIGZsYXR0ZW5fbGlzdChuYW1lLCBzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLiVzXFxcIiwgW3Byb3BdKSlcXG5cXHRzb21lIGsgaW4gb2JqZWN0LmdldChpeC52YWx1ZSwgXFxcIktleVNjaGVtYVxcXCIsIFtdKVxcblxcdG5vdCBpc19zdHJpbmcob2JqZWN0LmdldChrLCBcXFwiQXR0cmlidXRlTmFtZVxcXCIsIG51bGwpKVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWF0dHJpYnV0ZS1kZWZpbml0aW9ucy11c2FnZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5BdHRyaWJ1dGVEZWZpbml0aW9ucy4lZFxcXCIsIFtkLmluZGV4XSksXFxuXFx0c3ByaW50ZihcXFwiQXR0cmlidXRlICclcycgaXMgZGVmaW5lZCBidXQgdXNlZCBieSBubyBrZXkgc2NoZW1hOyBEeW5hbW9EQiByZXF1aXJlcyBhbiBleGFjdCBtYXRjaCBhbmQgZmFpbHMgd2l0aCBcXFxcXFxcIk51bWJlciBvZiBhdHRyaWJ1dGVzIGluIEtleVNjaGVtYSBkb2VzIG5vdCBleGFjdGx5IG1hdGNoIG51bWJlciBvZiBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gQXR0cmlidXRlRGVmaW5pdGlvbnNcXFxcXFxcIlxcXCIsIFthdHRyXSksXFxuXFx0XFxcIlJlbW92ZSB0aGUgdW51c2VkIGRlZmluaXRpb24gKG5vbi1rZXkgYXR0cmlidXRlcyBzdWNoIGFzIGEgVFRMIGF0dHJpYnV0ZSBtdXN0IE5PVCBiZSBkZWNsYXJlZCksIG9yIGFkZCB0aGUgaW5kZXggdGhhdCB1c2VzIGl0XFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcmVzb3VyY2UtZHluYW1vZGItdGFibGUuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6OlRhYmxlXFxcIilcXG5cXHRub3QgX3BmX2RkYmFkdV91bnJlc29sdmFibGUobmFtZSlcXG5cXHRzb21lIGQgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkF0dHJpYnV0ZURlZmluaXRpb25zXFxcIilcXG5cXHRhdHRyIDo9IG9iamVjdC5nZXQoZC52YWx1ZSwgXFxcIkF0dHJpYnV0ZU5hbWVcXFwiLCBudWxsKVxcblxcdGlzX3N0cmluZyhhdHRyKVxcblxcdG5vdCBhdHRyIGluIF9wZl9kZGJhZHVfdXNlZChuYW1lKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWR5bmFtb2RiLWJpbGxpbmctdGhyb3VnaHB1dFwiLFxuICAgIFwic2VydmljZVwiOiBcImR5bmFtb2RiXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIlByb3Zpc2lvbmVkVGhyb3VnaHB1dCBtdXN0IG1hdGNoIEJpbGxpbmdNb2RlIChyZXF1aXJlZCBmb3IgUFJPVklTSU9ORUQsIGZvcmJpZGRlbiBmb3IgUEFZX1BFUl9SRVFVRVNUKVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfZGRiYnRfdXJsIDo9IFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9uZHluYW1vZGIvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL0hvd0l0V29ya3MuUmVhZFdyaXRlQ2FwYWNpdHlNb2RlLmh0bWxcXFwiXFxuXFxuX3BmX2RkYmJ0X2hhc19wdChuYW1lKSBpZiBpc19vYmplY3QocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Qcm92aXNpb25lZFRocm91Z2hwdXRcXFwiKSlcXG5cXG5fcGZfZGRiYnRfYmlsbGluZ19wcmVzZW50KG5hbWUpIGlmIHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuQmlsbGluZ01vZGVcXFwiKVxcblxcbiMgQmlsbGluZ01vZGUg44GM44Oq44OG44Op44OrIFxcXCJQUk9WSVNJT05FRFxcXCLjgIHjgb7jgZ/jga/mnKrmjIflrprvvIjjg4fjg5Xjgqnjg6vjg4ggUFJPVklTSU9ORUTvvInjgIJcXG4jIOODiOODvOOCr+ODs+WApO+8iFJlZiDnrYnvvInjga/liKTlrprjgavkvb/jgo/jgarjgYTvvIjoqqTmpJznn6XpmLLmraLvvInjgIJcXG5fcGZfZGRiYnRfcHJvdmlzaW9uZWQobmFtZSkgaWYgcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5CaWxsaW5nTW9kZVxcXCIpID09IFxcXCJQUk9WSVNJT05FRFxcXCJcXG5cXG5fcGZfZGRiYnRfcHJvdmlzaW9uZWQobmFtZSkgaWYgbm90IF9wZl9kZGJidF9iaWxsaW5nX3ByZXNlbnQobmFtZSlcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWJpbGxpbmctdGhyb3VnaHB1dFxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuUHJvdmlzaW9uZWRUaHJvdWdocHV0XFxcIixcXG5cXHRcXFwiUHJvdmlzaW9uZWRUaHJvdWdocHV0IGNhbm5vdCBiZSBzcGVjaWZpZWQgd2hlbiBCaWxsaW5nTW9kZSBpcyBQQVlfUEVSX1JFUVVFU1Q7IENyZWF0ZVRhYmxlIGZhaWxzIGF0IGRlcGxveSB0aW1lXFxcIixcXG5cXHRcXFwiUmVtb3ZlIFByb3Zpc2lvbmVkVGhyb3VnaHB1dCwgb3Igc3dpdGNoIEJpbGxpbmdNb2RlIHRvIFBST1ZJU0lPTkVEXFxcIixcXG5cXHRfcGZfZGRiYnRfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVxcXCIpXFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5CaWxsaW5nTW9kZVxcXCIpID09IFxcXCJQQVlfUEVSX1JFUVVFU1RcXFwiXFxuXFx0X3BmX2RkYmJ0X2hhc19wdChuYW1lKVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWJpbGxpbmctdGhyb3VnaHB1dFxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuUHJvdmlzaW9uZWRUaHJvdWdocHV0XFxcIixcXG5cXHRcXFwiQmlsbGluZ01vZGUgaXMgUFJPVklTSU9ORUQgKHRoZSBkZWZhdWx0KSBidXQgUHJvdmlzaW9uZWRUaHJvdWdocHV0IGlzIG1pc3Npbmc7IENyZWF0ZVRhYmxlIGZhaWxzIGF0IGRlcGxveSB0aW1lXFxcIixcXG5cXHRcXFwiQWRkIFByb3Zpc2lvbmVkVGhyb3VnaHB1dCAoUmVhZENhcGFjaXR5VW5pdHMgLyBXcml0ZUNhcGFjaXR5VW5pdHMpLCBvciBzZXQgQmlsbGluZ01vZGUgdG8gUEFZX1BFUl9SRVFVRVNUXFxcIixcXG5cXHRfcGZfZGRiYnRfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVxcXCIpXFxuXFx0X3BmX2RkYmJ0X3Byb3Zpc2lvbmVkKG5hbWUpXFxuXFx0bm90IF9wZl9kZGJidF9oYXNfcHQobmFtZSlcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1keW5hbW9kYi1kdXBsaWNhdGUtYXR0cmlidXRlLWRlZmluaXRpb25zXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZHluYW1vZGJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQXR0cmlidXRlRGVmaW5pdGlvbnMgbXVzdCBub3QgZGVmaW5lIHRoZSBzYW1lIGF0dHJpYnV0ZSB0d2ljZVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWR1cGxpY2F0ZS1hdHRyaWJ1dGUtZGVmaW5pdGlvbnNcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuQXR0cmlidXRlRGVmaW5pdGlvbnMuJWRcXFwiLCBbYi5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcIkF0dHJpYnV0ZSAnJXMnIGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UgaW4gQXR0cmlidXRlRGVmaW5pdGlvbnM7IENyZWF0ZVRhYmxlIGZhaWxzIHdpdGggXFxcXFxcXCJBbiBhdHRyaWJ1dGUgYXBwZWFycyBtb3JlIHRoYW4gb25jZSBpbiBBdHRyaWJ1dGVEZWZpbml0aW9uc1xcXFxcXFwiXFxcIiwgW2FuXSksXFxuXFx0XFxcIktlZXAgYSBzaW5nbGUgZGVmaW5pdGlvbiBwZXIgYXR0cmlidXRlIG5hbWVcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1yZXNvdXJjZS1keW5hbW9kYi10YWJsZS5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcXFwiKVxcblxcdHNvbWUgYSBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuQXR0cmlidXRlRGVmaW5pdGlvbnNcXFwiKVxcblxcdHNvbWUgYiBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuQXR0cmlidXRlRGVmaW5pdGlvbnNcXFwiKVxcblxcdGEuaW5kZXggPCBiLmluZGV4XFxuXFx0YW4gOj0gb2JqZWN0LmdldChhLnZhbHVlLCBcXFwiQXR0cmlidXRlTmFtZVxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKGFuKVxcblxcdG9iamVjdC5nZXQoYi52YWx1ZSwgXFxcIkF0dHJpYnV0ZU5hbWVcXFwiLCBudWxsKSA9PSBhblxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWR5bmFtb2RiLWR1cGxpY2F0ZS1pbmRleC1uYW1lXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZHluYW1vZGJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiU2Vjb25kYXJ5IGluZGV4IG5hbWVzIG11c3QgYmUgdW5pcXVlXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9kZGJkaW5fdXJsIDo9IFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1yZXNvdXJjZS1keW5hbW9kYi10YWJsZS5odG1sXFxcIlxcblxcbiMgRHVwbGljYXRlcyB3aXRoaW4gdGhlIHNhbWUgaW5kZXggbGlzdCBvbmx5OyBhIEdTSS9MU0kgY3Jvc3MtbGlzdCBjbGFzaCB3YXNcXG4jIG5vdCBtZWFzdXJlZCAoaXNzdWUgIzIxKS5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWR1cGxpY2F0ZS1pbmRleC1uYW1lXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLiVzLiVkLkluZGV4TmFtZVxcXCIsIFtwcm9wLCBiLmluZGV4XSksXFxuXFx0c3ByaW50ZihcXFwiSW5kZXggbmFtZSAnJXMnIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2U7IENyZWF0ZVRhYmxlIGZhaWxzIHdpdGggXFxcXFxcXCJEdXBsaWNhdGUgaW5kZXggbmFtZVxcXFxcXFwiXFxcIiwgW2luYW1lXSksXFxuXFx0XFxcIkdpdmUgZXZlcnkgc2Vjb25kYXJ5IGluZGV4IGEgdW5pcXVlIEluZGV4TmFtZVxcXCIsXFxuXFx0X3BmX2RkYmRpbl91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6OlRhYmxlXFxcIilcXG5cXHRzb21lIHByb3AgaW4gW1xcXCJHbG9iYWxTZWNvbmRhcnlJbmRleGVzXFxcIiwgXFxcIkxvY2FsU2Vjb25kYXJ5SW5kZXhlc1xcXCJdXFxuXFx0c29tZSBhIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLiVzXFxcIiwgW3Byb3BdKSlcXG5cXHRzb21lIGIgaW4gZmxhdHRlbl9saXN0KG5hbWUsIHNwcmludGYoXFxcIlByb3BlcnRpZXMuJXNcXFwiLCBbcHJvcF0pKVxcblxcdGEuaW5kZXggPCBiLmluZGV4XFxuXFx0aW5hbWUgOj0gb2JqZWN0LmdldChhLnZhbHVlLCBcXFwiSW5kZXhOYW1lXFxcIiwgbnVsbClcXG5cXHRpc19zdHJpbmcoaW5hbWUpXFxuXFx0b2JqZWN0LmdldChiLnZhbHVlLCBcXFwiSW5kZXhOYW1lXFxcIiwgbnVsbCkgPT0gaW5hbWVcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1keW5hbW9kYi1nbG9iYWwtdGFibGUtcmVwbGljYS1yZWdpb25cIixcbiAgICBcInNlcnZpY2VcIjogXCJkeW5hbW9kYlwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJHbG9iYWxUYWJsZSBSZXBsaWNhcyBtdXN0IGluY2x1ZGUgdGhlIGRlcGxveW1lbnQgcmVnaW9uXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkR5bmFtb0RCOjpHbG9iYWxUYWJsZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgZGF0YS5jZGtfcHJlZmxpZ2h0LmRlcGxveV9yZWdpb24gaXMgZGVmaW5lZCBvbmx5IHdoZW4gdGhlIGVuZm9yY2UgcGx1Z2luXFxuIyBrbm93cyB0aGUgYXBwJ3MgY29uY3JldGUgcmVnaW9uIChzZWUgc3JjL3ByaXZhdGUvZW5mb3JjZS50cyk7IHdpdGhvdXQgaXQgdGhlXFxuIyByZWZlcmVuY2UgaXMgdW5kZWZpbmVkIGFuZCB0aGlzIHJ1bGUgc2tpcHMuIFJlcGxpY2FzIHdpdGggdW5yZXNvbHZhYmxlXFxuIyBSZWdpb24gdmFsdWVzIGFsc28gbWFrZSB0aGUgcnVsZSBza2lwIOKAlCBhYnNlbmNlIGNhbm5vdCBiZSBwcm92ZW4gdGhlbi5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWdsb2JhbC10YWJsZS1yZXBsaWNhLXJlZ2lvblxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuUmVwbGljYXNcXFwiLFxcblxcdHNwcmludGYoXFxcIlRoZSBSZXBsaWNhcyBsaXN0ICV2IGRvZXMgbm90IGluY2x1ZGUgdGhlIGRlcGxveW1lbnQgcmVnaW9uICclcyc7IENyZWF0ZUdsb2JhbFRhYmxlIGZhaWxzIHdpdGggXFxcXFxcXCJUaGUgUmVwbGljYXMgc2VjdGlvbiBtdXN0IGNvbnRhaW4gYW4gZW50cnkgZm9yIHRoZSBjdXJyZW50IHJlZ2lvblxcXFxcXFwiXFxcIiwgW3JlcGxpY2FzLCByZWdpb25dKSxcXG5cXHRcXFwiQWRkIGEgcmVwbGljYSBlbnRyeSBmb3IgdGhlIHJlZ2lvbiB0aGUgc3RhY2sgZGVwbG95cyB0byAoQ0RLIFRhYmxlVjIgZG9lcyB0aGlzIGF1dG9tYXRpY2FsbHkpXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcmVzb3VyY2UtZHluYW1vZGItZ2xvYmFsdGFibGUuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6Okdsb2JhbFRhYmxlXFxcIilcXG5cXHRyZWdpb24gOj0gZGF0YS5jZGtfcHJlZmxpZ2h0LmRlcGxveV9yZWdpb25cXG5cXHRpc19zdHJpbmcocmVnaW9uKVxcblxcdGl0ZW1zIDo9IFtpdCB8IHNvbWUgaXQgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlJlcGxpY2FzXFxcIildXFxuXFx0Y291bnQoaXRlbXMpID4gMFxcblxcdGV2ZXJ5IGl0IGluIGl0ZW1zIHtcXG5cXHRcXHRpc19zdHJpbmcob2JqZWN0LmdldChpdC52YWx1ZSwgXFxcIlJlZ2lvblxcXCIsIG51bGwpKVxcblxcdH1cXG5cXHRyZXBsaWNhcyA6PSBbciB8IHNvbWUgaXQgaW4gaXRlbXM7IHIgOj0gb2JqZWN0LmdldChpdC52YWx1ZSwgXFxcIlJlZ2lvblxcXCIsIG51bGwpXVxcblxcdG5vdCByZWdpb24gaW4gcmVwbGljYXNcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1keW5hbW9kYi1nc2ktYmlsbGluZy10aHJvdWdocHV0XCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZHluYW1vZGJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiR1NJIFByb3Zpc2lvbmVkVGhyb3VnaHB1dCBtdXN0IG1hdGNoIHRoZSB0YWJsZSBCaWxsaW5nTW9kZVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfZGRiZ2J0X3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbmR5bmFtb2RiL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9Ib3dJdFdvcmtzLlJlYWRXcml0ZUNhcGFjaXR5TW9kZS5odG1sXFxcIlxcblxcbiMgR1NJLWxldmVsIGNvdW50ZXJwYXJ0IG9mIHBmLWR5bmFtb2RiLWJpbGxpbmctdGhyb3VnaHB1dCAod2hpY2ggY292ZXJzIHRoZVxcbiMgdGFibGUtbGV2ZWwgcGFpciBvbmx5KS4gU2FtZSB0b2tlbiBzYWZldHk6IGxpdGVyYWwgQmlsbGluZ01vZGUgb3IgYWJzZW50XFxuIyAoZGVmYXVsdCBQUk9WSVNJT05FRCk7IHRva2VuIHZhbHVlcyBuZXZlciBqdWRnZWQuXFxuX3BmX2RkYmdidF9iaWxsaW5nX3ByZXNlbnQobmFtZSkgaWYgcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5CaWxsaW5nTW9kZVxcXCIpXFxuXFxuX3BmX2RkYmdidF9wcm92aXNpb25lZChuYW1lKSBpZiByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkJpbGxpbmdNb2RlXFxcIikgPT0gXFxcIlBST1ZJU0lPTkVEXFxcIlxcblxcbl9wZl9kZGJnYnRfcHJvdmlzaW9uZWQobmFtZSkgaWYgbm90IF9wZl9kZGJnYnRfYmlsbGluZ19wcmVzZW50KG5hbWUpXFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1keW5hbW9kYi1nc2ktYmlsbGluZy10aHJvdWdocHV0XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkdsb2JhbFNlY29uZGFyeUluZGV4ZXMuJWQuUHJvdmlzaW9uZWRUaHJvdWdocHV0XFxcIiwgW2cuaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJHU0kgJyVzJyBzcGVjaWZpZXMgUHJvdmlzaW9uZWRUaHJvdWdocHV0IGJ1dCBCaWxsaW5nTW9kZSBpcyBQQVlfUEVSX1JFUVVFU1Q7IENyZWF0ZVRhYmxlIGZhaWxzIHdpdGggXFxcXFxcXCJQcm9wZXJ0eSBQcm92aXNpb25lZFRocm91Z2hwdXQgY2FuJ3QgYmUgdXNlZCB3aXRoIFBBWV9QRVJfUkVRVUVTVCBCaWxsaW5nTW9kZVxcXFxcXFwiXFxcIiwgW2luYW1lXSksXFxuXFx0XFxcIlJlbW92ZSB0aGUgR1NJJ3MgUHJvdmlzaW9uZWRUaHJvdWdocHV0LCBvciBzd2l0Y2ggdGhlIHRhYmxlIHRvIFBST1ZJU0lPTkVEXFxcIixcXG5cXHRfcGZfZGRiZ2J0X3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcXFwiKVxcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuQmlsbGluZ01vZGVcXFwiKSA9PSBcXFwiUEFZX1BFUl9SRVFVRVNUXFxcIlxcblxcdHNvbWUgZyBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuR2xvYmFsU2Vjb25kYXJ5SW5kZXhlc1xcXCIpXFxuXFx0aXNfb2JqZWN0KG9iamVjdC5nZXQoZy52YWx1ZSwgXFxcIlByb3Zpc2lvbmVkVGhyb3VnaHB1dFxcXCIsIG51bGwpKVxcblxcdGluYW1lIDo9IG9iamVjdC5nZXQoZy52YWx1ZSwgXFxcIkluZGV4TmFtZVxcXCIsIFxcXCI8dW5uYW1lZD5cXFwiKVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWdzaS1iaWxsaW5nLXRocm91Z2hwdXRcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuR2xvYmFsU2Vjb25kYXJ5SW5kZXhlcy4lZC5Qcm92aXNpb25lZFRocm91Z2hwdXRcXFwiLCBbZy5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcIkdTSSAnJXMnIGlzIG1pc3NpbmcgUHJvdmlzaW9uZWRUaHJvdWdocHV0IHdoaWxlIHRoZSB0YWJsZSBiaWxscyBQUk9WSVNJT05FRCAodGhlIGRlZmF1bHQpOyBDcmVhdGVUYWJsZSBmYWlscyB3aXRoIFxcXFxcXFwiUHJvcGVydHkgUHJvdmlzaW9uZWRUaHJvdWdocHV0IGNhbm5vdCBiZSBlbXB0eVxcXFxcXFwiXFxcIiwgW2luYW1lXSksXFxuXFx0XFxcIkFkZCBQcm92aXNpb25lZFRocm91Z2hwdXQgdG8gdGhlIEdTSSwgb3Igc2V0IEJpbGxpbmdNb2RlIHRvIFBBWV9QRVJfUkVRVUVTVFxcXCIsXFxuXFx0X3BmX2RkYmdidF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6OlRhYmxlXFxcIilcXG5cXHRfcGZfZGRiZ2J0X3Byb3Zpc2lvbmVkKG5hbWUpXFxuXFx0c29tZSBnIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5HbG9iYWxTZWNvbmRhcnlJbmRleGVzXFxcIilcXG5cXHRub3QgaXNfb2JqZWN0KG9iamVjdC5nZXQoZy52YWx1ZSwgXFxcIlByb3Zpc2lvbmVkVGhyb3VnaHB1dFxcXCIsIG51bGwpKVxcblxcdGluYW1lIDo9IG9iamVjdC5nZXQoZy52YWx1ZSwgXFxcIkluZGV4TmFtZVxcXCIsIFxcXCI8dW5uYW1lZD5cXFwiKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWR5bmFtb2RiLWdzaS1wcm9qZWN0aW9uLW5vbmtleVwiLFxuICAgIFwic2VydmljZVwiOiBcImR5bmFtb2RiXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIk5vbktleUF0dHJpYnV0ZXMgZ29lcyB3aXRoIElOQ0xVREUsIGFuZCBvbmx5IHdpdGggSU5DTFVERVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfZGRiZ3BuX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcHJvcGVydGllcy1keW5hbW9kYi10YWJsZS1wcm9qZWN0aW9uLmh0bWxcXFwiXFxuXFxuIyBHU0kgcHJvamVjdGlvbnMgb25seTogdGhlIExTSSBzaGFwZSBhbmQgdGhlIEtFWVNfT05MWStOb25LZXlBdHRyaWJ1dGVzIGNvbWJvXFxuIyB3ZXJlIG5vdCBtZWFzdXJlZCAoaXNzdWUgIzIxKS5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWdzaS1wcm9qZWN0aW9uLW5vbmtleVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5HbG9iYWxTZWNvbmRhcnlJbmRleGVzLiVkLlByb2plY3Rpb25cXFwiLCBbZy5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcIkdTSSAnJXMnIHVzZXMgUHJvamVjdGlvblR5cGUgSU5DTFVERSB3aXRob3V0IE5vbktleUF0dHJpYnV0ZXM7IENyZWF0ZVRhYmxlIGZhaWxzIHdpdGggXFxcXFxcXCJQcm9qZWN0aW9uVHlwZSBpcyBJTkNMVURFLCBidXQgTm9uS2V5QXR0cmlidXRlcyBpcyBub3Qgc3BlY2lmaWVkXFxcXFxcXCJcXFwiLCBbaW5hbWVdKSxcXG5cXHRcXFwiTGlzdCB0aGUgcHJvamVjdGVkIGF0dHJpYnV0ZXMgaW4gTm9uS2V5QXR0cmlidXRlcywgb3Igc3dpdGNoIFByb2plY3Rpb25UeXBlIHRvIEFMTCAvIEtFWVNfT05MWVxcXCIsXFxuXFx0X3BmX2RkYmdwbl91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6OlRhYmxlXFxcIilcXG5cXHRzb21lIGcgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkdsb2JhbFNlY29uZGFyeUluZGV4ZXNcXFwiKVxcblxcdHByb2ogOj0gb2JqZWN0LmdldChnLnZhbHVlLCBcXFwiUHJvamVjdGlvblxcXCIsIG51bGwpXFxuXFx0aXNfb2JqZWN0KHByb2opXFxuXFx0b2JqZWN0LmdldChwcm9qLCBcXFwiUHJvamVjdGlvblR5cGVcXFwiLCBudWxsKSA9PSBcXFwiSU5DTFVERVxcXCJcXG5cXHRjb3VudChvYmplY3QuZ2V0KHByb2osIFxcXCJOb25LZXlBdHRyaWJ1dGVzXFxcIiwgW10pKSA9PSAwXFxuXFx0aW5hbWUgOj0gb2JqZWN0LmdldChnLnZhbHVlLCBcXFwiSW5kZXhOYW1lXFxcIiwgXFxcIjx1bm5hbWVkPlxcXCIpXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGItZ3NpLXByb2plY3Rpb24tbm9ua2V5XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkdsb2JhbFNlY29uZGFyeUluZGV4ZXMuJWQuUHJvamVjdGlvblxcXCIsIFtnLmluZGV4XSksXFxuXFx0c3ByaW50ZihcXFwiR1NJICclcycgY29tYmluZXMgUHJvamVjdGlvblR5cGUgQUxMIHdpdGggTm9uS2V5QXR0cmlidXRlczsgQ3JlYXRlVGFibGUgZmFpbHMgd2l0aCBcXFxcXFxcIlByb2plY3Rpb25UeXBlIGlzIEFMTCwgYnV0IE5vbktleUF0dHJpYnV0ZXMgaXMgc3BlY2lmaWVkXFxcXFxcXCJcXFwiLCBbaW5hbWVdKSxcXG5cXHRcXFwiRHJvcCBOb25LZXlBdHRyaWJ1dGVzIChBTEwgYWxyZWFkeSBwcm9qZWN0cyBldmVyeXRoaW5nKSwgb3Igc3dpdGNoIFByb2plY3Rpb25UeXBlIHRvIElOQ0xVREVcXFwiLFxcblxcdF9wZl9kZGJncG5fdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVxcXCIpXFxuXFx0c29tZSBnIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5HbG9iYWxTZWNvbmRhcnlJbmRleGVzXFxcIilcXG5cXHRwcm9qIDo9IG9iamVjdC5nZXQoZy52YWx1ZSwgXFxcIlByb2plY3Rpb25cXFwiLCBudWxsKVxcblxcdGlzX29iamVjdChwcm9qKVxcblxcdG9iamVjdC5nZXQocHJvaiwgXFxcIlByb2plY3Rpb25UeXBlXFxcIiwgbnVsbCkgPT0gXFxcIkFMTFxcXCJcXG5cXHRjb3VudChvYmplY3QuZ2V0KHByb2osIFxcXCJOb25LZXlBdHRyaWJ1dGVzXFxcIiwgW10pKSA+IDBcXG5cXHRpbmFtZSA6PSBvYmplY3QuZ2V0KGcudmFsdWUsIFxcXCJJbmRleE5hbWVcXFwiLCBcXFwiPHVubmFtZWQ+XFxcIilcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1keW5hbW9kYi1rZXktc2NoZW1hLXNoYXBlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZHluYW1vZGJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiS2V5U2NoZW1hIG11c3QgYmUgW0hBU0hdIG9yIFtIQVNILCBSQU5HRV1cIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6RHluYW1vREI6OlRhYmxlXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX2RkYmtzaF91cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXJlc291cmNlLWR5bmFtb2RiLXRhYmxlLmh0bWxcXFwiXFxuXFxuIyBUYWJsZS1sZXZlbCBrZXkgc2NoZW1hIG9ubHk6IGluZGV4IGtleSBzY2hlbWFzIHByb2R1Y2UgZGlmZmVyZW50IHNlcnZpY2VcXG4jIGVycm9ycyBhbmQgd2VyZSBub3QgbWVhc3VyZWQgKGlzc3VlICMyMSkuXFxuX3BmX2RkYmtzaF90eXBlKG5hbWUsIGkpIDo9IGt0IGlmIHtcXG5cXHRzb21lIGl0IGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5LZXlTY2hlbWFcXFwiKVxcblxcdGl0LmluZGV4ID09IGlcXG5cXHRrdCA6PSBvYmplY3QuZ2V0KGl0LnZhbHVlLCBcXFwiS2V5VHlwZVxcXCIsIG51bGwpXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGIta2V5LXNjaGVtYS1zaGFwZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuS2V5U2NoZW1hLjAuS2V5VHlwZVxcXCIsXFxuXFx0c3ByaW50ZihcXFwiVGhlIGZpcnN0IEtleVNjaGVtYSBlbGVtZW50IG11c3QgYmUgSEFTSCwgZ290ICclcyc7IENyZWF0ZVRhYmxlIGZhaWxzIHdpdGggXFxcXFxcXCJJbnZhbGlkIEtleVNjaGVtYTogVGhlIGZpcnN0IEtleVNjaGVtYUVsZW1lbnQgaXMgbm90IGEgSEFTSCBrZXkgdHlwZVxcXFxcXFwiXFxcIiwgW2t0XSksXFxuXFx0XFxcIlB1dCB0aGUgcGFydGl0aW9uIGtleSAoS2V5VHlwZSBIQVNIKSBmaXJzdCBhbmQgdGhlIG9wdGlvbmFsIHNvcnQga2V5IChSQU5HRSkgc2Vjb25kXFxcIixcXG5cXHRfcGZfZGRia3NoX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcXFwiKVxcblxcdGt0IDo9IF9wZl9kZGJrc2hfdHlwZShuYW1lLCAwKVxcblxcdGlzX3N0cmluZyhrdClcXG5cXHRrdCAhPSBcXFwiSEFTSFxcXCJcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1keW5hbW9kYi1rZXktc2NoZW1hLXNoYXBlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5LZXlTY2hlbWEuMS5LZXlUeXBlXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJUaGUgc2Vjb25kIEtleVNjaGVtYSBlbGVtZW50IG11c3QgYmUgUkFOR0UsIGdvdCAnJXMnOyBDcmVhdGVUYWJsZSBmYWlscyB3aXRoIFxcXFxcXFwiSW52YWxpZCBLZXlTY2hlbWE6IFRoZSBzZWNvbmQgS2V5U2NoZW1hRWxlbWVudCBpcyBub3QgYSBSQU5HRSBrZXkgdHlwZVxcXFxcXFwiXFxcIiwgW2t0XSksXFxuXFx0XFxcIlVzZSBleGFjdGx5IG9uZSBIQVNIIGVsZW1lbnQsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgb25lIFJBTkdFIGVsZW1lbnRcXFwiLFxcblxcdF9wZl9kZGJrc2hfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVxcXCIpXFxuXFx0a3QgOj0gX3BmX2RkYmtzaF90eXBlKG5hbWUsIDEpXFxuXFx0aXNfc3RyaW5nKGt0KVxcblxcdGt0ICE9IFxcXCJSQU5HRVxcXCJcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1keW5hbW9kYi1rZXktc2NoZW1hLXNoYXBlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5LZXlTY2hlbWFcXFwiLFxcblxcdHNwcmludGYoXFxcIktleVNjaGVtYSBjYW4gaG9sZCBhdCBtb3N0IDIgZWxlbWVudHMgKEhBU0ggKyBvcHRpb25hbCBSQU5HRSksIGdvdCAlZFxcXCIsIFtuXSksXFxuXFx0XFxcIk1vZGVsIGV4dHJhIGFjY2VzcyBwYXR0ZXJucyBhcyBnbG9iYWwgb3IgbG9jYWwgc2Vjb25kYXJ5IGluZGV4ZXMgaW5zdGVhZFxcXCIsXFxuXFx0X3BmX2RkYmtzaF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6OlRhYmxlXFxcIilcXG5cXHRuIDo9IGNvdW50KFsxIHwgc29tZSBfIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5LZXlTY2hlbWFcXFwiKV0pXFxuXFx0biA+IDJcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1keW5hbW9kYi1raW5lc2lzLXN0cmVhbS1yZWdpb25cIixcbiAgICBcInNlcnZpY2VcIjogXCJkeW5hbW9kYlwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJBIEtpbmVzaXMgc3RyZWFtaW5nIGRlc3RpbmF0aW9uIG11c3QgYmUgaW4gdGhlIHRhYmxlJ3MgcmVnaW9uXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgQSBLaW5lc2lzIERhdGEgU3RyZWFtcyBkZXN0aW5hdGlvbiBtdXN0IGxpdmUgaW4gdGhlIHNhbWUgcmVnaW9uIGFzIHRoZVxcbiMgdGFibGUuIFRoZSBkZXBsb3ktdGltZSBmYWlsdXJlIG1vZGUgaXMgdWdseTogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIHRoZVxcbiMgc3RyZWFtaW5nIGRlc3RpbmF0aW9uIG5ldmVyIHN0YWJpbGl6ZXMsIGFuZCBDbG91ZEZvcm1hdGlvbiByb2xscyBiYWNrIG9uXFxuIyBOb3RTdGFiaWxpemVkIG1pbnV0ZXMgbGF0ZXIg4oCUIG5vdGhpbmcgbmFtZXMgdGhlIHJlZ2lvbiBtaXNtYXRjaC5cXG4jIGRhdGEuY2RrX3ByZWZsaWdodC5kZXBsb3lfcmVnaW9uIGlzIGRlZmluZWQgb25seSBpbiBlbmZvcmNlIG1vZGUgd2l0aCBhXFxuIyBjb25jcmV0ZSByZWdpb247IG90aGVyd2lzZSB0aGlzIHJ1bGUgc2tpcHMuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1keW5hbW9kYi1raW5lc2lzLXN0cmVhbS1yZWdpb25cXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLktpbmVzaXNTdHJlYW1TcGVjaWZpY2F0aW9uLlN0cmVhbUFyblxcXCIsXFxuXFx0c3ByaW50ZihcXFwiVGhlIEtpbmVzaXMgc3RyZWFtIGxpdmVzIGluICclcycgYnV0IHRoZSB0YWJsZSBkZXBsb3lzIHRvICclcyc7IHRoZSBzdHJlYW1pbmcgZGVzdGluYXRpb24gbmV2ZXIgc3RhYmlsaXplcyBhbmQgdGhlIHN0YWNrIHJvbGxzIGJhY2tcXFwiLCBbc3RyZWFtUmVnaW9uLCByZWdpb25dKSxcXG5cXHRcXFwiUG9pbnQgS2luZXNpc1N0cmVhbVNwZWNpZmljYXRpb24uU3RyZWFtQXJuIGF0IGEgc3RyZWFtIGluIHRoZSB0YWJsZSdzIG93biByZWdpb25cXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9uZHluYW1vZGIvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2tkcy5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcXFwiKVxcblxcdHJlZ2lvbiA6PSBkYXRhLmNka19wcmVmbGlnaHQuZGVwbG95X3JlZ2lvblxcblxcdGlzX3N0cmluZyhyZWdpb24pXFxuXFx0YXJuIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuS2luZXNpc1N0cmVhbVNwZWNpZmljYXRpb24uU3RyZWFtQXJuXFxcIilcXG5cXHRpc19zdHJpbmcoYXJuKVxcblxcdHBhcnRzIDo9IHNwbGl0KGFybiwgXFxcIjpcXFwiKVxcblxcdGNvdW50KHBhcnRzKSA+PSA2XFxuXFx0cGFydHNbMF0gPT0gXFxcImFyblxcXCJcXG5cXHRwYXJ0c1syXSA9PSBcXFwia2luZXNpc1xcXCJcXG5cXHRzdHJlYW1SZWdpb24gOj0gcGFydHNbM11cXG5cXHRzdHJlYW1SZWdpb24gIT0gXFxcIlxcXCJcXG5cXHRzdHJlYW1SZWdpb24gIT0gcmVnaW9uXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtZHluYW1vZGItbHNpLWF0dHJpYnV0ZS1kZWZpbml0aW9uc1wiLFxuICAgIFwic2VydmljZVwiOiBcImR5bmFtb2RiXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkxTSSBrZXkgYXR0cmlidXRlcyBtdXN0IGJlIGRlZmluZWQgaW4gQXR0cmlidXRlRGVmaW5pdGlvbnNcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6RHluYW1vREI6OlRhYmxlXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuIyBUaGUgZW5naW5lJ3MgRTMwMzkgY2hlY2tzIHRhYmxlIGFuZCBHU0kga2V5IHNjaGVtYXMgYWdhaW5zdFxcbiMgQXR0cmlidXRlRGVmaW5pdGlvbnMgYnV0IGlzIGJsaW5kIHRvIExvY2FsU2Vjb25kYXJ5SW5kZXhlcyAobWVhc3VyZWRcXG4jIDIwMjYtMDktMDIsIDEuNy4wLWJldGEpLiBUaGlzIHJ1bGUgY292ZXJzIGV4YWN0bHkgdGhhdCBnYXAuXFxuXFxuX3BmX2RkYmxhZF9kZWZzKG5hbWUpIDo9IHthIHxcXG5cXHRzb21lIGQgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkF0dHJpYnV0ZURlZmluaXRpb25zXFxcIilcXG5cXHRhIDo9IG9iamVjdC5nZXQoZC52YWx1ZSwgXFxcIkF0dHJpYnV0ZU5hbWVcXFwiLCBudWxsKVxcblxcdGlzX3N0cmluZyhhKVxcbn1cXG5cXG4jIElmIGFueSBkZWZpbml0aW9uJ3MgbmFtZSBpcyB1bnJlc29sdmFibGUgdGhlIHNldCBpcyBpbmNvbXBsZXRlIOKAlCBzdGF5IHNpbGVudC5cXG5fcGZfZGRibGFkX2RlZnNfcmVzb2x2YWJsZShuYW1lKSBpZiB7XFxuXFx0ZXZlcnkgZCBpbiBbeCB8IHNvbWUgeCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuQXR0cmlidXRlRGVmaW5pdGlvbnNcXFwiKV0ge1xcblxcdFxcdGlzX3N0cmluZyhvYmplY3QuZ2V0KGQudmFsdWUsIFxcXCJBdHRyaWJ1dGVOYW1lXFxcIiwgbnVsbCkpXFxuXFx0fVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWxzaS1hdHRyaWJ1dGUtZGVmaW5pdGlvbnNcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuTG9jYWxTZWNvbmRhcnlJbmRleGVzLiVkLktleVNjaGVtYVxcXCIsIFtsLmluZGV4XSksXFxuXFx0c3ByaW50ZihcXFwiTFNJIGtleSBhdHRyaWJ1dGUgJyVzJyBpcyBub3QgZGVmaW5lZCBpbiBBdHRyaWJ1dGVEZWZpbml0aW9uczsgQ3JlYXRlVGFibGUgZmFpbHMgd2l0aCBcXFxcXFxcIkFuIGF0dHJpYnV0ZSByZWZlcmVuY2VkIGluIGEgS2V5U2NoZW1hIGVsZW1lbnQgaXMgbm90IGRlZmluZWQgaW4gQXR0cmlidXRlRGVmaW5pdGlvbnNcXFxcXFxcIlxcXCIsIFthdHRyXSksXFxuXFx0XFxcIkFkZCB0aGUgYXR0cmlidXRlIHRvIEF0dHJpYnV0ZURlZmluaXRpb25zIChhbmQgbm93aGVyZSBlbHNlOiBvbmx5IGtleSBhdHRyaWJ1dGVzIGJlbG9uZyB0aGVyZSlcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1wcm9wZXJ0aWVzLWR5bmFtb2RiLXRhYmxlLWxvY2Fsc2Vjb25kYXJ5aW5kZXguaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6OlRhYmxlXFxcIilcXG5cXHRjb3VudChfcGZfZGRibGFkX2RlZnMobmFtZSkpID4gMFxcblxcdF9wZl9kZGJsYWRfZGVmc19yZXNvbHZhYmxlKG5hbWUpXFxuXFx0c29tZSBsIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5Mb2NhbFNlY29uZGFyeUluZGV4ZXNcXFwiKVxcblxcdHNvbWUgayBpbiBvYmplY3QuZ2V0KGwudmFsdWUsIFxcXCJLZXlTY2hlbWFcXFwiLCBbXSlcXG5cXHRhdHRyIDo9IG9iamVjdC5nZXQoaywgXFxcIkF0dHJpYnV0ZU5hbWVcXFwiLCBudWxsKVxcblxcdGlzX3N0cmluZyhhdHRyKVxcblxcdG5vdCBhdHRyIGluIF9wZl9kZGJsYWRfZGVmcyhuYW1lKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWR5bmFtb2RiLWxzaS1zaGFwZVwiLFxuICAgIFwic2VydmljZVwiOiBcImR5bmFtb2RiXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkFuIExTSSBuZWVkcyBhIFJBTkdFIGtleSBhbmQgdGhlIHRhYmxlJ3MgbGVhZGluZyBoYXNoIGtleVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfZGRibHNoX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcHJvcGVydGllcy1keW5hbW9kYi10YWJsZS1sb2NhbHNlY29uZGFyeWluZGV4Lmh0bWxcXFwiXFxuXFxuX3BmX2RkYmxzaF9rZXl0eXBlcyhrcykgOj0ge2t0IHxcXG5cXHRzb21lIGsgaW4ga3NcXG5cXHRrdCA6PSBvYmplY3QuZ2V0KGssIFxcXCJLZXlUeXBlXFxcIiwgbnVsbClcXG5cXHRpc19zdHJpbmcoa3QpXFxufVxcblxcbiMgT25seSBqdWRnZSBhIGtleSBzY2hlbWEgd2hvc2UgS2V5VHlwZXMgYXJlIGFsbCBsaXRlcmFsIHN0cmluZ3MuXFxuX3BmX2RkYmxzaF9yZXNvbHZhYmxlKGtzKSBpZiBjb3VudChfcGZfZGRibHNoX2tleXR5cGVzKGtzKSkgPiAwXFxuXFxuX3BmX2RkYmxzaF9yZXNvbHZhYmxlX2FsbChrcykgaWYge1xcblxcdGV2ZXJ5IGsgaW4ga3Mge1xcblxcdFxcdGlzX3N0cmluZyhvYmplY3QuZ2V0KGssIFxcXCJLZXlUeXBlXFxcIiwgbnVsbCkpXFxuXFx0fVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWxzaS1zaGFwZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5Mb2NhbFNlY29uZGFyeUluZGV4ZXMuJWQuS2V5U2NoZW1hXFxcIiwgW2wuaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJMb2NhbCBzZWNvbmRhcnkgaW5kZXggJyVzJyBoYXMgbm8gUkFOR0Uga2V5OyBDcmVhdGVUYWJsZSBmYWlscyB3aXRoIFxcXFxcXFwiSW5kZXggS2V5U2NoZW1hIGRvZXMgbm90IGhhdmUgYSByYW5nZSBrZXkgZm9yIGluZGV4XFxcXFxcXCJcXFwiLCBbaW5hbWVdKSxcXG5cXHRcXFwiR2l2ZSB0aGUgTFNJIGEgc29ydCBrZXk6IFt0YWJsZSBIQVNIIGtleSwgaXRzIG93biBSQU5HRSBrZXldXFxcIixcXG5cXHRfcGZfZGRibHNoX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcXFwiKVxcblxcdHNvbWUgbCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuTG9jYWxTZWNvbmRhcnlJbmRleGVzXFxcIilcXG5cXHRrcyA6PSBvYmplY3QuZ2V0KGwudmFsdWUsIFxcXCJLZXlTY2hlbWFcXFwiLCBbXSlcXG5cXHRjb3VudChrcykgPiAwXFxuXFx0X3BmX2RkYmxzaF9yZXNvbHZhYmxlX2FsbChrcylcXG5cXHRub3QgXFxcIlJBTkdFXFxcIiBpbiBfcGZfZGRibHNoX2tleXR5cGVzKGtzKVxcblxcdGluYW1lIDo9IG9iamVjdC5nZXQobC52YWx1ZSwgXFxcIkluZGV4TmFtZVxcXCIsIFxcXCI8dW5uYW1lZD5cXFwiKVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWxzaS1zaGFwZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5Mb2NhbFNlY29uZGFyeUluZGV4ZXMuJWQuS2V5U2NoZW1hXFxcIiwgW2wuaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJMb2NhbCBzZWNvbmRhcnkgaW5kZXggJyVzJyB1c2VzIGhhc2gga2V5ICclcycgYnV0IHRoZSB0YWJsZSdzIGhhc2gga2V5IGlzICclcyc7IENyZWF0ZVRhYmxlIGZhaWxzIHdpdGggXFxcXFxcXCJJbmRleCBLZXlTY2hlbWEgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBsZWFkaW5nIGhhc2gga2V5IGFzIHRhYmxlIEtleVNjaGVtYVxcXFxcXFwiXFxcIiwgW2luYW1lLCBsc2lIYXNoLCB0YWJsZUhhc2hdKSxcXG5cXHRcXFwiQW4gTFNJIG11c3QgcmV1c2UgdGhlIHRhYmxlJ3MgcGFydGl0aW9uIGtleTsgdXNlIGEgZ2xvYmFsIHNlY29uZGFyeSBpbmRleCBmb3IgYSBkaWZmZXJlbnQgaGFzaCBrZXlcXFwiLFxcblxcdF9wZl9kZGJsc2hfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVxcXCIpXFxuXFx0c29tZSB0IGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5LZXlTY2hlbWFcXFwiKVxcblxcdHQuaW5kZXggPT0gMFxcblxcdHRhYmxlSGFzaCA6PSBvYmplY3QuZ2V0KHQudmFsdWUsIFxcXCJBdHRyaWJ1dGVOYW1lXFxcIiwgbnVsbClcXG5cXHRpc19zdHJpbmcodGFibGVIYXNoKVxcblxcdHNvbWUgbCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuTG9jYWxTZWNvbmRhcnlJbmRleGVzXFxcIilcXG5cXHRrcyA6PSBvYmplY3QuZ2V0KGwudmFsdWUsIFxcXCJLZXlTY2hlbWFcXFwiLCBbXSlcXG5cXHRzb21lIGsgaW4ga3NcXG5cXHRvYmplY3QuZ2V0KGssIFxcXCJLZXlUeXBlXFxcIiwgbnVsbCkgPT0gXFxcIkhBU0hcXFwiXFxuXFx0bHNpSGFzaCA6PSBvYmplY3QuZ2V0KGssIFxcXCJBdHRyaWJ1dGVOYW1lXFxcIiwgbnVsbClcXG5cXHRpc19zdHJpbmcobHNpSGFzaClcXG5cXHRsc2lIYXNoICE9IHRhYmxlSGFzaFxcblxcdGluYW1lIDo9IG9iamVjdC5nZXQobC52YWx1ZSwgXFxcIkluZGV4TmFtZVxcXCIsIFxcXCI8dW5uYW1lZD5cXFwiKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWR5bmFtb2RiLXRhYmxlLW5hbWUtbGVuZ3RoXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZHluYW1vZGJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiVGFibGVOYW1lIG11c3QgYmUgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcInBlbmRpbmctZW5naW5lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG4jIE9ubHkgdGhlIG1lYXN1cmVkIGJvdW5kIChtaW5pbXVtIDMgY2hhcmFjdGVycykgaXMgZW5mb3JjZWQuIFRoZSAyNTUtY2hhclxcbiMgbWF4aW11bSBhbmQgdGhlIGNoYXJhY3RlciBwYXR0ZXJuIHdlcmUgbm90IG1lYXN1cmVkLiBOb3RlIHJlc29sdmUoKSB0dXJucyBhXFxuIyBSZWYtdG8tcmVzb3VyY2UgaW50byB0aGUgdGFyZ2V0J3MgbG9naWNhbCBJRDsgYSBsb2dpY2FsIElEIHNob3J0IGVub3VnaCB0b1xcbiMgdHJpcCB0aGlzIHJ1bGUgd2hpbGUgZmVlZGluZyBhIFRhYmxlTmFtZSBpcyB0cmVhdGVkIGFzIHRoZSBidWcgaXQgYWxtb3N0XFxuIyBjZXJ0YWlubHkgaXMuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1keW5hbW9kYi10YWJsZS1uYW1lLWxlbmd0aFxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuVGFibGVOYW1lXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJUYWJsZU5hbWUgJyVzJyBpcyBzaG9ydGVyIHRoYW4gMyBjaGFyYWN0ZXJzOyBDcmVhdGVUYWJsZSBmYWlscyB3aXRoIFxcXFxcXFwiTWVtYmVyIG11c3QgaGF2ZSBsZW5ndGggZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDNcXFxcXFxcIlxcXCIsIFt0bl0pLFxcblxcdFxcXCJVc2UgYSB0YWJsZSBuYW1lIG9mIGF0IGxlYXN0IDMgY2hhcmFjdGVycywgb3Igb21pdCBUYWJsZU5hbWUgYW5kIGxldCBDbG91ZEZvcm1hdGlvbiBnZW5lcmF0ZSBvbmVcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9uZHluYW1vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVGFibGUuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6OlRhYmxlXFxcIilcXG5cXHR0biA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlRhYmxlTmFtZVxcXCIpXFxuXFx0aXNfc3RyaW5nKHRuKVxcblxcdGNvdW50KHRuKSA8IDNcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1lYzItc2ctcG9ydC1yYW5nZVwiLFxuICAgIFwic2VydmljZVwiOiBcImVjMlwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJTZWN1cml0eSBncm91cCBUQ1AvVURQIHBvcnRzIG11c3QgYmUgd2l0aGluIDAtNjU1MzUgYW5kIEZyb21Qb3J0IDw9IFRvUG9ydFwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXBcIixcbiAgICAgIFwiQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXBJbmdyZXNzXCIsXG4gICAgICBcIkFXUzo6RUMyOjpTZWN1cml0eUdyb3VwRWdyZXNzXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX3NnX2ZpeCA6PSBcXFwiVXNlIGEgcG9ydCBiZXR3ZWVuIDAgYW5kIDY1NTM1IHdpdGggRnJvbVBvcnQgPD0gVG9Qb3J0XFxcIlxcblxcbl9wZl9zZ191cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXV0aG9yaXplU2VjdXJpdHlHcm91cEluZ3Jlc3MuaHRtbFxcXCJcXG5cXG5fcGZfcG9ydF9vdXQobikgaWYgbiA8IDBcXG5cXG5fcGZfcG9ydF9vdXQobikgaWYgbiA+IDY1NTM1XFxuXFxuX3BmX3RjcF91ZHAocCkgaWYgcCBpbiB7XFxcInRjcFxcXCIsIFxcXCJ1ZHBcXFwiLCBcXFwiNlxcXCIsIFxcXCIxN1xcXCIsIDYsIDE3fVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWMyLXNnLXBvcnQtcmFuZ2VcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuJXMuJWQuJXNcXFwiLCBbZGlyLCBpdGVtLmluZGV4LCBwbmFtZV0pLFxcblxcdHNwcmludGYoXFxcIiVzICV2IGlzIG91dHNpZGUgdGhlIHZhbGlkIFRDUC9VRFAgcG9ydCByYW5nZSAwLTY1NTM1XFxcIiwgW3BuYW1lLCBuXSksXFxuXFx0X3BmX3NnX2ZpeCwgX3BmX3NnX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXBcXFwiKVxcblxcdHNvbWUgZGlyIGluIHtcXFwiU2VjdXJpdHlHcm91cEluZ3Jlc3NcXFwiLCBcXFwiU2VjdXJpdHlHcm91cEVncmVzc1xcXCJ9XFxuXFx0c29tZSBpdGVtIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLiVzXFxcIiwgW2Rpcl0pKVxcblxcdGVudHJ5IDo9IGl0ZW0udmFsdWVcXG5cXHRpc19vYmplY3QoZW50cnkpXFxuXFx0X3BmX3RjcF91ZHAob2JqZWN0LmdldChlbnRyeSwgXFxcIklwUHJvdG9jb2xcXFwiLCBudWxsKSlcXG5cXHRzb21lIHBuYW1lIGluIHtcXFwiRnJvbVBvcnRcXFwiLCBcXFwiVG9Qb3J0XFxcIn1cXG5cXHRuIDo9IHRvX251bWJlcihvYmplY3QuZ2V0KGVudHJ5LCBwbmFtZSwgbnVsbCkpXFxuXFx0X3BmX3BvcnRfb3V0KG4pXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWMyLXNnLXBvcnQtcmFuZ2VcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuJXMuJWQuRnJvbVBvcnRcXFwiLCBbZGlyLCBpdGVtLmluZGV4XSksXFxuXFx0c3ByaW50ZihcXFwiRnJvbVBvcnQgKCV2KSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBUb1BvcnQgKCV2KVxcXCIsIFtmLCB0XSksXFxuXFx0X3BmX3NnX2ZpeCwgX3BmX3NnX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXBcXFwiKVxcblxcdHNvbWUgZGlyIGluIHtcXFwiU2VjdXJpdHlHcm91cEluZ3Jlc3NcXFwiLCBcXFwiU2VjdXJpdHlHcm91cEVncmVzc1xcXCJ9XFxuXFx0c29tZSBpdGVtIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLiVzXFxcIiwgW2Rpcl0pKVxcblxcdGVudHJ5IDo9IGl0ZW0udmFsdWVcXG5cXHRpc19vYmplY3QoZW50cnkpXFxuXFx0X3BmX3RjcF91ZHAob2JqZWN0LmdldChlbnRyeSwgXFxcIklwUHJvdG9jb2xcXFwiLCBudWxsKSlcXG5cXHRmIDo9IHRvX251bWJlcihvYmplY3QuZ2V0KGVudHJ5LCBcXFwiRnJvbVBvcnRcXFwiLCBudWxsKSlcXG5cXHR0IDo9IHRvX251bWJlcihvYmplY3QuZ2V0KGVudHJ5LCBcXFwiVG9Qb3J0XFxcIiwgbnVsbCkpXFxuXFx0ZiA+PSAwXFxuXFx0dCA8PSA2NTUzNVxcblxcdGYgPiB0XFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWMyLXNnLXBvcnQtcmFuZ2VcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuJXNcXFwiLCBbcG5hbWVdKSxcXG5cXHRzcHJpbnRmKFxcXCIlcyAldiBpcyBvdXRzaWRlIHRoZSB2YWxpZCBUQ1AvVURQIHBvcnQgcmFuZ2UgMC02NTUzNVxcXCIsIFtwbmFtZSwgbl0pLFxcblxcdF9wZl9zZ19maXgsIF9wZl9zZ191cmwpIGlmIHtcXG5cXHRzb21lIHJ0eXBlIGluIHtcXFwiQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXBJbmdyZXNzXFxcIiwgXFxcIkFXUzo6RUMyOjpTZWN1cml0eUdyb3VwRWdyZXNzXFxcIn1cXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUocnR5cGUpXFxuXFx0X3BmX3RjcF91ZHAocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5JcFByb3RvY29sXFxcIikpXFxuXFx0c29tZSBwbmFtZSBpbiB7XFxcIkZyb21Qb3J0XFxcIiwgXFxcIlRvUG9ydFxcXCJ9XFxuXFx0biA6PSB0b19udW1iZXIocmVzb2x2ZShuYW1lLCBzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLiVzXFxcIiwgW3BuYW1lXSkpKVxcblxcdF9wZl9wb3J0X291dChuKVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWVjMi1zZy1wb3J0LXJhbmdlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5Gcm9tUG9ydFxcXCIsXFxuXFx0c3ByaW50ZihcXFwiRnJvbVBvcnQgKCV2KSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBUb1BvcnQgKCV2KVxcXCIsIFtmLCB0XSksXFxuXFx0X3BmX3NnX2ZpeCwgX3BmX3NnX3VybCkgaWYge1xcblxcdHNvbWUgcnR5cGUgaW4ge1xcXCJBV1M6OkVDMjo6U2VjdXJpdHlHcm91cEluZ3Jlc3NcXFwiLCBcXFwiQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXBFZ3Jlc3NcXFwifVxcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShydHlwZSlcXG5cXHRfcGZfdGNwX3VkcChyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLklwUHJvdG9jb2xcXFwiKSlcXG5cXHRmIDo9IHRvX251bWJlcihyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkZyb21Qb3J0XFxcIikpXFxuXFx0dCA6PSB0b19udW1iZXIocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Ub1BvcnRcXFwiKSlcXG5cXHRmID49IDBcXG5cXHR0IDw9IDY1NTM1XFxuXFx0ZiA+IHRcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1lYzItdXNlcmRhdGEtc2l6ZVwiLFxuICAgIFwic2VydmljZVwiOiBcImVjMlwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJFQzIgdXNlciBkYXRhIGlzIGxpbWl0ZWQgdG8gMTYzODQgYnl0ZXNcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6RUMyOjpJbnN0YW5jZVwiLFxuICAgICAgXCJBV1M6OkVDMjo6TGF1bmNoVGVtcGxhdGVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfdWRzel9maXggOj0gXFxcIktlZXAgdXNlciBkYXRhIHVuZGVyIDE2Mzg0IGJ5dGVzOyBtb3ZlIGxhcmdlIHBheWxvYWRzIHRvIFMzIGFuZCBmZXRjaCB0aGVtIGZyb20gYSBzbWFsbCBib290c3RyYXAgc2NyaXB0XFxcIlxcblxcbl9wZl91ZHN6X3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2luc3RhbmNlZGF0YS1hZGQtdXNlci1kYXRhLmh0bWxcXFwiXFxuXFxuX3BmX3Vkc3pfbGltaXQgOj0gMTYzODRcXG5cXG4jIGJhc2U2NCDmloflrZfliJfjga7jg4fjgrPjg7zjg4nlvozjg5DjgqTjg4jmlbDvvIjjg5Hjg4fjgqPjg7PjgrDogIPmha7vvIlcXG5fcGZfdWRzel9kZWNvZGVkKHMpIDo9ICgoY291bnQocykgKiAzKSAvIDQpIC0gMiBpZiBlbmRzd2l0aChzLCBcXFwiPT1cXFwiKVxcblxcbl9wZl91ZHN6X2RlY29kZWQocykgOj0gKChjb3VudChzKSAqIDMpIC8gNCkgLSAxIGlmIHtcXG5cXHRlbmRzd2l0aChzLCBcXFwiPVxcXCIpXFxuXFx0bm90IGVuZHN3aXRoKHMsIFxcXCI9PVxcXCIpXFxufVxcblxcbl9wZl91ZHN6X2RlY29kZWQocykgOj0gKGNvdW50KHMpICogMykgLyA0IGlmIG5vdCBlbmRzd2l0aChzLCBcXFwiPVxcXCIpXFxuXFxuX3BmX3Vkc3pfcGF0aHMgOj0ge1xcblxcdFxcXCJBV1M6OkVDMjo6SW5zdGFuY2VcXFwiOiBcXFwiUHJvcGVydGllcy5Vc2VyRGF0YVxcXCIsXFxuXFx0XFxcIkFXUzo6RUMyOjpMYXVuY2hUZW1wbGF0ZVxcXCI6IFxcXCJQcm9wZXJ0aWVzLkxhdW5jaFRlbXBsYXRlRGF0YS5Vc2VyRGF0YVxcXCIsXFxufVxcblxcbiMgVXNlckRhdGEg44GM44Oq44OG44Op44OrIGJhc2U2NCDmloflrZfliJfjga7jgrHjg7zjgrlcXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWVjMi11c2VyZGF0YS1zaXplXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSwgcCxcXG5cXHRzcHJpbnRmKFxcXCJVc2VyRGF0YSBkZWNvZGVzIHRvIGFib3V0ICV2IGJ5dGVzLCBidXQgRUMyIGxpbWl0cyB1c2VyIGRhdGEgdG8gJWQgYnl0ZXM7IFJ1bkluc3RhbmNlcyBmYWlscyBhdCBkZXBsb3kgdGltZVxcXCIsIFtzaXplLCBfcGZfdWRzel9saW1pdF0pLFxcblxcdF9wZl91ZHN6X2ZpeCwgX3BmX3Vkc3pfdXJsKSBpZiB7XFxuXFx0c29tZSBydHlwZSwgcCBpbiBfcGZfdWRzel9wYXRoc1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShydHlwZSlcXG5cXHR1ZCA6PSByZXNvbHZlKG5hbWUsIHApXFxuXFx0aXNfc3RyaW5nKHVkKVxcblxcdHNpemUgOj0gX3BmX3Vkc3pfZGVjb2RlZCh1ZClcXG5cXHRzaXplID4gX3BmX3Vkc3pfbGltaXRcXG59XFxuXFxuIyBVc2VyRGF0YSDjgYwge1xcXCJGbjo6QmFzZTY0XFxcIjogXFxcIjxsaXRlcmFsPlxcXCJ9IOOBruOCseODvOOCue+8iOOCqOODs+OCs+ODvOODieWJjeOBrueUn+ODkOOCpOODiOaVsOOBp+WIpOWumu+8iVxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWMyLXVzZXJkYXRhLXNpemVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLCBwLFxcblxcdHNwcmludGYoXFxcIlVzZXJEYXRhIGlzICVkIGJ5dGVzIGJlZm9yZSBiYXNlNjQgZW5jb2RpbmcsIGJ1dCBFQzIgbGltaXRzIHVzZXIgZGF0YSB0byAlZCBieXRlczsgUnVuSW5zdGFuY2VzIGZhaWxzIGF0IGRlcGxveSB0aW1lXFxcIiwgW2NvdW50KGlubmVyKSwgX3BmX3Vkc3pfbGltaXRdKSxcXG5cXHRfcGZfdWRzel9maXgsIF9wZl91ZHN6X3VybCkgaWYge1xcblxcdHNvbWUgcnR5cGUsIHAgaW4gX3BmX3Vkc3pfcGF0aHNcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUocnR5cGUpXFxuXFx0dWQgOj0gcmVzb2x2ZShuYW1lLCBwKVxcblxcdGlzX29iamVjdCh1ZClcXG5cXHRpbm5lciA6PSBvYmplY3QuZ2V0KHVkLCBcXFwiRm46OkJhc2U2NFxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKGlubmVyKVxcblxcdGNvdW50KGlubmVyKSA+IF9wZl91ZHN6X2xpbWl0XFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtZWMyLXZvbHVtZS1pb3BzXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZWMyXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkVCUyBJb3BzL1Rocm91Z2hwdXQgbXVzdCBtYXRjaCB0aGUgdm9sdW1lIHR5cGUncyBzdXBwb3J0ZWQgcmFuZ2VzIGFuZCByYXRpb3NcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6RUMyOjpWb2x1bWVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfdm9saW9wc19maXggOj0gXFxcIk1hdGNoIElvcHMvVGhyb3VnaHB1dCB0byB0aGUgdm9sdW1lIHR5cGU6IGdwMyAzMDAwLTgwMDAwIElPUFMgKG1heCA1MDAvR2lCLCB0aHJvdWdocHV0IDEyNS0yMDAwIE1pQi9zIGFuZCBhdCBtb3N0IElPUFMvNCksIGlvMSAxMDAtNjQwMDAgKG1heCA1MC9HaUIpLCBpbzIgMTAwLTI1NjAwMCAobWF4IDEwMDAvR2lCKTsgZ3AyL3N0MS9zYzEvc3RhbmRhcmQgYWNjZXB0IG5laXRoZXIgcHJvcGVydHlcXFwiXFxuXFxuX3BmX3ZvbGlvcHNfdXJsIDo9IFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWJzL2xhdGVzdC91c2VyZ3VpZGUvZWJzLXZvbHVtZS10eXBlcy5odG1sXFxcIlxcblxcbl9wZl92b2xpb3BzX3JhbmdlIDo9IHtcXFwiZ3AzXFxcIjogWzMwMDAsIDgwMDAwXSwgXFxcImlvMVxcXCI6IFsxMDAsIDY0MDAwXSwgXFxcImlvMlxcXCI6IFsxMDAsIDI1NjAwMF19XFxuXFxuX3BmX3ZvbGlvcHNfcGVyX2dpYiA6PSB7XFxcImdwM1xcXCI6IDUwMCwgXFxcImlvMVxcXCI6IDUwLCBcXFwiaW8yXFxcIjogMTAwMH1cXG5cXG5fcGZfdm9saW9wc19vdXQobiwgbG8sIGhpKSBpZiBuIDwgbG9cXG5cXG5fcGZfdm9saW9wc19vdXQobiwgbG8sIGhpKSBpZiBuID4gaGlcXG5cXG5fcGZfdm9saW9wc19oYXNfaW9wcyhuYW1lKSBpZiByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLklvcHNcXFwiKVxcblxcbiMgSU9QUyDjgYzlnovjgZTjgajjga7ntbblr77jg6zjg7PjgrjlpJZcXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWVjMi12b2x1bWUtaW9wc1xcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsIFxcXCJQcm9wZXJ0aWVzLklvcHNcXFwiLFxcblxcdHNwcmludGYoXFxcIklvcHMgJXYgaXMgb3V0c2lkZSB0aGUgc3VwcG9ydGVkIHJhbmdlICVkLSVkIGZvciAlcyB2b2x1bWVzXFxcIiwgW24sIHJbMF0sIHJbMV0sIHZ0XSksXFxuXFx0X3BmX3ZvbGlvcHNfZml4LCBfcGZfdm9saW9wc191cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUMyOjpWb2x1bWVcXFwiKVxcblxcdHZ0IDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVm9sdW1lVHlwZVxcXCIpXFxuXFx0ciA6PSBfcGZfdm9saW9wc19yYW5nZVt2dF1cXG5cXHRuIDo9IHRvX251bWJlcihyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLklvcHNcXFwiKSlcXG5cXHRfcGZfdm9saW9wc19vdXQobiwgclswXSwgclsxXSlcXG59XFxuXFxuIyBJT1BTIDog44K144Kk44K65q+U44Gu6LaF6YGOXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lYzItdm9sdW1lLWlvcHNcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLCBcXFwiUHJvcGVydGllcy5Jb3BzXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJJb3BzICV2IGV4Y2VlZHMgdGhlIG1heGltdW0gcmF0aW8gb2YgJWQgSU9QUyBwZXIgR2lCIGZvciAlcyAoU2l6ZSAldiBHaUIgYWxsb3dzIGF0IG1vc3QgJXYpXFxcIiwgW24sIHJhdGlvLCB2dCwgcywgcyAqIHJhdGlvXSksXFxuXFx0X3BmX3ZvbGlvcHNfZml4LCBfcGZfdm9saW9wc191cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUMyOjpWb2x1bWVcXFwiKVxcblxcdHZ0IDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVm9sdW1lVHlwZVxcXCIpXFxuXFx0cmF0aW8gOj0gX3BmX3ZvbGlvcHNfcGVyX2dpYlt2dF1cXG5cXHRuIDo9IHRvX251bWJlcihyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLklvcHNcXFwiKSlcXG5cXHRzIDo9IHRvX251bWJlcihyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlNpemVcXFwiKSlcXG5cXHRuID4gcyAqIHJhdGlvXFxufVxcblxcbiMgSW9wcyDjgpLlj5fjgZHku5jjgZHjgarjgYTlnovjgasgSW9wcyDjgpLmjIflrppcXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWVjMi12b2x1bWUtaW9wc1xcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsIFxcXCJQcm9wZXJ0aWVzLklvcHNcXFwiLFxcblxcdHNwcmludGYoXFxcIklvcHMgaXMgbm90IHN1cHBvcnRlZCBmb3IgJXMgdm9sdW1lcyAodmFsaWQgb25seSBmb3IgZ3AzLCBpbzEsIGlvMik7IEVDMiByZWplY3RzIHRoZSBDcmVhdGVWb2x1bWUgY2FsbFxcXCIsIFt2dF0pLFxcblxcdF9wZl92b2xpb3BzX2ZpeCwgX3BmX3ZvbGlvcHNfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkVDMjo6Vm9sdW1lXFxcIilcXG5cXHR2dCA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlZvbHVtZVR5cGVcXFwiKVxcblxcdHZ0IGluIHtcXFwiZ3AyXFxcIiwgXFxcInN0MVxcXCIsIFxcXCJzYzFcXFwiLCBcXFwic3RhbmRhcmRcXFwifVxcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuSW9wc1xcXCIpXFxufVxcblxcbiMgVGhyb3VnaHB1dCDjga8gZ3AzIOWwgueUqFxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWMyLXZvbHVtZS1pb3BzXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSwgXFxcIlByb3BlcnRpZXMuVGhyb3VnaHB1dFxcXCIsXFxuXFx0c3ByaW50ZihcXFwiVGhyb3VnaHB1dCBpcyBub3Qgc3VwcG9ydGVkIGZvciAlcyB2b2x1bWVzICh2YWxpZCBvbmx5IGZvciBncDMpOyBFQzIgcmVqZWN0cyB0aGUgQ3JlYXRlVm9sdW1lIGNhbGxcXFwiLCBbdnRdKSxcXG5cXHRfcGZfdm9saW9wc19maXgsIF9wZl92b2xpb3BzX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFQzI6OlZvbHVtZVxcXCIpXFxuXFx0dnQgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Wb2x1bWVUeXBlXFxcIilcXG5cXHRpc19zdHJpbmcodnQpXFxuXFx0dnQgIT0gXFxcImdwM1xcXCJcXG5cXHRyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlRocm91Z2hwdXRcXFwiKVxcbn1cXG5cXG4jIGdwMyBUaHJvdWdocHV0IOOBrue1tuWvvuODrOODs+OCuFxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWMyLXZvbHVtZS1pb3BzXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSwgXFxcIlByb3BlcnRpZXMuVGhyb3VnaHB1dFxcXCIsXFxuXFx0c3ByaW50ZihcXFwiVGhyb3VnaHB1dCAldiBNaUIvcyBpcyBvdXRzaWRlIHRoZSBzdXBwb3J0ZWQgcmFuZ2UgMTI1LTIwMDAgZm9yIGdwMyB2b2x1bWVzXFxcIiwgW3RdKSxcXG5cXHRfcGZfdm9saW9wc19maXgsIF9wZl92b2xpb3BzX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFQzI6OlZvbHVtZVxcXCIpXFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Wb2x1bWVUeXBlXFxcIikgPT0gXFxcImdwM1xcXCJcXG5cXHR0IDo9IHRvX251bWJlcihyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlRocm91Z2hwdXRcXFwiKSlcXG5cXHRfcGZfdm9saW9wc19vdXQodCwgMTI1LCAyMDAwKVxcbn1cXG5cXG4jIGdwMyBUaHJvdWdocHV0IDogSU9QUyDmr5TvvIjmnIDlpKcgMC4yNSBNaUIvcyBwZXIgSU9QU++8iVxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWMyLXZvbHVtZS1pb3BzXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSwgXFxcIlByb3BlcnRpZXMuVGhyb3VnaHB1dFxcXCIsXFxuXFx0c3ByaW50ZihcXFwiVGhyb3VnaHB1dCAldiBNaUIvcyBleGNlZWRzIHRoZSBtYXhpbXVtIHJhdGlvIG9mIDAuMjUgTWlCL3MgcGVyIHByb3Zpc2lvbmVkIElPUFMgKCV2IElPUFMgYWxsb3dzIGF0IG1vc3QgJXYpXFxcIiwgW3QsIG4sIG4gLyA0XSksXFxuXFx0X3BmX3ZvbGlvcHNfZml4LCBfcGZfdm9saW9wc191cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUMyOjpWb2x1bWVcXFwiKVxcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVm9sdW1lVHlwZVxcXCIpID09IFxcXCJncDNcXFwiXFxuXFx0dCA6PSB0b19udW1iZXIocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5UaHJvdWdocHV0XFxcIikpXFxuXFx0biA6PSB0b19udW1iZXIocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Jb3BzXFxcIikpXFxuXFx0dCAqIDQgPiBuXFxufVxcblxcbiMgZ3AzIOOBpyBJb3BzIOacquaMh+Wumu+8iOODh+ODleOCqeODq+ODiCAzMDAw77yJ44Gu44Go44GN44GuIFRocm91Z2hwdXQg5q+UXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lYzItdm9sdW1lLWlvcHNcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLCBcXFwiUHJvcGVydGllcy5UaHJvdWdocHV0XFxcIixcXG5cXHRzcHJpbnRmKFxcXCJUaHJvdWdocHV0ICV2IE1pQi9zIGV4Y2VlZHMgNzUwLCB0aGUgbWF4aW11bSBmb3IgdGhlIGRlZmF1bHQgMzAwMCBJT1BTICgwLjI1IE1pQi9zIHBlciBJT1BTKTsgcHJvdmlzaW9uIElvcHMgZXhwbGljaXRseSBvciBsb3dlciB0aGUgdGhyb3VnaHB1dFxcXCIsIFt0XSksXFxuXFx0X3BmX3ZvbGlvcHNfZml4LCBfcGZfdm9saW9wc191cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUMyOjpWb2x1bWVcXFwiKVxcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVm9sdW1lVHlwZVxcXCIpID09IFxcXCJncDNcXFwiXFxuXFx0bm90IF9wZl92b2xpb3BzX2hhc19pb3BzKG5hbWUpXFxuXFx0dCA6PSB0b19udW1iZXIocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5UaHJvdWdocHV0XFxcIikpXFxuXFx0dCA+IDc1MFxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWVjcy1mYXJnYXRlLW5ldHdvcmstbW9kZVwiLFxuICAgIFwic2VydmljZVwiOiBcImVjc1wiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJGYXJnYXRlIHRhc2sgZGVmaW5pdGlvbnMgcmVxdWlyZSBOZXR3b3JrTW9kZSAnYXdzdnBjJ1wiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpFQ1M6OlRhc2tEZWZpbml0aW9uXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX2Vjc25tX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdGFza19kZWZpbml0aW9uX3BhcmFtZXRlcnMuaHRtbCNuZXR3b3JrX21vZGVcXFwiXFxuXFxuX3BmX2Vjc25tX2hhc19tb2RlKG5hbWUpIGlmIHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuTmV0d29ya01vZGVcXFwiKVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWNzLWZhcmdhdGUtbmV0d29yay1tb2RlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5OZXR3b3JrTW9kZVxcXCIsXFxuXFx0c3ByaW50ZihcXFwiTmV0d29ya01vZGUgaXMgJyVzJyBidXQgdGFzayBkZWZpbml0aW9ucyByZXF1aXJpbmcgRkFSR0FURSBjb21wYXRpYmlsaXR5IG11c3QgdXNlICdhd3N2cGMnOyBSZWdpc3RlclRhc2tEZWZpbml0aW9uIGZhaWxzIGF0IGRlcGxveSB0aW1lXFxcIiwgW25tXSksXFxuXFx0XFxcIlNldCBOZXR3b3JrTW9kZSB0byAnYXdzdnBjJ1xcXCIsXFxuXFx0X3BmX2Vjc25tX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFQ1M6OlRhc2tEZWZpbml0aW9uXFxcIilcXG5cXHRyYyA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlJlcXVpcmVzQ29tcGF0aWJpbGl0aWVzXFxcIilcXG5cXHRpc19hcnJheShyYylcXG5cXHRcXFwiRkFSR0FURVxcXCIgaW4gcmNcXG5cXHRubSA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLk5ldHdvcmtNb2RlXFxcIilcXG5cXHRpc19zdHJpbmcobm0pXFxuXFx0bm0gIT0gXFxcImF3c3ZwY1xcXCJcXG59XFxuXFxuIyBOZXR3b3JrTW9kZSDmnKrmjIflrprjgafjgoIgUmVnaXN0ZXJUYXNrRGVmaW5pdGlvbiDjga9cXG4jIFxcXCJGYXJnYXRlIG9ubHkgc3VwcG9ydHMgbmV0d29yayBtb2RlICdhd3N2cGMnLlxcXCIg44Gn5aSx5pWX44GZ44KL77yIMjAyNi0wOS0wMSDlrp8gQVBJIOeiuuiqje+8iVxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWNzLWZhcmdhdGUtbmV0d29yay1tb2RlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5OZXR3b3JrTW9kZVxcXCIsXFxuXFx0XFxcIk5ldHdvcmtNb2RlIGlzIG5vdCBzZXQsIGJ1dCB0YXNrIGRlZmluaXRpb25zIHJlcXVpcmluZyBGQVJHQVRFIGNvbXBhdGliaWxpdHkgbXVzdCBzZXQgaXQgdG8gJ2F3c3ZwYyc7IFJlZ2lzdGVyVGFza0RlZmluaXRpb24gZmFpbHMgYXQgZGVwbG95IHRpbWVcXFwiLFxcblxcdFxcXCJTZXQgTmV0d29ya01vZGUgdG8gJ2F3c3ZwYydcXFwiLFxcblxcdF9wZl9lY3NubV91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUNTOjpUYXNrRGVmaW5pdGlvblxcXCIpXFxuXFx0cmMgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5SZXF1aXJlc0NvbXBhdGliaWxpdGllc1xcXCIpXFxuXFx0aXNfYXJyYXkocmMpXFxuXFx0XFxcIkZBUkdBVEVcXFwiIGluIHJjXFxuXFx0bm90IF9wZl9lY3NubV9oYXNfbW9kZShuYW1lKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWVsYnYyLWxiLWlkbGUtdGltZW91dC1yYW5nZVwiLFxuICAgIFwic2VydmljZVwiOiBcImVsYnYyXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkFMQiBpZGxlX3RpbWVvdXQudGltZW91dF9zZWNvbmRzIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA0MDAwXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkVsYXN0aWNMb2FkQmFsYW5jaW5nVjI6OkxvYWRCYWxhbmNlclwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9pZGxlX3RpbWVvdXRfb3V0KG4pIGlmIG4gPCAxXFxuXFxuX3BmX2lkbGVfdGltZW91dF9vdXQobikgaWYgbiA+IDQwMDBcXG5cXG5fcGZfbm9uX2FsYihuYW1lKSBpZiB7XFxuXFx0dCA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlR5cGVcXFwiKVxcblxcdHQgIT0gXFxcImFwcGxpY2F0aW9uXFxcIlxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWVsYnYyLWxiLWlkbGUtdGltZW91dC1yYW5nZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5Mb2FkQmFsYW5jZXJBdHRyaWJ1dGVzLiVkLlZhbHVlXFxcIiwgW2l0ZW0uaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJpZGxlX3RpbWVvdXQudGltZW91dF9zZWNvbmRzIGlzICV2IGJ1dCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNDAwMCBzZWNvbmRzXFxcIiwgW251bV0pLFxcblxcdFxcXCJTZXQgaWRsZV90aW1lb3V0LnRpbWVvdXRfc2Vjb25kcyB0byBhIHZhbHVlIGJldHdlZW4gMSBhbmQgNDAwMFxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lbGFzdGljbG9hZGJhbGFuY2luZy9sYXRlc3QvYXBwbGljYXRpb24vYXBwbGljYXRpb24tbG9hZC1iYWxhbmNlcnMuaHRtbCNjb25uZWN0aW9uLWlkbGUtdGltZW91dFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6TG9hZEJhbGFuY2VyXFxcIilcXG5cXHRub3QgX3BmX25vbl9hbGIobmFtZSlcXG5cXHRzb21lIGl0ZW0gaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkxvYWRCYWxhbmNlckF0dHJpYnV0ZXNcXFwiKVxcblxcdGF0dHIgOj0gaXRlbS52YWx1ZVxcblxcdGlzX29iamVjdChhdHRyKVxcblxcdG9iamVjdC5nZXQoYXR0ciwgXFxcIktleVxcXCIsIFxcXCJcXFwiKSA9PSBcXFwiaWRsZV90aW1lb3V0LnRpbWVvdXRfc2Vjb25kc1xcXCJcXG5cXHRudW0gOj0gdG9fbnVtYmVyKG9iamVjdC5nZXQoYXR0ciwgXFxcIlZhbHVlXFxcIiwgbnVsbCkpXFxuXFx0X3BmX2lkbGVfdGltZW91dF9vdXQobnVtKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWVsYnYyLXRnLWRlcmVnaXN0cmF0aW9uLWRlbGF5LXJhbmdlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZWxidjJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiVGFyZ2V0IGdyb3VwIGRlcmVnaXN0cmF0aW9uX2RlbGF5LnRpbWVvdXRfc2Vjb25kcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMzYwMFwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpFbGFzdGljTG9hZEJhbGFuY2luZ1YyOjpUYXJnZXRHcm91cFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9kZXJlZ19kZWxheV9vdXQobikgaWYgbiA8IDBcXG5cXG5fcGZfZGVyZWdfZGVsYXlfb3V0KG4pIGlmIG4gPiAzNjAwXFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lbGJ2Mi10Zy1kZXJlZ2lzdHJhdGlvbi1kZWxheS1yYW5nZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5UYXJnZXRHcm91cEF0dHJpYnV0ZXMuJWQuVmFsdWVcXFwiLCBbaXRlbS5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcImRlcmVnaXN0cmF0aW9uX2RlbGF5LnRpbWVvdXRfc2Vjb25kcyBpcyAldiBidXQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDM2MDAgc2Vjb25kc1xcXCIsIFtudW1dKSxcXG5cXHRcXFwiU2V0IGRlcmVnaXN0cmF0aW9uX2RlbGF5LnRpbWVvdXRfc2Vjb25kcyB0byBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMzYwMFxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lbGFzdGljbG9hZGJhbGFuY2luZy9sYXRlc3QvYXBwbGljYXRpb24vZWRpdC10YXJnZXQtZ3JvdXAtYXR0cmlidXRlcy5odG1sI2RlcmVnaXN0cmF0aW9uLWRlbGF5XFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFbGFzdGljTG9hZEJhbGFuY2luZ1YyOjpUYXJnZXRHcm91cFxcXCIpXFxuXFx0c29tZSBpdGVtIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5UYXJnZXRHcm91cEF0dHJpYnV0ZXNcXFwiKVxcblxcdGF0dHIgOj0gaXRlbS52YWx1ZVxcblxcdGlzX29iamVjdChhdHRyKVxcblxcdG9iamVjdC5nZXQoYXR0ciwgXFxcIktleVxcXCIsIFxcXCJcXFwiKSA9PSBcXFwiZGVyZWdpc3RyYXRpb25fZGVsYXkudGltZW91dF9zZWNvbmRzXFxcIlxcblxcdG51bSA6PSB0b19udW1iZXIob2JqZWN0LmdldChhdHRyLCBcXFwiVmFsdWVcXFwiLCBudWxsKSlcXG5cXHRfcGZfZGVyZWdfZGVsYXlfb3V0KG51bSlcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1lbGJ2Mi10Zy1zbG93LXN0YXJ0LXJhbmdlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZWxidjJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiVGFyZ2V0IGdyb3VwIHNsb3dfc3RhcnQuZHVyYXRpb25fc2Vjb25kcyBtdXN0IGJlIDAgb3IgYmV0d2VlbiAzMCBhbmQgOTAwXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkVsYXN0aWNMb2FkQmFsYW5jaW5nVjI6OlRhcmdldEdyb3VwXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX3Nsb3dfc3RhcnRfb3V0KG4pIGlmIG4gPCAwXFxuXFxuX3BmX3Nsb3dfc3RhcnRfb3V0KG4pIGlmIHtcXG5cXHRuID4gMFxcblxcdG4gPCAzMFxcbn1cXG5cXG5fcGZfc2xvd19zdGFydF9vdXQobikgaWYgbiA+IDkwMFxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWxidjItdGctc2xvdy1zdGFydC1yYW5nZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5UYXJnZXRHcm91cEF0dHJpYnV0ZXMuJWQuVmFsdWVcXFwiLCBbaXRlbS5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcInNsb3dfc3RhcnQuZHVyYXRpb25fc2Vjb25kcyBpcyAldiBidXQgbXVzdCBiZSAwIChkaXNhYmxlZCkgb3IgYmV0d2VlbiAzMCBhbmQgOTAwIHNlY29uZHNcXFwiLCBbbnVtXSksXFxuXFx0XFxcIlNldCBzbG93X3N0YXJ0LmR1cmF0aW9uX3NlY29uZHMgdG8gMCBvciBhIHZhbHVlIGJldHdlZW4gMzAgYW5kIDkwMFxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lbGFzdGljbG9hZGJhbGFuY2luZy9sYXRlc3QvYXBwbGljYXRpb24vZWRpdC10YXJnZXQtZ3JvdXAtYXR0cmlidXRlcy5odG1sI3Nsb3ctc3RhcnQtbW9kZVxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6VGFyZ2V0R3JvdXBcXFwiKVxcblxcdHNvbWUgaXRlbSBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuVGFyZ2V0R3JvdXBBdHRyaWJ1dGVzXFxcIilcXG5cXHRhdHRyIDo9IGl0ZW0udmFsdWVcXG5cXHRpc19vYmplY3QoYXR0cilcXG5cXHRvYmplY3QuZ2V0KGF0dHIsIFxcXCJLZXlcXFwiLCBcXFwiXFxcIikgPT0gXFxcInNsb3dfc3RhcnQuZHVyYXRpb25fc2Vjb25kc1xcXCJcXG5cXHRudW0gOj0gdG9fbnVtYmVyKG9iamVjdC5nZXQoYXR0ciwgXFxcIlZhbHVlXFxcIiwgbnVsbCkpXFxuXFx0X3BmX3Nsb3dfc3RhcnRfb3V0KG51bSlcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1pYW0taW5saW5lLXBvbGljeS1zaXplXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiaWFtXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIklubGluZSBwb2xpY3kgZG9jdW1lbnRzIGFyZSBsaW1pdGVkIHBlciBpZGVudGl0eSAocm9sZSAxMDI0MCAvIGdyb3VwIDUxMjAgLyB1c2VyIDIwNDggY2hhcmFjdGVycylcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6SUFNOjpQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJQU06OlJvbGVQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJQU06OlVzZXJQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJQU06Okdyb3VwUG9saWN5XCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX2lubGluZV9wb2xpY3lfbGltaXRzIDo9IHtcXG5cXHRcXFwiQVdTOjpJQU06OlBvbGljeVxcXCI6IDEwMjQwLFxcblxcdFxcXCJBV1M6OklBTTo6Um9sZVBvbGljeVxcXCI6IDEwMjQwLFxcblxcdFxcXCJBV1M6OklBTTo6VXNlclBvbGljeVxcXCI6IDIwNDgsXFxuXFx0XFxcIkFXUzo6SUFNOjpHcm91cFBvbGljeVxcXCI6IDUxMjAsXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtaWFtLWlubGluZS1wb2xpY3ktc2l6ZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnRcXFwiLFxcblxcdHNwcmludGYoXFxcIlBvbGljeURvY3VtZW50IGlzICVkIGNoYXJhY3RlcnMgKEpTT04gd2l0aG91dCB3aGl0ZXNwYWNlKSBidXQgdGhlIGlubGluZSBwb2xpY3kgbGltaXQgZm9yICVzIGlzICVkIChyb2xlOiAxMDI0MCwgZ3JvdXA6IDUxMjAsIHVzZXI6IDIwNDgpXFxcIiwgW3NpemUsIHJ0eXBlLCBsaW1pdF0pLFxcblxcdFxcXCJNb3ZlIHN0YXRlbWVudHMgaW50byBtYW5hZ2VkIHBvbGljaWVzIG9yIHNob3J0ZW4gdGhlIGRvY3VtZW50XFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9pYW0tcXVvdGFzLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBydHlwZSwgbGltaXQgaW4gX3BmX2lubGluZV9wb2xpY3lfbGltaXRzXFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKHJ0eXBlKVxcblxcdGRvYyA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlBvbGljeURvY3VtZW50XFxcIilcXG5cXHRpc19vYmplY3QoZG9jKVxcblxcdHNpemUgOj0gY291bnQoanNvbi5tYXJzaGFsKGRvYykpXFxuXFx0c2l6ZSA+IGxpbWl0XFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtaWFtLW1hbmFnZWQtcG9saWN5LWNvdW50XCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiaWFtXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIk1hbmFnZWQgcG9saWNpZXMgcGVyIGlkZW50aXR5IGFyZSBjYXBwZWQgKGhhcmQgbWF4aW11bXMgcm9sZSAyNSAvIHVzZXIgMjAgLyBncm91cCAxMClcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6SUFNOjpSb2xlXCIsXG4gICAgICBcIkFXUzo6SUFNOjpVc2VyXCIsXG4gICAgICBcIkFXUzo6SUFNOjpHcm91cFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMg44OP44O844OJ5LiK6ZmQ77yIU2VydmljZSBRdW90YXMg44Gu44CMTWF4aW11bSBxdW90YeOAjT0g44Gd44KM5Lul5LiK5byV44GN5LiK44GS5LiN5Y+v6IO944Gq5YCk77yJOlxcbiMgICByb2xlIDI1IC8gdXNlciAyMCAvIGdyb3VwIDEw77yIZ3JvdXAg44GvIGFkanVzdGFibGU6IGZhbHNl44CB5a6f5ris44Gn44KC56K66KqN77yJ44CCXFxuIyDjg4fjg5Xjgqnjg6vjg4jvvIhyb2xlIDIwIC8gdXNlciAxMCAvIGdyb3VwIDEw77yJ6LaF44Gv44Ki44Kr44Km44Oz44OI44Gu44Kv44Kp44O844K/5byV44GN5LiK44GS5qyh56ys44GnXFxuIyDmiJDlip/jgZflvpfjgovjgZ/jgoEgRVJST1Ig44Gr44GX44Gq44GE77yIYmVuY2gg44Ki44Kr44Km44Oz44OI44GuIHJvbGU9MjAg44GnIDExIOWAi+aIkOWKn+OCkuWun+a4rOa4iOOBv++8ieOAglxcbl9wZl9pYW1wb2xfbGltaXRzIDo9IHtcXG5cXHRcXFwiQVdTOjpJQU06OlJvbGVcXFwiOiAyNSxcXG5cXHRcXFwiQVdTOjpJQU06OlVzZXJcXFwiOiAyMCxcXG5cXHRcXFwiQVdTOjpJQU06Okdyb3VwXFxcIjogMTAsXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtaWFtLW1hbmFnZWQtcG9saWN5LWNvdW50XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5NYW5hZ2VkUG9saWN5QXJuc1xcXCIsXFxuXFx0c3ByaW50ZihcXFwiJWQgbWFuYWdlZCBwb2xpY2llcyBhcmUgYXR0YWNoZWQsIGJ1dCB0aGUgaGFyZCBtYXhpbXVtIGZvciAlcyBpcyAlZCAocXVvdGEgZGVmYXVsdHM6IHJvbGUgMjAsIHVzZXIgMTAsIGdyb3VwIDEwOyByYWlzYWJsZSBvbmx5IHVwIHRvIHRoZSBoYXJkIG1heGltdW0pOyBkZXBsb3ltZW50IGZhaWxzIHdpdGggTGltaXRFeGNlZWRlZFxcXCIsIFtuLCBydHlwZSwgbGltaXRdKSxcXG5cXHRcXFwiQ29uc29saWRhdGUgc3RhdGVtZW50cyBpbnRvIGZld2VyIG1hbmFnZWQgcG9saWNpZXNcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX2lhbS1xdW90YXMuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIHJ0eXBlLCBsaW1pdCBpbiBfcGZfaWFtcG9sX2xpbWl0c1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShydHlwZSlcXG5cXHRhcnIgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5NYW5hZ2VkUG9saWN5QXJuc1xcXCIpXFxuXFx0aXNfYXJyYXkoYXJyKVxcblxcdG4gOj0gY291bnQoYXJyKVxcblxcdG4gPiBsaW1pdFxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWlhbS1tYW5hZ2VkLXBvbGljeS1zaXplXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiaWFtXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIk1hbmFnZWQgcG9saWN5IGRvY3VtZW50cyBhcmUgbGltaXRlZCB0byA2MTQ0IGNoYXJhY3RlcnMgKHdoaXRlc3BhY2UgZXhjbHVkZWQpXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OklBTTo6TWFuYWdlZFBvbGljeVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtaWFtLW1hbmFnZWQtcG9saWN5LXNpemVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLlBvbGljeURvY3VtZW50XFxcIixcXG5cXHRzcHJpbnRmKFxcXCJQb2xpY3lEb2N1bWVudCBpcyAlZCBjaGFyYWN0ZXJzIChKU09OIHdpdGhvdXQgd2hpdGVzcGFjZSkgYnV0IHRoZSBtYW5hZ2VkIHBvbGljeSBsaW1pdCBpcyA2MTQ0XFxcIiwgW3NpemVdKSxcXG5cXHRcXFwiU3BsaXQgdGhlIGRvY3VtZW50IGludG8gbXVsdGlwbGUgbWFuYWdlZCBwb2xpY2llcyBvciBzaG9ydGVuIGl0XFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9pYW0tcXVvdGFzLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OklBTTo6TWFuYWdlZFBvbGljeVxcXCIpXFxuXFx0ZG9jIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnRcXFwiKVxcblxcdGlzX29iamVjdChkb2MpXFxuXFx0c2l6ZSA6PSBjb3VudChqc29uLm1hcnNoYWwoZG9jKSlcXG5cXHRzaXplID4gNjE0NFxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWxhbWJkYS1lbnYtc2l6ZVwiLFxuICAgIFwic2VydmljZVwiOiBcImxhbWJkYVwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJMYW1iZGEgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBsaW1pdGVkIHRvIDQwOTYgYnl0ZXMgaW4gdG90YWxcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6TGFtYmRhOjpGdW5jdGlvblwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMg44Oq44OG44Op44Or5paH5a2X5YiX44Gu44Kt44O8L+WApOOBoOOBkeOCkuaVsOOBiOOCi++8iOODiOODvOOCr+ODs+OBr+OCueOCreODg+ODl++8ieOAguWQiOioiOOBjOaXouOBqyA0MDk2IOOCkui2heOBiOOBplxcbiMg44GE44KM44Gw44CB5a6f6Zqb44Gu44OH44OX44Ot44Kk44Gn44KC5b+F44Ga5aSx5pWX44GZ44KL77yI5a6f44K144Kk44K644Gv5o6o5a6a5Lul5LiK44Gr44GX44GL44Gq44KJ44Gq44GE77yJ44CCXFxuIyBOT1RFOiDjgZPjga7jgqjjg7Pjgrjjg7Pjga4gUmVnbyDjg5Hjg7zjgrXjga/lhoXljIXooajoqJjlhoXjga4gMiDlpInmlbAgc29tZe+8iHNvbWUgaywgdiBpbiB2YXJz77yJ44KSXFxuIyDlj5fjgZHku5jjgZHjgarjgYTjgZ/jgoHjgIFvYmplY3Qua2V5cyDntYznlLHjgafmm7jjgY/jgIJcXG5fcGZfbGVudl9zaXplKHZhcnMpIDo9IHN1bShbcyB8XFxuXFx0c29tZSBrIGluIG9iamVjdC5rZXlzKHZhcnMpXFxuXFx0aXNfc3RyaW5nKHZhcnNba10pXFxuXFx0cyA6PSBjb3VudChrKSArIGNvdW50KHZhcnNba10pXFxuXSlcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWxhbWJkYS1lbnYtc2l6ZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuRW52aXJvbm1lbnQuVmFyaWFibGVzXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG90YWwgYXQgbGVhc3QgJWQgYnl0ZXMgKGxpdGVyYWwga2V5cyBhbmQgdmFsdWVzKSwgYnV0IExhbWJkYSBsaW1pdHMgdGhlIGVudmlyb25tZW50IHRvIDQwOTYgYnl0ZXM7IENyZWF0ZUZ1bmN0aW9uIGZhaWxzIGF0IGRlcGxveSB0aW1lXFxcIiwgW3RvdGFsXSksXFxuXFx0XFxcIk1vdmUgbGFyZ2UgdmFsdWVzIHRvIFNTTSBQYXJhbWV0ZXIgU3RvcmUsIFNlY3JldHMgTWFuYWdlciwgb3IgYSBidW5kbGVkIGNvbmZpZyBmaWxlXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvZ2V0dGluZ3N0YXJ0ZWQtbGltaXRzLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkxhbWJkYTo6RnVuY3Rpb25cXFwiKVxcblxcdHZhcnMgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5FbnZpcm9ubWVudC5WYXJpYWJsZXNcXFwiKVxcblxcdGlzX29iamVjdCh2YXJzKVxcblxcdHRvdGFsIDo9IF9wZl9sZW52X3NpemUodmFycylcXG5cXHR0b3RhbCA+IDQwOTZcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1yb3V0ZTUzLWFsaWFzLWNsb3VkZnJvbnQtem9uZS1pZFwiLFxuICAgIFwic2VydmljZVwiOiBcInJvdXRlNTNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQSBDbG91ZEZyb250IGFsaWFzIHRhcmdldCBtdXN0IHVzZSBob3N0ZWQgem9uZSBaMkZEVE5EQVRBUVlXMlwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG4jIEV2ZXJ5IENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIGlzIGFsaWFzZWQgdGhyb3VnaCB0aGUgc2luZ2xlIGdsb2JhbCBob3N0ZWRcXG4jIHpvbmUgWjJGRFROREFUQVFZVzIuIEFueSBvdGhlciBBbGlhc1RhcmdldC5Ib3N0ZWRab25lSWQgKGFuIEFMQidzIHJlZ2lvbmFsXFxuIyB6b25lIGlkIGlzIHRoZSBjbGFzc2ljIHBhc3RlIGVycm9yKSBmYWlscyBhdCBkZXBsb3kgdGltZSB3aXRoIFxcXCJ0aGUgYWxpYXNcXG4jIHRhcmdldCBuYW1lIGRvZXMgbm90IGxpZSB3aXRoaW4gdGhlIHRhcmdldCB6b25lXFxcIi5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXJvdXRlNTMtYWxpYXMtY2xvdWRmcm9udC16b25lLWlkXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5BbGlhc1RhcmdldC5Ib3N0ZWRab25lSWRcXFwiLFxcblxcdHNwcmludGYoXFxcIlRoZSBhbGlhcyB0YXJnZXRzIGEgQ2xvdWRGcm9udCBkb21haW4sIHNvIEFsaWFzVGFyZ2V0Lkhvc3RlZFpvbmVJZCBtdXN0IGJlIFoyRkRUTkRBVEFRWVcyLCBub3QgJyVzJ1xcXCIsIFt6aWRdKSxcXG5cXHRcXFwiU2V0IEFsaWFzVGFyZ2V0Lkhvc3RlZFpvbmVJZCB0byBaMkZEVE5EQVRBUVlXMiAoaW4gdGhlIENESywgcm91dGU1M190YXJnZXRzLkNsb3VkRnJvbnRUYXJnZXQgZG9lcyB0aGlzKVxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nZW5lcmFsL2xhdGVzdC9nci9jZl9yZWdpb24uaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XFxcIilcXG5cXHRkbnMgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5BbGlhc1RhcmdldC5ETlNOYW1lXFxcIilcXG5cXHRpc19zdHJpbmcoZG5zKVxcblxcdGVuZHN3aXRoKHRyaW1fc3VmZml4KGxvd2VyKGRucyksIFxcXCIuXFxcIiksIFxcXCIuY2xvdWRmcm9udC5uZXRcXFwiKVxcblxcdHppZCA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkFsaWFzVGFyZ2V0Lkhvc3RlZFpvbmVJZFxcXCIpXFxuXFx0aXNfc3RyaW5nKHppZClcXG5cXHR6aWQgIT0gXFxcIloyRkRUTkRBVEFRWVcyXFxcIlxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXJvdXRlNTMtYXBleC1jbmFtZVwiLFxuICAgIFwic2VydmljZVwiOiBcInJvdXRlNTNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQSBDTkFNRSByZWNvcmQgaXMgbm90IHBlcm1pdHRlZCBhdCB0aGUgem9uZSBhcGV4XCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiLFxuICAgICAgXCJBV1M6OlJvdXRlNTM6Okhvc3RlZFpvbmVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfcjUzX2FwZXhfbm9ybShuKSA6PSB0cmltX3N1ZmZpeChsb3dlcihuKSwgXFxcIi5cXFwiKVxcblxcbiMgVGhlIGVuZ2luZSdzIEUzMDIzIGNhdGNoZXMgYW4gYXBleCBDTkFNRSBvbmx5IHdoZW4gdGhlIHJlY29yZCBjYXJyaWVzIGFcXG4jIGxpdGVyYWwgSG9zdGVkWm9uZU5hbWUuIENESyBMMiBhbHdheXMgbGlua3MgcmVjb3JkcyB3aXRoXFxuIyBIb3N0ZWRab25lSWQ6IHtcXFwiUmVmXFxcIjogPHpvbmU+fSwgd2hpY2ggRTMwMjMgZG9lcyBub3Qgc2VlIChtZWFzdXJlZCAyMDI2LTA5LTAyLFxcbiMgZW5naW5lIDEuNy4wLWJldGEpLiByZXNvbHZlKCkgdHVybnMgc3VjaCBhIFJlZiBpbnRvIHRoZSB0YXJnZXQncyBsb2dpY2FsIElELFxcbiMgc28gd2hlbiB0aGF0IElEIG5hbWVzIGEgSG9zdGVkWm9uZSBpbiB0aGUgc2FtZSB0ZW1wbGF0ZSB3ZSBjYW4gcmVhZCBpdHNcXG4jIGxpdGVyYWwgTmFtZSBhbmQgZG8gdGhlIGFwZXggY29tcGFyaXNvbiBvdXJzZWx2ZXMuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1yb3V0ZTUzLWFwZXgtY25hbWVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLlR5cGVcXFwiLFxcblxcdHNwcmludGYoXFxcIkEgQ05BTUUgcmVjb3JkIGlzIG5vdCBwZXJtaXR0ZWQgYXQgdGhlIHpvbmUgYXBleCAoJyVzJyk7IHRoZSBkZXBsb3ltZW50IGZhaWxzIHdpdGggXFxcXFxcXCJSUlNldCBvZiB0eXBlIENOQU1FIC4uLiBpcyBub3QgcGVybWl0dGVkIGF0IGFwZXhcXFxcXFxcIlxcXCIsIFtyZWNOYW1lXSksXFxuXFx0XFxcIlVzZSBhbiBhbGlhcyBBL0FBQUEgcmVjb3JkIGZvciB0aGUgYXBleCAoQWxpYXNUYXJnZXQpLCBvciBtb3ZlIHRoZSBDTkFNRSB0byBhIHN1YmRvbWFpblxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9Sb3V0ZTUzL2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9yZXNvdXJjZS1yZWNvcmQtc2V0cy1jaG9vc2luZy1hbGlhcy1ub24tYWxpYXMuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XFxcIilcXG5cXHRyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlR5cGVcXFwiKSA9PSBcXFwiQ05BTUVcXFwiXFxuXFx0enJlZiA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkhvc3RlZFpvbmVJZFxcXCIpXFxuXFx0aXNfc3RyaW5nKHpyZWYpXFxuXFx0enJlZiBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpIb3N0ZWRab25lXFxcIilcXG5cXHR6b25lTmFtZSA6PSByZXNvbHZlKHpyZWYsIFxcXCJQcm9wZXJ0aWVzLk5hbWVcXFwiKVxcblxcdGlzX3N0cmluZyh6b25lTmFtZSlcXG5cXHRyZWNOYW1lIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuTmFtZVxcXCIpXFxuXFx0aXNfc3RyaW5nKHJlY05hbWUpXFxuXFx0X3BmX3I1M19hcGV4X25vcm0ocmVjTmFtZSkgPT0gX3BmX3I1M19hcGV4X25vcm0oem9uZU5hbWUpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtcm91dGU1My1nZW9sb2NhdGlvbi1leGNsdXNpdmVcIixcbiAgICBcInNlcnZpY2VcIjogXCJyb3V0ZTUzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkdlb0xvY2F0aW9uIGNhbm5vdCBzcGVjaWZ5IGJvdGggQ29udGluZW50Q29kZSBhbmQgQ291bnRyeUNvZGVcIixcbiAgICBcInVwc3RyZWFtXCI6IFwicGVuZGluZy1lbmdpbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgVGhlIHJlZ2lzdHJ5IHNjaGVtYSBleHByZXNzZXMgdGhpcyBhcyBhIG9uZU9mLCB3aGljaCB0aGUgc2VydmVyLXNpZGVcXG4jIHByZS1kZXBsb3kgdmFsaWRhdGlvbiBlbmZvcmNlcyAoXFxcIjIgc3Vic2NoZW1hcyBtYXRjaGVkIGluc3RlYWQgb2Ygb25lXFxcIikgYnV0XFxuIyB0aGUgYnVuZGxlZCBlbmdpbmUgZG9lcyBub3QgZXZhbHVhdGUg4oCUIGhlbmNlIHVwc3RyZWFtOiBwZW5kaW5nLWVuZ2luZS5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXJvdXRlNTMtZ2VvbG9jYXRpb24tZXhjbHVzaXZlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5HZW9Mb2NhdGlvblxcXCIsXFxuXFx0XFxcIkdlb0xvY2F0aW9uIGNhbm5vdCBzcGVjaWZ5IGJvdGggQ29udGluZW50Q29kZSBhbmQgQ291bnRyeUNvZGU7IENsb3VkRm9ybWF0aW9uIHJlamVjdHMgdGhlIHJlY29yZCBzZXQgYmVmb3JlIHByb3Zpc2lvbmluZ1xcXCIsXFxuXFx0XFxcIktlZXAgZWl0aGVyIHRoZSBDb250aW5lbnRDb2RlIG9yIHRoZSBDb3VudHJ5Q29kZSAoYWRkIFN1YmRpdmlzaW9uQ29kZSBvbmx5IG5leHQgdG8gQ291bnRyeUNvZGUgVVMpXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcHJvcGVydGllcy1yb3V0ZTUzLXJlY29yZHNldC1nZW9sb2NhdGlvbi5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcXFwiKVxcblxcdGdlbyA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkdlb0xvY2F0aW9uXFxcIilcXG5cXHRpc19vYmplY3QoZ2VvKVxcblxcdGlzX3N0cmluZyhvYmplY3QuZ2V0KGdlbywgXFxcIkNvbnRpbmVudENvZGVcXFwiLCBudWxsKSlcXG5cXHRpc19zdHJpbmcob2JqZWN0LmdldChnZW8sIFxcXCJDb3VudHJ5Q29kZVxcXCIsIG51bGwpKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXJvdXRlNTMtbXVsdGl2YWx1ZS1hbGlhc1wiLFxuICAgIFwic2VydmljZVwiOiBcInJvdXRlNTNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiTXVsdGlWYWx1ZUFuc3dlciBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBBbGlhc1RhcmdldFwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXJvdXRlNTMtbXVsdGl2YWx1ZS1hbGlhc1xcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuTXVsdGlWYWx1ZUFuc3dlclxcXCIsXFxuXFx0XFxcIk11bHRpVmFsdWVBbnN3ZXIgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggQWxpYXNUYXJnZXQ7IHRoZSBzZXJ2aWNlIHJlamVjdHMgaXQgd2l0aCBcXFxcXFxcIk11bHRpdmFsdWUgYW5zd2VyIHJyc2V0IHNob3VsZCBub3QgYmUgYW4gYWxpYXMgcnJzZXRcXFxcXFxcIlxcXCIsXFxuXFx0XFxcIlVzZSBwbGFpbiBtdWx0aXZhbHVlIHJlY29yZHMgd2l0aCBSZXNvdXJjZVJlY29yZHMsIG9yIGRyb3AgTXVsdGlWYWx1ZUFuc3dlciBhbmQga2VlcCB0aGUgYWxpYXNcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1yZXNvdXJjZS1yb3V0ZTUzLXJlY29yZHNldC5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcXFwiKVxcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuTXVsdGlWYWx1ZUFuc3dlclxcXCIpID09IHRydWVcXG5cXHRpc19vYmplY3QocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5BbGlhc1RhcmdldFxcXCIpKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXJvdXRlNTMtcmVjb3JkLXR5cGUtcm91dGluZy1wb2xpY3lcIixcbiAgICBcInNlcnZpY2VcIjogXCJyb3V0ZTUzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIk5TIHJlY29yZHMgdGFrZSBubyByb3V0aW5nIHBvbGljeTsgQ05BTUUgY2Fubm90IGJlIG11bHRpdmFsdWVcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX3I1M190eXBvbF91cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXJlc291cmNlLXJvdXRlNTMtcmVjb3Jkc2V0Lmh0bWxcXFwiXFxuXFxuX3BmX3I1M190eXBvbF9wcm9wcyA6PSBbXFxcIldlaWdodFxcXCIsIFxcXCJSZWdpb25cXFwiLCBcXFwiRmFpbG92ZXJcXFwiLCBcXFwiR2VvTG9jYXRpb25cXFwiLCBcXFwiQ2lkclJvdXRpbmdDb25maWdcXFwiXVxcblxcbl9wZl9yNTNfdHlwb2xfaGFzX3BvbGljeShuYW1lKSBpZiB7XFxuXFx0c29tZSBwIGluIF9wZl9yNTNfdHlwb2xfcHJvcHNcXG5cXHRyZXNvbHZlKG5hbWUsIHNwcmludGYoXFxcIlByb3BlcnRpZXMuJXNcXFwiLCBbcF0pKSAhPSBudWxsXFxufVxcblxcbl9wZl9yNTNfdHlwb2xfaGFzX3BvbGljeShuYW1lKSBpZiB7XFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5NdWx0aVZhbHVlQW5zd2VyXFxcIikgPT0gdHJ1ZVxcbn1cXG5cXG4jIE9ubHkgY29tYmluYXRpb25zIHRoYXQgZmFpbGVkIG9uIGEgcmVhbCBkZXBsb3kgYXJlIGZsYWdnZWQuIFNPQS9EUyB3aXRoIGFcXG4jIHJvdXRpbmcgcG9saWN5IGFyZSBhbHNvIGRvY3VtZW50ZWQgYXMgdW5zdXBwb3J0ZWQgYnV0IHdlcmUgbm90IG1lYXN1cmVkLCBzb1xcbiMgdGhleSBhcmUgZGVsaWJlcmF0ZWx5IGxlZnQgb3V0IChzZWUgdGhlIGRpc2NvdmVyeSBpc3N1ZSkuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1yb3V0ZTUzLXJlY29yZC10eXBlLXJvdXRpbmctcG9saWN5XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5UeXBlXFxcIixcXG5cXHRcXFwiQW4gTlMgcmVjb3JkIGNhbm5vdCB1c2UgYSByb3V0aW5nIHBvbGljeTsgdGhlIHNlcnZpY2UgcmVqZWN0cyBpdCB3aXRoIFxcXFxcXFwidGhpcyB0eXBlIG9mIFJSU2V0IGlzIG5vdCBzdXBwb3J0ZWRcXFxcXFxcIlxcXCIsXFxuXFx0XFxcIlVzZSBhIHNpbXBsZSByZWNvcmQgc2V0IGZvciBOUyByZWNvcmRzIChubyBXZWlnaHQvUmVnaW9uL0ZhaWxvdmVyL0dlb0xvY2F0aW9uL011bHRpVmFsdWVBbnN3ZXIvQ2lkclJvdXRpbmdDb25maWcpXFxcIixcXG5cXHRfcGZfcjUzX3R5cG9sX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcXFwiKVxcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVHlwZVxcXCIpID09IFxcXCJOU1xcXCJcXG5cXHRfcGZfcjUzX3R5cG9sX2hhc19wb2xpY3kobmFtZSlcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1yb3V0ZTUzLXJlY29yZC10eXBlLXJvdXRpbmctcG9saWN5XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5UeXBlXFxcIixcXG5cXHRcXFwiQSBDTkFNRSByZWNvcmQgY2Fubm90IHVzZSB0aGUgbXVsdGl2YWx1ZSBhbnN3ZXIgcm91dGluZyBwb2xpY3k7IHRoZSBzZXJ2aWNlIHJlamVjdHMgaXQgd2l0aCBcXFxcXFxcInRoaXMgdHlwZSBvZiBSUlNldCBpcyBub3Qgc3VwcG9ydGVkXFxcXFxcXCJcXFwiLFxcblxcdFxcXCJQb2ludCB0aGUgbXVsdGl2YWx1ZSByZWNvcmRzIGF0IEEvQUFBQSAob3IgYW5vdGhlciBzdXBwb3J0ZWQgdHlwZSksIG9yIGRyb3AgTXVsdGlWYWx1ZUFuc3dlclxcXCIsXFxuXFx0X3BmX3I1M190eXBvbF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XFxcIilcXG5cXHRyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlR5cGVcXFwiKSA9PSBcXFwiQ05BTUVcXFwiXFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5NdWx0aVZhbHVlQW5zd2VyXFxcIikgPT0gdHJ1ZVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXJvdXRlNTMtcmVjb3JkLXZhbHVlLXNvdXJjZVwiLFxuICAgIFwic2VydmljZVwiOiBcInJvdXRlNTNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQSByZWNvcmQgc2V0IG5lZWRzIEFsaWFzVGFyZ2V0IG9yIHRoZSBmdWxsIFRUTCtSZXNvdXJjZVJlY29yZHMgcGFpclwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfcjUzX3ZhbHNyY191cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXJlc291cmNlLXJvdXRlNTMtcmVjb3Jkc2V0Lmh0bWxcXFwiXFxuXFxuIyBUaGUgc2VydmljZSBleHBlY3RzIFxcXCJleGFjdGx5IG9uZSBvZiBbQWxpYXNUYXJnZXQsIGFsbCBvZiBbVFRMLCBhbmRcXG4jIFJlc291cmNlUmVjb3Jkc11dXFxcIiAoVHJhZmZpY1BvbGljeUluc3RhbmNlSWQgaGFzIG5vIENsb3VkRm9ybWF0aW9uIHByb3BlcnR5KS5cXG4jIFRoZSBUVEwrQWxpYXNUYXJnZXQgY29tYmluYXRpb24gaXMgYWxyZWFkeSB0aGUgZW5naW5lJ3MgRTMwMjksIHNvIHRoaXMgcnVsZVxcbiMgY292ZXJzIHRoZSByZW1haW5pbmcgc2hhcGVzOiBhbGlhcyBwbHVzIHJlY29yZHMsIGFuZCBhbiBpbmNvbXBsZXRlIG5vbi1hbGlhc1xcbiMgZ3JvdXAgKHJlY29yZHMgd2l0aG91dCBUVEwsIFRUTCB3aXRob3V0IHJlY29yZHMsIG9yIG5laXRoZXIpLlxcbl9wZl9yNTNfdmFsc3JjX2hhc19hbGlhcyhuYW1lKSBpZiBpc19vYmplY3QocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5BbGlhc1RhcmdldFxcXCIpKVxcblxcbl9wZl9yNTNfdmFsc3JjX2hhc19ycihuYW1lKSBpZiB7XFxuXFx0c29tZSBfIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5SZXNvdXJjZVJlY29yZHNcXFwiKVxcbn1cXG5cXG5fcGZfcjUzX3ZhbHNyY19oYXNfdHRsKG5hbWUpIGlmIHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVFRMXFxcIikgIT0gbnVsbFxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtcm91dGU1My1yZWNvcmQtdmFsdWUtc291cmNlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5SZXNvdXJjZVJlY29yZHNcXFwiLFxcblxcdFxcXCJBbGlhc1RhcmdldCBhbmQgUmVzb3VyY2VSZWNvcmRzIGFyZSBtdXR1YWxseSBleGNsdXNpdmU7IHRoZSBzZXJ2aWNlIGV4cGVjdHMgZXhhY3RseSBvbmUgb2YgQWxpYXNUYXJnZXQgb3IgVFRMLXBsdXMtUmVzb3VyY2VSZWNvcmRzXFxcIixcXG5cXHRcXFwiS2VlcCB0aGUgQWxpYXNUYXJnZXQgYW5kIGRyb3AgUmVzb3VyY2VSZWNvcmRzLCBvciBtYWtlIGl0IGEgcGxhaW4gcmVjb3JkIHdpdGggVFRMIGFuZCBSZXNvdXJjZVJlY29yZHNcXFwiLFxcblxcdF9wZl9yNTNfdmFsc3JjX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcXFwiKVxcblxcdF9wZl9yNTNfdmFsc3JjX2hhc19hbGlhcyhuYW1lKVxcblxcdF9wZl9yNTNfdmFsc3JjX2hhc19ycihuYW1lKVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXJvdXRlNTMtcmVjb3JkLXZhbHVlLXNvdXJjZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXNcXFwiLFxcblxcdFxcXCJBIG5vbi1hbGlhcyByZWNvcmQgc2V0IG5lZWRzIGJvdGggVFRMIGFuZCBSZXNvdXJjZVJlY29yZHM7IHRoZSBzZXJ2aWNlIHJlamVjdHMgYW4gaW5jb21wbGV0ZSBwYWlyIHdpdGggXFxcXFxcXCJFeHBlY3RlZCBleGFjdGx5IG9uZSBvZiBbQWxpYXNUYXJnZXQsIGFsbCBvZiBbVFRMLCBhbmQgUmVzb3VyY2VSZWNvcmRzXV0gLi4uIGZvdW5kIG5vbmVcXFxcXFxcIlxcXCIsXFxuXFx0XFxcIlNwZWNpZnkgVFRMIGFuZCBSZXNvdXJjZVJlY29yZHMgdG9nZXRoZXIsIG9yIHVzZSBBbGlhc1RhcmdldCBpbnN0ZWFkXFxcIixcXG5cXHRfcGZfcjUzX3ZhbHNyY191cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XFxcIilcXG5cXHRub3QgX3BmX3I1M192YWxzcmNfaGFzX2FsaWFzKG5hbWUpXFxuXFx0bm90IF9wZl9yNTNfdmFsc3JjX2NvbXBsZXRlKG5hbWUpXFxufVxcblxcbl9wZl9yNTNfdmFsc3JjX2NvbXBsZXRlKG5hbWUpIGlmIHtcXG5cXHRfcGZfcjUzX3ZhbHNyY19oYXNfcnIobmFtZSlcXG5cXHRfcGZfcjUzX3ZhbHNyY19oYXNfdHRsKG5hbWUpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtcm91dGU1My1yb3V0aW5nLXBvbGljeS1leGNsdXNpdmVcIixcbiAgICBcInNlcnZpY2VcIjogXCJyb3V0ZTUzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkEgcmVjb3JkIHNldCBjYW4gdXNlIG9ubHkgb25lIHJvdXRpbmcgcG9saWN5XCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgVGhlIHNlcnZpY2UgZW5mb3JjZXMgXFxcIkV4cGVjdGVkIGV4YWN0bHkgb25lIG9mIFtXZWlnaHQsIFJlZ2lvbiwgRmFpbG92ZXIsXFxuIyBHZW9Mb2NhdGlvbiwgTXVsdGlWYWx1ZUFuc3dlciwgR2VvUHJveGltaXR5TG9jYXRpb24sIG9yIENpZHJSb3V0aW5nQ29uZmlnXVxcXCIuXFxuIyBHZW9Qcm94aW1pdHlMb2NhdGlvbiBpcyBub3QgYSBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0eSwgc28gZml2ZSByZW1haW4gaGVyZS5cXG4jIE11bHRpVmFsdWVBbnN3ZXI6IGZhbHNlIGlzIHRyZWF0ZWQgYXMgYWJzZW50IOKAlCBvbmx5IHRydWUgc2VsZWN0cyB0aGUgcG9saWN5Llxcbl9wZl9yNTNfcG9seF9wcm9wcyA6PSBbXFxcIldlaWdodFxcXCIsIFxcXCJSZWdpb25cXFwiLCBcXFwiRmFpbG92ZXJcXFwiLCBcXFwiR2VvTG9jYXRpb25cXFwiLCBcXFwiQ2lkclJvdXRpbmdDb25maWdcXFwiXVxcblxcbl9wZl9yNTNfcG9seF9wcmVzZW50KG5hbWUsIHByb3ApIGlmIHtcXG5cXHRwcm9wICE9IFxcXCJNdWx0aVZhbHVlQW5zd2VyXFxcIlxcblxcdHJlc29sdmUobmFtZSwgc3ByaW50ZihcXFwiUHJvcGVydGllcy4lc1xcXCIsIFtwcm9wXSkpICE9IG51bGxcXG59XFxuXFxuX3BmX3I1M19wb2x4X3ByZXNlbnQobmFtZSwgXFxcIk11bHRpVmFsdWVBbnN3ZXJcXFwiKSBpZiB7XFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5NdWx0aVZhbHVlQW5zd2VyXFxcIikgPT0gdHJ1ZVxcbn1cXG5cXG5fcGZfcjUzX3BvbHhfcG9saWNpZXMobmFtZSkgOj0gcHMgaWYge1xcblxcdHBzIDo9IFtwIHwgc29tZSBwIGluIGFycmF5LmNvbmNhdChfcGZfcjUzX3BvbHhfcHJvcHMsIFtcXFwiTXVsdGlWYWx1ZUFuc3dlclxcXCJdKTsgX3BmX3I1M19wb2x4X3ByZXNlbnQobmFtZSwgcCldXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtcm91dGU1My1yb3V0aW5nLXBvbGljeS1leGNsdXNpdmVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJBIHJlY29yZCBzZXQgY2FuIHVzZSBvbmx5IG9uZSByb3V0aW5nIHBvbGljeSwgYnV0ICV2IGFyZSBhbGwgc3BlY2lmaWVkXFxcIiwgW3BzXSksXFxuXFx0XFxcIktlZXAgZXhhY3RseSBvbmUgb2YgV2VpZ2h0LCBSZWdpb24sIEZhaWxvdmVyLCBHZW9Mb2NhdGlvbiwgTXVsdGlWYWx1ZUFuc3dlciwgb3IgQ2lkclJvdXRpbmdDb25maWcgYW5kIHNwbGl0IHRoZSByZXN0IGludG8gc2VwYXJhdGUgcmVjb3JkIHNldHNcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1yZXNvdXJjZS1yb3V0ZTUzLXJlY29yZHNldC5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcXFwiKVxcblxcdHBzIDo9IF9wZl9yNTNfcG9seF9wb2xpY2llcyhuYW1lKVxcblxcdGNvdW50KHBzKSA+IDFcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1yb3V0ZTUzLXNldC1pZGVudGlmaWVyLXBhaXJpbmdcIixcbiAgICBcInNlcnZpY2VcIjogXCJyb3V0ZTUzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIlNldElkZW50aWZpZXIgYW5kIGEgcm91dGluZyBwb2xpY3kgbXVzdCBhcHBlYXIgdG9nZXRoZXJcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX3I1M19zaWRwX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcmVzb3VyY2Utcm91dGU1My1yZWNvcmRzZXQuaHRtbFxcXCJcXG5cXG5fcGZfcjUzX3NpZHBfcHJvcHMgOj0gW1xcXCJXZWlnaHRcXFwiLCBcXFwiUmVnaW9uXFxcIiwgXFxcIkZhaWxvdmVyXFxcIiwgXFxcIkdlb0xvY2F0aW9uXFxcIiwgXFxcIkNpZHJSb3V0aW5nQ29uZmlnXFxcIl1cXG5cXG5fcGZfcjUzX3NpZHBfaGFzX3BvbGljeShuYW1lKSBpZiB7XFxuXFx0c29tZSBwIGluIF9wZl9yNTNfc2lkcF9wcm9wc1xcblxcdHJlc29sdmUobmFtZSwgc3ByaW50ZihcXFwiUHJvcGVydGllcy4lc1xcXCIsIFtwXSkpICE9IG51bGxcXG59XFxuXFxuX3BmX3I1M19zaWRwX2hhc19wb2xpY3kobmFtZSkgaWYge1xcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuTXVsdGlWYWx1ZUFuc3dlclxcXCIpID09IHRydWVcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1yb3V0ZTUzLXNldC1pZGVudGlmaWVyLXBhaXJpbmdcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLlNldElkZW50aWZpZXJcXFwiLFxcblxcdFxcXCJBIHJvdXRpbmcgcG9saWN5IGlzIGNvbmZpZ3VyZWQgYnV0IFNldElkZW50aWZpZXIgaXMgbWlzc2luZzsgdGhlIENoYW5nZVJlc291cmNlUmVjb3JkU2V0cyBjYWxsIGZhaWxzIHdpdGggXFxcXFxcXCJNaXNzaW5nIGZpZWxkICdTZXRJZGVudGlmaWVyJ1xcXFxcXFwiXFxcIixcXG5cXHRcXFwiQWRkIGEgU2V0SWRlbnRpZmllciB0aGF0IGlzIHVuaXF1ZSBhbW9uZyB0aGUgcmVjb3JkIHNldHMgc2hhcmluZyB0aGlzIE5hbWUgYW5kIFR5cGVcXFwiLFxcblxcdF9wZl9yNTNfc2lkcF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XFxcIilcXG5cXHRfcGZfcjUzX3NpZHBfaGFzX3BvbGljeShuYW1lKVxcblxcdG5vdCBpc19zdHJpbmcocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5TZXRJZGVudGlmaWVyXFxcIikpXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtcm91dGU1My1zZXQtaWRlbnRpZmllci1wYWlyaW5nXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5TZXRJZGVudGlmaWVyXFxcIixcXG5cXHRcXFwiU2V0SWRlbnRpZmllciBpcyBzcGVjaWZpZWQgYnV0IG5vIHJvdXRpbmcgcG9saWN5IGlzOyB0aGUgc2VydmljZSBleHBlY3RzIGV4YWN0bHkgb25lIG9mIFdlaWdodCwgUmVnaW9uLCBGYWlsb3ZlciwgR2VvTG9jYXRpb24sIE11bHRpVmFsdWVBbnN3ZXIsIG9yIENpZHJSb3V0aW5nQ29uZmlnIGFuZCBmaW5kcyBub25lXFxcIixcXG5cXHRcXFwiUmVtb3ZlIFNldElkZW50aWZpZXIgZnJvbSB0aGlzIHNpbXBsZSByZWNvcmQgc2V0LCBvciBhZGQgdGhlIHJvdXRpbmcgcG9saWN5IGl0IHdhcyBtZWFudCBmb3JcXFwiLFxcblxcdF9wZl9yNTNfc2lkcF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XFxcIilcXG5cXHRpc19zdHJpbmcocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5TZXRJZGVudGlmaWVyXFxcIikpXFxuXFx0bm90IF9wZl9yNTNfc2lkcF9oYXNfcG9saWN5KG5hbWUpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtcm91dGU1My10dGwtcmFuZ2VcIixcbiAgICBcInNlcnZpY2VcIjogXCJyb3V0ZTUzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIlRUTCBtdXN0IGZpdCBpbiAzMiBiaXRzICgwLi4yMTQ3NDgzNjQ3IHNlY29uZHMpXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcInBlbmRpbmctZW5naW5lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG4jIE9ubHkgdGhlIG1lYXN1cmVkIGJvdW5kIGlzIGVuZm9yY2VkOiB0aGUgc2VydmljZSByZWplY3RlZCA5OTk5OTk5OTk5IHdpdGhcXG4jIFxcXCJNZW1iZXIgbXVzdCBoYXZlIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyMTQ3NDgzNjQ3XFxcIi4gTmVnYXRpdmUgVFRMcyBhcmVcXG4jIHVudGVzdGVkLCBzbyB0aGV5IGFyZSBkZWxpYmVyYXRlbHkgbm90IGZsYWdnZWQuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1yb3V0ZTUzLXR0bC1yYW5nZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuVFRMXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJUVEwgbXVzdCBiZSBhdCBtb3N0IDIxNDc0ODM2NDcgc2Vjb25kcywgZ290ICV2XFxcIiwgW25dKSxcXG5cXHRcXFwiU2V0IFRUTCB0byBhIDMyLWJpdCB2YWx1ZTsgYW55dGhpbmcgYWJvdmUgYSBkYXkgcmFyZWx5IGhlbHBzIGNhY2hpbmcgYW55d2F5XFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL1JvdXRlNTMvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ2hhbmdlUmVzb3VyY2VSZWNvcmRTZXRzLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFxcXCIpXFxuXFx0dCA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlRUTFxcXCIpXFxuXFx0biA6PSB0b19udW1iZXIodClcXG5cXHRuID4gMjE0NzQ4MzY0N1xcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXJvdXRlNTMtd2VpZ2h0LXJhbmdlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwicm91dGU1M1wiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJXZWlnaHQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJwZW5kaW5nLWVuZ2luZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuIyBPbmx5IHRoZSBtZWFzdXJlZCBib3VuZCBpcyBlbmZvcmNlZDogdGhlIHNlcnZpY2UgcmVqZWN0ZWQgMzAwIHdpdGggXFxcIk1lbWJlclxcbiMgbXVzdCBoYXZlIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyNTVcXFwiLiBOZWdhdGl2ZSB3ZWlnaHRzIGFyZSB1bnRlc3RlZCxcXG4jIHNvIHRoZXkgYXJlIGRlbGliZXJhdGVseSBub3QgZmxhZ2dlZC5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXJvdXRlNTMtd2VpZ2h0LXJhbmdlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5XZWlnaHRcXFwiLFxcblxcdHNwcmludGYoXFxcIldlaWdodCBtdXN0IGJlIGF0IG1vc3QgMjU1LCBnb3QgJXZcXFwiLCBbbl0pLFxcblxcdFxcXCJTZXQgV2VpZ2h0IHRvIGEgdmFsdWUgaW4gWzAsIDI1NV07IHdlaWdodHMgYXJlIHJlbGF0aXZlLCBzbyBzY2FsZSB0aGUgZ3JvdXAgZG93biBwcm9wb3J0aW9uYWxseVxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9Sb3V0ZTUzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NoYW5nZVJlc291cmNlUmVjb3JkU2V0cy5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcXFwiKVxcblxcdHcgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5XZWlnaHRcXFwiKVxcblxcdG4gOj0gdG9fbnVtYmVyKHcpXFxuXFx0biA+IDI1NVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXJvdXRlNTMtem9uZW5hbWUtdHJhaWxpbmctZG90XCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwicm91dGU1M1wiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJIb3N0ZWRab25lTmFtZSBtdXN0IGVuZCB3aXRoIGEgdHJhaWxpbmcgZG90XCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgQ2xvdWRGb3JtYXRpb24gbG9va3MgdGhlIHpvbmUgdXAgYnkgdGhlIGxpdGVyYWwgSG9zdGVkWm9uZU5hbWUgYW5kIGRvZXMgbm90XFxuIyBub3JtYWxpemUgdGhlIHRyYWlsaW5nIGRvdDogdGhlIHNhbWUgc3RhY2sgZGVwbG95ZWQgY2xlYW4gd2l0aFxcbiMgXFxcInpvbmUuZXhhbXBsZS5cXFwiIGFuZCBmYWlsZWQgd2l0aCBOb3RGb3VuZCBmb3IgXFxcInpvbmUuZXhhbXBsZVxcXCIgKDIwMjYtMDktMDIpLlxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtcm91dGU1My16b25lbmFtZS10cmFpbGluZy1kb3RcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLkhvc3RlZFpvbmVOYW1lXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJIb3N0ZWRab25lTmFtZSAnJXMnIGlzIG1pc3NpbmcgdGhlIHRyYWlsaW5nIGRvdCwgc28gQ2xvdWRGb3JtYXRpb24gZmFpbHMgdGhlIGxvb2t1cCB3aXRoIFxcXFxcXFwiTm8gaG9zdGVkIHpvbmUgd2l0aCBuYW1lIC4uLiBmb3VuZFxcXFxcXFwiXFxcIiwgW3puXSksXFxuXFx0c3ByaW50ZihcXFwiVXNlICclcy4nICh3aXRoIHRoZSB0cmFpbGluZyBkb3QpXFxcIiwgW3puXSksXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXJlc291cmNlLXJvdXRlNTMtcmVjb3Jkc2V0Lmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFxcXCIpXFxuXFx0em4gOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Ib3N0ZWRab25lTmFtZVxcXCIpXFxuXFx0aXNfc3RyaW5nKHpuKVxcblxcdHpuICE9IFxcXCJcXFwiXFxuXFx0bm90IGVuZHN3aXRoKHpuLCBcXFwiLlxcXCIpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtczMtbGlmZWN5Y2xlLWRheXMtb3JkZXJcIixcbiAgICBcInNlcnZpY2VcIjogXCJzM1wiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJMaWZlY3ljbGUgYXJjaGl2ZSB0cmFuc2l0aW9ucyBtdXN0IGNvbWUgMzArIGRheXMgYWZ0ZXIgSUEsIGFuZCBleHBpcmF0aW9uIGFmdGVyIGV2ZXJ5IHRyYW5zaXRpb25cIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6UzM6OkJ1Y2tldFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9zM29yZF9maXggOj0gXFxcIk9yZGVyIHRoZSBsaWZlY3ljbGUgZGF5cyBzbyBhcmNoaXZlIHRyYW5zaXRpb25zIGNvbWUgYXQgbGVhc3QgMzAgZGF5cyBhZnRlciBJQSB0cmFuc2l0aW9ucyBhbmQgZXhwaXJhdGlvbiBjb21lcyBhZnRlciBldmVyeSB0cmFuc2l0aW9uXFxcIlxcblxcbl9wZl9zM29yZF91cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL2xpZmVjeWNsZS10cmFuc2l0aW9uLWdlbmVyYWwtY29uc2lkZXJhdGlvbnMuaHRtbFxcXCJcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXMzLWxpZmVjeWNsZS1kYXlzLW9yZGVyXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkxpZmVjeWNsZUNvbmZpZ3VyYXRpb24uUnVsZXMuJWQuVHJhbnNpdGlvbnNcXFwiLCBbci5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcIlRyYW5zaXRpb24gdG8gJXMgYXQgJXYgZGF5cyBpcyBsZXNzIHRoYW4gMzAgZGF5cyBhZnRlciB0aGUgJXMgdHJhbnNpdGlvbiBhdCAldiBkYXlzOyBTMyByZXF1aXJlcyBvYmplY3RzIHRvIHN0YXkgYXQgbGVhc3QgMzAgZGF5cyBpbiBJQSBzdG9yYWdlXFxcIiwgW3NjMiwgZDIsIHNjMSwgZDFdKSxcXG5cXHRfcGZfczNvcmRfZml4LCBfcGZfczNvcmRfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlMzOjpCdWNrZXRcXFwiKVxcblxcdHNvbWUgciBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuTGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5SdWxlc1xcXCIpXFxuXFx0aXNfb2JqZWN0KHIudmFsdWUpXFxuXFx0dHJhbnMgOj0gb2JqZWN0LmdldChyLnZhbHVlLCBcXFwiVHJhbnNpdGlvbnNcXFwiLCBbXSlcXG5cXHRpc19hcnJheSh0cmFucylcXG5cXHRzb21lIHQxIGluIHRyYW5zXFxuXFx0aXNfb2JqZWN0KHQxKVxcblxcdHNjMSA6PSBvYmplY3QuZ2V0KHQxLCBcXFwiU3RvcmFnZUNsYXNzXFxcIiwgXFxcIlxcXCIpXFxuXFx0c2MxIGluIHtcXFwiU1RBTkRBUkRfSUFcXFwiLCBcXFwiT05FWk9ORV9JQVxcXCJ9XFxuXFx0cmF3MSA6PSBvYmplY3QuZ2V0KHQxLCBcXFwiVHJhbnNpdGlvbkluRGF5c1xcXCIsIG51bGwpXFxuXFx0cmF3MSAhPSBudWxsICMgdG9fbnVtYmVyKG51bGwpIOOBryAwIOOBq+OBquOCi1xcblxcdGQxIDo9IHRvX251bWJlcihyYXcxKVxcblxcdHNvbWUgdDIgaW4gdHJhbnNcXG5cXHRpc19vYmplY3QodDIpXFxuXFx0c2MyIDo9IG9iamVjdC5nZXQodDIsIFxcXCJTdG9yYWdlQ2xhc3NcXFwiLCBcXFwiXFxcIilcXG5cXHRzYzIgaW4ge1xcXCJHTEFDSUVSXFxcIiwgXFxcIkRFRVBfQVJDSElWRVxcXCJ9XFxuXFx0cmF3MiA6PSBvYmplY3QuZ2V0KHQyLCBcXFwiVHJhbnNpdGlvbkluRGF5c1xcXCIsIG51bGwpXFxuXFx0cmF3MiAhPSBudWxsXFxuXFx0ZDIgOj0gdG9fbnVtYmVyKHJhdzIpXFxuXFx0ZDIgPCBkMSArIDMwXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtczMtbGlmZWN5Y2xlLWRheXMtb3JkZXJcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuTGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5SdWxlcy4lZC5FeHBpcmF0aW9uSW5EYXlzXFxcIiwgW3IuaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJFeHBpcmF0aW9uSW5EYXlzICgldikgbXVzdCBiZSBncmVhdGVyIHRoYW4gVHJhbnNpdGlvbkluRGF5cyAoJXYpOyBTMyByZWplY3RzIGxpZmVjeWNsZSBydWxlcyB0aGF0IGV4cGlyZSBvYmplY3RzIGJlZm9yZSBvciB3aGVuIHRoZXkgdHJhbnNpdGlvblxcXCIsIFtlLCBkXSksXFxuXFx0X3BmX3Mzb3JkX2ZpeCwgX3BmX3Mzb3JkX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpTMzo6QnVja2V0XFxcIilcXG5cXHRzb21lIHIgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkxpZmVjeWNsZUNvbmZpZ3VyYXRpb24uUnVsZXNcXFwiKVxcblxcdGlzX29iamVjdChyLnZhbHVlKVxcblxcdHJhd2UgOj0gb2JqZWN0LmdldChyLnZhbHVlLCBcXFwiRXhwaXJhdGlvbkluRGF5c1xcXCIsIG51bGwpXFxuXFx0cmF3ZSAhPSBudWxsICMgdG9fbnVtYmVyKG51bGwpIOOBryAwIOOBq+OBquOCi1xcblxcdGUgOj0gdG9fbnVtYmVyKHJhd2UpXFxuXFx0dHJhbnMgOj0gb2JqZWN0LmdldChyLnZhbHVlLCBcXFwiVHJhbnNpdGlvbnNcXFwiLCBbXSlcXG5cXHRpc19hcnJheSh0cmFucylcXG5cXHRzb21lIHQgaW4gdHJhbnNcXG5cXHRpc19vYmplY3QodClcXG5cXHRyYXdkIDo9IG9iamVjdC5nZXQodCwgXFxcIlRyYW5zaXRpb25JbkRheXNcXFwiLCBudWxsKVxcblxcdHJhd2QgIT0gbnVsbFxcblxcdGQgOj0gdG9fbnVtYmVyKHJhd2QpXFxuXFx0ZSA8PSBkXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtczMtcmVwbGljYXRpb24tcmVxdWlyZXMtdmVyc2lvbmluZ1wiLFxuICAgIFwic2VydmljZVwiOiBcInMzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIlJlcGxpY2F0aW9uQ29uZmlndXJhdGlvbiByZXF1aXJlcyB2ZXJzaW9uaW5nIHRvIGJlIGVuYWJsZWQgb24gdGhlIHNvdXJjZSBidWNrZXRcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6UzM6OkJ1Y2tldFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgU3RhdHVzIOOBjOODquODhuODqeODq+OBpyBcXFwiU3VzcGVuZGVkXFxcIiDku6XlpJbvvIg9IFxcXCJFbmFibGVkXFxcIu+8ieOAgeOBvuOBn+OBr+acquino+axuuODiOODvOOCr+ODs+OBquOCiSBPSyDmibHjgYTjgIJcXG4jIFZlcnNpb25pbmdDb25maWd1cmF0aW9uIOiHquS9k+OBjOeEoeOBhCAvIFN1c3BlbmRlZCDjga7jgajjgY3jgaDjgZHpgZXlj43jgavjgZnjgovjgIJcXG5fcGZfczNyZXBsX3ZlcnNpb25pbmdfb2sobmFtZSkgaWYge1xcblxcdHMgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5WZXJzaW9uaW5nQ29uZmlndXJhdGlvbi5TdGF0dXNcXFwiKVxcblxcdG5vdCBzID09IFxcXCJTdXNwZW5kZWRcXFwiXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtczMtcmVwbGljYXRpb24tcmVxdWlyZXMtdmVyc2lvbmluZ1xcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuUmVwbGljYXRpb25Db25maWd1cmF0aW9uXFxcIixcXG5cXHRcXFwiUmVwbGljYXRpb25Db25maWd1cmF0aW9uIGlzIHNldCBidXQgYnVja2V0IHZlcnNpb25pbmcgaXMgbm90IGVuYWJsZWQ7IFMzIHJlamVjdHMgdGhlIHJlcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gYXQgZGVwbG95IHRpbWUgKEludmFsaWRSZXF1ZXN0OiBWZXJzaW9uaW5nIG11c3QgYmUgJ0VuYWJsZWQnIG9uIHRoZSBidWNrZXQpXFxcIixcXG5cXHRcXFwiU2V0IFZlcnNpb25pbmdDb25maWd1cmF0aW9uLlN0YXR1cyB0byAnRW5hYmxlZCcgb24gdGhlIHNvdXJjZSBidWNrZXRcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9yZXBsaWNhdGlvbi1yZXF1aXJlbWVudHMuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6UzM6OkJ1Y2tldFxcXCIpXFxuXFx0aXNfb2JqZWN0KHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuUmVwbGljYXRpb25Db25maWd1cmF0aW9uXFxcIikpXFxuXFx0bm90IF9wZl9zM3JlcGxfdmVyc2lvbmluZ19vayhuYW1lKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXNucy1maWZvLXRvcGljLW5hbWVcIixcbiAgICBcInNlcnZpY2VcIjogXCJzbnNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiRklGTyB0b3BpYyBuYW1lcyBtdXN0IGVuZCB3aXRoICcuZmlmbycgKGFuZCAnLmZpZm8nIG5hbWVzIHJlcXVpcmUgRmlmb1RvcGljKVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpTTlM6OlRvcGljXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX3Nuc2ZpZm9fZml4IDo9IFxcXCJHaXZlIEZJRk8gdG9waWNzIGEgVG9waWNOYW1lIGVuZGluZyBpbiAnLmZpZm8nIChvciBkcm9wIFRvcGljTmFtZSB0byBsZXQgQ2xvdWRGb3JtYXRpb24gZ2VuZXJhdGUgb25lKSwgYW5kIHNldCBGaWZvVG9waWM6IHRydWUgd2hlbmV2ZXIgdGhlIG5hbWUgZW5kcyBpbiAnLmZpZm8nXFxcIlxcblxcbl9wZl9zbnNmaWZvX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Nucy9sYXRlc3QvZGcvc25zLWNyZWF0ZS1maWZvLXRvcGljLmh0bWxcXFwiXFxuXFxuX3BmX3Nuc2ZpZm9fdHJ1ZShuYW1lKSBpZiByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkZpZm9Ub3BpY1xcXCIpIGluIHt0cnVlLCBcXFwidHJ1ZVxcXCJ9XFxuXFxuIyBGaWZvVG9waWMg44GM5a2Y5Zyo44GX44CB44Oq44OG44Op44OrIGZhbHNlIOS7peWklu+8iHRydWUg44KE44OI44O844Kv44Oz77yJ44Gq44KJ44CMRklGTyDjgYvjgoLjgZfjgozjgarjgYTjgI3mibHjgYRcXG5fcGZfc25zZmlmb19tYXliZV9maWZvKG5hbWUpIGlmIHtcXG5cXHR2IDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuRmlmb1RvcGljXFxcIilcXG5cXHRub3QgdiBpbiB7ZmFsc2UsIFxcXCJmYWxzZVxcXCJ9XFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtc25zLWZpZm8tdG9waWMtbmFtZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuVG9waWNOYW1lXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJGaWZvVG9waWMgaXMgdHJ1ZSBidXQgVG9waWNOYW1lICclcycgZG9lcyBub3QgZW5kIHdpdGggJy5maWZvJzsgU05TIHJlamVjdHMgdGhlIHRvcGljIGF0IGRlcGxveSB0aW1lXFxcIiwgW3RuXSksXFxuXFx0X3BmX3Nuc2ZpZm9fZml4LCBfcGZfc25zZmlmb191cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6U05TOjpUb3BpY1xcXCIpXFxuXFx0X3BmX3Nuc2ZpZm9fdHJ1ZShuYW1lKVxcblxcdHRuIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVG9waWNOYW1lXFxcIilcXG5cXHRpc19zdHJpbmcodG4pXFxuXFx0bm90IGVuZHN3aXRoKHRuLCBcXFwiLmZpZm9cXFwiKVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXNucy1maWZvLXRvcGljLW5hbWVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLlRvcGljTmFtZVxcXCIsXFxuXFx0c3ByaW50ZihcXFwiVG9waWNOYW1lICclcycgZW5kcyB3aXRoICcuZmlmbycgYnV0IEZpZm9Ub3BpYyBpcyBub3QgdHJ1ZTsgU05TIHJlamVjdHMgdGhlIHRvcGljIG5hbWUgYXQgZGVwbG95IHRpbWVcXFwiLCBbdG5dKSxcXG5cXHRfcGZfc25zZmlmb19maXgsIF9wZl9zbnNmaWZvX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpTTlM6OlRvcGljXFxcIilcXG5cXHR0biA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlRvcGljTmFtZVxcXCIpXFxuXFx0aXNfc3RyaW5nKHRuKVxcblxcdGVuZHN3aXRoKHRuLCBcXFwiLmZpZm9cXFwiKVxcblxcdG5vdCBfcGZfc25zZmlmb19tYXliZV9maWZvKG5hbWUpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtc2ZuLWFzbC1taXNzaW5nLXN0YXRlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwic3RlcGZ1bmN0aW9uc1wiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJBU0wgTmV4dC9EZWZhdWx0L0Nob2ljZXMgbXVzdCByZWZlcmVuY2UgYSBkZWZpbmVkIHN0YXRlICh0b3AtbGV2ZWwgc3RhdGVzOyBhIGRhbmdsaW5nIFN0YXJ0QXQgaXMgY292ZXJlZCBieSBlbmdpbmUgcnVsZSBFMzYwMSlcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX3Nmbl9maXggOj0gXFxcIlBvaW50IE5leHQvRGVmYXVsdC9DaG9pY2VzIGF0IGFuIGV4aXN0aW5nIHN0YXRlIG5hbWVcXFwiXFxuXFxuX3BmX3Nmbl91cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zdGVwLWZ1bmN0aW9ucy9sYXRlc3QvZGcvYW1hem9uLXN0YXRlcy1sYW5ndWFnZS1zdGF0ZXMuaHRtbFxcXCJcXG5cXG5fcGZfc2ZuX2FzbChuYW1lKSA6PSBhc2wgaWYge1xcblxcdGRlZiA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmdcXFwiKVxcblxcdGlzX3N0cmluZyhkZWYpXFxuXFx0YXNsIDo9IGpzb24udW5tYXJzaGFsKGRlZilcXG5cXHRpc19vYmplY3QoYXNsKVxcbn1cXG5cXG5fcGZfc2ZuX2RlZmluZWQoYXNsKSA6PSB7c24gfCBzb21lIHNuLCBfIGluIG9iamVjdC5nZXQoYXNsLCBcXFwiU3RhdGVzXFxcIiwge30pfVxcblxcbiMgTk9URTogYSBkYW5nbGluZyBTdGFydEF0IGlzIGRlbGliZXJhdGVseSBOT1QgY2hlY2tlZCBoZXJlIOKAlCB0aGUgZW5naW5lJ3NcXG4jIGJ1aWx0LWluIHJ1bGUgRTM2MDEgKEVSUk9SL0NGTl9MSU5UKSBhbHJlYWR5IGNvdmVycyBpdC4gVmVyaWZpZWQgYWdhaW5zdFxcbiMgQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZSAxLjcuMC1iZXRhIG9uIDIwMjYtMDktMDE6IEUzNjAxIGZpcmVzIGZvclxcbiMgU3RhcnRBdCBvbmx5IGFuZCBkb2VzIG5vdCBjaGVjayBOZXh0L0RlZmF1bHQvQ2hvaWNlcywgd2hpY2ggaXMgd2hhdCB0aGlzXFxuIyBydWxlIGFkZHMuXFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1zZm4tYXNsLW1pc3Npbmctc3RhdGVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLkRlZmluaXRpb25TdHJpbmdcXFwiLFxcblxcdHNwcmludGYoXFxcInN0YXRlICclcycgcmVmZXJlbmNlcyBzdGF0ZSAnJXMnIHZpYSAlcywgYnV0IG5vIHN0YXRlIHdpdGggdGhhdCBuYW1lIGlzIGRlZmluZWRcXFwiLCBbc25hbWUsIHRhcmdldCwga2V5XSksXFxuXFx0X3BmX3Nmbl9maXgsIF9wZl9zZm5fdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZVxcXCIpXFxuXFx0YXNsIDo9IF9wZl9zZm5fYXNsKG5hbWUpXFxuXFx0c29tZSBzbmFtZSwgc3QgaW4gb2JqZWN0LmdldChhc2wsIFxcXCJTdGF0ZXNcXFwiLCB7fSlcXG5cXHRpc19vYmplY3Qoc3QpXFxuXFx0c29tZSBrZXkgaW4ge1xcXCJOZXh0XFxcIiwgXFxcIkRlZmF1bHRcXFwifVxcblxcdHRhcmdldCA6PSBvYmplY3QuZ2V0KHN0LCBrZXksIG51bGwpXFxuXFx0aXNfc3RyaW5nKHRhcmdldClcXG5cXHRub3QgdGFyZ2V0IGluIF9wZl9zZm5fZGVmaW5lZChhc2wpXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtc2ZuLWFzbC1taXNzaW5nLXN0YXRlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJzdGF0ZSAnJXMnIGhhcyBhIENob2ljZSBydWxlIHJlZmVyZW5jaW5nIHN0YXRlICclcycsIGJ1dCBubyBzdGF0ZSB3aXRoIHRoYXQgbmFtZSBpcyBkZWZpbmVkXFxcIiwgW3NuYW1lLCB0YXJnZXRdKSxcXG5cXHRfcGZfc2ZuX2ZpeCwgX3BmX3Nmbl91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lXFxcIilcXG5cXHRhc2wgOj0gX3BmX3Nmbl9hc2wobmFtZSlcXG5cXHRzb21lIHNuYW1lLCBzdCBpbiBvYmplY3QuZ2V0KGFzbCwgXFxcIlN0YXRlc1xcXCIsIHt9KVxcblxcdGlzX29iamVjdChzdClcXG5cXHRjaG9pY2VzIDo9IG9iamVjdC5nZXQoc3QsIFxcXCJDaG9pY2VzXFxcIiwgW10pXFxuXFx0aXNfYXJyYXkoY2hvaWNlcylcXG5cXHRzb21lIGMgaW4gY2hvaWNlc1xcblxcdGlzX29iamVjdChjKVxcblxcdHRhcmdldCA6PSBvYmplY3QuZ2V0KGMsIFxcXCJOZXh0XFxcIiwgbnVsbClcXG5cXHRpc19zdHJpbmcodGFyZ2V0KVxcblxcdG5vdCB0YXJnZXQgaW4gX3BmX3Nmbl9kZWZpbmVkKGFzbClcXG59XFxuXCJcbiAgfVxuXTtcbiJdfQ==
|
|
741
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZXMuZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3J1bGVzLmdlbmVyYXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFhYSxRQUFBLGFBQWEsR0FBc0I7SUFDOUM7UUFDRSxJQUFJLEVBQUUscUNBQXFDO1FBQzNDLFNBQVMsRUFBRSxtQkFBbUI7UUFDOUIsVUFBVSxFQUFFLE9BQU87UUFDbkIsT0FBTyxFQUFFLHlFQUF5RTtRQUNsRixVQUFVLEVBQUUsTUFBTTtRQUNsQixlQUFlLEVBQUU7WUFDZixnQ0FBZ0M7U0FDakM7UUFDRCxNQUFNLEVBQUUsbzJCQUFvMkI7S0FDNzJCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsMkJBQTJCO1FBQ2pDLFNBQVMsRUFBRSxtQkFBbUI7UUFDOUIsVUFBVSxFQUFFLE9BQU87UUFDbkIsT0FBTyxFQUFFLDRFQUE0RTtRQUNyRixVQUFVLEVBQUUsZ0JBQWdCO1FBQzVCLGVBQWUsRUFBRTtZQUNmLGdDQUFnQztTQUNqQztRQUNELE1BQU0sRUFBRSwrNkJBQSs2QjtLQUN4N0I7SUFDRDtRQUNFLElBQUksRUFBRSwrQkFBK0I7UUFDckMsU0FBUyxFQUFFLFlBQVk7UUFDdkIsVUFBVSxFQUFFLE9BQU87UUFDbkIsT0FBTyxFQUFFLHVEQUF1RDtRQUNoRSxVQUFVLEVBQUUsTUFBTTtRQUNsQixlQUFlLEVBQUU7WUFDZiwrQkFBK0I7U0FDaEM7UUFDRCxNQUFNLEVBQUUsNjZCQUE2NkI7S0FDdDdCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsa0RBQWtEO1FBQ3hELFNBQVMsRUFBRSxZQUFZO1FBQ3ZCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLE9BQU8sRUFBRSwyRUFBMkU7UUFDcEYsVUFBVSxFQUFFLE1BQU07UUFDbEIsZUFBZSxFQUFFO1lBQ2YsK0JBQStCO1NBQ2hDO1FBQ0QsTUFBTSxFQUFFLHMvQkFBcy9CO0tBQy8vQjtJQUNEO1FBQ0UsSUFBSSxFQUFFLHFDQUFxQztRQUMzQyxTQUFT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RUFBRSxLQUFLO1FBQ2hCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLE9BQU8sRUFBRSw4RUFBOEU7UUFDdkYsVUFBVSxFQUFFLE1BQU07UUFDbEIsZUFBZSxFQUFFO1lBQ2YsaUJBQWlCO1NBQ2xCO1FBQ0QsTUFBTSxFQUFFLDYrQ0FBNitDO0tBQ3QvQztJQUNEO1FBQ0UsSUFBSSxFQUFFLDBCQUEwQjtRQUNoQyxTQUFTLEVBQUUsZUFBZTtRQUMxQixVQUFVLEVBQUUsT0FBTztRQUNuQixPQUFPLEVBQUUsZ0lBQWdJO1FBQ3pJLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLGVBQWUsRUFBRTtZQUNmLGtDQUFrQztTQUNuQztRQUNELE1BQU0sRUFBRSwyK0RBQTIrRDtLQUNwL0Q7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHNjcmlwdHMvYnVuZGxlLXJ1bGVzLnRzIGZyb20gcnVsZXMvKiouIERvIG5vdCBlZGl0IGJ5IGhhbmQuXG4vLyB+fiBSZWdlbmVyYXRlIHdpdGg6IG5weCBwcm9qZW4gYnVuZGxlLXJ1bGVzXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuZXhwb3J0IGludGVyZmFjZSBCdW5kbGVkUnVsZURhdGEge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNldmVyaXR5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVwc3RyZWFtOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc291cmNlVHlwZXM6IHN0cmluZ1tdO1xuICByZWFkb25seSByZWdvOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBCVU5ETEVEX1JVTEVTOiBCdW5kbGVkUnVsZURhdGFbXSA9IFtcbiAge1xuICAgIFwiaWRcIjogXCJwZi1hZ2VudGNvcmUtZ2F0ZXdheS1qd3QtYXV0aG9yaXplclwiLFxuICAgIFwic2VydmljZVwiOiBcImJlZHJvY2stYWdlbnRjb3JlXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkdhdGV3YXlzIHdpdGggQXV0aG9yaXplclR5cGUgQ1VTVE9NX0pXVCByZXF1aXJlIEF1dGhvcml6ZXJDb25maWd1cmF0aW9uXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkJlZHJvY2tBZ2VudENvcmU6OkdhdGV3YXlcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfZ3dqd3RfaGFzX2NvbmZpZyhuYW1lKSBpZiBpc19vYmplY3QocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5BdXRob3JpemVyQ29uZmlndXJhdGlvblxcXCIpKVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtYWdlbnRjb3JlLWdhdGV3YXktand0LWF1dGhvcml6ZXJcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLkF1dGhvcml6ZXJDb25maWd1cmF0aW9uXFxcIixcXG5cXHRcXFwiQXV0aG9yaXplclR5cGUgaXMgQ1VTVE9NX0pXVCBidXQgQXV0aG9yaXplckNvbmZpZ3VyYXRpb24gaXMgbWlzc2luZzsgdGhlIENyZWF0ZUdhdGV3YXkgQVBJIHJlcXVpcmVzIGl0IGFuZCB0aGUgZGVwbG95bWVudCBmYWlscyB3aXRoIGEgVmFsaWRhdGlvbkV4Y2VwdGlvblxcXCIsXFxuXFx0XFxcIkFkZCBBdXRob3JpemVyQ29uZmlndXJhdGlvbi5DdXN0b21KV1RBdXRob3JpemVyIChkaXNjb3ZlcnlVcmwgYW5kIGFsbG93ZWRBdWRpZW5jZS9hbGxvd2VkQ2xpZW50cyksIG9yIHN3aXRjaCBBdXRob3JpemVyVHlwZSB0byBBV1NfSUFNXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlLWNvbnRyb2wvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlR2F0ZXdheS5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpCZWRyb2NrQWdlbnRDb3JlOjpHYXRld2F5XFxcIilcXG5cXHRyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkF1dGhvcml6ZXJUeXBlXFxcIikgPT0gXFxcIkNVU1RPTV9KV1RcXFwiXFxuXFx0bm90IF9wZl9nd2p3dF9oYXNfY29uZmlnKG5hbWUpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtYWdlbnRjb3JlLXJ1bnRpbWUtbmFtZVwiLFxuICAgIFwic2VydmljZVwiOiBcImJlZHJvY2stYWdlbnRjb3JlXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkFnZW50Q29yZSBSdW50aW1lIG5hbWVzIG11c3QgbWF0Y2ggW2EtekEtWl1bYS16QS1aMC05X117MCw0N30gKG5vIGh5cGhlbnMpXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcInBlbmRpbmctZW5naW5lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpCZWRyb2NrQWdlbnRDb3JlOjpSdW50aW1lXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuIyBDbG91ZEZvcm1hdGlvbiDjgrnjgq3jg7zjg57jga8gQWdlbnRSdW50aW1lTmFtZSDjga7jg5Hjgr/jg7zjg7PjgpLmjIHjgZ/jgarjgYTvvIjjgqjjg7Pjgrjjg7PntKDpgJrjgorjgIFcXG4jIDIwMjYtMDktMDEg44GrIDEuNy4wLWJldGEg44Gn56K66KqN77yJ44GM44CBQ3JlYXRlQWdlbnRSdW50aW1lIEFQSSDjga9cXG4jIFthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9IOOCkuW8t+WItuOBmeOCi+OAguODj+OCpOODleODs+WFpeOCiuOBriBDREsg6aKo5ZG95ZCN44GM5a6a55Wq44Gu5q275Zug44CCXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1hZ2VudGNvcmUtcnVudGltZS1uYW1lXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5BZ2VudFJ1bnRpbWVOYW1lXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJBZ2VudFJ1bnRpbWVOYW1lICclcycgaXMgaW52YWxpZDogaXQgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluIG9ubHkgbGV0dGVycywgZGlnaXRzLCBhbmQgdW5kZXJzY29yZXMgKG1heCA0OCBjaGFyYWN0ZXJzLCBoeXBoZW5zIGFyZSBub3QgYWxsb3dlZCk7IENyZWF0ZUFnZW50UnVudGltZSBmYWlscyBhdCBkZXBsb3kgdGltZVxcXCIsIFtuXSksXFxuXFx0XFxcIlVzZSBhbiB1bmRlcnNjb3JlLXNlcGFyYXRlZCBuYW1lIHN1Y2ggYXMgJ215X2FnZW50X3J1bnRpbWUnXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlLWNvbnRyb2wvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlQWdlbnRSdW50aW1lLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkJlZHJvY2tBZ2VudENvcmU6OlJ1bnRpbWVcXFwiKVxcblxcdG4gOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5BZ2VudFJ1bnRpbWVOYW1lXFxcIilcXG5cXHRpc19zdHJpbmcobilcXG5cXHRub3QgcmVnZXgubWF0Y2goYF5bYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fSRgLCBuKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWNsb3VkZnJvbnQtYWNtLWNlcnQtcmVnaW9uXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiY2xvdWRmcm9udFwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJDbG91ZEZyb250IHZpZXdlciBjZXJ0aWZpY2F0ZXMgbXVzdCBsaXZlIGluIHVzLWVhc3QtMVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWNsb3VkZnJvbnQtYWNtLWNlcnQtcmVnaW9uXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuVmlld2VyQ2VydGlmaWNhdGUuQWNtQ2VydGlmaWNhdGVBcm5cXFwiLFxcblxcdHNwcmludGYoXFxcIkNsb3VkRnJvbnQgcmVxdWlyZXMgdGhlIEFDTSBjZXJ0aWZpY2F0ZSB0byBiZSBpbiB1cy1lYXN0LTEsIGJ1dCB0aGUgY2VydGlmaWNhdGUgaXMgaW4gJXNcXFwiLCBbcmVnaW9uXSksXFxuXFx0XFxcIklzc3VlIG9yIGltcG9ydCB0aGUgY2VydGlmaWNhdGUgaW4gdXMtZWFzdC0xIChlLmcuIGEgZGVkaWNhdGVkIHVzLWVhc3QtMSBzdGFjaykgYW5kIHJlZmVyZW5jZSB0aGF0IEFSTlxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jbmFtZXMtYW5kLWh0dHBzLXJlcXVpcmVtZW50cy5odG1sI2h0dHBzLXJlcXVpcmVtZW50cy1jZXJ0aWZpY2F0ZS1pc3N1ZXJcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblxcXCIpXFxuXFx0YXJuIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLlZpZXdlckNlcnRpZmljYXRlLkFjbUNlcnRpZmljYXRlQXJuXFxcIilcXG5cXHRpc19zdHJpbmcoYXJuKVxcblxcdHN0YXJ0c3dpdGgoYXJuLCBcXFwiYXJuOlxcXCIpXFxuXFx0cGFydHMgOj0gc3BsaXQoYXJuLCBcXFwiOlxcXCIpXFxuXFx0Y291bnQocGFydHMpID49IDZcXG5cXHRwYXJ0c1syXSA9PSBcXFwiYWNtXFxcIlxcblxcdHJlZ2lvbiA6PSBwYXJ0c1szXVxcblxcdHJlZ2lvbiAhPSBcXFwiXFxcIlxcblxcdHJlZ2lvbiAhPSBcXFwidXMtZWFzdC0xXFxcIlxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWNsb3VkZnJvbnQtYWxpYXNlcy1yZXF1aXJlLWN1c3RvbS1jZXJ0aWZpY2F0ZVwiLFxuICAgIFwic2VydmljZVwiOiBcImNsb3VkZnJvbnRcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQSBkaXN0cmlidXRpb24gd2l0aCBBbGlhc2VzIGNhbm5vdCB1c2UgdGhlIENsb3VkRnJvbnQgZGVmYXVsdCBjZXJ0aWZpY2F0ZVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfY2ZfYWxpYXNjZXJ0X3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcHJvcGVydGllcy1jbG91ZGZyb250LWRpc3RyaWJ1dGlvbi12aWV3ZXJjZXJ0aWZpY2F0ZS5odG1sXFxcIlxcblxcbl9wZl9jZl9hbGlhc2NlcnRfZml4IDo9IFxcXCJBdHRhY2ggYW4gQUNNIGNlcnRpZmljYXRlIChBY21DZXJ0aWZpY2F0ZUFybiwgdXMtZWFzdC0xKSBvciBhbiBJQU0gY2VydGlmaWNhdGUsIHRvZ2V0aGVyIHdpdGggU3NsU3VwcG9ydE1ldGhvZCBhbmQgTWluaW11bVByb3RvY29sVmVyc2lvblxcXCJcXG5cXG5fcGZfY2ZfYWxpYXNjZXJ0X2NvdW50KG5hbWUpIDo9IGNvdW50KFsxIHxcXG5cXHRzb21lIF8gaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5BbGlhc2VzXFxcIilcXG5dKVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtY2xvdWRmcm9udC1hbGlhc2VzLXJlcXVpcmUtY3VzdG9tLWNlcnRpZmljYXRlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuVmlld2VyQ2VydGlmaWNhdGVcXFwiLFxcblxcdFxcXCJBIGRpc3RyaWJ1dGlvbiB3aXRoIEFsaWFzZXMgY2Fubm90IHVzZSB0aGUgQ2xvdWRGcm9udCBkZWZhdWx0IGNlcnRpZmljYXRlXFxcIixcXG5cXHRfcGZfY2ZfYWxpYXNjZXJ0X2ZpeCwgX3BmX2NmX2FsaWFzY2VydF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXFxcIilcXG5cXHRfcGZfY2ZfYWxpYXNjZXJ0X2NvdW50KG5hbWUpID4gMFxcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLlZpZXdlckNlcnRpZmljYXRlLkNsb3VkRnJvbnREZWZhdWx0Q2VydGlmaWNhdGVcXFwiKSA9PSB0cnVlXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtY2xvdWRmcm9udC1jYWNoZWQtbWV0aG9kcy1zdWJzZXRcIixcbiAgICBcInNlcnZpY2VcIjogXCJjbG91ZGZyb250XCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkNhY2hlZE1ldGhvZHMgbXVzdCBiZSBhIHN1YnNldCBvZiBBbGxvd2VkTWV0aG9kc1wiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfY2ZfbWV0aG9kc191cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXByb3BlcnRpZXMtY2xvdWRmcm9udC1kaXN0cmlidXRpb24tY2FjaGViZWhhdmlvci5odG1sXFxcIlxcblxcbl9wZl9jZl9tZXRob2RzX2JlaGF2aW9ycyhuYW1lKSA6PSBhcnJheS5jb25jYXQoXFxuXFx0W3tcXFwicGF0aFxcXCI6IFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5EZWZhdWx0Q2FjaGVCZWhhdmlvclxcXCIsIFxcXCJ2YWx1ZVxcXCI6IGl0LnZhbHVlfSB8XFxuXFx0XFx0c29tZSBpdCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLkRlZmF1bHRDYWNoZUJlaGF2aW9yXFxcIildLFxcblxcdFt7XFxcInBhdGhcXFwiOiBzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5DYWNoZUJlaGF2aW9ycy4lZFxcXCIsIFtpdC5pbmRleF0pLCBcXFwidmFsdWVcXFwiOiBpdC52YWx1ZX0gfFxcblxcdFxcdHNvbWUgaXQgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5DYWNoZUJlaGF2aW9yc1xcXCIpXSxcXG4pXFxuXFxuIyBDbG91ZEZyb250IGRlZmF1bHRzIEFsbG93ZWRNZXRob2RzIHRvIEdFVC9IRUFEIHdoZW4gdGhlIHByb3BlcnR5IGlzIG9taXR0ZWQsXFxuIyBzbyBhbiBvbWl0dGVkIEFsbG93ZWRNZXRob2RzIHN0aWxsIGNvbnN0cmFpbnMgd2hhdCBtYXkgYmUgY2FjaGVkLlxcbl9wZl9jZl9tZXRob2RzX2FsbG93ZWQoYikgOj0gb2JqZWN0LmdldChiLnZhbHVlLCBcXFwiQWxsb3dlZE1ldGhvZHNcXFwiLCBbXFxcIkdFVFxcXCIsIFxcXCJIRUFEXFxcIl0pXFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1jbG91ZGZyb250LWNhY2hlZC1tZXRob2RzLXN1YnNldFxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiJXMuQ2FjaGVkTWV0aG9kc1xcXCIsIFtiLnBhdGhdKSxcXG5cXHRzcHJpbnRmKFxcXCJDYWNoZWRNZXRob2RzIGNvbnRhaW5zICVzLCB3aGljaCBpcyBub3QgaW4gQWxsb3dlZE1ldGhvZHMgJXZcXFwiLCBbbWV0aG9kLCBhbGxvd2VkXSksXFxuXFx0XFxcIkV2ZXJ5IG1ldGhvZCBpbiBDYWNoZWRNZXRob2RzIG11c3QgYWxzbyBhcHBlYXIgaW4gQWxsb3dlZE1ldGhvZHNcXFwiLFxcblxcdF9wZl9jZl9tZXRob2RzX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cXFwiKVxcblxcdHNvbWUgYiBpbiBfcGZfY2ZfbWV0aG9kc19iZWhhdmlvcnMobmFtZSlcXG5cXHRpc19vYmplY3QoYi52YWx1ZSlcXG5cXHRjYWNoZWQgOj0gb2JqZWN0LmdldChiLnZhbHVlLCBcXFwiQ2FjaGVkTWV0aG9kc1xcXCIsIG51bGwpXFxuXFx0aXNfYXJyYXkoY2FjaGVkKVxcblxcdGFsbG93ZWQgOj0gX3BmX2NmX21ldGhvZHNfYWxsb3dlZChiKVxcblxcdGlzX2FycmF5KGFsbG93ZWQpXFxuXFx0c29tZSBtZXRob2QgaW4gY2FjaGVkXFxuXFx0bm90IG1ldGhvZCBpbiBhbGxvd2VkXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtY2xvdWRmcm9udC1lZGdlLWxhbWJkYS1yZWdpb25cIixcbiAgICBcInNlcnZpY2VcIjogXCJjbG91ZGZyb250XCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkxhbWJkYUBFZGdlIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBkaXN0cmlidXRpb24gbXVzdCBiZSBpbiB1cy1lYXN0LTFcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX2NmX2VkZ2VyZWdpb25fZml4IDo9IFxcXCJDcmVhdGUgdGhlIExhbWJkYUBFZGdlIGZ1bmN0aW9uIGluIHVzLWVhc3QtMSAoY2xvdWRmcm9udC5leHBlcmltZW50YWwuRWRnZUZ1bmN0aW9uIGRvZXMgdGhpcyBmb3IgeW91KSBhbmQgYXNzb2NpYXRlIHRoYXQgdmVyc2lvbidzIEFSTlxcXCJcXG5cXG5fcGZfY2ZfZWRnZXJlZ2lvbl91cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9sYW1iZGEtYXQtZWRnZS1mdW5jdGlvbi1yZXN0cmljdGlvbnMuaHRtbFxcXCJcXG5cXG5fcGZfY2ZfZWRnZXJlZ2lvbl9iZWhhdmlvcnMobmFtZSkgOj0gYXJyYXkuY29uY2F0KFxcblxcdFt7XFxcInBhdGhcXFwiOiBcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuRGVmYXVsdENhY2hlQmVoYXZpb3JcXFwifSB8XFxuXFx0XFx0c29tZSBfIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuRGVmYXVsdENhY2hlQmVoYXZpb3JcXFwiKV0sXFxuXFx0W3tcXFwicGF0aFxcXCI6IHNwcmludGYoXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLkNhY2hlQmVoYXZpb3JzLiVkXFxcIiwgW2l0LmluZGV4XSl9IHxcXG5cXHRcXHRzb21lIGl0IGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuQ2FjaGVCZWhhdmlvcnNcXFwiKV0sXFxuKVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtY2xvdWRmcm9udC1lZGdlLWxhbWJkYS1yZWdpb25cXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIiVzLkxhbWJkYUZ1bmN0aW9uQXNzb2NpYXRpb25zLiVkLkxhbWJkYUZ1bmN0aW9uQVJOXFxcIiwgW2IucGF0aCwgYS5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcIkxhbWJkYUBFZGdlIGZ1bmN0aW9ucyBtdXN0IGxpdmUgaW4gdXMtZWFzdC0xLCBidXQgdGhpcyBmdW5jdGlvbiBpcyBpbiAlc1xcXCIsIFtyZWdpb25dKSxcXG5cXHRfcGZfY2ZfZWRnZXJlZ2lvbl9maXgsIF9wZl9jZl9lZGdlcmVnaW9uX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cXFwiKVxcblxcdHNvbWUgYiBpbiBfcGZfY2ZfZWRnZXJlZ2lvbl9iZWhhdmlvcnMobmFtZSlcXG5cXHRzb21lIGEgaW4gZmxhdHRlbl9saXN0KG5hbWUsIHNwcmludGYoXFxcIiVzLkxhbWJkYUZ1bmN0aW9uQXNzb2NpYXRpb25zXFxcIiwgW2IucGF0aF0pKVxcblxcdGFybiA6PSBvYmplY3QuZ2V0KGEudmFsdWUsIFxcXCJMYW1iZGFGdW5jdGlvbkFSTlxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKGFybilcXG5cXHRwYXJ0cyA6PSBzcGxpdChhcm4sIFxcXCI6XFxcIilcXG5cXHRjb3VudChwYXJ0cykgPj0gN1xcblxcdHBhcnRzWzBdID09IFxcXCJhcm5cXFwiXFxuXFx0cGFydHNbMl0gPT0gXFxcImxhbWJkYVxcXCJcXG5cXHRyZWdpb24gOj0gcGFydHNbM11cXG5cXHRyZWdpb24gIT0gXFxcIlxcXCJcXG5cXHRyZWdpb24gIT0gXFxcInVzLWVhc3QtMVxcXCJcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1jbG91ZGZyb250LWVkZ2UtbGFtYmRhLXZlcnNpb25cIixcbiAgICBcInNlcnZpY2VcIjogXCJjbG91ZGZyb250XCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkxhbWJkYUBFZGdlIGFzc29jaWF0aW9ucyBtdXN0IHJlZmVyZW5jZSBhIHZlcnNpb24gQVJOLCBub3QgYW4gYWxpYXMgb3IgJExBVEVTVFwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfY2ZfZWRnZXZlcl9maXggOj0gXFxcIkFzc29jaWF0ZSBhIHZlcnNpb24gQVJOIChpbiB0aGUgQ0RLLCBmbi5jdXJyZW50VmVyc2lvbi5lZGdlQXJuKSBpbnN0ZWFkIG9mIHRoZSB1bnF1YWxpZmllZCBmdW5jdGlvbiBBUk4sIGFuIGFsaWFzLCBvciAkTEFURVNUXFxcIlxcblxcbl9wZl9jZl9lZGdldmVyX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcHJvcGVydGllcy1jbG91ZGZyb250LWRpc3RyaWJ1dGlvbi1sYW1iZGFmdW5jdGlvbmFzc29jaWF0aW9uLmh0bWxcXFwiXFxuXFxuX3BmX2NmX2VkZ2V2ZXJfYmVoYXZpb3JzKG5hbWUpIDo9IGFycmF5LmNvbmNhdChcXG5cXHRbe1xcXCJwYXRoXFxcIjogXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLkRlZmF1bHRDYWNoZUJlaGF2aW9yXFxcIn0gfFxcblxcdFxcdHNvbWUgXyBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLkRlZmF1bHRDYWNoZUJlaGF2aW9yXFxcIildLFxcblxcdFt7XFxcInBhdGhcXFwiOiBzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZy5DYWNoZUJlaGF2aW9ycy4lZFxcXCIsIFtpdC5pbmRleF0pfSB8XFxuXFx0XFx0c29tZSBpdCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLkNhY2hlQmVoYXZpb3JzXFxcIildLFxcbilcXG5cXG4jIExhbWJkYSBBUk5zIHNwbGl0IGludG8gNyBzZWdtZW50cyB3aGVuIHVucXVhbGlmaWVkXFxuIyAoYXJuOnBhcnRpdGlvbjpsYW1iZGE6cmVnaW9uOmFjY291bnQ6ZnVuY3Rpb246bmFtZSkgYW5kIDggd2hlbiBhIHZlcnNpb24gb3JcXG4jIGFsaWFzIHF1YWxpZmllciBpcyBhcHBlbmRlZC4gT25seSBhbiBhbGwtZGlnaXQgcXVhbGlmaWVyIGlzIGEgdmVyc2lvbi5cXG5fcGZfY2ZfZWRnZXZlcl9hcm5zKG5hbWUpIDo9IFt7XFxcInBhdGhcXFwiOiBwYXRoLCBcXFwiYXJuXFxcIjogYXJuLCBcXFwicGFydHNcXFwiOiBwYXJ0c30gfFxcblxcdHNvbWUgYiBpbiBfcGZfY2ZfZWRnZXZlcl9iZWhhdmlvcnMobmFtZSlcXG5cXHRzb21lIGEgaW4gZmxhdHRlbl9saXN0KG5hbWUsIHNwcmludGYoXFxcIiVzLkxhbWJkYUZ1bmN0aW9uQXNzb2NpYXRpb25zXFxcIiwgW2IucGF0aF0pKVxcblxcdGFybiA6PSBvYmplY3QuZ2V0KGEudmFsdWUsIFxcXCJMYW1iZGFGdW5jdGlvbkFSTlxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKGFybilcXG5cXHRwYXJ0cyA6PSBzcGxpdChhcm4sIFxcXCI6XFxcIilcXG5cXHRwYXJ0c1swXSA9PSBcXFwiYXJuXFxcIlxcblxcdHBhcnRzWzJdID09IFxcXCJsYW1iZGFcXFwiXFxuXFx0cGFydHNbNV0gPT0gXFxcImZ1bmN0aW9uXFxcIlxcblxcdHBhdGggOj0gc3ByaW50ZihcXFwiJXMuTGFtYmRhRnVuY3Rpb25Bc3NvY2lhdGlvbnMuJWQuTGFtYmRhRnVuY3Rpb25BUk5cXFwiLCBbYi5wYXRoLCBhLmluZGV4XSlcXG5dXFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1jbG91ZGZyb250LWVkZ2UtbGFtYmRhLXZlcnNpb25cXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLCBpdC5wYXRoLFxcblxcdFxcXCJMYW1iZGFARWRnZSByZXF1aXJlcyBhIHZlcnNpb24tcXVhbGlmaWVkIGZ1bmN0aW9uIEFSTiwgYnV0IHRoaXMgQVJOIGhhcyBubyBxdWFsaWZpZXJcXFwiLFxcblxcdF9wZl9jZl9lZGdldmVyX2ZpeCwgX3BmX2NmX2VkZ2V2ZXJfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblxcXCIpXFxuXFx0c29tZSBpdCBpbiBfcGZfY2ZfZWRnZXZlcl9hcm5zKG5hbWUpXFxuXFx0Y291bnQoaXQucGFydHMpID09IDdcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1jbG91ZGZyb250LWVkZ2UtbGFtYmRhLXZlcnNpb25cXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLCBpdC5wYXRoLFxcblxcdHNwcmludGYoXFxcIkxhbWJkYUBFZGdlIHJlcXVpcmVzIGEgdmVyc2lvbi1xdWFsaWZpZWQgZnVuY3Rpb24gQVJOLCBidXQgJyVzJyBpcyBhbiBhbGlhcyBvciAkTEFURVNUXFxcIiwgW3F1YWxpZmllcl0pLFxcblxcdF9wZl9jZl9lZGdldmVyX2ZpeCwgX3BmX2NmX2VkZ2V2ZXJfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblxcXCIpXFxuXFx0c29tZSBpdCBpbiBfcGZfY2ZfZWRnZXZlcl9hcm5zKG5hbWUpXFxuXFx0Y291bnQoaXQucGFydHMpID09IDhcXG5cXHRxdWFsaWZpZXIgOj0gaXQucGFydHNbN11cXG5cXHRub3QgcmVnZXgubWF0Y2goXFxcIl5bMC05XSskXFxcIiwgcXVhbGlmaWVyKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWNsb3VkZnJvbnQtb3JpZ2luLWdyb3VwLW1lbWJlci1vcmlnaW5cIixcbiAgICBcInNlcnZpY2VcIjogXCJjbG91ZGZyb250XCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIk9yaWdpbiBncm91cCBtZW1iZXJzIG11c3QgcmVmZXJlbmNlIGFuIG9yaWdpbiBkZWNsYXJlZCBpbiB0aGUgZGlzdHJpYnV0aW9uXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9jZl9vZ21lbWJlcl9pZHMobmFtZSkgOj0ge2lkIHxcXG5cXHRzb21lIGl0IGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuT3JpZ2luc1xcXCIpXFxuXFx0aWQgOj0gb2JqZWN0LmdldChpdC52YWx1ZSwgXFxcIklkXFxcIiwgbnVsbClcXG5cXHRpc19zdHJpbmcoaWQpXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtY2xvdWRmcm9udC1vcmlnaW4tZ3JvdXAtbWVtYmVyLW9yaWdpblxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuT3JpZ2luR3JvdXBzLkl0ZW1zLiVkLk1lbWJlcnNcXFwiLCBbZy5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcIk9yaWdpbiBncm91cCBtZW1iZXIgJyVzJyBkb2VzIG5vdCBtYXRjaCBhbnkgb3JpZ2luIElkIGluIHRoZSBkaXN0cmlidXRpb25cXFwiLCBbb2lkXSksXFxuXFx0XFxcIlBvaW50IGV2ZXJ5IG9yaWdpbiBncm91cCBtZW1iZXIgYXQgdGhlIElkIG9mIGFuIG9yaWdpbiBkZWNsYXJlZCBpbiBPcmlnaW5zXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcHJvcGVydGllcy1jbG91ZGZyb250LWRpc3RyaWJ1dGlvbi1vcmlnaW5ncm91cC5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cXFwiKVxcblxcdHNvbWUgZyBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLk9yaWdpbkdyb3Vwcy5JdGVtc1xcXCIpXFxuXFx0bWVtYmVycyA6PSBvYmplY3QuZ2V0KG9iamVjdC5nZXQoZy52YWx1ZSwgXFxcIk1lbWJlcnNcXFwiLCB7fSksIFxcXCJJdGVtc1xcXCIsIFtdKVxcblxcdHNvbWUgbSBpbiBtZW1iZXJzXFxuXFx0b2lkIDo9IG9iamVjdC5nZXQobSwgXFxcIk9yaWdpbklkXFxcIiwgbnVsbClcXG5cXHRpc19zdHJpbmcob2lkKVxcblxcdG5vdCBvaWQgaW4gX3BmX2NmX29nbWVtYmVyX2lkcyhuYW1lKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWNsb3VkZnJvbnQtdHRsLW9yZGVyXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiY2xvdWRmcm9udFwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJDYWNoZSBiZWhhdmlvciBUVExzIG11c3Qgc2F0aXNmeSBNaW5UVEwgPD0gRGVmYXVsdFRUTCA8PSBNYXhUVExcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX2NmX3R0bF9maXggOj0gXFxcIk9yZGVyIHRoZSBUVExzIGFzIE1pblRUTCA8PSBEZWZhdWx0VFRMIDw9IE1heFRUTFxcXCJcXG5cXG5fcGZfY2ZfdHRsX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0V4cGlyYXRpb24uaHRtbFxcXCJcXG5cXG5fcGZfY2ZfYmVoYXZpb3JzKG5hbWUpIDo9IGFycmF5LmNvbmNhdChcXG5cXHRbe1xcXCJwYXRoXFxcIjogXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLkRlZmF1bHRDYWNoZUJlaGF2aW9yXFxcIiwgXFxcInZhbHVlXFxcIjogaXQudmFsdWV9IHxcXG5cXHRcXHRzb21lIGl0IGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuRGVmYXVsdENhY2hlQmVoYXZpb3JcXFwiKV0sXFxuXFx0W3tcXFwicGF0aFxcXCI6IHNwcmludGYoXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLkNhY2hlQmVoYXZpb3JzLiVkXFxcIiwgW2l0LmluZGV4XSksIFxcXCJ2YWx1ZVxcXCI6IGl0LnZhbHVlfSB8XFxuXFx0XFx0c29tZSBpdCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLkNhY2hlQmVoYXZpb3JzXFxcIildLFxcbilcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWNsb3VkZnJvbnQtdHRsLW9yZGVyXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSwgYi5wYXRoLFxcblxcdHNwcmludGYoXFxcIk1pblRUTCAoJXYpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIE1heFRUTCAoJXYpXFxcIiwgW21uLCBteF0pLFxcblxcdF9wZl9jZl90dGxfZml4LCBfcGZfY2ZfdHRsX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cXFwiKVxcblxcdHNvbWUgYiBpbiBfcGZfY2ZfYmVoYXZpb3JzKG5hbWUpXFxuXFx0aXNfb2JqZWN0KGIudmFsdWUpXFxuXFx0bW4gOj0gdG9fbnVtYmVyKG9iamVjdC5nZXQoYi52YWx1ZSwgXFxcIk1pblRUTFxcXCIsIG51bGwpKVxcblxcdG14IDo9IHRvX251bWJlcihvYmplY3QuZ2V0KGIudmFsdWUsIFxcXCJNYXhUVExcXFwiLCBudWxsKSlcXG5cXHRtbiA+IG14XFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtY2xvdWRmcm9udC10dGwtb3JkZXJcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLCBiLnBhdGgsXFxuXFx0c3ByaW50ZihcXFwiTWluVFRMICgldikgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gRGVmYXVsdFRUTCAoJXYpXFxcIiwgW21uLCBkZl0pLFxcblxcdF9wZl9jZl90dGxfZml4LCBfcGZfY2ZfdHRsX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cXFwiKVxcblxcdHNvbWUgYiBpbiBfcGZfY2ZfYmVoYXZpb3JzKG5hbWUpXFxuXFx0aXNfb2JqZWN0KGIudmFsdWUpXFxuXFx0bW4gOj0gdG9fbnVtYmVyKG9iamVjdC5nZXQoYi52YWx1ZSwgXFxcIk1pblRUTFxcXCIsIG51bGwpKVxcblxcdGRmIDo9IHRvX251bWJlcihvYmplY3QuZ2V0KGIudmFsdWUsIFxcXCJEZWZhdWx0VFRMXFxcIiwgbnVsbCkpXFxuXFx0bW4gPiBkZlxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWNsb3VkZnJvbnQtdHRsLW9yZGVyXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSwgYi5wYXRoLFxcblxcdHNwcmludGYoXFxcIkRlZmF1bHRUVEwgKCV2KSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBNYXhUVEwgKCV2KVxcXCIsIFtkZiwgbXhdKSxcXG5cXHRfcGZfY2ZfdHRsX2ZpeCwgX3BmX2NmX3R0bF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXFxcIilcXG5cXHRzb21lIGIgaW4gX3BmX2NmX2JlaGF2aW9ycyhuYW1lKVxcblxcdGlzX29iamVjdChiLnZhbHVlKVxcblxcdGRmIDo9IHRvX251bWJlcihvYmplY3QuZ2V0KGIudmFsdWUsIFxcXCJEZWZhdWx0VFRMXFxcIiwgbnVsbCkpXFxuXFx0bXggOj0gdG9fbnVtYmVyKG9iamVjdC5nZXQoYi52YWx1ZSwgXFxcIk1heFRUTFxcXCIsIG51bGwpKVxcblxcdGRmID4gbXhcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1jbG91ZGZyb250LXdhZnYyLXdlYmFjbC1zY29wZVwiLFxuICAgIFwic2VydmljZVwiOiBcImNsb3VkZnJvbnRcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQSBXQUZ2MiB3ZWIgQUNMIGF0dGFjaGVkIHRvIENsb3VkRnJvbnQgbXVzdCBiZSBnbG9iYWxseSBzY29wZWRcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuIyBBIFdBRnYyIEFSTiBjYXJyaWVzIGl0cyBzY29wZSBpbiB0aGUgcmVzb3VyY2Ugc2VnbWVudDpcXG4jICAgYXJuOmF3czp3YWZ2Mjp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmdsb2JhbC93ZWJhY2wvbmFtZS9pZCAgICAoQ0xPVURGUk9OVClcXG4jICAgYXJuOmF3czp3YWZ2MjphcC1ub3J0aGVhc3QtMToxMjM0NTY3ODkwMTI6cmVnaW9uYWwvd2ViYWNsLy4uLiAoUkVHSU9OQUwpXFxuIyBDbG91ZEZyb250IGFjY2VwdHMgb25seSB0aGUgZ2xvYmFsIGZvcm0uIENoZWNraW5nIHRoZSByZWdpb24gYWxvbmUgd291bGQgbWlzc1xcbiMgYSBSRUdJT05BTCB3ZWIgQUNMIHRoYXQgaGFwcGVucyB0byBoYXZlIGJlZW4gY3JlYXRlZCBpbiB1cy1lYXN0LTEsIHdoaWNoIGlzXFxuIyB0aGUgZWFzeSBtaXN0YWtlIHRvIG1ha2UuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1jbG91ZGZyb250LXdhZnYyLXdlYmFjbC1zY29wZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnLldlYkFDTElkXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJDbG91ZEZyb250IG9ubHkgYWNjZXB0cyBhIGdsb2JhbGx5IHNjb3BlZCB3ZWIgQUNMLCBidXQgdGhpcyBBUk4gaXMgc2NvcGVkICclcydcXFwiLCBbc2NvcGVdKSxcXG5cXHRcXFwiQ3JlYXRlIHRoZSB3ZWIgQUNMIHdpdGggc2NvcGUgQ0xPVURGUk9OVCBpbiB1cy1lYXN0LTEgKHdhZnYyLkNmbldlYkFDTCB3aXRoIHNjb3BlOiAnQ0xPVURGUk9OVCcpIGFuZCByZWZlcmVuY2UgdGhhdCBBUk5cXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1yZXNvdXJjZS13YWZ2Mi13ZWJhY2wuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXFxcIilcXG5cXHRhcm4gOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWcuV2ViQUNMSWRcXFwiKVxcblxcdGlzX3N0cmluZyhhcm4pXFxuXFx0cGFydHMgOj0gc3BsaXQoYXJuLCBcXFwiOlxcXCIpXFxuXFx0Y291bnQocGFydHMpID49IDZcXG5cXHRwYXJ0c1swXSA9PSBcXFwiYXJuXFxcIlxcblxcdHBhcnRzWzJdID09IFxcXCJ3YWZ2MlxcXCJcXG5cXHRzZWdtZW50cyA6PSBzcGxpdChwYXJ0c1s1XSwgXFxcIi9cXFwiKVxcblxcdHNjb3BlIDo9IHNlZ21lbnRzWzBdXFxuXFx0c2NvcGUgIT0gXFxcImdsb2JhbFxcXCJcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1keW5hbW9kYi1hdHRyaWJ1dGUtZGVmaW5pdGlvbnMtdXNhZ2VcIixcbiAgICBcInNlcnZpY2VcIjogXCJkeW5hbW9kYlwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJFdmVyeSBBdHRyaWJ1dGVEZWZpbml0aW9ucyBlbnRyeSBtdXN0IGJlIHVzZWQgYnkgYSBrZXkgc2NoZW1hXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgRHluYW1vREIgcmVxdWlyZXMgYW4gZXhhY3QgbWF0Y2g6IGV2ZXJ5IEF0dHJpYnV0ZURlZmluaXRpb25zIGVudHJ5IG11c3QgYmVcXG4jIHVzZWQgYnkgdGhlIHRhYmxlIGtleSBzY2hlbWEgb3IgYW4gaW5kZXgga2V5IHNjaGVtYS4gVGhlIGVuZ2luZSdzIEUzMDM5XFxuIyBjaGVja3MgdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiBvbmx5IChrZXkgYXR0cmlidXRlIG5vdCBkZWZpbmVkKSwgc28gdGhlXFxuIyBjbGFzc2ljIFxcXCJyZW1vdmVkIGEgR1NJLCBsZWZ0IHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvblxcXCIgbWlzdGFrZSBzYWlscyB0aHJvdWdoLlxcblxcbl9wZl9kZGJhZHVfdGFibGVfa2V5cyhuYW1lKSA6PSB7YSB8XFxuXFx0c29tZSBpdCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuS2V5U2NoZW1hXFxcIilcXG5cXHRhIDo9IG9iamVjdC5nZXQoaXQudmFsdWUsIFxcXCJBdHRyaWJ1dGVOYW1lXFxcIiwgbnVsbClcXG5cXHRpc19zdHJpbmcoYSlcXG59XFxuXFxuX3BmX2RkYmFkdV9pbmRleF9rZXlzKG5hbWUsIHByb3ApIDo9IHthIHxcXG5cXHRzb21lIGl4IGluIGZsYXR0ZW5fbGlzdChuYW1lLCBzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLiVzXFxcIiwgW3Byb3BdKSlcXG5cXHRzb21lIGsgaW4gb2JqZWN0LmdldChpeC52YWx1ZSwgXFxcIktleVNjaGVtYVxcXCIsIFtdKVxcblxcdGEgOj0gb2JqZWN0LmdldChrLCBcXFwiQXR0cmlidXRlTmFtZVxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKGEpXFxufVxcblxcbl9wZl9kZGJhZHVfdXNlZChuYW1lKSA6PSAoKF9wZl9kZGJhZHVfdGFibGVfa2V5cyhuYW1lKSB8XFxuXFx0X3BmX2RkYmFkdV9pbmRleF9rZXlzKG5hbWUsIFxcXCJHbG9iYWxTZWNvbmRhcnlJbmRleGVzXFxcIikpIHxcXG5cXHRfcGZfZGRiYWR1X2luZGV4X2tleXMobmFtZSwgXFxcIkxvY2FsU2Vjb25kYXJ5SW5kZXhlc1xcXCIpKVxcblxcbiMgQW55IHVucmVzb2x2YWJsZSBBdHRyaWJ1dGVOYW1lIGluIGEga2V5IHNjaGVtYSBtZWFucyB0aGUgdXNlZC1zZXQgaXNcXG4jIGluY29tcGxldGUsIHNvIHRoZSBydWxlIG11c3Qgc3RheSBzaWxlbnQgcmF0aGVyIHRoYW4gZ3Vlc3MuXFxuX3BmX2RkYmFkdV91bnJlc29sdmFibGUobmFtZSkgaWYge1xcblxcdHNvbWUgaXQgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLktleVNjaGVtYVxcXCIpXFxuXFx0bm90IGlzX3N0cmluZyhvYmplY3QuZ2V0KGl0LnZhbHVlLCBcXFwiQXR0cmlidXRlTmFtZVxcXCIsIG51bGwpKVxcbn1cXG5cXG5fcGZfZGRiYWR1X3VucmVzb2x2YWJsZShuYW1lKSBpZiB7XFxuXFx0c29tZSBwcm9wIGluIFtcXFwiR2xvYmFsU2Vjb25kYXJ5SW5kZXhlc1xcXCIsIFxcXCJMb2NhbFNlY29uZGFyeUluZGV4ZXNcXFwiXVxcblxcdHNvbWUgaXggaW4gZmxhdHRlbl9saXN0KG5hbWUsIHNwcmludGYoXFxcIlByb3BlcnRpZXMuJXNcXFwiLCBbcHJvcF0pKVxcblxcdHNvbWUgayBpbiBvYmplY3QuZ2V0KGl4LnZhbHVlLCBcXFwiS2V5U2NoZW1hXFxcIiwgW10pXFxuXFx0bm90IGlzX3N0cmluZyhvYmplY3QuZ2V0KGssIFxcXCJBdHRyaWJ1dGVOYW1lXFxcIiwgbnVsbCkpXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGItYXR0cmlidXRlLWRlZmluaXRpb25zLXVzYWdlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkF0dHJpYnV0ZURlZmluaXRpb25zLiVkXFxcIiwgW2QuaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJBdHRyaWJ1dGUgJyVzJyBpcyBkZWZpbmVkIGJ1dCB1c2VkIGJ5IG5vIGtleSBzY2hlbWE7IER5bmFtb0RCIHJlcXVpcmVzIGFuIGV4YWN0IG1hdGNoIGFuZCBmYWlscyB3aXRoIFxcXFxcXFwiTnVtYmVyIG9mIGF0dHJpYnV0ZXMgaW4gS2V5U2NoZW1hIGRvZXMgbm90IGV4YWN0bHkgbWF0Y2ggbnVtYmVyIG9mIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiBBdHRyaWJ1dGVEZWZpbml0aW9uc1xcXFxcXFwiXFxcIiwgW2F0dHJdKSxcXG5cXHRcXFwiUmVtb3ZlIHRoZSB1bnVzZWQgZGVmaW5pdGlvbiAobm9uLWtleSBhdHRyaWJ1dGVzIHN1Y2ggYXMgYSBUVEwgYXR0cmlidXRlIG11c3QgTk9UIGJlIGRlY2xhcmVkKSwgb3IgYWRkIHRoZSBpbmRleCB0aGF0IHVzZXMgaXRcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1yZXNvdXJjZS1keW5hbW9kYi10YWJsZS5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcXFwiKVxcblxcdG5vdCBfcGZfZGRiYWR1X3VucmVzb2x2YWJsZShuYW1lKVxcblxcdHNvbWUgZCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuQXR0cmlidXRlRGVmaW5pdGlvbnNcXFwiKVxcblxcdGF0dHIgOj0gb2JqZWN0LmdldChkLnZhbHVlLCBcXFwiQXR0cmlidXRlTmFtZVxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKGF0dHIpXFxuXFx0bm90IGF0dHIgaW4gX3BmX2RkYmFkdV91c2VkKG5hbWUpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtZHluYW1vZGItYmlsbGluZy10aHJvdWdocHV0XCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZHluYW1vZGJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiUHJvdmlzaW9uZWRUaHJvdWdocHV0IG11c3QgbWF0Y2ggQmlsbGluZ01vZGUgKHJlcXVpcmVkIGZvciBQUk9WSVNJT05FRCwgZm9yYmlkZGVuIGZvciBQQVlfUEVSX1JFUVVFU1QpXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9kZGJidF91cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25keW5hbW9kYi9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvSG93SXRXb3Jrcy5SZWFkV3JpdGVDYXBhY2l0eU1vZGUuaHRtbFxcXCJcXG5cXG5fcGZfZGRiYnRfaGFzX3B0KG5hbWUpIGlmIGlzX29iamVjdChyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlByb3Zpc2lvbmVkVGhyb3VnaHB1dFxcXCIpKVxcblxcbl9wZl9kZGJidF9iaWxsaW5nX3ByZXNlbnQobmFtZSkgaWYgcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5CaWxsaW5nTW9kZVxcXCIpXFxuXFxuIyBCaWxsaW5nTW9kZSDjgYzjg6rjg4bjg6njg6sgXFxcIlBST1ZJU0lPTkVEXFxcIuOAgeOBvuOBn+OBr+acquaMh+Wumu+8iOODh+ODleOCqeODq+ODiCBQUk9WSVNJT05FRO+8ieOAglxcbiMg44OI44O844Kv44Oz5YCk77yIUmVmIOetie+8ieOBr+WIpOWumuOBq+S9v+OCj+OBquOBhO+8iOiqpOaknOefpemYsuatou+8ieOAglxcbl9wZl9kZGJidF9wcm92aXNpb25lZChuYW1lKSBpZiByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkJpbGxpbmdNb2RlXFxcIikgPT0gXFxcIlBST1ZJU0lPTkVEXFxcIlxcblxcbl9wZl9kZGJidF9wcm92aXNpb25lZChuYW1lKSBpZiBub3QgX3BmX2RkYmJ0X2JpbGxpbmdfcHJlc2VudChuYW1lKVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGItYmlsbGluZy10aHJvdWdocHV0XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5Qcm92aXNpb25lZFRocm91Z2hwdXRcXFwiLFxcblxcdFxcXCJQcm92aXNpb25lZFRocm91Z2hwdXQgY2Fubm90IGJlIHNwZWNpZmllZCB3aGVuIEJpbGxpbmdNb2RlIGlzIFBBWV9QRVJfUkVRVUVTVDsgQ3JlYXRlVGFibGUgZmFpbHMgYXQgZGVwbG95IHRpbWVcXFwiLFxcblxcdFxcXCJSZW1vdmUgUHJvdmlzaW9uZWRUaHJvdWdocHV0LCBvciBzd2l0Y2ggQmlsbGluZ01vZGUgdG8gUFJPVklTSU9ORURcXFwiLFxcblxcdF9wZl9kZGJidF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6OlRhYmxlXFxcIilcXG5cXHRyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkJpbGxpbmdNb2RlXFxcIikgPT0gXFxcIlBBWV9QRVJfUkVRVUVTVFxcXCJcXG5cXHRfcGZfZGRiYnRfaGFzX3B0KG5hbWUpXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGItYmlsbGluZy10aHJvdWdocHV0XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5Qcm92aXNpb25lZFRocm91Z2hwdXRcXFwiLFxcblxcdFxcXCJCaWxsaW5nTW9kZSBpcyBQUk9WSVNJT05FRCAodGhlIGRlZmF1bHQpIGJ1dCBQcm92aXNpb25lZFRocm91Z2hwdXQgaXMgbWlzc2luZzsgQ3JlYXRlVGFibGUgZmFpbHMgYXQgZGVwbG95IHRpbWVcXFwiLFxcblxcdFxcXCJBZGQgUHJvdmlzaW9uZWRUaHJvdWdocHV0IChSZWFkQ2FwYWNpdHlVbml0cyAvIFdyaXRlQ2FwYWNpdHlVbml0cyksIG9yIHNldCBCaWxsaW5nTW9kZSB0byBQQVlfUEVSX1JFUVVFU1RcXFwiLFxcblxcdF9wZl9kZGJidF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6OlRhYmxlXFxcIilcXG5cXHRfcGZfZGRiYnRfcHJvdmlzaW9uZWQobmFtZSlcXG5cXHRub3QgX3BmX2RkYmJ0X2hhc19wdChuYW1lKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWR5bmFtb2RiLWR1cGxpY2F0ZS1hdHRyaWJ1dGUtZGVmaW5pdGlvbnNcIixcbiAgICBcInNlcnZpY2VcIjogXCJkeW5hbW9kYlwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJBdHRyaWJ1dGVEZWZpbml0aW9ucyBtdXN0IG5vdCBkZWZpbmUgdGhlIHNhbWUgYXR0cmlidXRlIHR3aWNlXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGItZHVwbGljYXRlLWF0dHJpYnV0ZS1kZWZpbml0aW9uc1xcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5BdHRyaWJ1dGVEZWZpbml0aW9ucy4lZFxcXCIsIFtiLmluZGV4XSksXFxuXFx0c3ByaW50ZihcXFwiQXR0cmlidXRlICclcycgYXBwZWFycyBtb3JlIHRoYW4gb25jZSBpbiBBdHRyaWJ1dGVEZWZpbml0aW9uczsgQ3JlYXRlVGFibGUgZmFpbHMgd2l0aCBcXFxcXFxcIkFuIGF0dHJpYnV0ZSBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlIGluIEF0dHJpYnV0ZURlZmluaXRpb25zXFxcXFxcXCJcXFwiLCBbYW5dKSxcXG5cXHRcXFwiS2VlcCBhIHNpbmdsZSBkZWZpbml0aW9uIHBlciBhdHRyaWJ1dGUgbmFtZVxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXJlc291cmNlLWR5bmFtb2RiLXRhYmxlLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVxcXCIpXFxuXFx0c29tZSBhIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5BdHRyaWJ1dGVEZWZpbml0aW9uc1xcXCIpXFxuXFx0c29tZSBiIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5BdHRyaWJ1dGVEZWZpbml0aW9uc1xcXCIpXFxuXFx0YS5pbmRleCA8IGIuaW5kZXhcXG5cXHRhbiA6PSBvYmplY3QuZ2V0KGEudmFsdWUsIFxcXCJBdHRyaWJ1dGVOYW1lXFxcIiwgbnVsbClcXG5cXHRpc19zdHJpbmcoYW4pXFxuXFx0b2JqZWN0LmdldChiLnZhbHVlLCBcXFwiQXR0cmlidXRlTmFtZVxcXCIsIG51bGwpID09IGFuXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtZHluYW1vZGItZHVwbGljYXRlLWluZGV4LW5hbWVcIixcbiAgICBcInNlcnZpY2VcIjogXCJkeW5hbW9kYlwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJTZWNvbmRhcnkgaW5kZXggbmFtZXMgbXVzdCBiZSB1bmlxdWVcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6RHluYW1vREI6OlRhYmxlXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX2RkYmRpbl91cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXJlc291cmNlLWR5bmFtb2RiLXRhYmxlLmh0bWxcXFwiXFxuXFxuIyBEdXBsaWNhdGVzIHdpdGhpbiB0aGUgc2FtZSBpbmRleCBsaXN0IG9ubHk7IGEgR1NJL0xTSSBjcm9zcy1saXN0IGNsYXNoIHdhc1xcbiMgbm90IG1lYXN1cmVkIChpc3N1ZSAjMjEpLlxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGItZHVwbGljYXRlLWluZGV4LW5hbWVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuJXMuJWQuSW5kZXhOYW1lXFxcIiwgW3Byb3AsIGIuaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJJbmRleCBuYW1lICclcycgaXMgdXNlZCBtb3JlIHRoYW4gb25jZTsgQ3JlYXRlVGFibGUgZmFpbHMgd2l0aCBcXFxcXFxcIkR1cGxpY2F0ZSBpbmRleCBuYW1lXFxcXFxcXCJcXFwiLCBbaW5hbWVdKSxcXG5cXHRcXFwiR2l2ZSBldmVyeSBzZWNvbmRhcnkgaW5kZXggYSB1bmlxdWUgSW5kZXhOYW1lXFxcIixcXG5cXHRfcGZfZGRiZGluX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcXFwiKVxcblxcdHNvbWUgcHJvcCBpbiBbXFxcIkdsb2JhbFNlY29uZGFyeUluZGV4ZXNcXFwiLCBcXFwiTG9jYWxTZWNvbmRhcnlJbmRleGVzXFxcIl1cXG5cXHRzb21lIGEgaW4gZmxhdHRlbl9saXN0KG5hbWUsIHNwcmludGYoXFxcIlByb3BlcnRpZXMuJXNcXFwiLCBbcHJvcF0pKVxcblxcdHNvbWUgYiBpbiBmbGF0dGVuX2xpc3QobmFtZSwgc3ByaW50ZihcXFwiUHJvcGVydGllcy4lc1xcXCIsIFtwcm9wXSkpXFxuXFx0YS5pbmRleCA8IGIuaW5kZXhcXG5cXHRpbmFtZSA6PSBvYmplY3QuZ2V0KGEudmFsdWUsIFxcXCJJbmRleE5hbWVcXFwiLCBudWxsKVxcblxcdGlzX3N0cmluZyhpbmFtZSlcXG5cXHRvYmplY3QuZ2V0KGIudmFsdWUsIFxcXCJJbmRleE5hbWVcXFwiLCBudWxsKSA9PSBpbmFtZVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWR5bmFtb2RiLWdsb2JhbC10YWJsZS1yZXBsaWNhLXJlZ2lvblwiLFxuICAgIFwic2VydmljZVwiOiBcImR5bmFtb2RiXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkdsb2JhbFRhYmxlIFJlcGxpY2FzIG11c3QgaW5jbHVkZSB0aGUgZGVwbG95bWVudCByZWdpb25cIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6RHluYW1vREI6Okdsb2JhbFRhYmxlXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuIyBkYXRhLmNka19wcmVmbGlnaHQuZGVwbG95X3JlZ2lvbiBpcyBkZWZpbmVkIG9ubHkgd2hlbiB0aGUgZW5mb3JjZSBwbHVnaW5cXG4jIGtub3dzIHRoZSBhcHAncyBjb25jcmV0ZSByZWdpb24gKHNlZSBzcmMvcHJpdmF0ZS9lbmZvcmNlLnRzKTsgd2l0aG91dCBpdCB0aGVcXG4jIHJlZmVyZW5jZSBpcyB1bmRlZmluZWQgYW5kIHRoaXMgcnVsZSBza2lwcy4gUmVwbGljYXMgd2l0aCB1bnJlc29sdmFibGVcXG4jIFJlZ2lvbiB2YWx1ZXMgYWxzbyBtYWtlIHRoZSBydWxlIHNraXAg4oCUIGFic2VuY2UgY2Fubm90IGJlIHByb3ZlbiB0aGVuLlxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGItZ2xvYmFsLXRhYmxlLXJlcGxpY2EtcmVnaW9uXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5SZXBsaWNhc1xcXCIsXFxuXFx0c3ByaW50ZihcXFwiVGhlIFJlcGxpY2FzIGxpc3QgJXYgZG9lcyBub3QgaW5jbHVkZSB0aGUgZGVwbG95bWVudCByZWdpb24gJyVzJzsgQ3JlYXRlR2xvYmFsVGFibGUgZmFpbHMgd2l0aCBcXFxcXFxcIlRoZSBSZXBsaWNhcyBzZWN0aW9uIG11c3QgY29udGFpbiBhbiBlbnRyeSBmb3IgdGhlIGN1cnJlbnQgcmVnaW9uXFxcXFxcXCJcXFwiLCBbcmVwbGljYXMsIHJlZ2lvbl0pLFxcblxcdFxcXCJBZGQgYSByZXBsaWNhIGVudHJ5IGZvciB0aGUgcmVnaW9uIHRoZSBzdGFjayBkZXBsb3lzIHRvIChDREsgVGFibGVWMiBkb2VzIHRoaXMgYXV0b21hdGljYWxseSlcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1yZXNvdXJjZS1keW5hbW9kYi1nbG9iYWx0YWJsZS5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6R2xvYmFsVGFibGVcXFwiKVxcblxcdHJlZ2lvbiA6PSBkYXRhLmNka19wcmVmbGlnaHQuZGVwbG95X3JlZ2lvblxcblxcdGlzX3N0cmluZyhyZWdpb24pXFxuXFx0aXRlbXMgOj0gW2l0IHwgc29tZSBpdCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuUmVwbGljYXNcXFwiKV1cXG5cXHRjb3VudChpdGVtcykgPiAwXFxuXFx0ZXZlcnkgaXQgaW4gaXRlbXMge1xcblxcdFxcdGlzX3N0cmluZyhvYmplY3QuZ2V0KGl0LnZhbHVlLCBcXFwiUmVnaW9uXFxcIiwgbnVsbCkpXFxuXFx0fVxcblxcdHJlcGxpY2FzIDo9IFtyIHwgc29tZSBpdCBpbiBpdGVtczsgciA6PSBvYmplY3QuZ2V0KGl0LnZhbHVlLCBcXFwiUmVnaW9uXFxcIiwgbnVsbCldXFxuXFx0bm90IHJlZ2lvbiBpbiByZXBsaWNhc1xcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWR5bmFtb2RiLWdzaS1iaWxsaW5nLXRocm91Z2hwdXRcIixcbiAgICBcInNlcnZpY2VcIjogXCJkeW5hbW9kYlwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJHU0kgUHJvdmlzaW9uZWRUaHJvdWdocHV0IG11c3QgbWF0Y2ggdGhlIHRhYmxlIEJpbGxpbmdNb2RlXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9kZGJnYnRfdXJsIDo9IFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9uZHluYW1vZGIvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL0hvd0l0V29ya3MuUmVhZFdyaXRlQ2FwYWNpdHlNb2RlLmh0bWxcXFwiXFxuXFxuIyBHU0ktbGV2ZWwgY291bnRlcnBhcnQgb2YgcGYtZHluYW1vZGItYmlsbGluZy10aHJvdWdocHV0ICh3aGljaCBjb3ZlcnMgdGhlXFxuIyB0YWJsZS1sZXZlbCBwYWlyIG9ubHkpLiBTYW1lIHRva2VuIHNhZmV0eTogbGl0ZXJhbCBCaWxsaW5nTW9kZSBvciBhYnNlbnRcXG4jIChkZWZhdWx0IFBST1ZJU0lPTkVEKTsgdG9rZW4gdmFsdWVzIG5ldmVyIGp1ZGdlZC5cXG5fcGZfZGRiZ2J0X2JpbGxpbmdfcHJlc2VudChuYW1lKSBpZiByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkJpbGxpbmdNb2RlXFxcIilcXG5cXG5fcGZfZGRiZ2J0X3Byb3Zpc2lvbmVkKG5hbWUpIGlmIHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuQmlsbGluZ01vZGVcXFwiKSA9PSBcXFwiUFJPVklTSU9ORURcXFwiXFxuXFxuX3BmX2RkYmdidF9wcm92aXNpb25lZChuYW1lKSBpZiBub3QgX3BmX2RkYmdidF9iaWxsaW5nX3ByZXNlbnQobmFtZSlcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWdzaS1iaWxsaW5nLXRocm91Z2hwdXRcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuR2xvYmFsU2Vjb25kYXJ5SW5kZXhlcy4lZC5Qcm92aXNpb25lZFRocm91Z2hwdXRcXFwiLCBbZy5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcIkdTSSAnJXMnIHNwZWNpZmllcyBQcm92aXNpb25lZFRocm91Z2hwdXQgYnV0IEJpbGxpbmdNb2RlIGlzIFBBWV9QRVJfUkVRVUVTVDsgQ3JlYXRlVGFibGUgZmFpbHMgd2l0aCBcXFxcXFxcIlByb3BlcnR5IFByb3Zpc2lvbmVkVGhyb3VnaHB1dCBjYW4ndCBiZSB1c2VkIHdpdGggUEFZX1BFUl9SRVFVRVNUIEJpbGxpbmdNb2RlXFxcXFxcXCJcXFwiLCBbaW5hbWVdKSxcXG5cXHRcXFwiUmVtb3ZlIHRoZSBHU0kncyBQcm92aXNpb25lZFRocm91Z2hwdXQsIG9yIHN3aXRjaCB0aGUgdGFibGUgdG8gUFJPVklTSU9ORURcXFwiLFxcblxcdF9wZl9kZGJnYnRfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVxcXCIpXFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5CaWxsaW5nTW9kZVxcXCIpID09IFxcXCJQQVlfUEVSX1JFUVVFU1RcXFwiXFxuXFx0c29tZSBnIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5HbG9iYWxTZWNvbmRhcnlJbmRleGVzXFxcIilcXG5cXHRpc19vYmplY3Qob2JqZWN0LmdldChnLnZhbHVlLCBcXFwiUHJvdmlzaW9uZWRUaHJvdWdocHV0XFxcIiwgbnVsbCkpXFxuXFx0aW5hbWUgOj0gb2JqZWN0LmdldChnLnZhbHVlLCBcXFwiSW5kZXhOYW1lXFxcIiwgXFxcIjx1bm5hbWVkPlxcXCIpXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGItZ3NpLWJpbGxpbmctdGhyb3VnaHB1dFxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5HbG9iYWxTZWNvbmRhcnlJbmRleGVzLiVkLlByb3Zpc2lvbmVkVGhyb3VnaHB1dFxcXCIsIFtnLmluZGV4XSksXFxuXFx0c3ByaW50ZihcXFwiR1NJICclcycgaXMgbWlzc2luZyBQcm92aXNpb25lZFRocm91Z2hwdXQgd2hpbGUgdGhlIHRhYmxlIGJpbGxzIFBST1ZJU0lPTkVEICh0aGUgZGVmYXVsdCk7IENyZWF0ZVRhYmxlIGZhaWxzIHdpdGggXFxcXFxcXCJQcm9wZXJ0eSBQcm92aXNpb25lZFRocm91Z2hwdXQgY2Fubm90IGJlIGVtcHR5XFxcXFxcXCJcXFwiLCBbaW5hbWVdKSxcXG5cXHRcXFwiQWRkIFByb3Zpc2lvbmVkVGhyb3VnaHB1dCB0byB0aGUgR1NJLCBvciBzZXQgQmlsbGluZ01vZGUgdG8gUEFZX1BFUl9SRVFVRVNUXFxcIixcXG5cXHRfcGZfZGRiZ2J0X3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcXFwiKVxcblxcdF9wZl9kZGJnYnRfcHJvdmlzaW9uZWQobmFtZSlcXG5cXHRzb21lIGcgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkdsb2JhbFNlY29uZGFyeUluZGV4ZXNcXFwiKVxcblxcdG5vdCBpc19vYmplY3Qob2JqZWN0LmdldChnLnZhbHVlLCBcXFwiUHJvdmlzaW9uZWRUaHJvdWdocHV0XFxcIiwgbnVsbCkpXFxuXFx0aW5hbWUgOj0gb2JqZWN0LmdldChnLnZhbHVlLCBcXFwiSW5kZXhOYW1lXFxcIiwgXFxcIjx1bm5hbWVkPlxcXCIpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtZHluYW1vZGItZ3NpLXByb2plY3Rpb24tbm9ua2V5XCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZHluYW1vZGJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiTm9uS2V5QXR0cmlidXRlcyBnb2VzIHdpdGggSU5DTFVERSwgYW5kIG9ubHkgd2l0aCBJTkNMVURFXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9kZGJncG5fdXJsIDo9IFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1wcm9wZXJ0aWVzLWR5bmFtb2RiLXRhYmxlLXByb2plY3Rpb24uaHRtbFxcXCJcXG5cXG4jIEdTSSBwcm9qZWN0aW9ucyBvbmx5OiB0aGUgTFNJIHNoYXBlIGFuZCB0aGUgS0VZU19PTkxZK05vbktleUF0dHJpYnV0ZXMgY29tYm9cXG4jIHdlcmUgbm90IG1lYXN1cmVkIChpc3N1ZSAjMjEpLlxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGItZ3NpLXByb2plY3Rpb24tbm9ua2V5XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkdsb2JhbFNlY29uZGFyeUluZGV4ZXMuJWQuUHJvamVjdGlvblxcXCIsIFtnLmluZGV4XSksXFxuXFx0c3ByaW50ZihcXFwiR1NJICclcycgdXNlcyBQcm9qZWN0aW9uVHlwZSBJTkNMVURFIHdpdGhvdXQgTm9uS2V5QXR0cmlidXRlczsgQ3JlYXRlVGFibGUgZmFpbHMgd2l0aCBcXFxcXFxcIlByb2plY3Rpb25UeXBlIGlzIElOQ0xVREUsIGJ1dCBOb25LZXlBdHRyaWJ1dGVzIGlzIG5vdCBzcGVjaWZpZWRcXFxcXFxcIlxcXCIsIFtpbmFtZV0pLFxcblxcdFxcXCJMaXN0IHRoZSBwcm9qZWN0ZWQgYXR0cmlidXRlcyBpbiBOb25LZXlBdHRyaWJ1dGVzLCBvciBzd2l0Y2ggUHJvamVjdGlvblR5cGUgdG8gQUxMIC8gS0VZU19PTkxZXFxcIixcXG5cXHRfcGZfZGRiZ3BuX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcXFwiKVxcblxcdHNvbWUgZyBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuR2xvYmFsU2Vjb25kYXJ5SW5kZXhlc1xcXCIpXFxuXFx0cHJvaiA6PSBvYmplY3QuZ2V0KGcudmFsdWUsIFxcXCJQcm9qZWN0aW9uXFxcIiwgbnVsbClcXG5cXHRpc19vYmplY3QocHJvailcXG5cXHRvYmplY3QuZ2V0KHByb2osIFxcXCJQcm9qZWN0aW9uVHlwZVxcXCIsIG51bGwpID09IFxcXCJJTkNMVURFXFxcIlxcblxcdGNvdW50KG9iamVjdC5nZXQocHJvaiwgXFxcIk5vbktleUF0dHJpYnV0ZXNcXFwiLCBbXSkpID09IDBcXG5cXHRpbmFtZSA6PSBvYmplY3QuZ2V0KGcudmFsdWUsIFxcXCJJbmRleE5hbWVcXFwiLCBcXFwiPHVubmFtZWQ+XFxcIilcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1keW5hbW9kYi1nc2ktcHJvamVjdGlvbi1ub25rZXlcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuR2xvYmFsU2Vjb25kYXJ5SW5kZXhlcy4lZC5Qcm9qZWN0aW9uXFxcIiwgW2cuaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJHU0kgJyVzJyBjb21iaW5lcyBQcm9qZWN0aW9uVHlwZSBBTEwgd2l0aCBOb25LZXlBdHRyaWJ1dGVzOyBDcmVhdGVUYWJsZSBmYWlscyB3aXRoIFxcXFxcXFwiUHJvamVjdGlvblR5cGUgaXMgQUxMLCBidXQgTm9uS2V5QXR0cmlidXRlcyBpcyBzcGVjaWZpZWRcXFxcXFxcIlxcXCIsIFtpbmFtZV0pLFxcblxcdFxcXCJEcm9wIE5vbktleUF0dHJpYnV0ZXMgKEFMTCBhbHJlYWR5IHByb2plY3RzIGV2ZXJ5dGhpbmcpLCBvciBzd2l0Y2ggUHJvamVjdGlvblR5cGUgdG8gSU5DTFVERVxcXCIsXFxuXFx0X3BmX2RkYmdwbl91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6OlRhYmxlXFxcIilcXG5cXHRzb21lIGcgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkdsb2JhbFNlY29uZGFyeUluZGV4ZXNcXFwiKVxcblxcdHByb2ogOj0gb2JqZWN0LmdldChnLnZhbHVlLCBcXFwiUHJvamVjdGlvblxcXCIsIG51bGwpXFxuXFx0aXNfb2JqZWN0KHByb2opXFxuXFx0b2JqZWN0LmdldChwcm9qLCBcXFwiUHJvamVjdGlvblR5cGVcXFwiLCBudWxsKSA9PSBcXFwiQUxMXFxcIlxcblxcdGNvdW50KG9iamVjdC5nZXQocHJvaiwgXFxcIk5vbktleUF0dHJpYnV0ZXNcXFwiLCBbXSkpID4gMFxcblxcdGluYW1lIDo9IG9iamVjdC5nZXQoZy52YWx1ZSwgXFxcIkluZGV4TmFtZVxcXCIsIFxcXCI8dW5uYW1lZD5cXFwiKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWR5bmFtb2RiLWtleS1zY2hlbWEtc2hhcGVcIixcbiAgICBcInNlcnZpY2VcIjogXCJkeW5hbW9kYlwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJLZXlTY2hlbWEgbXVzdCBiZSBbSEFTSF0gb3IgW0hBU0gsIFJBTkdFXVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfZGRia3NoX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcmVzb3VyY2UtZHluYW1vZGItdGFibGUuaHRtbFxcXCJcXG5cXG4jIFRhYmxlLWxldmVsIGtleSBzY2hlbWEgb25seTogaW5kZXgga2V5IHNjaGVtYXMgcHJvZHVjZSBkaWZmZXJlbnQgc2VydmljZVxcbiMgZXJyb3JzIGFuZCB3ZXJlIG5vdCBtZWFzdXJlZCAoaXNzdWUgIzIxKS5cXG5fcGZfZGRia3NoX3R5cGUobmFtZSwgaSkgOj0ga3QgaWYge1xcblxcdHNvbWUgaXQgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLktleVNjaGVtYVxcXCIpXFxuXFx0aXQuaW5kZXggPT0gaVxcblxcdGt0IDo9IG9iamVjdC5nZXQoaXQudmFsdWUsIFxcXCJLZXlUeXBlXFxcIiwgbnVsbClcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1keW5hbW9kYi1rZXktc2NoZW1hLXNoYXBlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5LZXlTY2hlbWEuMC5LZXlUeXBlXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJUaGUgZmlyc3QgS2V5U2NoZW1hIGVsZW1lbnQgbXVzdCBiZSBIQVNILCBnb3QgJyVzJzsgQ3JlYXRlVGFibGUgZmFpbHMgd2l0aCBcXFxcXFxcIkludmFsaWQgS2V5U2NoZW1hOiBUaGUgZmlyc3QgS2V5U2NoZW1hRWxlbWVudCBpcyBub3QgYSBIQVNIIGtleSB0eXBlXFxcXFxcXCJcXFwiLCBba3RdKSxcXG5cXHRcXFwiUHV0IHRoZSBwYXJ0aXRpb24ga2V5IChLZXlUeXBlIEhBU0gpIGZpcnN0IGFuZCB0aGUgb3B0aW9uYWwgc29ydCBrZXkgKFJBTkdFKSBzZWNvbmRcXFwiLFxcblxcdF9wZl9kZGJrc2hfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVxcXCIpXFxuXFx0a3QgOj0gX3BmX2RkYmtzaF90eXBlKG5hbWUsIDApXFxuXFx0aXNfc3RyaW5nKGt0KVxcblxcdGt0ICE9IFxcXCJIQVNIXFxcIlxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWtleS1zY2hlbWEtc2hhcGVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLktleVNjaGVtYS4xLktleVR5cGVcXFwiLFxcblxcdHNwcmludGYoXFxcIlRoZSBzZWNvbmQgS2V5U2NoZW1hIGVsZW1lbnQgbXVzdCBiZSBSQU5HRSwgZ290ICclcyc7IENyZWF0ZVRhYmxlIGZhaWxzIHdpdGggXFxcXFxcXCJJbnZhbGlkIEtleVNjaGVtYTogVGhlIHNlY29uZCBLZXlTY2hlbWFFbGVtZW50IGlzIG5vdCBhIFJBTkdFIGtleSB0eXBlXFxcXFxcXCJcXFwiLCBba3RdKSxcXG5cXHRcXFwiVXNlIGV4YWN0bHkgb25lIEhBU0ggZWxlbWVudCwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBvbmUgUkFOR0UgZWxlbWVudFxcXCIsXFxuXFx0X3BmX2RkYmtzaF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6OlRhYmxlXFxcIilcXG5cXHRrdCA6PSBfcGZfZGRia3NoX3R5cGUobmFtZSwgMSlcXG5cXHRpc19zdHJpbmcoa3QpXFxuXFx0a3QgIT0gXFxcIlJBTkdFXFxcIlxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWtleS1zY2hlbWEtc2hhcGVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLktleVNjaGVtYVxcXCIsXFxuXFx0c3ByaW50ZihcXFwiS2V5U2NoZW1hIGNhbiBob2xkIGF0IG1vc3QgMiBlbGVtZW50cyAoSEFTSCArIG9wdGlvbmFsIFJBTkdFKSwgZ290ICVkXFxcIiwgW25dKSxcXG5cXHRcXFwiTW9kZWwgZXh0cmEgYWNjZXNzIHBhdHRlcm5zIGFzIGdsb2JhbCBvciBsb2NhbCBzZWNvbmRhcnkgaW5kZXhlcyBpbnN0ZWFkXFxcIixcXG5cXHRfcGZfZGRia3NoX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcXFwiKVxcblxcdG4gOj0gY291bnQoWzEgfCBzb21lIF8gaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLktleVNjaGVtYVxcXCIpXSlcXG5cXHRuID4gMlxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWR5bmFtb2RiLWtpbmVzaXMtc3RyZWFtLXJlZ2lvblwiLFxuICAgIFwic2VydmljZVwiOiBcImR5bmFtb2RiXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkEgS2luZXNpcyBzdHJlYW1pbmcgZGVzdGluYXRpb24gbXVzdCBiZSBpbiB0aGUgdGFibGUncyByZWdpb25cIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6RHluYW1vREI6OlRhYmxlXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuIyBBIEtpbmVzaXMgRGF0YSBTdHJlYW1zIGRlc3RpbmF0aW9uIG11c3QgbGl2ZSBpbiB0aGUgc2FtZSByZWdpb24gYXMgdGhlXFxuIyB0YWJsZS4gVGhlIGRlcGxveS10aW1lIGZhaWx1cmUgbW9kZSBpcyB1Z2x5OiB0aGUgdGFibGUgaXMgY3JlYXRlZCwgdGhlXFxuIyBzdHJlYW1pbmcgZGVzdGluYXRpb24gbmV2ZXIgc3RhYmlsaXplcywgYW5kIENsb3VkRm9ybWF0aW9uIHJvbGxzIGJhY2sgb25cXG4jIE5vdFN0YWJpbGl6ZWQgbWludXRlcyBsYXRlciDigJQgbm90aGluZyBuYW1lcyB0aGUgcmVnaW9uIG1pc21hdGNoLlxcbiMgZGF0YS5jZGtfcHJlZmxpZ2h0LmRlcGxveV9yZWdpb24gaXMgZGVmaW5lZCBvbmx5IGluIGVuZm9yY2UgbW9kZSB3aXRoIGFcXG4jIGNvbmNyZXRlIHJlZ2lvbjsgb3RoZXJ3aXNlIHRoaXMgcnVsZSBza2lwcy5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLWtpbmVzaXMtc3RyZWFtLXJlZ2lvblxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuS2luZXNpc1N0cmVhbVNwZWNpZmljYXRpb24uU3RyZWFtQXJuXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJUaGUgS2luZXNpcyBzdHJlYW0gbGl2ZXMgaW4gJyVzJyBidXQgdGhlIHRhYmxlIGRlcGxveXMgdG8gJyVzJzsgdGhlIHN0cmVhbWluZyBkZXN0aW5hdGlvbiBuZXZlciBzdGFiaWxpemVzIGFuZCB0aGUgc3RhY2sgcm9sbHMgYmFja1xcXCIsIFtzdHJlYW1SZWdpb24sIHJlZ2lvbl0pLFxcblxcdFxcXCJQb2ludCBLaW5lc2lzU3RyZWFtU3BlY2lmaWNhdGlvbi5TdHJlYW1Bcm4gYXQgYSBzdHJlYW0gaW4gdGhlIHRhYmxlJ3Mgb3duIHJlZ2lvblxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25keW5hbW9kYi9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUva2RzLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVxcXCIpXFxuXFx0cmVnaW9uIDo9IGRhdGEuY2RrX3ByZWZsaWdodC5kZXBsb3lfcmVnaW9uXFxuXFx0aXNfc3RyaW5nKHJlZ2lvbilcXG5cXHRhcm4gOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5LaW5lc2lzU3RyZWFtU3BlY2lmaWNhdGlvbi5TdHJlYW1Bcm5cXFwiKVxcblxcdGlzX3N0cmluZyhhcm4pXFxuXFx0cGFydHMgOj0gc3BsaXQoYXJuLCBcXFwiOlxcXCIpXFxuXFx0Y291bnQocGFydHMpID49IDZcXG5cXHRwYXJ0c1swXSA9PSBcXFwiYXJuXFxcIlxcblxcdHBhcnRzWzJdID09IFxcXCJraW5lc2lzXFxcIlxcblxcdHN0cmVhbVJlZ2lvbiA6PSBwYXJ0c1szXVxcblxcdHN0cmVhbVJlZ2lvbiAhPSBcXFwiXFxcIlxcblxcdHN0cmVhbVJlZ2lvbiAhPSByZWdpb25cXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1keW5hbW9kYi1sc2ktYXR0cmlidXRlLWRlZmluaXRpb25zXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZHluYW1vZGJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiTFNJIGtleSBhdHRyaWJ1dGVzIG11c3QgYmUgZGVmaW5lZCBpbiBBdHRyaWJ1dGVEZWZpbml0aW9uc1wiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG4jIFRoZSBlbmdpbmUncyBFMzAzOSBjaGVja3MgdGFibGUgYW5kIEdTSSBrZXkgc2NoZW1hcyBhZ2FpbnN0XFxuIyBBdHRyaWJ1dGVEZWZpbml0aW9ucyBidXQgaXMgYmxpbmQgdG8gTG9jYWxTZWNvbmRhcnlJbmRleGVzIChtZWFzdXJlZFxcbiMgMjAyNi0wOS0wMiwgMS43LjAtYmV0YSkuIFRoaXMgcnVsZSBjb3ZlcnMgZXhhY3RseSB0aGF0IGdhcC5cXG5cXG5fcGZfZGRibGFkX2RlZnMobmFtZSkgOj0ge2EgfFxcblxcdHNvbWUgZCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuQXR0cmlidXRlRGVmaW5pdGlvbnNcXFwiKVxcblxcdGEgOj0gb2JqZWN0LmdldChkLnZhbHVlLCBcXFwiQXR0cmlidXRlTmFtZVxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKGEpXFxufVxcblxcbiMgSWYgYW55IGRlZmluaXRpb24ncyBuYW1lIGlzIHVucmVzb2x2YWJsZSB0aGUgc2V0IGlzIGluY29tcGxldGUg4oCUIHN0YXkgc2lsZW50Llxcbl9wZl9kZGJsYWRfZGVmc19yZXNvbHZhYmxlKG5hbWUpIGlmIHtcXG5cXHRldmVyeSBkIGluIFt4IHwgc29tZSB4IGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5BdHRyaWJ1dGVEZWZpbml0aW9uc1xcXCIpXSB7XFxuXFx0XFx0aXNfc3RyaW5nKG9iamVjdC5nZXQoZC52YWx1ZSwgXFxcIkF0dHJpYnV0ZU5hbWVcXFwiLCBudWxsKSlcXG5cXHR9XFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGItbHNpLWF0dHJpYnV0ZS1kZWZpbml0aW9uc1xcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5Mb2NhbFNlY29uZGFyeUluZGV4ZXMuJWQuS2V5U2NoZW1hXFxcIiwgW2wuaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJMU0kga2V5IGF0dHJpYnV0ZSAnJXMnIGlzIG5vdCBkZWZpbmVkIGluIEF0dHJpYnV0ZURlZmluaXRpb25zOyBDcmVhdGVUYWJsZSBmYWlscyB3aXRoIFxcXFxcXFwiQW4gYXR0cmlidXRlIHJlZmVyZW5jZWQgaW4gYSBLZXlTY2hlbWEgZWxlbWVudCBpcyBub3QgZGVmaW5lZCBpbiBBdHRyaWJ1dGVEZWZpbml0aW9uc1xcXFxcXFwiXFxcIiwgW2F0dHJdKSxcXG5cXHRcXFwiQWRkIHRoZSBhdHRyaWJ1dGUgdG8gQXR0cmlidXRlRGVmaW5pdGlvbnMgKGFuZCBub3doZXJlIGVsc2U6IG9ubHkga2V5IGF0dHJpYnV0ZXMgYmVsb25nIHRoZXJlKVxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXByb3BlcnRpZXMtZHluYW1vZGItdGFibGUtbG9jYWxzZWNvbmRhcnlpbmRleC5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcXFwiKVxcblxcdGNvdW50KF9wZl9kZGJsYWRfZGVmcyhuYW1lKSkgPiAwXFxuXFx0X3BmX2RkYmxhZF9kZWZzX3Jlc29sdmFibGUobmFtZSlcXG5cXHRzb21lIGwgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkxvY2FsU2Vjb25kYXJ5SW5kZXhlc1xcXCIpXFxuXFx0c29tZSBrIGluIG9iamVjdC5nZXQobC52YWx1ZSwgXFxcIktleVNjaGVtYVxcXCIsIFtdKVxcblxcdGF0dHIgOj0gb2JqZWN0LmdldChrLCBcXFwiQXR0cmlidXRlTmFtZVxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKGF0dHIpXFxuXFx0bm90IGF0dHIgaW4gX3BmX2RkYmxhZF9kZWZzKG5hbWUpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtZHluYW1vZGItbHNpLXNoYXBlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZHluYW1vZGJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQW4gTFNJIG5lZWRzIGEgUkFOR0Uga2V5IGFuZCB0aGUgdGFibGUncyBsZWFkaW5nIGhhc2gga2V5XCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9kZGJsc2hfdXJsIDo9IFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1wcm9wZXJ0aWVzLWR5bmFtb2RiLXRhYmxlLWxvY2Fsc2Vjb25kYXJ5aW5kZXguaHRtbFxcXCJcXG5cXG5fcGZfZGRibHNoX2tleXR5cGVzKGtzKSA6PSB7a3QgfFxcblxcdHNvbWUgayBpbiBrc1xcblxcdGt0IDo9IG9iamVjdC5nZXQoaywgXFxcIktleVR5cGVcXFwiLCBudWxsKVxcblxcdGlzX3N0cmluZyhrdClcXG59XFxuXFxuIyBPbmx5IGp1ZGdlIGEga2V5IHNjaGVtYSB3aG9zZSBLZXlUeXBlcyBhcmUgYWxsIGxpdGVyYWwgc3RyaW5ncy5cXG5fcGZfZGRibHNoX3Jlc29sdmFibGUoa3MpIGlmIGNvdW50KF9wZl9kZGJsc2hfa2V5dHlwZXMoa3MpKSA+IDBcXG5cXG5fcGZfZGRibHNoX3Jlc29sdmFibGVfYWxsKGtzKSBpZiB7XFxuXFx0ZXZlcnkgayBpbiBrcyB7XFxuXFx0XFx0aXNfc3RyaW5nKG9iamVjdC5nZXQoaywgXFxcIktleVR5cGVcXFwiLCBudWxsKSlcXG5cXHR9XFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGItbHNpLXNoYXBlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkxvY2FsU2Vjb25kYXJ5SW5kZXhlcy4lZC5LZXlTY2hlbWFcXFwiLCBbbC5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcIkxvY2FsIHNlY29uZGFyeSBpbmRleCAnJXMnIGhhcyBubyBSQU5HRSBrZXk7IENyZWF0ZVRhYmxlIGZhaWxzIHdpdGggXFxcXFxcXCJJbmRleCBLZXlTY2hlbWEgZG9lcyBub3QgaGF2ZSBhIHJhbmdlIGtleSBmb3IgaW5kZXhcXFxcXFxcIlxcXCIsIFtpbmFtZV0pLFxcblxcdFxcXCJHaXZlIHRoZSBMU0kgYSBzb3J0IGtleTogW3RhYmxlIEhBU0gga2V5LCBpdHMgb3duIFJBTkdFIGtleV1cXFwiLFxcblxcdF9wZl9kZGJsc2hfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVxcXCIpXFxuXFx0c29tZSBsIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5Mb2NhbFNlY29uZGFyeUluZGV4ZXNcXFwiKVxcblxcdGtzIDo9IG9iamVjdC5nZXQobC52YWx1ZSwgXFxcIktleVNjaGVtYVxcXCIsIFtdKVxcblxcdGNvdW50KGtzKSA+IDBcXG5cXHRfcGZfZGRibHNoX3Jlc29sdmFibGVfYWxsKGtzKVxcblxcdG5vdCBcXFwiUkFOR0VcXFwiIGluIF9wZl9kZGJsc2hfa2V5dHlwZXMoa3MpXFxuXFx0aW5hbWUgOj0gb2JqZWN0LmdldChsLnZhbHVlLCBcXFwiSW5kZXhOYW1lXFxcIiwgXFxcIjx1bm5hbWVkPlxcXCIpXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZHluYW1vZGItbHNpLXNoYXBlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkxvY2FsU2Vjb25kYXJ5SW5kZXhlcy4lZC5LZXlTY2hlbWFcXFwiLCBbbC5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcIkxvY2FsIHNlY29uZGFyeSBpbmRleCAnJXMnIHVzZXMgaGFzaCBrZXkgJyVzJyBidXQgdGhlIHRhYmxlJ3MgaGFzaCBrZXkgaXMgJyVzJzsgQ3JlYXRlVGFibGUgZmFpbHMgd2l0aCBcXFxcXFxcIkluZGV4IEtleVNjaGVtYSBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIGxlYWRpbmcgaGFzaCBrZXkgYXMgdGFibGUgS2V5U2NoZW1hXFxcXFxcXCJcXFwiLCBbaW5hbWUsIGxzaUhhc2gsIHRhYmxlSGFzaF0pLFxcblxcdFxcXCJBbiBMU0kgbXVzdCByZXVzZSB0aGUgdGFibGUncyBwYXJ0aXRpb24ga2V5OyB1c2UgYSBnbG9iYWwgc2Vjb25kYXJ5IGluZGV4IGZvciBhIGRpZmZlcmVudCBoYXNoIGtleVxcXCIsXFxuXFx0X3BmX2RkYmxzaF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RHluYW1vREI6OlRhYmxlXFxcIilcXG5cXHRzb21lIHQgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLktleVNjaGVtYVxcXCIpXFxuXFx0dC5pbmRleCA9PSAwXFxuXFx0dGFibGVIYXNoIDo9IG9iamVjdC5nZXQodC52YWx1ZSwgXFxcIkF0dHJpYnV0ZU5hbWVcXFwiLCBudWxsKVxcblxcdGlzX3N0cmluZyh0YWJsZUhhc2gpXFxuXFx0c29tZSBsIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5Mb2NhbFNlY29uZGFyeUluZGV4ZXNcXFwiKVxcblxcdGtzIDo9IG9iamVjdC5nZXQobC52YWx1ZSwgXFxcIktleVNjaGVtYVxcXCIsIFtdKVxcblxcdHNvbWUgayBpbiBrc1xcblxcdG9iamVjdC5nZXQoaywgXFxcIktleVR5cGVcXFwiLCBudWxsKSA9PSBcXFwiSEFTSFxcXCJcXG5cXHRsc2lIYXNoIDo9IG9iamVjdC5nZXQoaywgXFxcIkF0dHJpYnV0ZU5hbWVcXFwiLCBudWxsKVxcblxcdGlzX3N0cmluZyhsc2lIYXNoKVxcblxcdGxzaUhhc2ggIT0gdGFibGVIYXNoXFxuXFx0aW5hbWUgOj0gb2JqZWN0LmdldChsLnZhbHVlLCBcXFwiSW5kZXhOYW1lXFxcIiwgXFxcIjx1bm5hbWVkPlxcXCIpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtZHluYW1vZGItdGFibGUtbmFtZS1sZW5ndGhcIixcbiAgICBcInNlcnZpY2VcIjogXCJkeW5hbW9kYlwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJUYWJsZU5hbWUgbXVzdCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnNcIixcbiAgICBcInVwc3RyZWFtXCI6IFwicGVuZGluZy1lbmdpbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkR5bmFtb0RCOjpUYWJsZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgT25seSB0aGUgbWVhc3VyZWQgYm91bmQgKG1pbmltdW0gMyBjaGFyYWN0ZXJzKSBpcyBlbmZvcmNlZC4gVGhlIDI1NS1jaGFyXFxuIyBtYXhpbXVtIGFuZCB0aGUgY2hhcmFjdGVyIHBhdHRlcm4gd2VyZSBub3QgbWVhc3VyZWQuIE5vdGUgcmVzb2x2ZSgpIHR1cm5zIGFcXG4jIFJlZi10by1yZXNvdXJjZSBpbnRvIHRoZSB0YXJnZXQncyBsb2dpY2FsIElEOyBhIGxvZ2ljYWwgSUQgc2hvcnQgZW5vdWdoIHRvXFxuIyB0cmlwIHRoaXMgcnVsZSB3aGlsZSBmZWVkaW5nIGEgVGFibGVOYW1lIGlzIHRyZWF0ZWQgYXMgdGhlIGJ1ZyBpdCBhbG1vc3RcXG4jIGNlcnRhaW5seSBpcy5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWR5bmFtb2RiLXRhYmxlLW5hbWUtbGVuZ3RoXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5UYWJsZU5hbWVcXFwiLFxcblxcdHNwcmludGYoXFxcIlRhYmxlTmFtZSAnJXMnIGlzIHNob3J0ZXIgdGhhbiAzIGNoYXJhY3RlcnM7IENyZWF0ZVRhYmxlIGZhaWxzIHdpdGggXFxcXFxcXCJNZW1iZXIgbXVzdCBoYXZlIGxlbmd0aCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gM1xcXFxcXFwiXFxcIiwgW3RuXSksXFxuXFx0XFxcIlVzZSBhIHRhYmxlIG5hbWUgb2YgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzLCBvciBvbWl0IFRhYmxlTmFtZSBhbmQgbGV0IENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlIG9uZVxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25keW5hbW9kYi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVUYWJsZS5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcXFwiKVxcblxcdHRuIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVGFibGVOYW1lXFxcIilcXG5cXHRpc19zdHJpbmcodG4pXFxuXFx0Y291bnQodG4pIDwgM1xcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWVjMi1zZy1wb3J0LXJhbmdlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZWMyXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIlNlY3VyaXR5IGdyb3VwIFRDUC9VRFAgcG9ydHMgbXVzdCBiZSB3aXRoaW4gMC02NTUzNSBhbmQgRnJvbVBvcnQgPD0gVG9Qb3J0XCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkVDMjo6U2VjdXJpdHlHcm91cFwiLFxuICAgICAgXCJBV1M6OkVDMjo6U2VjdXJpdHlHcm91cEluZ3Jlc3NcIixcbiAgICAgIFwiQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXBFZ3Jlc3NcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfc2dfZml4IDo9IFxcXCJVc2UgYSBwb3J0IGJldHdlZW4gMCBhbmQgNjU1MzUgd2l0aCBGcm9tUG9ydCA8PSBUb1BvcnRcXFwiXFxuXFxuX3BmX3NnX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9BdXRob3JpemVTZWN1cml0eUdyb3VwSW5ncmVzcy5odG1sXFxcIlxcblxcbl9wZl9wb3J0X291dChuKSBpZiBuIDwgMFxcblxcbl9wZl9wb3J0X291dChuKSBpZiBuID4gNjU1MzVcXG5cXG5fcGZfdGNwX3VkcChwKSBpZiBwIGluIHtcXFwidGNwXFxcIiwgXFxcInVkcFxcXCIsIFxcXCI2XFxcIiwgXFxcIjE3XFxcIiwgNiwgMTd9XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lYzItc2ctcG9ydC1yYW5nZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy4lcy4lZC4lc1xcXCIsIFtkaXIsIGl0ZW0uaW5kZXgsIHBuYW1lXSksXFxuXFx0c3ByaW50ZihcXFwiJXMgJXYgaXMgb3V0c2lkZSB0aGUgdmFsaWQgVENQL1VEUCBwb3J0IHJhbmdlIDAtNjU1MzVcXFwiLCBbcG5hbWUsIG5dKSxcXG5cXHRfcGZfc2dfZml4LCBfcGZfc2dfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkVDMjo6U2VjdXJpdHlHcm91cFxcXCIpXFxuXFx0c29tZSBkaXIgaW4ge1xcXCJTZWN1cml0eUdyb3VwSW5ncmVzc1xcXCIsIFxcXCJTZWN1cml0eUdyb3VwRWdyZXNzXFxcIn1cXG5cXHRzb21lIGl0ZW0gaW4gZmxhdHRlbl9saXN0KG5hbWUsIHNwcmludGYoXFxcIlByb3BlcnRpZXMuJXNcXFwiLCBbZGlyXSkpXFxuXFx0ZW50cnkgOj0gaXRlbS52YWx1ZVxcblxcdGlzX29iamVjdChlbnRyeSlcXG5cXHRfcGZfdGNwX3VkcChvYmplY3QuZ2V0KGVudHJ5LCBcXFwiSXBQcm90b2NvbFxcXCIsIG51bGwpKVxcblxcdHNvbWUgcG5hbWUgaW4ge1xcXCJGcm9tUG9ydFxcXCIsIFxcXCJUb1BvcnRcXFwifVxcblxcdG4gOj0gdG9fbnVtYmVyKG9iamVjdC5nZXQoZW50cnksIHBuYW1lLCBudWxsKSlcXG5cXHRfcGZfcG9ydF9vdXQobilcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lYzItc2ctcG9ydC1yYW5nZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy4lcy4lZC5Gcm9tUG9ydFxcXCIsIFtkaXIsIGl0ZW0uaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJGcm9tUG9ydCAoJXYpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFRvUG9ydCAoJXYpXFxcIiwgW2YsIHRdKSxcXG5cXHRfcGZfc2dfZml4LCBfcGZfc2dfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkVDMjo6U2VjdXJpdHlHcm91cFxcXCIpXFxuXFx0c29tZSBkaXIgaW4ge1xcXCJTZWN1cml0eUdyb3VwSW5ncmVzc1xcXCIsIFxcXCJTZWN1cml0eUdyb3VwRWdyZXNzXFxcIn1cXG5cXHRzb21lIGl0ZW0gaW4gZmxhdHRlbl9saXN0KG5hbWUsIHNwcmludGYoXFxcIlByb3BlcnRpZXMuJXNcXFwiLCBbZGlyXSkpXFxuXFx0ZW50cnkgOj0gaXRlbS52YWx1ZVxcblxcdGlzX29iamVjdChlbnRyeSlcXG5cXHRfcGZfdGNwX3VkcChvYmplY3QuZ2V0KGVudHJ5LCBcXFwiSXBQcm90b2NvbFxcXCIsIG51bGwpKVxcblxcdGYgOj0gdG9fbnVtYmVyKG9iamVjdC5nZXQoZW50cnksIFxcXCJGcm9tUG9ydFxcXCIsIG51bGwpKVxcblxcdHQgOj0gdG9fbnVtYmVyKG9iamVjdC5nZXQoZW50cnksIFxcXCJUb1BvcnRcXFwiLCBudWxsKSlcXG5cXHRmID49IDBcXG5cXHR0IDw9IDY1NTM1XFxuXFx0ZiA+IHRcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lYzItc2ctcG9ydC1yYW5nZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy4lc1xcXCIsIFtwbmFtZV0pLFxcblxcdHNwcmludGYoXFxcIiVzICV2IGlzIG91dHNpZGUgdGhlIHZhbGlkIFRDUC9VRFAgcG9ydCByYW5nZSAwLTY1NTM1XFxcIiwgW3BuYW1lLCBuXSksXFxuXFx0X3BmX3NnX2ZpeCwgX3BmX3NnX3VybCkgaWYge1xcblxcdHNvbWUgcnR5cGUgaW4ge1xcXCJBV1M6OkVDMjo6U2VjdXJpdHlHcm91cEluZ3Jlc3NcXFwiLCBcXFwiQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXBFZ3Jlc3NcXFwifVxcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShydHlwZSlcXG5cXHRfcGZfdGNwX3VkcChyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLklwUHJvdG9jb2xcXFwiKSlcXG5cXHRzb21lIHBuYW1lIGluIHtcXFwiRnJvbVBvcnRcXFwiLCBcXFwiVG9Qb3J0XFxcIn1cXG5cXHRuIDo9IHRvX251bWJlcihyZXNvbHZlKG5hbWUsIHNwcmludGYoXFxcIlByb3BlcnRpZXMuJXNcXFwiLCBbcG5hbWVdKSkpXFxuXFx0X3BmX3BvcnRfb3V0KG4pXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWMyLXNnLXBvcnQtcmFuZ2VcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLkZyb21Qb3J0XFxcIixcXG5cXHRzcHJpbnRmKFxcXCJGcm9tUG9ydCAoJXYpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFRvUG9ydCAoJXYpXFxcIiwgW2YsIHRdKSxcXG5cXHRfcGZfc2dfZml4LCBfcGZfc2dfdXJsKSBpZiB7XFxuXFx0c29tZSBydHlwZSBpbiB7XFxcIkFXUzo6RUMyOjpTZWN1cml0eUdyb3VwSW5ncmVzc1xcXCIsIFxcXCJBV1M6OkVDMjo6U2VjdXJpdHlHcm91cEVncmVzc1xcXCJ9XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKHJ0eXBlKVxcblxcdF9wZl90Y3BfdWRwKHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuSXBQcm90b2NvbFxcXCIpKVxcblxcdGYgOj0gdG9fbnVtYmVyKHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuRnJvbVBvcnRcXFwiKSlcXG5cXHR0IDo9IHRvX251bWJlcihyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlRvUG9ydFxcXCIpKVxcblxcdGYgPj0gMFxcblxcdHQgPD0gNjU1MzVcXG5cXHRmID4gdFxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWVjMi11c2VyZGF0YS1zaXplXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZWMyXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkVDMiB1c2VyIGRhdGEgaXMgbGltaXRlZCB0byAxNjM4NCBieXRlc1wiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpFQzI6Okluc3RhbmNlXCIsXG4gICAgICBcIkFXUzo6RUMyOjpMYXVuY2hUZW1wbGF0ZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl91ZHN6X2ZpeCA6PSBcXFwiS2VlcCB1c2VyIGRhdGEgdW5kZXIgMTYzODQgYnl0ZXM7IG1vdmUgbGFyZ2UgcGF5bG9hZHMgdG8gUzMgYW5kIGZldGNoIHRoZW0gZnJvbSBhIHNtYWxsIGJvb3RzdHJhcCBzY3JpcHRcXFwiXFxuXFxuX3BmX3Vkc3pfdXJsIDo9IFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaW5zdGFuY2VkYXRhLWFkZC11c2VyLWRhdGEuaHRtbFxcXCJcXG5cXG5fcGZfdWRzel9saW1pdCA6PSAxNjM4NFxcblxcbiMgYmFzZTY0IOaWh+Wtl+WIl+OBruODh+OCs+ODvOODieW+jOODkOOCpOODiOaVsO+8iOODkeODh+OCo+ODs+OCsOiAg+aFru+8iVxcbl9wZl91ZHN6X2RlY29kZWQocykgOj0gKChjb3VudChzKSAqIDMpIC8gNCkgLSAyIGlmIGVuZHN3aXRoKHMsIFxcXCI9PVxcXCIpXFxuXFxuX3BmX3Vkc3pfZGVjb2RlZChzKSA6PSAoKGNvdW50KHMpICogMykgLyA0KSAtIDEgaWYge1xcblxcdGVuZHN3aXRoKHMsIFxcXCI9XFxcIilcXG5cXHRub3QgZW5kc3dpdGgocywgXFxcIj09XFxcIilcXG59XFxuXFxuX3BmX3Vkc3pfZGVjb2RlZChzKSA6PSAoY291bnQocykgKiAzKSAvIDQgaWYgbm90IGVuZHN3aXRoKHMsIFxcXCI9XFxcIilcXG5cXG5fcGZfdWRzel9wYXRocyA6PSB7XFxuXFx0XFxcIkFXUzo6RUMyOjpJbnN0YW5jZVxcXCI6IFxcXCJQcm9wZXJ0aWVzLlVzZXJEYXRhXFxcIixcXG5cXHRcXFwiQVdTOjpFQzI6OkxhdW5jaFRlbXBsYXRlXFxcIjogXFxcIlByb3BlcnRpZXMuTGF1bmNoVGVtcGxhdGVEYXRhLlVzZXJEYXRhXFxcIixcXG59XFxuXFxuIyBVc2VyRGF0YSDjgYzjg6rjg4bjg6njg6sgYmFzZTY0IOaWh+Wtl+WIl+OBruOCseODvOOCuVxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWMyLXVzZXJkYXRhLXNpemVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLCBwLFxcblxcdHNwcmludGYoXFxcIlVzZXJEYXRhIGRlY29kZXMgdG8gYWJvdXQgJXYgYnl0ZXMsIGJ1dCBFQzIgbGltaXRzIHVzZXIgZGF0YSB0byAlZCBieXRlczsgUnVuSW5zdGFuY2VzIGZhaWxzIGF0IGRlcGxveSB0aW1lXFxcIiwgW3NpemUsIF9wZl91ZHN6X2xpbWl0XSksXFxuXFx0X3BmX3Vkc3pfZml4LCBfcGZfdWRzel91cmwpIGlmIHtcXG5cXHRzb21lIHJ0eXBlLCBwIGluIF9wZl91ZHN6X3BhdGhzXFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKHJ0eXBlKVxcblxcdHVkIDo9IHJlc29sdmUobmFtZSwgcClcXG5cXHRpc19zdHJpbmcodWQpXFxuXFx0c2l6ZSA6PSBfcGZfdWRzel9kZWNvZGVkKHVkKVxcblxcdHNpemUgPiBfcGZfdWRzel9saW1pdFxcbn1cXG5cXG4jIFVzZXJEYXRhIOOBjCB7XFxcIkZuOjpCYXNlNjRcXFwiOiBcXFwiPGxpdGVyYWw+XFxcIn0g44Gu44Kx44O844K577yI44Ko44Oz44Kz44O844OJ5YmN44Gu55Sf44OQ44Kk44OI5pWw44Gn5Yik5a6a77yJXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lYzItdXNlcmRhdGEtc2l6ZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsIHAsXFxuXFx0c3ByaW50ZihcXFwiVXNlckRhdGEgaXMgJWQgYnl0ZXMgYmVmb3JlIGJhc2U2NCBlbmNvZGluZywgYnV0IEVDMiBsaW1pdHMgdXNlciBkYXRhIHRvICVkIGJ5dGVzOyBSdW5JbnN0YW5jZXMgZmFpbHMgYXQgZGVwbG95IHRpbWVcXFwiLCBbY291bnQoaW5uZXIpLCBfcGZfdWRzel9saW1pdF0pLFxcblxcdF9wZl91ZHN6X2ZpeCwgX3BmX3Vkc3pfdXJsKSBpZiB7XFxuXFx0c29tZSBydHlwZSwgcCBpbiBfcGZfdWRzel9wYXRoc1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShydHlwZSlcXG5cXHR1ZCA6PSByZXNvbHZlKG5hbWUsIHApXFxuXFx0aXNfb2JqZWN0KHVkKVxcblxcdGlubmVyIDo9IG9iamVjdC5nZXQodWQsIFxcXCJGbjo6QmFzZTY0XFxcIiwgbnVsbClcXG5cXHRpc19zdHJpbmcoaW5uZXIpXFxuXFx0Y291bnQoaW5uZXIpID4gX3BmX3Vkc3pfbGltaXRcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1lYzItdm9sdW1lLWlvcHNcIixcbiAgICBcInNlcnZpY2VcIjogXCJlYzJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiRUJTIElvcHMvVGhyb3VnaHB1dCBtdXN0IG1hdGNoIHRoZSB2b2x1bWUgdHlwZSdzIHN1cHBvcnRlZCByYW5nZXMgYW5kIHJhdGlvc1wiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpFQzI6OlZvbHVtZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl92b2xpb3BzX2ZpeCA6PSBcXFwiTWF0Y2ggSW9wcy9UaHJvdWdocHV0IHRvIHRoZSB2b2x1bWUgdHlwZTogZ3AzIDMwMDAtODAwMDAgSU9QUyAobWF4IDUwMC9HaUIsIHRocm91Z2hwdXQgMTI1LTIwMDAgTWlCL3MgYW5kIGF0IG1vc3QgSU9QUy80KSwgaW8xIDEwMC02NDAwMCAobWF4IDUwL0dpQiksIGlvMiAxMDAtMjU2MDAwIChtYXggMTAwMC9HaUIpOyBncDIvc3QxL3NjMS9zdGFuZGFyZCBhY2NlcHQgbmVpdGhlciBwcm9wZXJ0eVxcXCJcXG5cXG5fcGZfdm9saW9wc191cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lYnMvbGF0ZXN0L3VzZXJndWlkZS9lYnMtdm9sdW1lLXR5cGVzLmh0bWxcXFwiXFxuXFxuX3BmX3ZvbGlvcHNfcmFuZ2UgOj0ge1xcXCJncDNcXFwiOiBbMzAwMCwgODAwMDBdLCBcXFwiaW8xXFxcIjogWzEwMCwgNjQwMDBdLCBcXFwiaW8yXFxcIjogWzEwMCwgMjU2MDAwXX1cXG5cXG5fcGZfdm9saW9wc19wZXJfZ2liIDo9IHtcXFwiZ3AzXFxcIjogNTAwLCBcXFwiaW8xXFxcIjogNTAsIFxcXCJpbzJcXFwiOiAxMDAwfVxcblxcbl9wZl92b2xpb3BzX291dChuLCBsbywgaGkpIGlmIG4gPCBsb1xcblxcbl9wZl92b2xpb3BzX291dChuLCBsbywgaGkpIGlmIG4gPiBoaVxcblxcbl9wZl92b2xpb3BzX2hhc19pb3BzKG5hbWUpIGlmIHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuSW9wc1xcXCIpXFxuXFxuIyBJT1BTIOOBjOWei+OBlOOBqOOBrue1tuWvvuODrOODs+OCuOWkllxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWMyLXZvbHVtZS1pb3BzXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSwgXFxcIlByb3BlcnRpZXMuSW9wc1xcXCIsXFxuXFx0c3ByaW50ZihcXFwiSW9wcyAldiBpcyBvdXRzaWRlIHRoZSBzdXBwb3J0ZWQgcmFuZ2UgJWQtJWQgZm9yICVzIHZvbHVtZXNcXFwiLCBbbiwgclswXSwgclsxXSwgdnRdKSxcXG5cXHRfcGZfdm9saW9wc19maXgsIF9wZl92b2xpb3BzX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFQzI6OlZvbHVtZVxcXCIpXFxuXFx0dnQgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Wb2x1bWVUeXBlXFxcIilcXG5cXHRyIDo9IF9wZl92b2xpb3BzX3JhbmdlW3Z0XVxcblxcdG4gOj0gdG9fbnVtYmVyKHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuSW9wc1xcXCIpKVxcblxcdF9wZl92b2xpb3BzX291dChuLCByWzBdLCByWzFdKVxcbn1cXG5cXG4jIElPUFMgOiDjgrXjgqTjgrrmr5Tjga7otoXpgY5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWVjMi12b2x1bWUtaW9wc1xcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsIFxcXCJQcm9wZXJ0aWVzLklvcHNcXFwiLFxcblxcdHNwcmludGYoXFxcIklvcHMgJXYgZXhjZWVkcyB0aGUgbWF4aW11bSByYXRpbyBvZiAlZCBJT1BTIHBlciBHaUIgZm9yICVzIChTaXplICV2IEdpQiBhbGxvd3MgYXQgbW9zdCAldilcXFwiLCBbbiwgcmF0aW8sIHZ0LCBzLCBzICogcmF0aW9dKSxcXG5cXHRfcGZfdm9saW9wc19maXgsIF9wZl92b2xpb3BzX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFQzI6OlZvbHVtZVxcXCIpXFxuXFx0dnQgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Wb2x1bWVUeXBlXFxcIilcXG5cXHRyYXRpbyA6PSBfcGZfdm9saW9wc19wZXJfZ2liW3Z0XVxcblxcdG4gOj0gdG9fbnVtYmVyKHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuSW9wc1xcXCIpKVxcblxcdHMgOj0gdG9fbnVtYmVyKHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuU2l6ZVxcXCIpKVxcblxcdG4gPiBzICogcmF0aW9cXG59XFxuXFxuIyBJb3BzIOOCkuWPl+OBkeS7mOOBkeOBquOBhOWei+OBqyBJb3BzIOOCkuaMh+WumlxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWMyLXZvbHVtZS1pb3BzXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSwgXFxcIlByb3BlcnRpZXMuSW9wc1xcXCIsXFxuXFx0c3ByaW50ZihcXFwiSW9wcyBpcyBub3Qgc3VwcG9ydGVkIGZvciAlcyB2b2x1bWVzICh2YWxpZCBvbmx5IGZvciBncDMsIGlvMSwgaW8yKTsgRUMyIHJlamVjdHMgdGhlIENyZWF0ZVZvbHVtZSBjYWxsXFxcIiwgW3Z0XSksXFxuXFx0X3BmX3ZvbGlvcHNfZml4LCBfcGZfdm9saW9wc191cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUMyOjpWb2x1bWVcXFwiKVxcblxcdHZ0IDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVm9sdW1lVHlwZVxcXCIpXFxuXFx0dnQgaW4ge1xcXCJncDJcXFwiLCBcXFwic3QxXFxcIiwgXFxcInNjMVxcXCIsIFxcXCJzdGFuZGFyZFxcXCJ9XFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Jb3BzXFxcIilcXG59XFxuXFxuIyBUaHJvdWdocHV0IOOBryBncDMg5bCC55SoXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lYzItdm9sdW1lLWlvcHNcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLCBcXFwiUHJvcGVydGllcy5UaHJvdWdocHV0XFxcIixcXG5cXHRzcHJpbnRmKFxcXCJUaHJvdWdocHV0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yICVzIHZvbHVtZXMgKHZhbGlkIG9ubHkgZm9yIGdwMyk7IEVDMiByZWplY3RzIHRoZSBDcmVhdGVWb2x1bWUgY2FsbFxcXCIsIFt2dF0pLFxcblxcdF9wZl92b2xpb3BzX2ZpeCwgX3BmX3ZvbGlvcHNfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkVDMjo6Vm9sdW1lXFxcIilcXG5cXHR2dCA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlZvbHVtZVR5cGVcXFwiKVxcblxcdGlzX3N0cmluZyh2dClcXG5cXHR2dCAhPSBcXFwiZ3AzXFxcIlxcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVGhyb3VnaHB1dFxcXCIpXFxufVxcblxcbiMgZ3AzIFRocm91Z2hwdXQg44Gu57W25a++44Os44Oz44K4XFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lYzItdm9sdW1lLWlvcHNcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLCBcXFwiUHJvcGVydGllcy5UaHJvdWdocHV0XFxcIixcXG5cXHRzcHJpbnRmKFxcXCJUaHJvdWdocHV0ICV2IE1pQi9zIGlzIG91dHNpZGUgdGhlIHN1cHBvcnRlZCByYW5nZSAxMjUtMjAwMCBmb3IgZ3AzIHZvbHVtZXNcXFwiLCBbdF0pLFxcblxcdF9wZl92b2xpb3BzX2ZpeCwgX3BmX3ZvbGlvcHNfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkVDMjo6Vm9sdW1lXFxcIilcXG5cXHRyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlZvbHVtZVR5cGVcXFwiKSA9PSBcXFwiZ3AzXFxcIlxcblxcdHQgOj0gdG9fbnVtYmVyKHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVGhyb3VnaHB1dFxcXCIpKVxcblxcdF9wZl92b2xpb3BzX291dCh0LCAxMjUsIDIwMDApXFxufVxcblxcbiMgZ3AzIFRocm91Z2hwdXQgOiBJT1BTIOavlO+8iOacgOWkpyAwLjI1IE1pQi9zIHBlciBJT1BT77yJXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lYzItdm9sdW1lLWlvcHNcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLCBcXFwiUHJvcGVydGllcy5UaHJvdWdocHV0XFxcIixcXG5cXHRzcHJpbnRmKFxcXCJUaHJvdWdocHV0ICV2IE1pQi9zIGV4Y2VlZHMgdGhlIG1heGltdW0gcmF0aW8gb2YgMC4yNSBNaUIvcyBwZXIgcHJvdmlzaW9uZWQgSU9QUyAoJXYgSU9QUyBhbGxvd3MgYXQgbW9zdCAldilcXFwiLCBbdCwgbiwgbiAvIDRdKSxcXG5cXHRfcGZfdm9saW9wc19maXgsIF9wZl92b2xpb3BzX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFQzI6OlZvbHVtZVxcXCIpXFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Wb2x1bWVUeXBlXFxcIikgPT0gXFxcImdwM1xcXCJcXG5cXHR0IDo9IHRvX251bWJlcihyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlRocm91Z2hwdXRcXFwiKSlcXG5cXHRuIDo9IHRvX251bWJlcihyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLklvcHNcXFwiKSlcXG5cXHR0ICogNCA+IG5cXG59XFxuXFxuIyBncDMg44GnIElvcHMg5pyq5oyH5a6a77yI44OH44OV44Kp44Or44OIIDMwMDDvvInjga7jgajjgY3jga4gVGhyb3VnaHB1dCDmr5RcXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWVjMi12b2x1bWUtaW9wc1xcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlRocm91Z2hwdXRcXFwiLFxcblxcdHNwcmludGYoXFxcIlRocm91Z2hwdXQgJXYgTWlCL3MgZXhjZWVkcyA3NTAsIHRoZSBtYXhpbXVtIGZvciB0aGUgZGVmYXVsdCAzMDAwIElPUFMgKDAuMjUgTWlCL3MgcGVyIElPUFMpOyBwcm92aXNpb24gSW9wcyBleHBsaWNpdGx5IG9yIGxvd2VyIHRoZSB0aHJvdWdocHV0XFxcIiwgW3RdKSxcXG5cXHRfcGZfdm9saW9wc19maXgsIF9wZl92b2xpb3BzX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFQzI6OlZvbHVtZVxcXCIpXFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Wb2x1bWVUeXBlXFxcIikgPT0gXFxcImdwM1xcXCJcXG5cXHRub3QgX3BmX3ZvbGlvcHNfaGFzX2lvcHMobmFtZSlcXG5cXHR0IDo9IHRvX251bWJlcihyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlRocm91Z2hwdXRcXFwiKSlcXG5cXHR0ID4gNzUwXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtZWNzLWNvbnRhaW5lci1kZWZpbml0aW9ucy1lbXB0eVwiLFxuICAgIFwic2VydmljZVwiOiBcImVjc1wiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJDb250YWluZXJEZWZpbml0aW9ucyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNvbnRhaW5lclwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJwZW5kaW5nLWVuZ2luZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6RUNTOjpUYXNrRGVmaW5pdGlvblwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9lY3NjZGVfdXJsIDo9IFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1yZXNvdXJjZS1lY3MtdGFza2RlZmluaXRpb24uaHRtbFxcXCJcXG5cXG5fcGZfZWNzY2RlX21zZyA6PSBcXFwiUmVnaXN0ZXJUYXNrRGVmaW5pdGlvbiBuZWVkcyBhdCBsZWFzdCBvbmUgY29udGFpbmVyOyB0aGUgc2VydmljZSBmYWlscyB3aXRoIFxcXFxcXFwiQ29udGFpbmVyIGxpc3QgY2Fubm90IGJlIGVtcHR5XFxcXFxcXCJcXFwiXFxuXFxuX3BmX2Vjc2NkZV9maXggOj0gXFxcIkFkZCBhdCBsZWFzdCBvbmUgZW50cnkgdG8gQ29udGFpbmVyRGVmaW5pdGlvbnNcXFwiXFxuXFxuIyBUaGUgcmVnaXN0cnkgc2NoZW1hIG1hcmtzIG5vIFRhc2tEZWZpbml0aW9uIHByb3BlcnR5IGFzIHJlcXVpcmVkLCBzbyBhblxcbiMgYWJzZW50IG9yIGVtcHR5IENvbnRhaW5lckRlZmluaXRpb25zIHNhaWxzIHRocm91Z2ggc2NoZW1hIHZhbGlkYXRpb24gYW5kXFxuIyBkaWVzIGF0IHJlZ2lzdHJhdGlvbi4gZmxhdHRlbl9saXN0IHJldHVybnMgYW4gZW1wdHkgbGlzdCBmb3IgYWJzZW50IGFuZFxcbiMgZW1wdHkgYWxpa2UsIHNvIGJvdGggYmxvY2tzIHJlYWQgdGhlIHByZXByb2Nlc3NlZCBkb2N1bWVudCAoaW5wdXQucmVzb3VyY2VzKVxcbiMgdG8gdGVsbCBhIGxpdGVyYWwgZW1wdHkgbGlzdCBmcm9tIGFuIHVucmVzb2x2YWJsZSB2YWx1ZSBzdWNoIGFzIEZuOjpJZi5cXG5fcGZfZWNzY2RlX3Byb3BzKG5hbWUpIDo9IHByb3BzIGlmIHtcXG5cXHRwcm9wcyA6PSBpbnB1dC5yZXNvdXJjZXNbbmFtZV0ucHJvcGVydGllc1xcblxcdGlzX29iamVjdChwcm9wcylcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lY3MtY29udGFpbmVyLWRlZmluaXRpb25zLWVtcHR5XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllc1xcXCIsXFxuXFx0X3BmX2Vjc2NkZV9tc2csXFxuXFx0X3BmX2Vjc2NkZV9maXgsXFxuXFx0X3BmX2Vjc2NkZV91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUNTOjpUYXNrRGVmaW5pdGlvblxcXCIpXFxuXFx0cHJvcHMgOj0gX3BmX2Vjc2NkZV9wcm9wcyhuYW1lKVxcblxcdG9iamVjdC5nZXQocHJvcHMsIFxcXCJDb250YWluZXJEZWZpbml0aW9uc1xcXCIsIFxcXCJfX3BmX2Fic2VudFxcXCIpID09IFxcXCJfX3BmX2Fic2VudFxcXCJcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lY3MtY29udGFpbmVyLWRlZmluaXRpb25zLWVtcHR5XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5Db250YWluZXJEZWZpbml0aW9uc1xcXCIsXFxuXFx0X3BmX2Vjc2NkZV9tc2csXFxuXFx0X3BmX2Vjc2NkZV9maXgsXFxuXFx0X3BmX2Vjc2NkZV91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUNTOjpUYXNrRGVmaW5pdGlvblxcXCIpXFxuXFx0cHJvcHMgOj0gX3BmX2Vjc2NkZV9wcm9wcyhuYW1lKVxcblxcdHJhdyA6PSBvYmplY3QuZ2V0KHByb3BzLCBcXFwiQ29udGFpbmVyRGVmaW5pdGlvbnNcXFwiLCBudWxsKVxcblxcdGlzX2FycmF5KHJhdylcXG5cXHRjb3VudChyYXcpID09IDBcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1lY3MtY29udGFpbmVyLW1lbW9yeS1vdmVyLXRhc2tcIixcbiAgICBcInNlcnZpY2VcIjogXCJlY3NcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQSBjb250YWluZXIgTWVtb3J5IG11c3Qgbm90IGV4Y2VlZCB0aGUgdGFzay1sZXZlbCBNZW1vcnlcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6RUNTOjpUYXNrRGVmaW5pdGlvblwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgQSBzaW5nbGUgY29udGFpbmVyJ3MgaGFyZCBNZW1vcnkgbGltaXQgY2Fubm90IGV4Y2VlZCB0aGUgdGFzay1sZXZlbCBNZW1vcnkuXFxuIyBUYXNrIE1lbW9yeSBhcnJpdmVzIGFzIGEgc3RyaW5nIChcXFwiNTEyXFxcIik7IHRvX251bWJlciBjb3ZlcnMgYm90aCBzcGVsbGluZ3MgYW5kXFxuIyBtYWtlcyB0aGUgcnVsZSBza2lwIHdoZW4gZWl0aGVyIHNpZGUgaXMgdW5yZXNvbHZhYmxlIG9yIEdCLXN1ZmZpeGVkLlxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWNzLWNvbnRhaW5lci1tZW1vcnktb3Zlci10YXNrXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkNvbnRhaW5lckRlZmluaXRpb25zLiVkLk1lbW9yeVxcXCIsIFtjLmluZGV4XSksXFxuXFx0c3ByaW50ZihcXFwiQ29udGFpbmVyICclcycgc2V0cyBNZW1vcnkgJXYgYWJvdmUgdGhlIHRhc2stbGV2ZWwgTWVtb3J5ICV2OyBSZWdpc3RlclRhc2tEZWZpbml0aW9uIGZhaWxzIHdpdGggXFxcXFxcXCJUaGUgJ21lbW9yeScgc2V0dGluZyBmb3IgY29udGFpbmVyICclcycgaXMgZ3JlYXRlciB0aGFuIGZvciB0aGUgdGFza1xcXFxcXFwiXFxcIiwgW2NuYW1lLCBjbSwgdG0sIGNuYW1lXSksXFxuXFx0XFxcIkxvd2VyIHRoZSBjb250YWluZXIgTWVtb3J5IHRvIGF0IG1vc3QgdGhlIHRhc2stbGV2ZWwgTWVtb3J5LCBvciByYWlzZSB0aGUgdGFzay1sZXZlbCBNZW1vcnlcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1yZXNvdXJjZS1lY3MtdGFza2RlZmluaXRpb24uaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUNTOjpUYXNrRGVmaW5pdGlvblxcXCIpXFxuXFx0dG0gOj0gdG9fbnVtYmVyKHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuTWVtb3J5XFxcIikpXFxuXFx0c29tZSBjIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5Db250YWluZXJEZWZpbml0aW9uc1xcXCIpXFxuXFx0aXNfb2JqZWN0KGMudmFsdWUpXFxuXFx0Y20gOj0gdG9fbnVtYmVyKG9iamVjdC5nZXQoYy52YWx1ZSwgXFxcIk1lbW9yeVxcXCIsIG51bGwpKVxcblxcdGNtID4gdG1cXG5cXHRjbmFtZSA6PSBvYmplY3QuZ2V0KGMudmFsdWUsIFxcXCJOYW1lXFxcIiwgXFxcIjx1bm5hbWVkPlxcXCIpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtZWNzLWNvbnRhaW5lci1tZW1vcnktcmVxdWlyZWRcIixcbiAgICBcInNlcnZpY2VcIjogXCJlY3NcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQSBjb250YWluZXIgbmVlZHMgTWVtb3J5IG9yIE1lbW9yeVJlc2VydmF0aW9uIHdoZW4gdGhlIHRhc2sgc2V0cyBubyBNZW1vcnlcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6RUNTOjpUYXNrRGVmaW5pdGlvblwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9lY3NtZW1yZXFfdXJsIDo9IFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1wcm9wZXJ0aWVzLWVjcy10YXNrZGVmaW5pdGlvbi1jb250YWluZXJkZWZpbml0aW9uLmh0bWxcXFwiXFxuXFxuIyBXaGVuIHRoZSB0YXNrIGRlZmluaXRpb24gaGFzIG5vIHRhc2stbGV2ZWwgTWVtb3J5LCBldmVyeSBjb250YWluZXIgbXVzdCBzZXRcXG4jIE1lbW9yeSBvciBNZW1vcnlSZXNlcnZhdGlvbi4gUHJvdmluZyB0cnVlIGFic2VuY2UgbmVlZHMgdGhlIHByZXByb2Nlc3NlZFxcbiMgZG9jdW1lbnQgKGlucHV0LnJlc291cmNlcyk6IHJlc29sdmUoKSBpcyB1bmRlZmluZWQgZm9yIGEgbWlzc2luZyBrZXkgYW5kIGZvclxcbiMgYW4gdW5yZXNvbHZhYmxlIHZhbHVlIGFsaWtlLCBzbyBpdCBjYW5ub3QgdGVsbCBcXFwiYWJzZW50XFxcIiBmcm9tIFxcXCJSZWYgdG8gYVxcbiMgcGFyYW1ldGVyXFxcIi4gVGhlIGlzX29iamVjdCBndWFyZCBmYWlscyBjbG9zZWQgaWYgdGhhdCBpbnRlcm5hbCBzaGFwZSBjaGFuZ2VzLlxcbl9wZl9lY3NtZW1yZXFfdGFza19tZW1vcnlfYWJzZW50KG5hbWUpIGlmIHtcXG5cXHRwcm9wcyA6PSBpbnB1dC5yZXNvdXJjZXNbbmFtZV0ucHJvcGVydGllc1xcblxcdGlzX29iamVjdChwcm9wcylcXG5cXHRvYmplY3QuZ2V0KHByb3BzLCBcXFwiTWVtb3J5XFxcIiwgXFxcIl9fcGZfYWJzZW50XFxcIikgPT0gXFxcIl9fcGZfYWJzZW50XFxcIlxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWVjcy1jb250YWluZXItbWVtb3J5LXJlcXVpcmVkXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkNvbnRhaW5lckRlZmluaXRpb25zLiVkXFxcIiwgW2MuaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJDb250YWluZXIgJyVzJyBzZXRzIG5laXRoZXIgTWVtb3J5IG5vciBNZW1vcnlSZXNlcnZhdGlvbiBhbmQgdGhlIHRhc2sgaGFzIG5vIHRhc2stbGV2ZWwgTWVtb3J5OyBSZWdpc3RlclRhc2tEZWZpbml0aW9uIGZhaWxzIHdpdGggXFxcXFxcXCJBdCBsZWFzdCBvbmUgb2YgJ21lbW9yeScgb3IgJ21lbW9yeVJlc2VydmF0aW9uJyBtdXN0IGJlIHNwZWNpZmllZFxcXFxcXFwiXFxcIiwgW2NuYW1lXSksXFxuXFx0XFxcIlNldCB0YXNrLWxldmVsIE1lbW9yeSwgb3IgZ2l2ZSB0aGUgY29udGFpbmVyIE1lbW9yeSBvciBNZW1vcnlSZXNlcnZhdGlvblxcXCIsXFxuXFx0X3BmX2Vjc21lbXJlcV91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUNTOjpUYXNrRGVmaW5pdGlvblxcXCIpXFxuXFx0X3BmX2Vjc21lbXJlcV90YXNrX21lbW9yeV9hYnNlbnQobmFtZSlcXG5cXHRzb21lIGMgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkNvbnRhaW5lckRlZmluaXRpb25zXFxcIilcXG5cXHRpc19vYmplY3QoYy52YWx1ZSlcXG5cXHRvYmplY3QuZ2V0KGMudmFsdWUsIFxcXCJNZW1vcnlcXFwiLCBudWxsKSA9PSBudWxsXFxuXFx0b2JqZWN0LmdldChjLnZhbHVlLCBcXFwiTWVtb3J5UmVzZXJ2YXRpb25cXFwiLCBudWxsKSA9PSBudWxsXFxuXFx0Y25hbWUgOj0gb2JqZWN0LmdldChjLnZhbHVlLCBcXFwiTmFtZVxcXCIsIFxcXCI8dW5uYW1lZD5cXFwiKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWVjcy1jb250YWluZXItbWVtb3J5LXJlc2VydmF0aW9uXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZWNzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIk1lbW9yeVJlc2VydmF0aW9uIG11c3Qgbm90IGV4Y2VlZCBNZW1vcnlcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6RUNTOjpUYXNrRGVmaW5pdGlvblwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgTWVtb3J5UmVzZXJ2YXRpb24gaXMgYSBzb2Z0IGZsb29yIGFuZCBNZW1vcnkgYSBoYXJkIGNlaWxpbmc7IHRoZSBzZXJ2aWNlXFxuIyByZWplY3RzIGEgZmxvb3IgYWJvdmUgdGhlIGNlaWxpbmcuIHRvX251bWJlciBmYWlscyAoYW5kIHRoZSBydWxlIHNraXBzKSB3aGVuXFxuIyBlaXRoZXIgdmFsdWUgaXMgYWJzZW50IG9yIHVucmVzb2x2YWJsZS5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWVjcy1jb250YWluZXItbWVtb3J5LXJlc2VydmF0aW9uXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkNvbnRhaW5lckRlZmluaXRpb25zLiVkLk1lbW9yeVJlc2VydmF0aW9uXFxcIiwgW2MuaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJDb250YWluZXIgJyVzJyBzZXRzIE1lbW9yeVJlc2VydmF0aW9uICV2IGFib3ZlIE1lbW9yeSAldjsgUmVnaXN0ZXJUYXNrRGVmaW5pdGlvbiBmYWlscyB3aXRoIFxcXFxcXFwiJ21lbW9yeScgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJ21lbW9yeVJlc2VydmF0aW9uJ1xcXFxcXFwiXFxcIiwgW2NuYW1lLCBtciwgbV0pLFxcblxcdFxcXCJMb3dlciBNZW1vcnlSZXNlcnZhdGlvbiB0byBhdCBtb3N0IE1lbW9yeSwgb3IgcmFpc2UgTWVtb3J5XFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcHJvcGVydGllcy1lY3MtdGFza2RlZmluaXRpb24tY29udGFpbmVyZGVmaW5pdGlvbi5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFQ1M6OlRhc2tEZWZpbml0aW9uXFxcIilcXG5cXHRzb21lIGMgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkNvbnRhaW5lckRlZmluaXRpb25zXFxcIilcXG5cXHRpc19vYmplY3QoYy52YWx1ZSlcXG5cXHRtIDo9IHRvX251bWJlcihvYmplY3QuZ2V0KGMudmFsdWUsIFxcXCJNZW1vcnlcXFwiLCBudWxsKSlcXG5cXHRtciA6PSB0b19udW1iZXIob2JqZWN0LmdldChjLnZhbHVlLCBcXFwiTWVtb3J5UmVzZXJ2YXRpb25cXFwiLCBudWxsKSlcXG5cXHRtciA+IG1cXG5cXHRjbmFtZSA6PSBvYmplY3QuZ2V0KGMudmFsdWUsIFxcXCJOYW1lXFxcIiwgXFxcIjx1bm5hbWVkPlxcXCIpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtZWNzLWR1cGxpY2F0ZS1jb250YWluZXItbmFtZXNcIixcbiAgICBcInNlcnZpY2VcIjogXCJlY3NcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQ29udGFpbmVyIG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHRhc2sgZGVmaW5pdGlvblwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpFQ1M6OlRhc2tEZWZpbml0aW9uXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuIyBPbmUgZGlhZ25vc3RpYyBwZXIgZHVwbGljYXRlZCBsYXRlciBvY2N1cnJlbmNlOyBvbmx5IGxpdGVyYWwgc3RyaW5nIG5hbWVzXFxuIyBjYW4gYmUgY29tcGFyZWQsIHNvIGEgUmVmLXZhbHVlZCBOYW1lIHNraXBzIGl0cyBwYWlycy5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWVjcy1kdXBsaWNhdGUtY29udGFpbmVyLW5hbWVzXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkNvbnRhaW5lckRlZmluaXRpb25zLiVkLk5hbWVcXFwiLCBbYi5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcIkNvbnRhaW5lciBuYW1lICclcycgYXBwZWFycyBtb3JlIHRoYW4gb25jZTsgUmVnaXN0ZXJUYXNrRGVmaW5pdGlvbiBmYWlscyB3aXRoIFxcXFxcXFwiQ29udGFpbmVyIG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHRhc2sgZGVmaW5pdGlvblxcXFxcXFwiXFxcIiwgW25hXSksXFxuXFx0XFxcIkdpdmUgZXZlcnkgY29udGFpbmVyIGluIHRoZSB0YXNrIGRlZmluaXRpb24gYSBkaXN0aW5jdCBOYW1lXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcHJvcGVydGllcy1lY3MtdGFza2RlZmluaXRpb24tY29udGFpbmVyZGVmaW5pdGlvbi5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFQ1M6OlRhc2tEZWZpbml0aW9uXFxcIilcXG5cXHRzb21lIGEgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkNvbnRhaW5lckRlZmluaXRpb25zXFxcIilcXG5cXHRzb21lIGIgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkNvbnRhaW5lckRlZmluaXRpb25zXFxcIilcXG5cXHRhLmluZGV4IDwgYi5pbmRleFxcblxcdG5hIDo9IG9iamVjdC5nZXQoYS52YWx1ZSwgXFxcIk5hbWVcXFwiLCBudWxsKVxcblxcdGlzX3N0cmluZyhuYSlcXG5cXHRuYSA9PSBvYmplY3QuZ2V0KGIudmFsdWUsIFxcXCJOYW1lXFxcIiwgbnVsbClcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1lY3MtZXBoZW1lcmFsLXN0b3JhZ2UtcmFuZ2VcIixcbiAgICBcInNlcnZpY2VcIjogXCJlY3NcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiRXBoZW1lcmFsU3RvcmFnZSBTaXplSW5HaUIgbXVzdCBiZSAyMS0yMDBcIixcbiAgICBcInVwc3RyZWFtXCI6IFwicGVuZGluZy1lbmdpbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkVDUzo6VGFza0RlZmluaXRpb25cIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfZWNzZXBoX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcHJvcGVydGllcy1lY3MtdGFza2RlZmluaXRpb24tZXBoZW1lcmFsc3RvcmFnZS5odG1sXFxcIlxcblxcbiMgVGhlIHJlZ2lzdHJ5IHNjaGVtYSBjYXJyaWVzIG5vIG1pbmltdW0vbWF4aW11bSBmb3IgU2l6ZUluR2lCLCBzbyAyMS0yMDAgaXNcXG4jIGVuZm9yY2VkIG9ubHkgYXQgcmVnaXN0cmF0aW9uIHRpbWUuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lY3MtZXBoZW1lcmFsLXN0b3JhZ2UtcmFuZ2VcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLkVwaGVtZXJhbFN0b3JhZ2UuU2l6ZUluR2lCXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJFcGhlbWVyYWxTdG9yYWdlIFNpemVJbkdpQiAldiBpcyBiZWxvdyAyMTsgUmVnaXN0ZXJUYXNrRGVmaW5pdGlvbiBmYWlscyB3aXRoIFxcXFxcXFwiRXBoZW1lcmFsU3RvcmFnZSBzaXplIHNob3VsZCBiZSBhdCBsZWFzdCAyMVxcXFxcXFwiXFxcIiwgW3NdKSxcXG5cXHRcXFwiVXNlIGEgc2l6ZSBiZXR3ZWVuIDIxIGFuZCAyMDAgR2lCLCBvciBkcm9wIEVwaGVtZXJhbFN0b3JhZ2UgdG8ga2VlcCB0aGUgZGVmYXVsdCAyMCBHaUJcXFwiLFxcblxcdF9wZl9lY3NlcGhfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkVDUzo6VGFza0RlZmluaXRpb25cXFwiKVxcblxcdHMgOj0gdG9fbnVtYmVyKHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuRXBoZW1lcmFsU3RvcmFnZS5TaXplSW5HaUJcXFwiKSlcXG5cXHRzIDwgMjFcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lY3MtZXBoZW1lcmFsLXN0b3JhZ2UtcmFuZ2VcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLkVwaGVtZXJhbFN0b3JhZ2UuU2l6ZUluR2lCXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJFcGhlbWVyYWxTdG9yYWdlIFNpemVJbkdpQiAldiBpcyBhYm92ZSAyMDA7IFJlZ2lzdGVyVGFza0RlZmluaXRpb24gZmFpbHMgd2l0aCBcXFxcXFxcIkVwaGVtZXJhbFN0b3JhZ2Ugc2l6ZSBzaG91bGQgYmUgYXQgbW9zdCAyMDBcXFxcXFxcIlxcXCIsIFtzXSksXFxuXFx0XFxcIlVzZSBhIHNpemUgYmV0d2VlbiAyMSBhbmQgMjAwIEdpQlxcXCIsXFxuXFx0X3BmX2Vjc2VwaF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUNTOjpUYXNrRGVmaW5pdGlvblxcXCIpXFxuXFx0cyA6PSB0b19udW1iZXIocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5FcGhlbWVyYWxTdG9yYWdlLlNpemVJbkdpQlxcXCIpKVxcblxcdHMgPiAyMDBcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1lY3MtZXNzZW50aWFsLWNvbnRhaW5lclwiLFxuICAgIFwic2VydmljZVwiOiBcImVjc1wiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJBdCBsZWFzdCBvbmUgY29udGFpbmVyIG11c3QgYmUgZXNzZW50aWFsXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkVDUzo6VGFza0RlZmluaXRpb25cIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG4jIEVzc2VudGlhbCBkZWZhdWx0cyB0byB0cnVlLCBzbyB0aGUgcnVsZSBmaXJlcyBvbmx5IHdoZW4gZXZlcnkgY29udGFpbmVyIHNheXNcXG4jIEVzc2VudGlhbDogZmFsc2UgZXhwbGljaXRseS4gQSBjb250YWluZXIgd2hvc2UgRXNzZW50aWFsIGlzIHVucmVzb2x2YWJsZSAob3JcXG4jIGEgbm9uLWJvb2xlYW4pIGJyZWFrcyB0aGUgYGV2ZXJ5YCwgYW5kIHRoZSBydWxlIHNraXBzIOKAlCBhYnNlbmNlIG9mIGFuXFxuIyBlc3NlbnRpYWwgY29udGFpbmVyIGNhbm5vdCBiZSBwcm92ZW4gdGhlbi5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWVjcy1lc3NlbnRpYWwtY29udGFpbmVyXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5Db250YWluZXJEZWZpbml0aW9uc1xcXCIsXFxuXFx0XFxcIkV2ZXJ5IGNvbnRhaW5lciBzZXRzIEVzc2VudGlhbDogZmFsc2U7IFJlZ2lzdGVyVGFza0RlZmluaXRpb24gZmFpbHMgd2l0aCBcXFxcXFxcIlRhc2sgZGVmaW5pdGlvbiBkb2Vzbid0IGhhdmUgYW55IGVzc2VudGlhbCBjb250YWluZXJcXFxcXFxcIlxcXCIsXFxuXFx0XFxcIk1hcmsgYXQgbGVhc3Qgb25lIGNvbnRhaW5lciBFc3NlbnRpYWw6IHRydWUsIG9yIG9taXQgRXNzZW50aWFsIChpdCBkZWZhdWx0cyB0byB0cnVlKVxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXByb3BlcnRpZXMtZWNzLXRhc2tkZWZpbml0aW9uLWNvbnRhaW5lcmRlZmluaXRpb24uaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUNTOjpUYXNrRGVmaW5pdGlvblxcXCIpXFxuXFx0aXRlbXMgOj0gW2MgfCBzb21lIGMgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkNvbnRhaW5lckRlZmluaXRpb25zXFxcIildXFxuXFx0Y291bnQoaXRlbXMpID4gMFxcblxcdGV2ZXJ5IGMgaW4gaXRlbXMge1xcblxcdFxcdG9iamVjdC5nZXQoYy52YWx1ZSwgXFxcIkVzc2VudGlhbFxcXCIsIG51bGwpID09IGZhbHNlXFxuXFx0fVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWVjcy1mYXJnYXRlLW5ldHdvcmstbW9kZVwiLFxuICAgIFwic2VydmljZVwiOiBcImVjc1wiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJGYXJnYXRlIHRhc2sgZGVmaW5pdGlvbnMgcmVxdWlyZSBOZXR3b3JrTW9kZSAnYXdzdnBjJ1wiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpFQ1M6OlRhc2tEZWZpbml0aW9uXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX2Vjc25tX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdGFza19kZWZpbml0aW9uX3BhcmFtZXRlcnMuaHRtbCNuZXR3b3JrX21vZGVcXFwiXFxuXFxuIyByZXNvbHZlKCkgY2Fubm90IHRlbGwgXFxcImFic2VudFxcXCIgZnJvbSBcXFwidW5yZXNvbHZhYmxlXFxcIiAoYm90aCB1bmRlZmluZWQpLCBzbyB0cnVlXFxuIyBhYnNlbmNlIGlzIHByb3ZlbiBhZ2FpbnN0IHRoZSBwcmVwcm9jZXNzZWQgZG9jdW1lbnQ7IGEgUmVmLXZhbHVlZCBOZXR3b3JrTW9kZVxcbiMgbm8gbG9uZ2VyIHRyaXBzIHRoZSBub3Qtc2V0IGJsb2NrLlxcbl9wZl9lY3NubV9hYnNlbnQobmFtZSkgaWYge1xcblxcdHByb3BzIDo9IGlucHV0LnJlc291cmNlc1tuYW1lXS5wcm9wZXJ0aWVzXFxuXFx0aXNfb2JqZWN0KHByb3BzKVxcblxcdG9iamVjdC5nZXQocHJvcHMsIFxcXCJOZXR3b3JrTW9kZVxcXCIsIFxcXCJfX3BmX2Fic2VudFxcXCIpID09IFxcXCJfX3BmX2Fic2VudFxcXCJcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lY3MtZmFyZ2F0ZS1uZXR3b3JrLW1vZGVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLk5ldHdvcmtNb2RlXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJOZXR3b3JrTW9kZSBpcyAnJXMnIGJ1dCB0YXNrIGRlZmluaXRpb25zIHJlcXVpcmluZyBGQVJHQVRFIGNvbXBhdGliaWxpdHkgbXVzdCB1c2UgJ2F3c3ZwYyc7IFJlZ2lzdGVyVGFza0RlZmluaXRpb24gZmFpbHMgYXQgZGVwbG95IHRpbWVcXFwiLCBbbm1dKSxcXG5cXHRcXFwiU2V0IE5ldHdvcmtNb2RlIHRvICdhd3N2cGMnXFxcIixcXG5cXHRfcGZfZWNzbm1fdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkVDUzo6VGFza0RlZmluaXRpb25cXFwiKVxcblxcdHJjIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuUmVxdWlyZXNDb21wYXRpYmlsaXRpZXNcXFwiKVxcblxcdGlzX2FycmF5KHJjKVxcblxcdFxcXCJGQVJHQVRFXFxcIiBpbiByY1xcblxcdG5tIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuTmV0d29ya01vZGVcXFwiKVxcblxcdGlzX3N0cmluZyhubSlcXG5cXHRubSAhPSBcXFwiYXdzdnBjXFxcIlxcbn1cXG5cXG4jIE5ldHdvcmtNb2RlIOacquaMh+WumuOBp+OCgiBSZWdpc3RlclRhc2tEZWZpbml0aW9uIOOBr1xcbiMgXFxcIkZhcmdhdGUgb25seSBzdXBwb3J0cyBuZXR3b3JrIG1vZGUgJ2F3c3ZwYycuXFxcIiDjgaflpLHmlZfjgZnjgovvvIgyMDI2LTA5LTAxIOWunyBBUEkg56K66KqN77yJXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lY3MtZmFyZ2F0ZS1uZXR3b3JrLW1vZGVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLk5ldHdvcmtNb2RlXFxcIixcXG5cXHRcXFwiTmV0d29ya01vZGUgaXMgbm90IHNldCwgYnV0IHRhc2sgZGVmaW5pdGlvbnMgcmVxdWlyaW5nIEZBUkdBVEUgY29tcGF0aWJpbGl0eSBtdXN0IHNldCBpdCB0byAnYXdzdnBjJzsgUmVnaXN0ZXJUYXNrRGVmaW5pdGlvbiBmYWlscyBhdCBkZXBsb3kgdGltZVxcXCIsXFxuXFx0XFxcIlNldCBOZXR3b3JrTW9kZSB0byAnYXdzdnBjJ1xcXCIsXFxuXFx0X3BmX2Vjc25tX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFQ1M6OlRhc2tEZWZpbml0aW9uXFxcIilcXG5cXHRyYyA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlJlcXVpcmVzQ29tcGF0aWJpbGl0aWVzXFxcIilcXG5cXHRpc19hcnJheShyYylcXG5cXHRcXFwiRkFSR0FURVxcXCIgaW4gcmNcXG5cXHRfcGZfZWNzbm1fYWJzZW50KG5hbWUpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtZWNzLWZhcmdhdGUtdGFzay1jcHUtbWVtb3J5XCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZWNzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkZBUkdBVEUgY29tcGF0aWJpbGl0eSByZXF1aXJlcyB0YXNrLWxldmVsIENwdSBhbmQgTWVtb3J5XCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkVDUzo6VGFza0RlZmluaXRpb25cIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfZWNzZmFyZ2NtX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcmVzb3VyY2UtZWNzLXRhc2tkZWZpbml0aW9uLmh0bWxcXFwiXFxuXFxuIyBUaGUgZW5naW5lJ3MgRTMwNDcgY2hlY2tzIHRoZSBDcHUvTWVtb3J5IHBhaXJpbmcgb25seSB3aGVuIGJvdGggYXJlIHByZXNlbnQ7XFxuIyBsZWF2aW5nIG9uZSBvdXQgZW50aXJlbHkgaXMgY2F1Z2h0IGJ5IG5vdGhpbmcgYmVmb3JlIHJlZ2lzdHJhdGlvbi4gVHJ1ZVxcbiMgYWJzZW5jZSBuZWVkcyB0aGUgcHJlcHJvY2Vzc2VkIGRvY3VtZW50IChzZWUgcGYtZWNzLWNvbnRhaW5lci1tZW1vcnktcmVxdWlyZWRcXG4jIGZvciB0aGUgaWRpb20pLlxcbl9wZl9lY3NmYXJnY21fZmFyZ2F0ZShuYW1lKSBpZiB7XFxuXFx0c29tZSByYyBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuUmVxdWlyZXNDb21wYXRpYmlsaXRpZXNcXFwiKVxcblxcdHJjLnZhbHVlID09IFxcXCJGQVJHQVRFXFxcIlxcbn1cXG5cXG5fcGZfZWNzZmFyZ2NtX2Fic2VudChuYW1lLCBrZXkpIGlmIHtcXG5cXHRwcm9wcyA6PSBpbnB1dC5yZXNvdXJjZXNbbmFtZV0ucHJvcGVydGllc1xcblxcdGlzX29iamVjdChwcm9wcylcXG5cXHRvYmplY3QuZ2V0KHByb3BzLCBrZXksIFxcXCJfX3BmX2Fic2VudFxcXCIpID09IFxcXCJfX3BmX2Fic2VudFxcXCJcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lY3MtZmFyZ2F0ZS10YXNrLWNwdS1tZW1vcnlcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLkNwdVxcXCIsXFxuXFx0XFxcIlJlcXVpcmVzQ29tcGF0aWJpbGl0aWVzIGluY2x1ZGVzIEZBUkdBVEUgYnV0IHRoZSB0YXNrLWxldmVsIENwdSBpcyBtaXNzaW5nOyBSZWdpc3RlclRhc2tEZWZpbml0aW9uIGZhaWxzIHdpdGggXFxcXFxcXCJGYXJnYXRlIHJlcXVpcmVzIHRoYXQgJ2NwdScgYmUgZGVmaW5lZCBhdCB0aGUgdGFzayBsZXZlbFxcXFxcXFwiXFxcIixcXG5cXHRcXFwiU2V0IHRhc2stbGV2ZWwgQ3B1IChhbmQgTWVtb3J5KSB0byBvbmUgb2YgdGhlIHN1cHBvcnRlZCBGYXJnYXRlIGNvbWJpbmF0aW9uc1xcXCIsXFxuXFx0X3BmX2Vjc2ZhcmdjbV91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RUNTOjpUYXNrRGVmaW5pdGlvblxcXCIpXFxuXFx0X3BmX2Vjc2ZhcmdjbV9mYXJnYXRlKG5hbWUpXFxuXFx0X3BmX2Vjc2ZhcmdjbV9hYnNlbnQobmFtZSwgXFxcIkNwdVxcXCIpXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWNzLWZhcmdhdGUtdGFzay1jcHUtbWVtb3J5XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5NZW1vcnlcXFwiLFxcblxcdFxcXCJSZXF1aXJlc0NvbXBhdGliaWxpdGllcyBpbmNsdWRlcyBGQVJHQVRFIGJ1dCB0aGUgdGFzay1sZXZlbCBNZW1vcnkgaXMgbWlzc2luZzsgUmVnaXN0ZXJUYXNrRGVmaW5pdGlvbiBmYWlscyB3aXRoIFxcXFxcXFwiRmFyZ2F0ZSByZXF1aXJlcyB0aGF0ICdtZW1vcnknIGJlIGRlZmluZWQgYXQgdGhlIHRhc2sgbGV2ZWxcXFxcXFxcIlxcXCIsXFxuXFx0XFxcIlNldCB0YXNrLWxldmVsIE1lbW9yeSAoYW5kIENwdSkgdG8gb25lIG9mIHRoZSBzdXBwb3J0ZWQgRmFyZ2F0ZSBjb21iaW5hdGlvbnNcXFwiLFxcblxcdF9wZl9lY3NmYXJnY21fdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkVDUzo6VGFza0RlZmluaXRpb25cXFwiKVxcblxcdF9wZl9lY3NmYXJnY21fZmFyZ2F0ZShuYW1lKVxcblxcdF9wZl9lY3NmYXJnY21fYWJzZW50KG5hbWUsIFxcXCJNZW1vcnlcXFwiKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWVsYnYyLWxiLWlkbGUtdGltZW91dC1yYW5nZVwiLFxuICAgIFwic2VydmljZVwiOiBcImVsYnYyXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkFMQiBpZGxlX3RpbWVvdXQudGltZW91dF9zZWNvbmRzIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA0MDAwXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkVsYXN0aWNMb2FkQmFsYW5jaW5nVjI6OkxvYWRCYWxhbmNlclwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9pZGxlX3RpbWVvdXRfb3V0KG4pIGlmIG4gPCAxXFxuXFxuX3BmX2lkbGVfdGltZW91dF9vdXQobikgaWYgbiA+IDQwMDBcXG5cXG5fcGZfbm9uX2FsYihuYW1lKSBpZiB7XFxuXFx0dCA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlR5cGVcXFwiKVxcblxcdHQgIT0gXFxcImFwcGxpY2F0aW9uXFxcIlxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWVsYnYyLWxiLWlkbGUtdGltZW91dC1yYW5nZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5Mb2FkQmFsYW5jZXJBdHRyaWJ1dGVzLiVkLlZhbHVlXFxcIiwgW2l0ZW0uaW5kZXhdKSxcXG5cXHRzcHJpbnRmKFxcXCJpZGxlX3RpbWVvdXQudGltZW91dF9zZWNvbmRzIGlzICV2IGJ1dCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNDAwMCBzZWNvbmRzXFxcIiwgW251bV0pLFxcblxcdFxcXCJTZXQgaWRsZV90aW1lb3V0LnRpbWVvdXRfc2Vjb25kcyB0byBhIHZhbHVlIGJldHdlZW4gMSBhbmQgNDAwMFxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lbGFzdGljbG9hZGJhbGFuY2luZy9sYXRlc3QvYXBwbGljYXRpb24vYXBwbGljYXRpb24tbG9hZC1iYWxhbmNlcnMuaHRtbCNjb25uZWN0aW9uLWlkbGUtdGltZW91dFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6TG9hZEJhbGFuY2VyXFxcIilcXG5cXHRub3QgX3BmX25vbl9hbGIobmFtZSlcXG5cXHRzb21lIGl0ZW0gaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkxvYWRCYWxhbmNlckF0dHJpYnV0ZXNcXFwiKVxcblxcdGF0dHIgOj0gaXRlbS52YWx1ZVxcblxcdGlzX29iamVjdChhdHRyKVxcblxcdG9iamVjdC5nZXQoYXR0ciwgXFxcIktleVxcXCIsIFxcXCJcXFwiKSA9PSBcXFwiaWRsZV90aW1lb3V0LnRpbWVvdXRfc2Vjb25kc1xcXCJcXG5cXHRudW0gOj0gdG9fbnVtYmVyKG9iamVjdC5nZXQoYXR0ciwgXFxcIlZhbHVlXFxcIiwgbnVsbCkpXFxuXFx0X3BmX2lkbGVfdGltZW91dF9vdXQobnVtKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWVsYnYyLXRnLWRlcmVnaXN0cmF0aW9uLWRlbGF5LXJhbmdlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZWxidjJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiVGFyZ2V0IGdyb3VwIGRlcmVnaXN0cmF0aW9uX2RlbGF5LnRpbWVvdXRfc2Vjb25kcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMzYwMFwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpFbGFzdGljTG9hZEJhbGFuY2luZ1YyOjpUYXJnZXRHcm91cFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9kZXJlZ19kZWxheV9vdXQobikgaWYgbiA8IDBcXG5cXG5fcGZfZGVyZWdfZGVsYXlfb3V0KG4pIGlmIG4gPiAzNjAwXFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1lbGJ2Mi10Zy1kZXJlZ2lzdHJhdGlvbi1kZWxheS1yYW5nZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5UYXJnZXRHcm91cEF0dHJpYnV0ZXMuJWQuVmFsdWVcXFwiLCBbaXRlbS5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcImRlcmVnaXN0cmF0aW9uX2RlbGF5LnRpbWVvdXRfc2Vjb25kcyBpcyAldiBidXQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDM2MDAgc2Vjb25kc1xcXCIsIFtudW1dKSxcXG5cXHRcXFwiU2V0IGRlcmVnaXN0cmF0aW9uX2RlbGF5LnRpbWVvdXRfc2Vjb25kcyB0byBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMzYwMFxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lbGFzdGljbG9hZGJhbGFuY2luZy9sYXRlc3QvYXBwbGljYXRpb24vZWRpdC10YXJnZXQtZ3JvdXAtYXR0cmlidXRlcy5odG1sI2RlcmVnaXN0cmF0aW9uLWRlbGF5XFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpFbGFzdGljTG9hZEJhbGFuY2luZ1YyOjpUYXJnZXRHcm91cFxcXCIpXFxuXFx0c29tZSBpdGVtIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5UYXJnZXRHcm91cEF0dHJpYnV0ZXNcXFwiKVxcblxcdGF0dHIgOj0gaXRlbS52YWx1ZVxcblxcdGlzX29iamVjdChhdHRyKVxcblxcdG9iamVjdC5nZXQoYXR0ciwgXFxcIktleVxcXCIsIFxcXCJcXFwiKSA9PSBcXFwiZGVyZWdpc3RyYXRpb25fZGVsYXkudGltZW91dF9zZWNvbmRzXFxcIlxcblxcdG51bSA6PSB0b19udW1iZXIob2JqZWN0LmdldChhdHRyLCBcXFwiVmFsdWVcXFwiLCBudWxsKSlcXG5cXHRfcGZfZGVyZWdfZGVsYXlfb3V0KG51bSlcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1lbGJ2Mi10Zy1zbG93LXN0YXJ0LXJhbmdlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiZWxidjJcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiVGFyZ2V0IGdyb3VwIHNsb3dfc3RhcnQuZHVyYXRpb25fc2Vjb25kcyBtdXN0IGJlIDAgb3IgYmV0d2VlbiAzMCBhbmQgOTAwXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OkVsYXN0aWNMb2FkQmFsYW5jaW5nVjI6OlRhcmdldEdyb3VwXCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX3Nsb3dfc3RhcnRfb3V0KG4pIGlmIG4gPCAwXFxuXFxuX3BmX3Nsb3dfc3RhcnRfb3V0KG4pIGlmIHtcXG5cXHRuID4gMFxcblxcdG4gPCAzMFxcbn1cXG5cXG5fcGZfc2xvd19zdGFydF9vdXQobikgaWYgbiA+IDkwMFxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtZWxidjItdGctc2xvdy1zdGFydC1yYW5nZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5UYXJnZXRHcm91cEF0dHJpYnV0ZXMuJWQuVmFsdWVcXFwiLCBbaXRlbS5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcInNsb3dfc3RhcnQuZHVyYXRpb25fc2Vjb25kcyBpcyAldiBidXQgbXVzdCBiZSAwIChkaXNhYmxlZCkgb3IgYmV0d2VlbiAzMCBhbmQgOTAwIHNlY29uZHNcXFwiLCBbbnVtXSksXFxuXFx0XFxcIlNldCBzbG93X3N0YXJ0LmR1cmF0aW9uX3NlY29uZHMgdG8gMCBvciBhIHZhbHVlIGJldHdlZW4gMzAgYW5kIDkwMFxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lbGFzdGljbG9hZGJhbGFuY2luZy9sYXRlc3QvYXBwbGljYXRpb24vZWRpdC10YXJnZXQtZ3JvdXAtYXR0cmlidXRlcy5odG1sI3Nsb3ctc3RhcnQtbW9kZVxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6VGFyZ2V0R3JvdXBcXFwiKVxcblxcdHNvbWUgaXRlbSBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuVGFyZ2V0R3JvdXBBdHRyaWJ1dGVzXFxcIilcXG5cXHRhdHRyIDo9IGl0ZW0udmFsdWVcXG5cXHRpc19vYmplY3QoYXR0cilcXG5cXHRvYmplY3QuZ2V0KGF0dHIsIFxcXCJLZXlcXFwiLCBcXFwiXFxcIikgPT0gXFxcInNsb3dfc3RhcnQuZHVyYXRpb25fc2Vjb25kc1xcXCJcXG5cXHRudW0gOj0gdG9fbnVtYmVyKG9iamVjdC5nZXQoYXR0ciwgXFxcIlZhbHVlXFxcIiwgbnVsbCkpXFxuXFx0X3BmX3Nsb3dfc3RhcnRfb3V0KG51bSlcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1pYW0taW5saW5lLXBvbGljeS1zaXplXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiaWFtXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIklubGluZSBwb2xpY3kgZG9jdW1lbnRzIGFyZSBsaW1pdGVkIHBlciBpZGVudGl0eSAocm9sZSAxMDI0MCAvIGdyb3VwIDUxMjAgLyB1c2VyIDIwNDggY2hhcmFjdGVycylcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6SUFNOjpQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJQU06OlJvbGVQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJQU06OlVzZXJQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJQU06Okdyb3VwUG9saWN5XCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX2lubGluZV9wb2xpY3lfbGltaXRzIDo9IHtcXG5cXHRcXFwiQVdTOjpJQU06OlBvbGljeVxcXCI6IDEwMjQwLFxcblxcdFxcXCJBV1M6OklBTTo6Um9sZVBvbGljeVxcXCI6IDEwMjQwLFxcblxcdFxcXCJBV1M6OklBTTo6VXNlclBvbGljeVxcXCI6IDIwNDgsXFxuXFx0XFxcIkFXUzo6SUFNOjpHcm91cFBvbGljeVxcXCI6IDUxMjAsXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtaWFtLWlubGluZS1wb2xpY3ktc2l6ZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnRcXFwiLFxcblxcdHNwcmludGYoXFxcIlBvbGljeURvY3VtZW50IGlzICVkIGNoYXJhY3RlcnMgKEpTT04gd2l0aG91dCB3aGl0ZXNwYWNlKSBidXQgdGhlIGlubGluZSBwb2xpY3kgbGltaXQgZm9yICVzIGlzICVkIChyb2xlOiAxMDI0MCwgZ3JvdXA6IDUxMjAsIHVzZXI6IDIwNDgpXFxcIiwgW3NpemUsIHJ0eXBlLCBsaW1pdF0pLFxcblxcdFxcXCJNb3ZlIHN0YXRlbWVudHMgaW50byBtYW5hZ2VkIHBvbGljaWVzIG9yIHNob3J0ZW4gdGhlIGRvY3VtZW50XFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9pYW0tcXVvdGFzLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBydHlwZSwgbGltaXQgaW4gX3BmX2lubGluZV9wb2xpY3lfbGltaXRzXFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKHJ0eXBlKVxcblxcdGRvYyA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlBvbGljeURvY3VtZW50XFxcIilcXG5cXHRpc19vYmplY3QoZG9jKVxcblxcdHNpemUgOj0gY291bnQoanNvbi5tYXJzaGFsKGRvYykpXFxuXFx0c2l6ZSA+IGxpbWl0XFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtaWFtLW1hbmFnZWQtcG9saWN5LWNvdW50XCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiaWFtXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIk1hbmFnZWQgcG9saWNpZXMgcGVyIGlkZW50aXR5IGFyZSBjYXBwZWQgKGhhcmQgbWF4aW11bXMgcm9sZSAyNSAvIHVzZXIgMjAgLyBncm91cCAxMClcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6SUFNOjpSb2xlXCIsXG4gICAgICBcIkFXUzo6SUFNOjpVc2VyXCIsXG4gICAgICBcIkFXUzo6SUFNOjpHcm91cFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMg44OP44O844OJ5LiK6ZmQ77yIU2VydmljZSBRdW90YXMg44Gu44CMTWF4aW11bSBxdW90YeOAjT0g44Gd44KM5Lul5LiK5byV44GN5LiK44GS5LiN5Y+v6IO944Gq5YCk77yJOlxcbiMgICByb2xlIDI1IC8gdXNlciAyMCAvIGdyb3VwIDEw77yIZ3JvdXAg44GvIGFkanVzdGFibGU6IGZhbHNl44CB5a6f5ris44Gn44KC56K66KqN77yJ44CCXFxuIyDjg4fjg5Xjgqnjg6vjg4jvvIhyb2xlIDIwIC8gdXNlciAxMCAvIGdyb3VwIDEw77yJ6LaF44Gv44Ki44Kr44Km44Oz44OI44Gu44Kv44Kp44O844K/5byV44GN5LiK44GS5qyh56ys44GnXFxuIyDmiJDlip/jgZflvpfjgovjgZ/jgoEgRVJST1Ig44Gr44GX44Gq44GE77yIYmVuY2gg44Ki44Kr44Km44Oz44OI44GuIHJvbGU9MjAg44GnIDExIOWAi+aIkOWKn+OCkuWun+a4rOa4iOOBv++8ieOAglxcbl9wZl9pYW1wb2xfbGltaXRzIDo9IHtcXG5cXHRcXFwiQVdTOjpJQU06OlJvbGVcXFwiOiAyNSxcXG5cXHRcXFwiQVdTOjpJQU06OlVzZXJcXFwiOiAyMCxcXG5cXHRcXFwiQVdTOjpJQU06Okdyb3VwXFxcIjogMTAsXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtaWFtLW1hbmFnZWQtcG9saWN5LWNvdW50XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5NYW5hZ2VkUG9saWN5QXJuc1xcXCIsXFxuXFx0c3ByaW50ZihcXFwiJWQgbWFuYWdlZCBwb2xpY2llcyBhcmUgYXR0YWNoZWQsIGJ1dCB0aGUgaGFyZCBtYXhpbXVtIGZvciAlcyBpcyAlZCAocXVvdGEgZGVmYXVsdHM6IHJvbGUgMjAsIHVzZXIgMTAsIGdyb3VwIDEwOyByYWlzYWJsZSBvbmx5IHVwIHRvIHRoZSBoYXJkIG1heGltdW0pOyBkZXBsb3ltZW50IGZhaWxzIHdpdGggTGltaXRFeGNlZWRlZFxcXCIsIFtuLCBydHlwZSwgbGltaXRdKSxcXG5cXHRcXFwiQ29uc29saWRhdGUgc3RhdGVtZW50cyBpbnRvIGZld2VyIG1hbmFnZWQgcG9saWNpZXNcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX2lhbS1xdW90YXMuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIHJ0eXBlLCBsaW1pdCBpbiBfcGZfaWFtcG9sX2xpbWl0c1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShydHlwZSlcXG5cXHRhcnIgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5NYW5hZ2VkUG9saWN5QXJuc1xcXCIpXFxuXFx0aXNfYXJyYXkoYXJyKVxcblxcdG4gOj0gY291bnQoYXJyKVxcblxcdG4gPiBsaW1pdFxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWlhbS1tYW5hZ2VkLXBvbGljeS1zaXplXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiaWFtXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIk1hbmFnZWQgcG9saWN5IGRvY3VtZW50cyBhcmUgbGltaXRlZCB0byA2MTQ0IGNoYXJhY3RlcnMgKHdoaXRlc3BhY2UgZXhjbHVkZWQpXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OklBTTo6TWFuYWdlZFBvbGljeVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtaWFtLW1hbmFnZWQtcG9saWN5LXNpemVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLlBvbGljeURvY3VtZW50XFxcIixcXG5cXHRzcHJpbnRmKFxcXCJQb2xpY3lEb2N1bWVudCBpcyAlZCBjaGFyYWN0ZXJzIChKU09OIHdpdGhvdXQgd2hpdGVzcGFjZSkgYnV0IHRoZSBtYW5hZ2VkIHBvbGljeSBsaW1pdCBpcyA2MTQ0XFxcIiwgW3NpemVdKSxcXG5cXHRcXFwiU3BsaXQgdGhlIGRvY3VtZW50IGludG8gbXVsdGlwbGUgbWFuYWdlZCBwb2xpY2llcyBvciBzaG9ydGVuIGl0XFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9pYW0tcXVvdGFzLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OklBTTo6TWFuYWdlZFBvbGljeVxcXCIpXFxuXFx0ZG9jIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnRcXFwiKVxcblxcdGlzX29iamVjdChkb2MpXFxuXFx0c2l6ZSA6PSBjb3VudChqc29uLm1hcnNoYWwoZG9jKSlcXG5cXHRzaXplID4gNjE0NFxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLWxhbWJkYS1lbnYtc2l6ZVwiLFxuICAgIFwic2VydmljZVwiOiBcImxhbWJkYVwiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJMYW1iZGEgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBsaW1pdGVkIHRvIDQwOTYgYnl0ZXMgaW4gdG90YWxcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6TGFtYmRhOjpGdW5jdGlvblwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMg44Oq44OG44Op44Or5paH5a2X5YiX44Gu44Kt44O8L+WApOOBoOOBkeOCkuaVsOOBiOOCi++8iOODiOODvOOCr+ODs+OBr+OCueOCreODg+ODl++8ieOAguWQiOioiOOBjOaXouOBqyA0MDk2IOOCkui2heOBiOOBplxcbiMg44GE44KM44Gw44CB5a6f6Zqb44Gu44OH44OX44Ot44Kk44Gn44KC5b+F44Ga5aSx5pWX44GZ44KL77yI5a6f44K144Kk44K644Gv5o6o5a6a5Lul5LiK44Gr44GX44GL44Gq44KJ44Gq44GE77yJ44CCXFxuIyBOT1RFOiDjgZPjga7jgqjjg7Pjgrjjg7Pjga4gUmVnbyDjg5Hjg7zjgrXjga/lhoXljIXooajoqJjlhoXjga4gMiDlpInmlbAgc29tZe+8iHNvbWUgaywgdiBpbiB2YXJz77yJ44KSXFxuIyDlj5fjgZHku5jjgZHjgarjgYTjgZ/jgoHjgIFvYmplY3Qua2V5cyDntYznlLHjgafmm7jjgY/jgIJcXG5fcGZfbGVudl9zaXplKHZhcnMpIDo9IHN1bShbcyB8XFxuXFx0c29tZSBrIGluIG9iamVjdC5rZXlzKHZhcnMpXFxuXFx0aXNfc3RyaW5nKHZhcnNba10pXFxuXFx0cyA6PSBjb3VudChrKSArIGNvdW50KHZhcnNba10pXFxuXSlcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLWxhbWJkYS1lbnYtc2l6ZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuRW52aXJvbm1lbnQuVmFyaWFibGVzXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG90YWwgYXQgbGVhc3QgJWQgYnl0ZXMgKGxpdGVyYWwga2V5cyBhbmQgdmFsdWVzKSwgYnV0IExhbWJkYSBsaW1pdHMgdGhlIGVudmlyb25tZW50IHRvIDQwOTYgYnl0ZXM7IENyZWF0ZUZ1bmN0aW9uIGZhaWxzIGF0IGRlcGxveSB0aW1lXFxcIiwgW3RvdGFsXSksXFxuXFx0XFxcIk1vdmUgbGFyZ2UgdmFsdWVzIHRvIFNTTSBQYXJhbWV0ZXIgU3RvcmUsIFNlY3JldHMgTWFuYWdlciwgb3IgYSBidW5kbGVkIGNvbmZpZyBmaWxlXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvZ2V0dGluZ3N0YXJ0ZWQtbGltaXRzLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OkxhbWJkYTo6RnVuY3Rpb25cXFwiKVxcblxcdHZhcnMgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5FbnZpcm9ubWVudC5WYXJpYWJsZXNcXFwiKVxcblxcdGlzX29iamVjdCh2YXJzKVxcblxcdHRvdGFsIDo9IF9wZl9sZW52X3NpemUodmFycylcXG5cXHR0b3RhbCA+IDQwOTZcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1yb3V0ZTUzLWFsaWFzLWNsb3VkZnJvbnQtem9uZS1pZFwiLFxuICAgIFwic2VydmljZVwiOiBcInJvdXRlNTNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQSBDbG91ZEZyb250IGFsaWFzIHRhcmdldCBtdXN0IHVzZSBob3N0ZWQgem9uZSBaMkZEVE5EQVRBUVlXMlwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG4jIEV2ZXJ5IENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIGlzIGFsaWFzZWQgdGhyb3VnaCB0aGUgc2luZ2xlIGdsb2JhbCBob3N0ZWRcXG4jIHpvbmUgWjJGRFROREFUQVFZVzIuIEFueSBvdGhlciBBbGlhc1RhcmdldC5Ib3N0ZWRab25lSWQgKGFuIEFMQidzIHJlZ2lvbmFsXFxuIyB6b25lIGlkIGlzIHRoZSBjbGFzc2ljIHBhc3RlIGVycm9yKSBmYWlscyBhdCBkZXBsb3kgdGltZSB3aXRoIFxcXCJ0aGUgYWxpYXNcXG4jIHRhcmdldCBuYW1lIGRvZXMgbm90IGxpZSB3aXRoaW4gdGhlIHRhcmdldCB6b25lXFxcIi5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXJvdXRlNTMtYWxpYXMtY2xvdWRmcm9udC16b25lLWlkXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5BbGlhc1RhcmdldC5Ib3N0ZWRab25lSWRcXFwiLFxcblxcdHNwcmludGYoXFxcIlRoZSBhbGlhcyB0YXJnZXRzIGEgQ2xvdWRGcm9udCBkb21haW4sIHNvIEFsaWFzVGFyZ2V0Lkhvc3RlZFpvbmVJZCBtdXN0IGJlIFoyRkRUTkRBVEFRWVcyLCBub3QgJyVzJ1xcXCIsIFt6aWRdKSxcXG5cXHRcXFwiU2V0IEFsaWFzVGFyZ2V0Lkhvc3RlZFpvbmVJZCB0byBaMkZEVE5EQVRBUVlXMiAoaW4gdGhlIENESywgcm91dGU1M190YXJnZXRzLkNsb3VkRnJvbnRUYXJnZXQgZG9lcyB0aGlzKVxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nZW5lcmFsL2xhdGVzdC9nci9jZl9yZWdpb24uaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XFxcIilcXG5cXHRkbnMgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5BbGlhc1RhcmdldC5ETlNOYW1lXFxcIilcXG5cXHRpc19zdHJpbmcoZG5zKVxcblxcdGVuZHN3aXRoKHRyaW1fc3VmZml4KGxvd2VyKGRucyksIFxcXCIuXFxcIiksIFxcXCIuY2xvdWRmcm9udC5uZXRcXFwiKVxcblxcdHppZCA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkFsaWFzVGFyZ2V0Lkhvc3RlZFpvbmVJZFxcXCIpXFxuXFx0aXNfc3RyaW5nKHppZClcXG5cXHR6aWQgIT0gXFxcIloyRkRUTkRBVEFRWVcyXFxcIlxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXJvdXRlNTMtYXBleC1jbmFtZVwiLFxuICAgIFwic2VydmljZVwiOiBcInJvdXRlNTNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQSBDTkFNRSByZWNvcmQgaXMgbm90IHBlcm1pdHRlZCBhdCB0aGUgem9uZSBhcGV4XCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiLFxuICAgICAgXCJBV1M6OlJvdXRlNTM6Okhvc3RlZFpvbmVcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfcjUzX2FwZXhfbm9ybShuKSA6PSB0cmltX3N1ZmZpeChsb3dlcihuKSwgXFxcIi5cXFwiKVxcblxcbiMgVGhlIGVuZ2luZSdzIEUzMDIzIGNhdGNoZXMgYW4gYXBleCBDTkFNRSBvbmx5IHdoZW4gdGhlIHJlY29yZCBjYXJyaWVzIGFcXG4jIGxpdGVyYWwgSG9zdGVkWm9uZU5hbWUuIENESyBMMiBhbHdheXMgbGlua3MgcmVjb3JkcyB3aXRoXFxuIyBIb3N0ZWRab25lSWQ6IHtcXFwiUmVmXFxcIjogPHpvbmU+fSwgd2hpY2ggRTMwMjMgZG9lcyBub3Qgc2VlIChtZWFzdXJlZCAyMDI2LTA5LTAyLFxcbiMgZW5naW5lIDEuNy4wLWJldGEpLiByZXNvbHZlKCkgdHVybnMgc3VjaCBhIFJlZiBpbnRvIHRoZSB0YXJnZXQncyBsb2dpY2FsIElELFxcbiMgc28gd2hlbiB0aGF0IElEIG5hbWVzIGEgSG9zdGVkWm9uZSBpbiB0aGUgc2FtZSB0ZW1wbGF0ZSB3ZSBjYW4gcmVhZCBpdHNcXG4jIGxpdGVyYWwgTmFtZSBhbmQgZG8gdGhlIGFwZXggY29tcGFyaXNvbiBvdXJzZWx2ZXMuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1yb3V0ZTUzLWFwZXgtY25hbWVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLlR5cGVcXFwiLFxcblxcdHNwcmludGYoXFxcIkEgQ05BTUUgcmVjb3JkIGlzIG5vdCBwZXJtaXR0ZWQgYXQgdGhlIHpvbmUgYXBleCAoJyVzJyk7IHRoZSBkZXBsb3ltZW50IGZhaWxzIHdpdGggXFxcXFxcXCJSUlNldCBvZiB0eXBlIENOQU1FIC4uLiBpcyBub3QgcGVybWl0dGVkIGF0IGFwZXhcXFxcXFxcIlxcXCIsIFtyZWNOYW1lXSksXFxuXFx0XFxcIlVzZSBhbiBhbGlhcyBBL0FBQUEgcmVjb3JkIGZvciB0aGUgYXBleCAoQWxpYXNUYXJnZXQpLCBvciBtb3ZlIHRoZSBDTkFNRSB0byBhIHN1YmRvbWFpblxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9Sb3V0ZTUzL2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9yZXNvdXJjZS1yZWNvcmQtc2V0cy1jaG9vc2luZy1hbGlhcy1ub24tYWxpYXMuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XFxcIilcXG5cXHRyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlR5cGVcXFwiKSA9PSBcXFwiQ05BTUVcXFwiXFxuXFx0enJlZiA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkhvc3RlZFpvbmVJZFxcXCIpXFxuXFx0aXNfc3RyaW5nKHpyZWYpXFxuXFx0enJlZiBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpIb3N0ZWRab25lXFxcIilcXG5cXHR6b25lTmFtZSA6PSByZXNvbHZlKHpyZWYsIFxcXCJQcm9wZXJ0aWVzLk5hbWVcXFwiKVxcblxcdGlzX3N0cmluZyh6b25lTmFtZSlcXG5cXHRyZWNOYW1lIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuTmFtZVxcXCIpXFxuXFx0aXNfc3RyaW5nKHJlY05hbWUpXFxuXFx0X3BmX3I1M19hcGV4X25vcm0ocmVjTmFtZSkgPT0gX3BmX3I1M19hcGV4X25vcm0oem9uZU5hbWUpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtcm91dGU1My1nZW9sb2NhdGlvbi1leGNsdXNpdmVcIixcbiAgICBcInNlcnZpY2VcIjogXCJyb3V0ZTUzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkdlb0xvY2F0aW9uIGNhbm5vdCBzcGVjaWZ5IGJvdGggQ29udGluZW50Q29kZSBhbmQgQ291bnRyeUNvZGVcIixcbiAgICBcInVwc3RyZWFtXCI6IFwicGVuZGluZy1lbmdpbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgVGhlIHJlZ2lzdHJ5IHNjaGVtYSBleHByZXNzZXMgdGhpcyBhcyBhIG9uZU9mLCB3aGljaCB0aGUgc2VydmVyLXNpZGVcXG4jIHByZS1kZXBsb3kgdmFsaWRhdGlvbiBlbmZvcmNlcyAoXFxcIjIgc3Vic2NoZW1hcyBtYXRjaGVkIGluc3RlYWQgb2Ygb25lXFxcIikgYnV0XFxuIyB0aGUgYnVuZGxlZCBlbmdpbmUgZG9lcyBub3QgZXZhbHVhdGUg4oCUIGhlbmNlIHVwc3RyZWFtOiBwZW5kaW5nLWVuZ2luZS5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXJvdXRlNTMtZ2VvbG9jYXRpb24tZXhjbHVzaXZlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5HZW9Mb2NhdGlvblxcXCIsXFxuXFx0XFxcIkdlb0xvY2F0aW9uIGNhbm5vdCBzcGVjaWZ5IGJvdGggQ29udGluZW50Q29kZSBhbmQgQ291bnRyeUNvZGU7IENsb3VkRm9ybWF0aW9uIHJlamVjdHMgdGhlIHJlY29yZCBzZXQgYmVmb3JlIHByb3Zpc2lvbmluZ1xcXCIsXFxuXFx0XFxcIktlZXAgZWl0aGVyIHRoZSBDb250aW5lbnRDb2RlIG9yIHRoZSBDb3VudHJ5Q29kZSAoYWRkIFN1YmRpdmlzaW9uQ29kZSBvbmx5IG5leHQgdG8gQ291bnRyeUNvZGUgVVMpXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcHJvcGVydGllcy1yb3V0ZTUzLXJlY29yZHNldC1nZW9sb2NhdGlvbi5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcXFwiKVxcblxcdGdlbyA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkdlb0xvY2F0aW9uXFxcIilcXG5cXHRpc19vYmplY3QoZ2VvKVxcblxcdGlzX3N0cmluZyhvYmplY3QuZ2V0KGdlbywgXFxcIkNvbnRpbmVudENvZGVcXFwiLCBudWxsKSlcXG5cXHRpc19zdHJpbmcob2JqZWN0LmdldChnZW8sIFxcXCJDb3VudHJ5Q29kZVxcXCIsIG51bGwpKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXJvdXRlNTMtbXVsdGl2YWx1ZS1hbGlhc1wiLFxuICAgIFwic2VydmljZVwiOiBcInJvdXRlNTNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiTXVsdGlWYWx1ZUFuc3dlciBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBBbGlhc1RhcmdldFwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXJvdXRlNTMtbXVsdGl2YWx1ZS1hbGlhc1xcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuTXVsdGlWYWx1ZUFuc3dlclxcXCIsXFxuXFx0XFxcIk11bHRpVmFsdWVBbnN3ZXIgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggQWxpYXNUYXJnZXQ7IHRoZSBzZXJ2aWNlIHJlamVjdHMgaXQgd2l0aCBcXFxcXFxcIk11bHRpdmFsdWUgYW5zd2VyIHJyc2V0IHNob3VsZCBub3QgYmUgYW4gYWxpYXMgcnJzZXRcXFxcXFxcIlxcXCIsXFxuXFx0XFxcIlVzZSBwbGFpbiBtdWx0aXZhbHVlIHJlY29yZHMgd2l0aCBSZXNvdXJjZVJlY29yZHMsIG9yIGRyb3AgTXVsdGlWYWx1ZUFuc3dlciBhbmQga2VlcCB0aGUgYWxpYXNcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1yZXNvdXJjZS1yb3V0ZTUzLXJlY29yZHNldC5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcXFwiKVxcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuTXVsdGlWYWx1ZUFuc3dlclxcXCIpID09IHRydWVcXG5cXHRpc19vYmplY3QocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5BbGlhc1RhcmdldFxcXCIpKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXJvdXRlNTMtcmVjb3JkLXR5cGUtcm91dGluZy1wb2xpY3lcIixcbiAgICBcInNlcnZpY2VcIjogXCJyb3V0ZTUzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIk5TIHJlY29yZHMgdGFrZSBubyByb3V0aW5nIHBvbGljeTsgQ05BTUUgY2Fubm90IGJlIG11bHRpdmFsdWVcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX3I1M190eXBvbF91cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXJlc291cmNlLXJvdXRlNTMtcmVjb3Jkc2V0Lmh0bWxcXFwiXFxuXFxuX3BmX3I1M190eXBvbF9wcm9wcyA6PSBbXFxcIldlaWdodFxcXCIsIFxcXCJSZWdpb25cXFwiLCBcXFwiRmFpbG92ZXJcXFwiLCBcXFwiR2VvTG9jYXRpb25cXFwiLCBcXFwiQ2lkclJvdXRpbmdDb25maWdcXFwiXVxcblxcbl9wZl9yNTNfdHlwb2xfaGFzX3BvbGljeShuYW1lKSBpZiB7XFxuXFx0c29tZSBwIGluIF9wZl9yNTNfdHlwb2xfcHJvcHNcXG5cXHRyZXNvbHZlKG5hbWUsIHNwcmludGYoXFxcIlByb3BlcnRpZXMuJXNcXFwiLCBbcF0pKSAhPSBudWxsXFxufVxcblxcbl9wZl9yNTNfdHlwb2xfaGFzX3BvbGljeShuYW1lKSBpZiB7XFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5NdWx0aVZhbHVlQW5zd2VyXFxcIikgPT0gdHJ1ZVxcbn1cXG5cXG4jIE9ubHkgY29tYmluYXRpb25zIHRoYXQgZmFpbGVkIG9uIGEgcmVhbCBkZXBsb3kgYXJlIGZsYWdnZWQuIFNPQS9EUyB3aXRoIGFcXG4jIHJvdXRpbmcgcG9saWN5IGFyZSBhbHNvIGRvY3VtZW50ZWQgYXMgdW5zdXBwb3J0ZWQgYnV0IHdlcmUgbm90IG1lYXN1cmVkLCBzb1xcbiMgdGhleSBhcmUgZGVsaWJlcmF0ZWx5IGxlZnQgb3V0IChzZWUgdGhlIGRpc2NvdmVyeSBpc3N1ZSkuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1yb3V0ZTUzLXJlY29yZC10eXBlLXJvdXRpbmctcG9saWN5XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5UeXBlXFxcIixcXG5cXHRcXFwiQW4gTlMgcmVjb3JkIGNhbm5vdCB1c2UgYSByb3V0aW5nIHBvbGljeTsgdGhlIHNlcnZpY2UgcmVqZWN0cyBpdCB3aXRoIFxcXFxcXFwidGhpcyB0eXBlIG9mIFJSU2V0IGlzIG5vdCBzdXBwb3J0ZWRcXFxcXFxcIlxcXCIsXFxuXFx0XFxcIlVzZSBhIHNpbXBsZSByZWNvcmQgc2V0IGZvciBOUyByZWNvcmRzIChubyBXZWlnaHQvUmVnaW9uL0ZhaWxvdmVyL0dlb0xvY2F0aW9uL011bHRpVmFsdWVBbnN3ZXIvQ2lkclJvdXRpbmdDb25maWcpXFxcIixcXG5cXHRfcGZfcjUzX3R5cG9sX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcXFwiKVxcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVHlwZVxcXCIpID09IFxcXCJOU1xcXCJcXG5cXHRfcGZfcjUzX3R5cG9sX2hhc19wb2xpY3kobmFtZSlcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1yb3V0ZTUzLXJlY29yZC10eXBlLXJvdXRpbmctcG9saWN5XFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5UeXBlXFxcIixcXG5cXHRcXFwiQSBDTkFNRSByZWNvcmQgY2Fubm90IHVzZSB0aGUgbXVsdGl2YWx1ZSBhbnN3ZXIgcm91dGluZyBwb2xpY3k7IHRoZSBzZXJ2aWNlIHJlamVjdHMgaXQgd2l0aCBcXFxcXFxcInRoaXMgdHlwZSBvZiBSUlNldCBpcyBub3Qgc3VwcG9ydGVkXFxcXFxcXCJcXFwiLFxcblxcdFxcXCJQb2ludCB0aGUgbXVsdGl2YWx1ZSByZWNvcmRzIGF0IEEvQUFBQSAob3IgYW5vdGhlciBzdXBwb3J0ZWQgdHlwZSksIG9yIGRyb3AgTXVsdGlWYWx1ZUFuc3dlclxcXCIsXFxuXFx0X3BmX3I1M190eXBvbF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XFxcIilcXG5cXHRyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlR5cGVcXFwiKSA9PSBcXFwiQ05BTUVcXFwiXFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5NdWx0aVZhbHVlQW5zd2VyXFxcIikgPT0gdHJ1ZVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXJvdXRlNTMtcmVjb3JkLXZhbHVlLXNvdXJjZVwiLFxuICAgIFwic2VydmljZVwiOiBcInJvdXRlNTNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQSByZWNvcmQgc2V0IG5lZWRzIEFsaWFzVGFyZ2V0IG9yIHRoZSBmdWxsIFRUTCtSZXNvdXJjZVJlY29yZHMgcGFpclwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG5fcGZfcjUzX3ZhbHNyY191cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXJlc291cmNlLXJvdXRlNTMtcmVjb3Jkc2V0Lmh0bWxcXFwiXFxuXFxuIyBUaGUgc2VydmljZSBleHBlY3RzIFxcXCJleGFjdGx5IG9uZSBvZiBbQWxpYXNUYXJnZXQsIGFsbCBvZiBbVFRMLCBhbmRcXG4jIFJlc291cmNlUmVjb3Jkc11dXFxcIiAoVHJhZmZpY1BvbGljeUluc3RhbmNlSWQgaGFzIG5vIENsb3VkRm9ybWF0aW9uIHByb3BlcnR5KS5cXG4jIFRoZSBUVEwrQWxpYXNUYXJnZXQgY29tYmluYXRpb24gaXMgYWxyZWFkeSB0aGUgZW5naW5lJ3MgRTMwMjksIHNvIHRoaXMgcnVsZVxcbiMgY292ZXJzIHRoZSByZW1haW5pbmcgc2hhcGVzOiBhbGlhcyBwbHVzIHJlY29yZHMsIGFuZCBhbiBpbmNvbXBsZXRlIG5vbi1hbGlhc1xcbiMgZ3JvdXAgKHJlY29yZHMgd2l0aG91dCBUVEwsIFRUTCB3aXRob3V0IHJlY29yZHMsIG9yIG5laXRoZXIpLlxcbl9wZl9yNTNfdmFsc3JjX2hhc19hbGlhcyhuYW1lKSBpZiBpc19vYmplY3QocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5BbGlhc1RhcmdldFxcXCIpKVxcblxcbl9wZl9yNTNfdmFsc3JjX2hhc19ycihuYW1lKSBpZiB7XFxuXFx0c29tZSBfIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5SZXNvdXJjZVJlY29yZHNcXFwiKVxcbn1cXG5cXG5fcGZfcjUzX3ZhbHNyY19oYXNfdHRsKG5hbWUpIGlmIHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVFRMXFxcIikgIT0gbnVsbFxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtcm91dGU1My1yZWNvcmQtdmFsdWUtc291cmNlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5SZXNvdXJjZVJlY29yZHNcXFwiLFxcblxcdFxcXCJBbGlhc1RhcmdldCBhbmQgUmVzb3VyY2VSZWNvcmRzIGFyZSBtdXR1YWxseSBleGNsdXNpdmU7IHRoZSBzZXJ2aWNlIGV4cGVjdHMgZXhhY3RseSBvbmUgb2YgQWxpYXNUYXJnZXQgb3IgVFRMLXBsdXMtUmVzb3VyY2VSZWNvcmRzXFxcIixcXG5cXHRcXFwiS2VlcCB0aGUgQWxpYXNUYXJnZXQgYW5kIGRyb3AgUmVzb3VyY2VSZWNvcmRzLCBvciBtYWtlIGl0IGEgcGxhaW4gcmVjb3JkIHdpdGggVFRMIGFuZCBSZXNvdXJjZVJlY29yZHNcXFwiLFxcblxcdF9wZl9yNTNfdmFsc3JjX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcXFwiKVxcblxcdF9wZl9yNTNfdmFsc3JjX2hhc19hbGlhcyhuYW1lKVxcblxcdF9wZl9yNTNfdmFsc3JjX2hhc19ycihuYW1lKVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXJvdXRlNTMtcmVjb3JkLXZhbHVlLXNvdXJjZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXNcXFwiLFxcblxcdFxcXCJBIG5vbi1hbGlhcyByZWNvcmQgc2V0IG5lZWRzIGJvdGggVFRMIGFuZCBSZXNvdXJjZVJlY29yZHM7IHRoZSBzZXJ2aWNlIHJlamVjdHMgYW4gaW5jb21wbGV0ZSBwYWlyIHdpdGggXFxcXFxcXCJFeHBlY3RlZCBleGFjdGx5IG9uZSBvZiBbQWxpYXNUYXJnZXQsIGFsbCBvZiBbVFRMLCBhbmQgUmVzb3VyY2VSZWNvcmRzXV0gLi4uIGZvdW5kIG5vbmVcXFxcXFxcIlxcXCIsXFxuXFx0XFxcIlNwZWNpZnkgVFRMIGFuZCBSZXNvdXJjZVJlY29yZHMgdG9nZXRoZXIsIG9yIHVzZSBBbGlhc1RhcmdldCBpbnN0ZWFkXFxcIixcXG5cXHRfcGZfcjUzX3ZhbHNyY191cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XFxcIilcXG5cXHRub3QgX3BmX3I1M192YWxzcmNfaGFzX2FsaWFzKG5hbWUpXFxuXFx0bm90IF9wZl9yNTNfdmFsc3JjX2NvbXBsZXRlKG5hbWUpXFxufVxcblxcbl9wZl9yNTNfdmFsc3JjX2NvbXBsZXRlKG5hbWUpIGlmIHtcXG5cXHRfcGZfcjUzX3ZhbHNyY19oYXNfcnIobmFtZSlcXG5cXHRfcGZfcjUzX3ZhbHNyY19oYXNfdHRsKG5hbWUpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtcm91dGU1My1yb3V0aW5nLXBvbGljeS1leGNsdXNpdmVcIixcbiAgICBcInNlcnZpY2VcIjogXCJyb3V0ZTUzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkEgcmVjb3JkIHNldCBjYW4gdXNlIG9ubHkgb25lIHJvdXRpbmcgcG9saWN5XCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgVGhlIHNlcnZpY2UgZW5mb3JjZXMgXFxcIkV4cGVjdGVkIGV4YWN0bHkgb25lIG9mIFtXZWlnaHQsIFJlZ2lvbiwgRmFpbG92ZXIsXFxuIyBHZW9Mb2NhdGlvbiwgTXVsdGlWYWx1ZUFuc3dlciwgR2VvUHJveGltaXR5TG9jYXRpb24sIG9yIENpZHJSb3V0aW5nQ29uZmlnXVxcXCIuXFxuIyBHZW9Qcm94aW1pdHlMb2NhdGlvbiBpcyBub3QgYSBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0eSwgc28gZml2ZSByZW1haW4gaGVyZS5cXG4jIE11bHRpVmFsdWVBbnN3ZXI6IGZhbHNlIGlzIHRyZWF0ZWQgYXMgYWJzZW50IOKAlCBvbmx5IHRydWUgc2VsZWN0cyB0aGUgcG9saWN5Llxcbl9wZl9yNTNfcG9seF9wcm9wcyA6PSBbXFxcIldlaWdodFxcXCIsIFxcXCJSZWdpb25cXFwiLCBcXFwiRmFpbG92ZXJcXFwiLCBcXFwiR2VvTG9jYXRpb25cXFwiLCBcXFwiQ2lkclJvdXRpbmdDb25maWdcXFwiXVxcblxcbl9wZl9yNTNfcG9seF9wcmVzZW50KG5hbWUsIHByb3ApIGlmIHtcXG5cXHRwcm9wICE9IFxcXCJNdWx0aVZhbHVlQW5zd2VyXFxcIlxcblxcdHJlc29sdmUobmFtZSwgc3ByaW50ZihcXFwiUHJvcGVydGllcy4lc1xcXCIsIFtwcm9wXSkpICE9IG51bGxcXG59XFxuXFxuX3BmX3I1M19wb2x4X3ByZXNlbnQobmFtZSwgXFxcIk11bHRpVmFsdWVBbnN3ZXJcXFwiKSBpZiB7XFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5NdWx0aVZhbHVlQW5zd2VyXFxcIikgPT0gdHJ1ZVxcbn1cXG5cXG5fcGZfcjUzX3BvbHhfcG9saWNpZXMobmFtZSkgOj0gcHMgaWYge1xcblxcdHBzIDo9IFtwIHwgc29tZSBwIGluIGFycmF5LmNvbmNhdChfcGZfcjUzX3BvbHhfcHJvcHMsIFtcXFwiTXVsdGlWYWx1ZUFuc3dlclxcXCJdKTsgX3BmX3I1M19wb2x4X3ByZXNlbnQobmFtZSwgcCldXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtcm91dGU1My1yb3V0aW5nLXBvbGljeS1leGNsdXNpdmVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJBIHJlY29yZCBzZXQgY2FuIHVzZSBvbmx5IG9uZSByb3V0aW5nIHBvbGljeSwgYnV0ICV2IGFyZSBhbGwgc3BlY2lmaWVkXFxcIiwgW3BzXSksXFxuXFx0XFxcIktlZXAgZXhhY3RseSBvbmUgb2YgV2VpZ2h0LCBSZWdpb24sIEZhaWxvdmVyLCBHZW9Mb2NhdGlvbiwgTXVsdGlWYWx1ZUFuc3dlciwgb3IgQ2lkclJvdXRpbmdDb25maWcgYW5kIHNwbGl0IHRoZSByZXN0IGludG8gc2VwYXJhdGUgcmVjb3JkIHNldHNcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1RlbXBsYXRlUmVmZXJlbmNlL2F3cy1yZXNvdXJjZS1yb3V0ZTUzLXJlY29yZHNldC5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcXFwiKVxcblxcdHBzIDo9IF9wZl9yNTNfcG9seF9wb2xpY2llcyhuYW1lKVxcblxcdGNvdW50KHBzKSA+IDFcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1yb3V0ZTUzLXNldC1pZGVudGlmaWVyLXBhaXJpbmdcIixcbiAgICBcInNlcnZpY2VcIjogXCJyb3V0ZTUzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIlNldElkZW50aWZpZXIgYW5kIGEgcm91dGluZyBwb2xpY3kgbXVzdCBhcHBlYXIgdG9nZXRoZXJcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX3I1M19zaWRwX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcmVzb3VyY2Utcm91dGU1My1yZWNvcmRzZXQuaHRtbFxcXCJcXG5cXG5fcGZfcjUzX3NpZHBfcHJvcHMgOj0gW1xcXCJXZWlnaHRcXFwiLCBcXFwiUmVnaW9uXFxcIiwgXFxcIkZhaWxvdmVyXFxcIiwgXFxcIkdlb0xvY2F0aW9uXFxcIiwgXFxcIkNpZHJSb3V0aW5nQ29uZmlnXFxcIl1cXG5cXG5fcGZfcjUzX3NpZHBfaGFzX3BvbGljeShuYW1lKSBpZiB7XFxuXFx0c29tZSBwIGluIF9wZl9yNTNfc2lkcF9wcm9wc1xcblxcdHJlc29sdmUobmFtZSwgc3ByaW50ZihcXFwiUHJvcGVydGllcy4lc1xcXCIsIFtwXSkpICE9IG51bGxcXG59XFxuXFxuX3BmX3I1M19zaWRwX2hhc19wb2xpY3kobmFtZSkgaWYge1xcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuTXVsdGlWYWx1ZUFuc3dlclxcXCIpID09IHRydWVcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1yb3V0ZTUzLXNldC1pZGVudGlmaWVyLXBhaXJpbmdcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLlNldElkZW50aWZpZXJcXFwiLFxcblxcdFxcXCJBIHJvdXRpbmcgcG9saWN5IGlzIGNvbmZpZ3VyZWQgYnV0IFNldElkZW50aWZpZXIgaXMgbWlzc2luZzsgdGhlIENoYW5nZVJlc291cmNlUmVjb3JkU2V0cyBjYWxsIGZhaWxzIHdpdGggXFxcXFxcXCJNaXNzaW5nIGZpZWxkICdTZXRJZGVudGlmaWVyJ1xcXFxcXFwiXFxcIixcXG5cXHRcXFwiQWRkIGEgU2V0SWRlbnRpZmllciB0aGF0IGlzIHVuaXF1ZSBhbW9uZyB0aGUgcmVjb3JkIHNldHMgc2hhcmluZyB0aGlzIE5hbWUgYW5kIFR5cGVcXFwiLFxcblxcdF9wZl9yNTNfc2lkcF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XFxcIilcXG5cXHRfcGZfcjUzX3NpZHBfaGFzX3BvbGljeShuYW1lKVxcblxcdG5vdCBpc19zdHJpbmcocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5TZXRJZGVudGlmaWVyXFxcIikpXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtcm91dGU1My1zZXQtaWRlbnRpZmllci1wYWlyaW5nXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5TZXRJZGVudGlmaWVyXFxcIixcXG5cXHRcXFwiU2V0SWRlbnRpZmllciBpcyBzcGVjaWZpZWQgYnV0IG5vIHJvdXRpbmcgcG9saWN5IGlzOyB0aGUgc2VydmljZSBleHBlY3RzIGV4YWN0bHkgb25lIG9mIFdlaWdodCwgUmVnaW9uLCBGYWlsb3ZlciwgR2VvTG9jYXRpb24sIE11bHRpVmFsdWVBbnN3ZXIsIG9yIENpZHJSb3V0aW5nQ29uZmlnIGFuZCBmaW5kcyBub25lXFxcIixcXG5cXHRcXFwiUmVtb3ZlIFNldElkZW50aWZpZXIgZnJvbSB0aGlzIHNpbXBsZSByZWNvcmQgc2V0LCBvciBhZGQgdGhlIHJvdXRpbmcgcG9saWN5IGl0IHdhcyBtZWFudCBmb3JcXFwiLFxcblxcdF9wZl9yNTNfc2lkcF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XFxcIilcXG5cXHRpc19zdHJpbmcocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5TZXRJZGVudGlmaWVyXFxcIikpXFxuXFx0bm90IF9wZl9yNTNfc2lkcF9oYXNfcG9saWN5KG5hbWUpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtcm91dGU1My10dGwtcmFuZ2VcIixcbiAgICBcInNlcnZpY2VcIjogXCJyb3V0ZTUzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIlRUTCBtdXN0IGZpdCBpbiAzMiBiaXRzICgwLi4yMTQ3NDgzNjQ3IHNlY29uZHMpXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcInBlbmRpbmctZW5naW5lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG4jIE9ubHkgdGhlIG1lYXN1cmVkIGJvdW5kIGlzIGVuZm9yY2VkOiB0aGUgc2VydmljZSByZWplY3RlZCA5OTk5OTk5OTk5IHdpdGhcXG4jIFxcXCJNZW1iZXIgbXVzdCBoYXZlIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyMTQ3NDgzNjQ3XFxcIi4gTmVnYXRpdmUgVFRMcyBhcmVcXG4jIHVudGVzdGVkLCBzbyB0aGV5IGFyZSBkZWxpYmVyYXRlbHkgbm90IGZsYWdnZWQuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1yb3V0ZTUzLXR0bC1yYW5nZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuVFRMXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJUVEwgbXVzdCBiZSBhdCBtb3N0IDIxNDc0ODM2NDcgc2Vjb25kcywgZ290ICV2XFxcIiwgW25dKSxcXG5cXHRcXFwiU2V0IFRUTCB0byBhIDMyLWJpdCB2YWx1ZTsgYW55dGhpbmcgYWJvdmUgYSBkYXkgcmFyZWx5IGhlbHBzIGNhY2hpbmcgYW55d2F5XFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL1JvdXRlNTMvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ2hhbmdlUmVzb3VyY2VSZWNvcmRTZXRzLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFxcXCIpXFxuXFx0dCA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlRUTFxcXCIpXFxuXFx0biA6PSB0b19udW1iZXIodClcXG5cXHRuID4gMjE0NzQ4MzY0N1xcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXJvdXRlNTMtd2VpZ2h0LXJhbmdlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwicm91dGU1M1wiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJXZWlnaHQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJwZW5kaW5nLWVuZ2luZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6UmVjb3JkU2V0XCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuIyBPbmx5IHRoZSBtZWFzdXJlZCBib3VuZCBpcyBlbmZvcmNlZDogdGhlIHNlcnZpY2UgcmVqZWN0ZWQgMzAwIHdpdGggXFxcIk1lbWJlclxcbiMgbXVzdCBoYXZlIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyNTVcXFwiLiBOZWdhdGl2ZSB3ZWlnaHRzIGFyZSB1bnRlc3RlZCxcXG4jIHNvIHRoZXkgYXJlIGRlbGliZXJhdGVseSBub3QgZmxhZ2dlZC5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXJvdXRlNTMtd2VpZ2h0LXJhbmdlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5XZWlnaHRcXFwiLFxcblxcdHNwcmludGYoXFxcIldlaWdodCBtdXN0IGJlIGF0IG1vc3QgMjU1LCBnb3QgJXZcXFwiLCBbbl0pLFxcblxcdFxcXCJTZXQgV2VpZ2h0IHRvIGEgdmFsdWUgaW4gWzAsIDI1NV07IHdlaWdodHMgYXJlIHJlbGF0aXZlLCBzbyBzY2FsZSB0aGUgZ3JvdXAgZG93biBwcm9wb3J0aW9uYWxseVxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9Sb3V0ZTUzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NoYW5nZVJlc291cmNlUmVjb3JkU2V0cy5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpSb3V0ZTUzOjpSZWNvcmRTZXRcXFwiKVxcblxcdHcgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5XZWlnaHRcXFwiKVxcblxcdG4gOj0gdG9fbnVtYmVyKHcpXFxuXFx0biA+IDI1NVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXJvdXRlNTMtem9uZW5hbWUtdHJhaWxpbmctZG90XCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwicm91dGU1M1wiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJIb3N0ZWRab25lTmFtZSBtdXN0IGVuZCB3aXRoIGEgdHJhaWxpbmcgZG90XCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgQ2xvdWRGb3JtYXRpb24gbG9va3MgdGhlIHpvbmUgdXAgYnkgdGhlIGxpdGVyYWwgSG9zdGVkWm9uZU5hbWUgYW5kIGRvZXMgbm90XFxuIyBub3JtYWxpemUgdGhlIHRyYWlsaW5nIGRvdDogdGhlIHNhbWUgc3RhY2sgZGVwbG95ZWQgY2xlYW4gd2l0aFxcbiMgXFxcInpvbmUuZXhhbXBsZS5cXFwiIGFuZCBmYWlsZWQgd2l0aCBOb3RGb3VuZCBmb3IgXFxcInpvbmUuZXhhbXBsZVxcXCIgKDIwMjYtMDktMDIpLlxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtcm91dGU1My16b25lbmFtZS10cmFpbGluZy1kb3RcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLkhvc3RlZFpvbmVOYW1lXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJIb3N0ZWRab25lTmFtZSAnJXMnIGlzIG1pc3NpbmcgdGhlIHRyYWlsaW5nIGRvdCwgc28gQ2xvdWRGb3JtYXRpb24gZmFpbHMgdGhlIGxvb2t1cCB3aXRoIFxcXFxcXFwiTm8gaG9zdGVkIHpvbmUgd2l0aCBuYW1lIC4uLiBmb3VuZFxcXFxcXFwiXFxcIiwgW3puXSksXFxuXFx0c3ByaW50ZihcXFwiVXNlICclcy4nICh3aXRoIHRoZSB0cmFpbGluZyBkb3QpXFxcIiwgW3puXSksXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXJlc291cmNlLXJvdXRlNTMtcmVjb3Jkc2V0Lmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFxcXCIpXFxuXFx0em4gOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Ib3N0ZWRab25lTmFtZVxcXCIpXFxuXFx0aXNfc3RyaW5nKHpuKVxcblxcdHpuICE9IFxcXCJcXFwiXFxuXFx0bm90IGVuZHN3aXRoKHpuLCBcXFwiLlxcXCIpXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtczMtYWNjZWxlcmF0ZS1kb3R0ZWQtbmFtZVwiLFxuICAgIFwic2VydmljZVwiOiBcInMzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIlRyYW5zZmVyIEFjY2VsZXJhdGlvbiByZWplY3RzIGJ1Y2tldCBuYW1lcyB3aXRoIHBlcmlvZHNcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6UzM6OkJ1Y2tldFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgVHJhbnNmZXIgQWNjZWxlcmF0aW9uIGVuZHBvaW50cyBhcmUgRE5TLWJhc2VkLCBzbyBidWNrZXQgbmFtZXMgY29udGFpbmluZ1xcbiMgcGVyaW9kcyBhcmUgcmVqZWN0ZWQgYXQgY3JlYXRpb24uIE9ubHkgYSBsaXRlcmFsIEJ1Y2tldE5hbWUgaXMgY2hlY2thYmxlO1xcbiMgQ0RLLWdlbmVyYXRlZCBuYW1lcyBuZXZlciBjb250YWluIHBlcmlvZHMgYW55d2F5LlxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtczMtYWNjZWxlcmF0ZS1kb3R0ZWQtbmFtZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuQWNjZWxlcmF0ZUNvbmZpZ3VyYXRpb24uQWNjZWxlcmF0aW9uU3RhdHVzXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJCdWNrZXQgbmFtZSAnJXMnIGNvbnRhaW5zIHBlcmlvZHMsIHdoaWNoIFRyYW5zZmVyIEFjY2VsZXJhdGlvbiBkb2VzIG5vdCBzdXBwb3J0OyBDcmVhdGVCdWNrZXQgZmFpbHMgd2l0aCBcXFxcXFxcIlMzIFRyYW5zZmVyIEFjY2VsZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBidWNrZXRzIHdpdGggcGVyaW9kcyAoLikgaW4gdGhlaXIgbmFtZXNcXFxcXFxcIlxcXCIsIFtibl0pLFxcblxcdFxcXCJSZW5hbWUgdGhlIGJ1Y2tldCB3aXRob3V0IHBlcmlvZHMsIG9yIGRyb3AgQWNjZWxlcmF0ZUNvbmZpZ3VyYXRpb25cXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS90cmFuc2Zlci1hY2NlbGVyYXRpb24uaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6UzM6OkJ1Y2tldFxcXCIpXFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5BY2NlbGVyYXRlQ29uZmlndXJhdGlvbi5BY2NlbGVyYXRpb25TdGF0dXNcXFwiKSA9PSBcXFwiRW5hYmxlZFxcXCJcXG5cXHRibiA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkJ1Y2tldE5hbWVcXFwiKVxcblxcdGlzX3N0cmluZyhibilcXG5cXHRjb250YWlucyhibiwgXFxcIi5cXFwiKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXMzLWJ1Y2tldC1wb2xpY3ktYWN0aW9uLXJlc291cmNlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiczNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiT2JqZWN0LWxldmVsIGFjdGlvbnMgbmVlZCBhbiBvYmplY3QtbGV2ZWwgUmVzb3VyY2VcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6UzM6OkJ1Y2tldFBvbGljeVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgQW4gb2JqZWN0LWxldmVsIGFjdGlvbiB3aG9zZSBzdGF0ZW1lbnQgbGlzdHMgb25seSBidWNrZXQtbGV2ZWwgQVJOcyBhcHBsaWVzXFxuIyB0byBub3RoaW5nLCBhbmQgUzMgcmVqZWN0cyB0aGUgcG9saWN5LiBBIGJ1Y2tldC1sZXZlbCBBUk4gaXMgcHJvdmFibGUgdHdvXFxuIyB3YXlzOiBhIGxpdGVyYWwgYXJuOi4uLjpzMzo6Om5hbWUgd2l0aCBubyBcXFwiL1xcXCIgaW4gdGhlIG5hbWUgcGFydCwgb3IgYSB2YWx1ZVxcbiMgdGhhdCByZXNvbHZlKCkgdHVybnMgaW50byB0aGUgbG9naWNhbCBJRCBvZiBhbiBpbi10ZW1wbGF0ZSBidWNrZXQgKFJlZiBhbmRcXG4jIEZuOjpHZXRBdHQgQXJuIGJvdGggZG8g4oCUIHRoZSBHZXRBdHQgb2YgYSBidWNrZXQgaXMgaXRzIGJ1Y2tldCBBUk4pLiBGaXJlc1xcbiMgb25seSB3aGVuIGV2ZXJ5IHJlc291cmNlIGluIHRoZSBzdGF0ZW1lbnQgaXMgcHJvdmFibHkgYnVja2V0LWxldmVsLCBzb1xcbiMgdW5yZXNvbHZhYmxlIGVudHJpZXMgKGUuZy4gRm46OlN1YiBcXFwiJHtCLkFybn0vKlxcXCIpIG11dGUgdGhlIHN0YXRlbWVudC5cXG5cXG5fcGZfczNicGFyX29iamVjdF9hY3Rpb24oYSkgaWYgc3RhcnRzd2l0aChsb3dlcihhKSwgXFxcInMzOmdldG9iamVjdFxcXCIpXFxuXFxuX3BmX3MzYnBhcl9vYmplY3RfYWN0aW9uKGEpIGlmIHN0YXJ0c3dpdGgobG93ZXIoYSksIFxcXCJzMzpwdXRvYmplY3RcXFwiKVxcblxcbl9wZl9zM2JwYXJfb2JqZWN0X2FjdGlvbihhKSBpZiBzdGFydHN3aXRoKGxvd2VyKGEpLCBcXFwiczM6ZGVsZXRlb2JqZWN0XFxcIilcXG5cXG5fcGZfczNicGFyX29iamVjdF9hY3Rpb24oYSkgaWYgbG93ZXIoYSkgaW4ge1xcXCJzMzphYm9ydG11bHRpcGFydHVwbG9hZFxcXCIsIFxcXCJzMzpyZXN0b3Jlb2JqZWN0XFxcIiwgXFxcInMzOmxpc3RtdWx0aXBhcnR1cGxvYWRwYXJ0c1xcXCJ9XFxuXFxuX3BmX3MzYnBhcl9idWNrZXRfbGV2ZWwocikgaWYgciBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpTMzo6QnVja2V0XFxcIilcXG5cXG5fcGZfczNicGFyX2J1Y2tldF9sZXZlbChyKSBpZiB7XFxuXFx0c3RhcnRzd2l0aChyLCBcXFwiYXJuOlxcXCIpXFxuXFx0Y29udGFpbnMociwgXFxcIjpzMzo6OlxcXCIpXFxuXFx0cGFydHMgOj0gc3BsaXQociwgXFxcIjo6OlxcXCIpXFxuXFx0Y291bnQocGFydHMpID09IDJcXG5cXHRub3QgY29udGFpbnMocGFydHNbMV0sIFxcXCIvXFxcIilcXG59XFxuXFxuX3BmX3MzYnBhcl9hY3Rpb25zKG5hbWUsIGkpIDo9IFthXSBpZiB7XFxuXFx0YSA6PSByZXNvbHZlKG5hbWUsIHNwcmludGYoXFxcIlByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50LiVkLkFjdGlvblxcXCIsIFtpXSkpXFxuXFx0aXNfc3RyaW5nKGEpXFxufVxcblxcbl9wZl9zM2JwYXJfYWN0aW9ucyhuYW1lLCBpKSA6PSBhY3RzIGlmIHtcXG5cXHRpdGVtcyA6PSBbaXQgfCBzb21lIGl0IGluIGZsYXR0ZW5fbGlzdChuYW1lLCBzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLlBvbGljeURvY3VtZW50LlN0YXRlbWVudC4lZC5BY3Rpb25cXFwiLCBbaV0pKV1cXG5cXHRjb3VudChpdGVtcykgPiAwXFxuXFx0YWN0cyA6PSBbdiB8IHNvbWUgaXQgaW4gaXRlbXM7IHYgOj0gaXQudmFsdWU7IGlzX3N0cmluZyh2KV1cXG59XFxuXFxuX3BmX3MzYnBhcl9yZXNvdXJjZXMobmFtZSwgaSkgOj0gW3JdIGlmIHtcXG5cXHRyIDo9IHJlc29sdmUobmFtZSwgc3ByaW50ZihcXFwiUHJvcGVydGllcy5Qb2xpY3lEb2N1bWVudC5TdGF0ZW1lbnQuJWQuUmVzb3VyY2VcXFwiLCBbaV0pKVxcblxcdGlzX3N0cmluZyhyKVxcbn1cXG5cXG5fcGZfczNicGFyX3Jlc291cmNlcyhuYW1lLCBpKSA6PSBycyBpZiB7XFxuXFx0aXRlbXMgOj0gW2l0IHwgc29tZSBpdCBpbiBmbGF0dGVuX2xpc3QobmFtZSwgc3ByaW50ZihcXFwiUHJvcGVydGllcy5Qb2xpY3lEb2N1bWVudC5TdGF0ZW1lbnQuJWQuUmVzb3VyY2VcXFwiLCBbaV0pKV1cXG5cXHRjb3VudChpdGVtcykgPiAwXFxuXFx0cnMgOj0gW3YgfCBzb21lIGl0IGluIGl0ZW1zOyB2IDo9IHJlc29sdmUobmFtZSwgc3ByaW50ZihcXFwiUHJvcGVydGllcy5Qb2xpY3lEb2N1bWVudC5TdGF0ZW1lbnQuJWQuUmVzb3VyY2UuJWRcXFwiLCBbaSwgaXQuaW5kZXhdKSk7IGlzX3N0cmluZyh2KV1cXG5cXHRjb3VudChycykgPT0gY291bnQoaXRlbXMpXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtczMtYnVja2V0LXBvbGljeS1hY3Rpb24tcmVzb3VyY2VcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50LiVkLlJlc291cmNlXFxcIiwgW3N0LmluZGV4XSksXFxuXFx0c3ByaW50ZihcXFwiQWN0aW9uICclcycgdGFyZ2V0cyBvYmplY3RzIGJ1dCB0aGUgc3RhdGVtZW50J3MgcmVzb3VyY2VzIGFyZSBhbGwgYnVja2V0LWxldmVsIEFSTnM7IFMzIHJlamVjdHMgdGhlIHBvbGljeSB3aXRoIFxcXFxcXFwiQWN0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSByZXNvdXJjZShzKSBpbiBzdGF0ZW1lbnRcXFxcXFxcIlxcXCIsIFthXSksXFxuXFx0XFxcIkFkZCB0aGUgb2JqZWN0IGZvcm0gb2YgdGhlIEFSTiAoYXBwZW5kIC8qIG9yIGEga2V5IHBhdHRlcm4pIHRvIFJlc291cmNlLCBvciBkcm9wIHRoZSBvYmplY3QtbGV2ZWwgYWN0aW9uXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvYnVja2V0LXBvbGljaWVzLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlMzOjpCdWNrZXRQb2xpY3lcXFwiKVxcblxcdHNvbWUgc3QgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlBvbGljeURvY3VtZW50LlN0YXRlbWVudFxcXCIpXFxuXFx0aXNfb2JqZWN0KHN0LnZhbHVlKVxcblxcdHNvbWUgYSBpbiBfcGZfczNicGFyX2FjdGlvbnMobmFtZSwgc3QuaW5kZXgpXFxuXFx0X3BmX3MzYnBhcl9vYmplY3RfYWN0aW9uKGEpXFxuXFx0cnMgOj0gX3BmX3MzYnBhcl9yZXNvdXJjZXMobmFtZSwgc3QuaW5kZXgpXFxuXFx0Y291bnQocnMpID4gMFxcblxcdGV2ZXJ5IHIgaW4gcnMge1xcblxcdFxcdF9wZl9zM2JwYXJfYnVja2V0X2xldmVsKHIpXFxuXFx0fVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXMzLWJ1Y2tldC1wb2xpY3ktcHJpbmNpcGFsXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiczNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQnVja2V0IHBvbGljeSBzdGF0ZW1lbnRzIG5lZWQgYSBQcmluY2lwYWxcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6UzM6OkJ1Y2tldFBvbGljeVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgUmVzb3VyY2UtYmFzZWQgcG9saWNpZXMgcmVxdWlyZSBQcmluY2lwYWwgKG9yIE5vdFByaW5jaXBhbCkgaW4gZXZlcnlcXG4jIHN0YXRlbWVudCDigJQgdW5saWtlIGlkZW50aXR5IHBvbGljaWVzLCB3aGVyZSBjZm4tbGludC1ncmFkZSBjaGVja3MgYXJlXFxuIyB0dW5lZC4gQW4gdW5yZXNvbHZhYmxlIFByaW5jaXBhbCB2YWx1ZSBzdGlsbCBjb3VudHMgYXMgcHJlc2VudC5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXMzLWJ1Y2tldC1wb2xpY3ktcHJpbmNpcGFsXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLlBvbGljeURvY3VtZW50LlN0YXRlbWVudC4lZFxcXCIsIFtzdC5pbmRleF0pLFxcblxcdFxcXCJUaGUgc3RhdGVtZW50IGhhcyBuZWl0aGVyIFByaW5jaXBhbCBub3IgTm90UHJpbmNpcGFsOyBTMyByZWplY3RzIHRoZSBwb2xpY3kgd2l0aCBcXFxcXFxcIk1pc3NpbmcgcmVxdWlyZWQgZmllbGQgUHJpbmNpcGFsXFxcXFxcXCJcXFwiLFxcblxcdFxcXCJBZGQgYSBQcmluY2lwYWwgKG9yIE5vdFByaW5jaXBhbCkgdG8gdGhlIHN0YXRlbWVudCDigJQgYnVja2V0IHBvbGljaWVzIGFsd2F5cyBuYW1lIHdobyB0aGV5IGFwcGx5IHRvXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvYnVja2V0LXBvbGljaWVzLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlMzOjpCdWNrZXRQb2xpY3lcXFwiKVxcblxcdHNvbWUgc3QgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlBvbGljeURvY3VtZW50LlN0YXRlbWVudFxcXCIpXFxuXFx0aXNfb2JqZWN0KHN0LnZhbHVlKVxcblxcdG9iamVjdC5nZXQoc3QudmFsdWUsIFxcXCJQcmluY2lwYWxcXFwiLCBcXFwiX19wZl9hYnNlbnRcXFwiKSA9PSBcXFwiX19wZl9hYnNlbnRcXFwiXFxuXFx0b2JqZWN0LmdldChzdC52YWx1ZSwgXFxcIk5vdFByaW5jaXBhbFxcXCIsIFxcXCJfX3BmX2Fic2VudFxcXCIpID09IFxcXCJfX3BmX2Fic2VudFxcXCJcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1zMy1saWZlY3ljbGUtZGF5cy1vcmRlclwiLFxuICAgIFwic2VydmljZVwiOiBcInMzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkxpZmVjeWNsZSBhcmNoaXZlIHRyYW5zaXRpb25zIG11c3QgY29tZSAzMCsgZGF5cyBhZnRlciBJQSwgYW5kIGV4cGlyYXRpb24gYWZ0ZXIgZXZlcnkgdHJhbnNpdGlvblwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpTMzo6QnVja2V0XCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuX3BmX3Mzb3JkX2ZpeCA6PSBcXFwiT3JkZXIgdGhlIGxpZmVjeWNsZSBkYXlzIHNvIGFyY2hpdmUgdHJhbnNpdGlvbnMgY29tZSBhdCBsZWFzdCAzMCBkYXlzIGFmdGVyIElBIHRyYW5zaXRpb25zIGFuZCBleHBpcmF0aW9uIGNvbWVzIGFmdGVyIGV2ZXJ5IHRyYW5zaXRpb25cXFwiXFxuXFxuX3BmX3Mzb3JkX3VybCA6PSBcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvbGlmZWN5Y2xlLXRyYW5zaXRpb24tZ2VuZXJhbC1jb25zaWRlcmF0aW9ucy5odG1sXFxcIlxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtczMtbGlmZWN5Y2xlLWRheXMtb3JkZXJcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuTGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5SdWxlcy4lZC5UcmFuc2l0aW9uc1xcXCIsIFtyLmluZGV4XSksXFxuXFx0c3ByaW50ZihcXFwiVHJhbnNpdGlvbiB0byAlcyBhdCAldiBkYXlzIGlzIGxlc3MgdGhhbiAzMCBkYXlzIGFmdGVyIHRoZSAlcyB0cmFuc2l0aW9uIGF0ICV2IGRheXM7IFMzIHJlcXVpcmVzIG9iamVjdHMgdG8gc3RheSBhdCBsZWFzdCAzMCBkYXlzIGluIElBIHN0b3JhZ2VcXFwiLCBbc2MyLCBkMiwgc2MxLCBkMV0pLFxcblxcdF9wZl9zM29yZF9maXgsIF9wZl9zM29yZF91cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6UzM6OkJ1Y2tldFxcXCIpXFxuXFx0c29tZSByIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5MaWZlY3ljbGVDb25maWd1cmF0aW9uLlJ1bGVzXFxcIilcXG5cXHRpc19vYmplY3Qoci52YWx1ZSlcXG5cXHR0cmFucyA6PSBvYmplY3QuZ2V0KHIudmFsdWUsIFxcXCJUcmFuc2l0aW9uc1xcXCIsIFtdKVxcblxcdGlzX2FycmF5KHRyYW5zKVxcblxcdHNvbWUgdDEgaW4gdHJhbnNcXG5cXHRpc19vYmplY3QodDEpXFxuXFx0c2MxIDo9IG9iamVjdC5nZXQodDEsIFxcXCJTdG9yYWdlQ2xhc3NcXFwiLCBcXFwiXFxcIilcXG5cXHRzYzEgaW4ge1xcXCJTVEFOREFSRF9JQVxcXCIsIFxcXCJPTkVaT05FX0lBXFxcIn1cXG5cXHRyYXcxIDo9IG9iamVjdC5nZXQodDEsIFxcXCJUcmFuc2l0aW9uSW5EYXlzXFxcIiwgbnVsbClcXG5cXHRyYXcxICE9IG51bGwgIyB0b19udW1iZXIobnVsbCkg44GvIDAg44Gr44Gq44KLXFxuXFx0ZDEgOj0gdG9fbnVtYmVyKHJhdzEpXFxuXFx0c29tZSB0MiBpbiB0cmFuc1xcblxcdGlzX29iamVjdCh0MilcXG5cXHRzYzIgOj0gb2JqZWN0LmdldCh0MiwgXFxcIlN0b3JhZ2VDbGFzc1xcXCIsIFxcXCJcXFwiKVxcblxcdHNjMiBpbiB7XFxcIkdMQUNJRVJcXFwiLCBcXFwiREVFUF9BUkNISVZFXFxcIn1cXG5cXHRyYXcyIDo9IG9iamVjdC5nZXQodDIsIFxcXCJUcmFuc2l0aW9uSW5EYXlzXFxcIiwgbnVsbClcXG5cXHRyYXcyICE9IG51bGxcXG5cXHRkMiA6PSB0b19udW1iZXIocmF3MilcXG5cXHRkMiA8IGQxICsgMzBcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1zMy1saWZlY3ljbGUtZGF5cy1vcmRlclxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5MaWZlY3ljbGVDb25maWd1cmF0aW9uLlJ1bGVzLiVkLkV4cGlyYXRpb25JbkRheXNcXFwiLCBbci5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcIkV4cGlyYXRpb25JbkRheXMgKCV2KSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBUcmFuc2l0aW9uSW5EYXlzICgldik7IFMzIHJlamVjdHMgbGlmZWN5Y2xlIHJ1bGVzIHRoYXQgZXhwaXJlIG9iamVjdHMgYmVmb3JlIG9yIHdoZW4gdGhleSB0cmFuc2l0aW9uXFxcIiwgW2UsIGRdKSxcXG5cXHRfcGZfczNvcmRfZml4LCBfcGZfczNvcmRfdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlMzOjpCdWNrZXRcXFwiKVxcblxcdHNvbWUgciBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuTGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5SdWxlc1xcXCIpXFxuXFx0aXNfb2JqZWN0KHIudmFsdWUpXFxuXFx0cmF3ZSA6PSBvYmplY3QuZ2V0KHIudmFsdWUsIFxcXCJFeHBpcmF0aW9uSW5EYXlzXFxcIiwgbnVsbClcXG5cXHRyYXdlICE9IG51bGwgIyB0b19udW1iZXIobnVsbCkg44GvIDAg44Gr44Gq44KLXFxuXFx0ZSA6PSB0b19udW1iZXIocmF3ZSlcXG5cXHR0cmFucyA6PSBvYmplY3QuZ2V0KHIudmFsdWUsIFxcXCJUcmFuc2l0aW9uc1xcXCIsIFtdKVxcblxcdGlzX2FycmF5KHRyYW5zKVxcblxcdHNvbWUgdCBpbiB0cmFuc1xcblxcdGlzX29iamVjdCh0KVxcblxcdHJhd2QgOj0gb2JqZWN0LmdldCh0LCBcXFwiVHJhbnNpdGlvbkluRGF5c1xcXCIsIG51bGwpXFxuXFx0cmF3ZCAhPSBudWxsXFxuXFx0ZCA6PSB0b19udW1iZXIocmF3ZClcXG5cXHRlIDw9IGRcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1zMy1saWZlY3ljbGUtZXhwaXJhdGlvbi1wb3NpdGl2ZVwiLFxuICAgIFwic2VydmljZVwiOiBcInMzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkV4cGlyYXRpb25JbkRheXMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXJcIixcbiAgICBcInVwc3RyZWFtXCI6IFwicGVuZGluZy1lbmdpbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlMzOjpCdWNrZXRcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG4jIFRoZSByZWdpc3RyeSBzY2hlbWEgdHlwZXMgRXhwaXJhdGlvbkluRGF5cyBhcyBhIGJhcmUgaW50ZWdlciB3aXRoIG5vXFxuIyBtaW5pbXVtLCBzbyAwIGFuZCBuZWdhdGl2ZXMgcmVhY2ggdGhlIHNlcnZpY2UuIE9ubHkgdGhlIEV4cGlyYXRpb24gYWN0aW9uXFxuIyB3YXMgYmVuY2gtdmVyaWZpZWQ7IG90aGVyIGRheSBmaWVsZHMgYXJlIGxlZnQgYWxvbmUuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1zMy1saWZlY3ljbGUtZXhwaXJhdGlvbi1wb3NpdGl2ZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0c3ByaW50ZihcXFwiUHJvcGVydGllcy5MaWZlY3ljbGVDb25maWd1cmF0aW9uLlJ1bGVzLiVkLkV4cGlyYXRpb25JbkRheXNcXFwiLCBbci5pbmRleF0pLFxcblxcdHNwcmludGYoXFxcIkV4cGlyYXRpb25JbkRheXMgaXMgJXY7IFMzIHJlamVjdHMgdGhlIHJ1bGUgd2l0aCBcXFxcXFxcIidEYXlzJyBmb3IgRXhwaXJhdGlvbiBhY3Rpb24gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXJcXFxcXFxcIlxcXCIsIFtkXSksXFxuXFx0XFxcIlVzZSBhbiBFeHBpcmF0aW9uSW5EYXlzIG9mIDEgb3IgbW9yZVxcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXByb3BlcnRpZXMtczMtYnVja2V0LXJ1bGUuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6UzM6OkJ1Y2tldFxcXCIpXFxuXFx0c29tZSByIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5MaWZlY3ljbGVDb25maWd1cmF0aW9uLlJ1bGVzXFxcIilcXG5cXHRpc19vYmplY3Qoci52YWx1ZSlcXG5cXHRyYXcgOj0gb2JqZWN0LmdldChyLnZhbHVlLCBcXFwiRXhwaXJhdGlvbkluRGF5c1xcXCIsIG51bGwpXFxuXFx0cmF3ICE9IG51bGxcXG5cXHRkIDo9IHRvX251bWJlcihyYXcpXFxuXFx0ZCA8PSAwXFxufVxcblwiXG4gIH0sXG4gIHtcbiAgICBcImlkXCI6IFwicGYtczMtbGlmZWN5Y2xlLXJ1bGUtbm8tYWN0aW9uXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiczNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQSBsaWZlY3ljbGUgcnVsZSBuZWVkcyBhdCBsZWFzdCBvbmUgYWN0aW9uXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlMzOjpCdWNrZXRcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG4jIFRoZSB0ZW4gYWN0aW9uIGZpZWxkcywgdmVyYmF0aW0gZnJvbSB0aGUgc2VydmljZSBlcnJvci4gQSBmaWVsZCB3aG9zZSB2YWx1ZVxcbiMgaXMgYW4gdW5yZXNvbHZhYmxlIGludHJpbnNpYyBzdGlsbCBjb3VudHMgYXMgcHJlc2VudCAoZmFpbCBjbG9zZWQpLlxcbl9wZl9zM2xuYV9hY3Rpb25zIDo9IHtcXG5cXHRcXFwiQWJvcnRJbmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkXFxcIixcXG5cXHRcXFwiRXhwaXJhdGlvbkRhdGVcXFwiLFxcblxcdFxcXCJFeHBpcmF0aW9uSW5EYXlzXFxcIixcXG5cXHRcXFwiRXhwaXJlZE9iamVjdERlbGV0ZU1hcmtlclxcXCIsXFxuXFx0XFxcIk5vbmN1cnJlbnRWZXJzaW9uRXhwaXJhdGlvblxcXCIsXFxuXFx0XFxcIk5vbmN1cnJlbnRWZXJzaW9uRXhwaXJhdGlvbkluRGF5c1xcXCIsXFxuXFx0XFxcIk5vbmN1cnJlbnRWZXJzaW9uVHJhbnNpdGlvblxcXCIsXFxuXFx0XFxcIk5vbmN1cnJlbnRWZXJzaW9uVHJhbnNpdGlvbnNcXFwiLFxcblxcdFxcXCJUcmFuc2l0aW9uXFxcIixcXG5cXHRcXFwiVHJhbnNpdGlvbnNcXFwiLFxcbn1cXG5cXG5fcGZfczNsbmFfaGFzX2FjdGlvbihydWxlKSBpZiB7XFxuXFx0c29tZSBrIGluIF9wZl9zM2xuYV9hY3Rpb25zXFxuXFx0b2JqZWN0LmdldChydWxlLCBrLCBcXFwiX19wZl9hYnNlbnRcXFwiKSAhPSBcXFwiX19wZl9hYnNlbnRcXFwiXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtczMtbGlmZWN5Y2xlLXJ1bGUtbm8tYWN0aW9uXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRzcHJpbnRmKFxcXCJQcm9wZXJ0aWVzLkxpZmVjeWNsZUNvbmZpZ3VyYXRpb24uUnVsZXMuJWRcXFwiLCBbci5pbmRleF0pLFxcblxcdFxcXCJUaGUgbGlmZWN5Y2xlIHJ1bGUgc3BlY2lmaWVzIG5vIGFjdGlvbjsgUzMgcmVqZWN0cyBpdCB3aXRoIFxcXFxcXFwiQXQgbGVhc3Qgb25lIG9mIFtFeHBpcmF0aW9uRGF0ZSxFeHBpcmF0aW9uSW5EYXlzLEFib3J0SW5jb21wbGV0ZU11bHRpcGFydFVwbG9hZCxUcmFuc2l0aW9uLC4uLl0gbmVlZHMgdG8gYmUgc3BlY2lmaWVkXFxcXFxcXCJcXFwiLFxcblxcdFxcXCJBZGQgYW4gZXhwaXJhdGlvbiwgdHJhbnNpdGlvbiwgb3IgYWJvcnQtaW5jb21wbGV0ZS1tdWx0aXBhcnQtdXBsb2FkIGFjdGlvbiB0byB0aGUgcnVsZSwgb3IgcmVtb3ZlIHRoZSBydWxlXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcHJvcGVydGllcy1zMy1idWNrZXQtcnVsZS5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpTMzo6QnVja2V0XFxcIilcXG5cXHRzb21lIHIgaW4gZmxhdHRlbl9saXN0KG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkxpZmVjeWNsZUNvbmZpZ3VyYXRpb24uUnVsZXNcXFwiKVxcblxcdGlzX29iamVjdChyLnZhbHVlKVxcblxcdG5vdCBfcGZfczNsbmFfaGFzX2FjdGlvbihyLnZhbHVlKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXMzLW5vdGlmaWNhdGlvbi1vdmVybGFwcGluZy1maWx0ZXJzXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiczNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiTm90aWZpY2F0aW9uIGVudHJpZXMgbXVzdCBub3Qgb3ZlcmxhcCBmb3IgdGhlIHNhbWUgZXZlbnQgdHlwZVwiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpTMzo6QnVja2V0XCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuIyBTMyBrZWVwcyBvbmUgbm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb24gcGVyIGJ1Y2tldCBhbmQgcmVqZWN0cyBpdCB3aGVuIHR3b1xcbiMgZW50cmllcyAoYWNyb3NzIHF1ZXVlL3RvcGljL2xhbWJkYSBhbGlrZSkgY291bGQgbWF0Y2ggdGhlIHNhbWUgb2JqZWN0IGV2ZW50OlxcbiMgb3ZlcmxhcHBpbmcgZXZlbnQgdHlwZXMgQU5EIG92ZXJsYXBwaW5nIHByZWZpeGVzIEFORCBvdmVybGFwcGluZyBzdWZmaXhlcy5cXG4jIEEgbWlzc2luZyBmaWx0ZXIgc2lkZSBtZWFucyBcXFwiXFxcIiBhbmQgb3ZlcmxhcHMgZXZlcnl0aGluZy4gUGFpcnMgd2l0aCBhblxcbiMgdW5yZXNvbHZhYmxlIGV2ZW50IG9yIGZpbHRlciB2YWx1ZSBhcmUgc2tpcHBlZCDigJQgb3ZlcmxhcCBjYW5ub3QgYmUgcHJvdmVuLlxcblxcbl9wZl9zM25vX2NvbmZpZ3MobmFtZSkgOj0gYXJyYXkuY29uY2F0KGFycmF5LmNvbmNhdChcXG5cXHRbYyB8IHNvbWUgYyBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuTm90aWZpY2F0aW9uQ29uZmlndXJhdGlvbi5RdWV1ZUNvbmZpZ3VyYXRpb25zXFxcIildLFxcblxcdFtjIHwgc29tZSBjIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5Ob3RpZmljYXRpb25Db25maWd1cmF0aW9uLlRvcGljQ29uZmlndXJhdGlvbnNcXFwiKV0pLFxcblxcdFtjIHwgc29tZSBjIGluIGZsYXR0ZW5fbGlzdChuYW1lLCBcXFwiUHJvcGVydGllcy5Ob3RpZmljYXRpb25Db25maWd1cmF0aW9uLkxhbWJkYUNvbmZpZ3VyYXRpb25zXFxcIildKVxcblxcbl9wZl9zM25vX3J1bGVzKGMpIDo9IHJ1bGVzIGlmIHtcXG5cXHRmIDo9IG9iamVjdC5nZXQoYywgXFxcIkZpbHRlclxcXCIsIG51bGwpXFxuXFx0aXNfb2JqZWN0KGYpXFxuXFx0ayA6PSBvYmplY3QuZ2V0KGYsIFxcXCJTM0tleVxcXCIsIG51bGwpXFxuXFx0aXNfb2JqZWN0KGspXFxuXFx0cnVsZXMgOj0gb2JqZWN0LmdldChrLCBcXFwiUnVsZXNcXFwiLCBbXSlcXG5cXHRpc19hcnJheShydWxlcylcXG59XFxuXFxuX3BmX3Mzbm9fcnVsZXMoYykgOj0gW10gaWYge1xcblxcdG9iamVjdC5nZXQoYywgXFxcIkZpbHRlclxcXCIsIFxcXCJfX3BmX2Fic2VudFxcXCIpID09IFxcXCJfX3BmX2Fic2VudFxcXCJcXG59XFxuXFxuX3BmX3Mzbm9fZmlsdGVyX3ZhbChjLCBraW5kKSA6PSB2IGlmIHtcXG5cXHR2cyA6PSBbeCB8IHNvbWUgciBpbiBfcGZfczNub19ydWxlcyhjKTsgaXNfb2JqZWN0KHIpOyBsb3dlcihvYmplY3QuZ2V0KHIsIFxcXCJOYW1lXFxcIiwgXFxcIlxcXCIpKSA9PSBraW5kOyB4IDo9IG9iamVjdC5nZXQociwgXFxcIlZhbHVlXFxcIiwgbnVsbCldXFxuXFx0Y291bnQodnMpID4gMFxcblxcdHYgOj0gdnNbMF1cXG59XFxuXFxuX3BmX3Mzbm9fZmlsdGVyX3ZhbChjLCBraW5kKSA6PSBcXFwiXFxcIiBpZiB7XFxuXFx0dnMgOj0gW3ggfCBzb21lIHIgaW4gX3BmX3Mzbm9fcnVsZXMoYyk7IGlzX29iamVjdChyKTsgbG93ZXIob2JqZWN0LmdldChyLCBcXFwiTmFtZVxcXCIsIFxcXCJcXFwiKSkgPT0ga2luZDsgeCA6PSBvYmplY3QuZ2V0KHIsIFxcXCJWYWx1ZVxcXCIsIG51bGwpXVxcblxcdGNvdW50KHZzKSA9PSAwXFxufVxcblxcbl9wZl9zM25vX3ByZV9vdmVybGFwKGEsIGIpIGlmIHN0YXJ0c3dpdGgoYSwgYilcXG5cXG5fcGZfczNub19wcmVfb3ZlcmxhcChhLCBiKSBpZiBzdGFydHN3aXRoKGIsIGEpXFxuXFxuX3BmX3Mzbm9fc3VmX292ZXJsYXAoYSwgYikgaWYgZW5kc3dpdGgoYSwgYilcXG5cXG5fcGZfczNub19zdWZfb3ZlcmxhcChhLCBiKSBpZiBlbmRzd2l0aChiLCBhKVxcblxcbiMgXFxcInMzOk9iamVjdENyZWF0ZWQ6KlxcXCIgY292ZXJzIFxcXCJzMzpPYmplY3RDcmVhdGVkOlB1dFxcXCI7IGRyb3AgdGhlIHRyYWlsaW5nIFxcXCIqXFxcIlxcbiMgYW5kIHByZWZpeC1tYXRjaC5cXG5fcGZfczNub19ldmVudF9vdmVybGFwKGUxLCBlMikgaWYgZTEgPT0gZTJcXG5cXG5fcGZfczNub19ldmVudF9vdmVybGFwKGUxLCBlMikgaWYge1xcblxcdGVuZHN3aXRoKGUxLCBcXFwiOipcXFwiKVxcblxcdHN0YXJ0c3dpdGgoZTIsIHN1YnN0cmluZyhlMSwgMCwgY291bnQoZTEpIC0gMSkpXFxufVxcblxcbl9wZl9zM25vX2V2ZW50X292ZXJsYXAoZTEsIGUyKSBpZiB7XFxuXFx0ZW5kc3dpdGgoZTIsIFxcXCI6KlxcXCIpXFxuXFx0c3RhcnRzd2l0aChlMSwgc3Vic3RyaW5nKGUyLCAwLCBjb3VudChlMikgLSAxKSlcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1zMy1ub3RpZmljYXRpb24tb3ZlcmxhcHBpbmctZmlsdGVyc1xcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuTm90aWZpY2F0aW9uQ29uZmlndXJhdGlvblxcXCIsXFxuXFx0c3ByaW50ZihcXFwiVHdvIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBvdmVybGFwcGluZyBldmVudCB0eXBlcyAoJyVzJyBhbmQgJyVzJykgaGF2ZSBvdmVybGFwcGluZyBwcmVmaXgvc3VmZml4IGZpbHRlcnM7IFMzIHJlamVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBcXFxcXFxcIkNvbmZpZ3VyYXRpb24gaXMgYW1iaWd1b3VzbHkgZGVmaW5lZC4gQ2Fubm90IGhhdmUgb3ZlcmxhcHBpbmcgc3VmZml4ZXMgaW4gdHdvIHJ1bGVzIGlmIHRoZSBwcmVmaXhlcyBhcmUgb3ZlcmxhcHBpbmcgZm9yIHRoZSBzYW1lIGV2ZW50IHR5cGUuXFxcXFxcXCJcXFwiLCBbZTEsIGUyXSksXFxuXFx0XFxcIk1ha2UgdGhlIHByZWZpeGVzIG9yIHN1ZmZpeGVzIGRpc2pvaW50LCBvciBtZXJnZSB0aGUgdHdvIGVudHJpZXMgaW50byBvbmVcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9ub3RpZmljYXRpb24taG93LXRvLWZpbHRlcmluZy5odG1sXFxcIikgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpTMzo6QnVja2V0XFxcIilcXG5cXHRjcyA6PSBfcGZfczNub19jb25maWdzKG5hbWUpXFxuXFx0c29tZSBpLCBhIGluIGNzXFxuXFx0c29tZSBqLCBiIGluIGNzXFxuXFx0aSA8IGpcXG5cXHRlMSA6PSBvYmplY3QuZ2V0KGEudmFsdWUsIFxcXCJFdmVudFxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKGUxKVxcblxcdGUyIDo9IG9iamVjdC5nZXQoYi52YWx1ZSwgXFxcIkV2ZW50XFxcIiwgbnVsbClcXG5cXHRpc19zdHJpbmcoZTIpXFxuXFx0X3BmX3Mzbm9fZXZlbnRfb3ZlcmxhcChlMSwgZTIpXFxuXFx0cDEgOj0gX3BmX3Mzbm9fZmlsdGVyX3ZhbChhLnZhbHVlLCBcXFwicHJlZml4XFxcIilcXG5cXHRpc19zdHJpbmcocDEpXFxuXFx0cDIgOj0gX3BmX3Mzbm9fZmlsdGVyX3ZhbChiLnZhbHVlLCBcXFwicHJlZml4XFxcIilcXG5cXHRpc19zdHJpbmcocDIpXFxuXFx0X3BmX3Mzbm9fcHJlX292ZXJsYXAocDEsIHAyKVxcblxcdHMxIDo9IF9wZl9zM25vX2ZpbHRlcl92YWwoYS52YWx1ZSwgXFxcInN1ZmZpeFxcXCIpXFxuXFx0aXNfc3RyaW5nKHMxKVxcblxcdHMyIDo9IF9wZl9zM25vX2ZpbHRlcl92YWwoYi52YWx1ZSwgXFxcInN1ZmZpeFxcXCIpXFxuXFx0aXNfc3RyaW5nKHMyKVxcblxcdF9wZl9zM25vX3N1Zl9vdmVybGFwKHMxLCBzMilcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1zMy1vYmplY3Rsb2NrLXJlcXVpcmVzLXZlcnNpb25pbmdcIixcbiAgICBcInNlcnZpY2VcIjogXCJzM1wiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJPYmplY3RMb2NrQ29uZmlndXJhdGlvbiBuZWVkcyB2ZXJzaW9uaW5nIGVuYWJsZWRcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6UzM6OkJ1Y2tldFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb24gb24gaXRzIG93biBkb2VzIE5PVCByZXF1aXJlIE9iamVjdExvY2tFbmFibGVkIOKAlFxcbiMgUzMgYWNjZXB0cyBPYmplY3QgTG9jayBvbiBhbiBleGlzdGluZyB2ZXJzaW9uZWQgYnVja2V0IChiZW5jaCBzMDViIGRlcGxveWVkXFxuIyBjbGVhbikuIFdoYXQgaXQgZG9lcyByZXF1aXJlIGlzIHZlcnNpb25pbmcuIFdoZW4gT2JqZWN0TG9ja0VuYWJsZWQgaXMgdHJ1ZVxcbiMgdGhlIGJ1Y2tldCBpcyBjcmVhdGVkIGxvY2stZW5hYmxlZCBhbmQgdmVyc2lvbmluZyBjb21lcyB3aXRoIGl0LCBzbyB0aGUgcnVsZVxcbiMgZmlyZXMgb25seSB3aGVuIGxvY2stZW5hYmxlbWVudCBpcyBwcm92YWJseSBvZmYgKGtleSBsaXRlcmFsbHkgYWJzZW50IG9yXFxuIyBsaXRlcmFsIGZhbHNlKSBhbmQgdmVyc2lvbmluZyBpcyBwcm92YWJseSBub3QgZW5hYmxlZC5cXG5fcGZfczNvbHJ2X25vX2xvY2tfZW5hYmxlZChuYW1lKSBpZiB7XFxuXFx0cHJvcHMgOj0gaW5wdXQucmVzb3VyY2VzW25hbWVdLnByb3BlcnRpZXNcXG5cXHRpc19vYmplY3QocHJvcHMpXFxuXFx0b2JqZWN0LmdldChwcm9wcywgXFxcIk9iamVjdExvY2tFbmFibGVkXFxcIiwgXFxcIl9fcGZfYWJzZW50XFxcIikgPT0gXFxcIl9fcGZfYWJzZW50XFxcIlxcbn1cXG5cXG5fcGZfczNvbHJ2X25vX2xvY2tfZW5hYmxlZChuYW1lKSBpZiB7XFxuXFx0Y29lcmNlX3RvX2Jvb2wocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5PYmplY3RMb2NrRW5hYmxlZFxcXCIpKSA9PSBmYWxzZVxcbn1cXG5cXG5fcGZfczNvbHJ2X2JhZF92ZXJzaW9uaW5nKG5hbWUpIGlmIHtcXG5cXHRwcm9wcyA6PSBpbnB1dC5yZXNvdXJjZXNbbmFtZV0ucHJvcGVydGllc1xcblxcdGlzX29iamVjdChwcm9wcylcXG5cXHRvYmplY3QuZ2V0KHByb3BzLCBcXFwiVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb25cXFwiLCBcXFwiX19wZl9hYnNlbnRcXFwiKSA9PSBcXFwiX19wZl9hYnNlbnRcXFwiXFxufVxcblxcbl9wZl9zM29scnZfYmFkX3ZlcnNpb25pbmcobmFtZSkgaWYge1xcblxcdHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb24uU3RhdHVzXFxcIikgPT0gXFxcIlN1c3BlbmRlZFxcXCJcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1zMy1vYmplY3Rsb2NrLXJlcXVpcmVzLXZlcnNpb25pbmdcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLk9iamVjdExvY2tDb25maWd1cmF0aW9uXFxcIixcXG5cXHRcXFwiT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb24gaXMgc2V0IG9uIGEgYnVja2V0IHdob3NlIHZlcnNpb25pbmcgaXMgbm90IGVuYWJsZWQ7IFMzIHJlamVjdHMgaXQgd2l0aCBcXFxcXFxcIlZlcnNpb25pbmcgbXVzdCBiZSAnRW5hYmxlZCcgb24gdGhlIGJ1Y2tldCB0byBhcHBseSBhIE9iamVjdCBMb2NrIGNvbmZpZ3VyYXRpb25cXFxcXFxcIlxcXCIsXFxuXFx0XFxcIlNldCBWZXJzaW9uaW5nQ29uZmlndXJhdGlvbi5TdGF0dXMgdG8gJ0VuYWJsZWQnLCBvciBzZXQgT2JqZWN0TG9ja0VuYWJsZWQ6IHRydWUgdG8gY3JlYXRlIHRoZSBidWNrZXQgbG9jay1lbmFibGVkXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvb2JqZWN0LWxvY2suaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6UzM6OkJ1Y2tldFxcXCIpXFxuXFx0aXNfb2JqZWN0KHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuT2JqZWN0TG9ja0NvbmZpZ3VyYXRpb25cXFwiKSlcXG5cXHRfcGZfczNvbHJ2X25vX2xvY2tfZW5hYmxlZChuYW1lKVxcblxcdF9wZl9zM29scnZfYmFkX3ZlcnNpb25pbmcobmFtZSlcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1zMy1vYmplY3Rsb2NrLXZlcnNpb25pbmctc3VzcGVuZGVkXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiczNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiT2JqZWN0IExvY2sgZm9yYmlkcyBzdXNwZW5kaW5nIHZlcnNpb25pbmdcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6UzM6OkJ1Y2tldFwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbiMgT2JqZWN0IExvY2sgZm9yY2UtZW5hYmxlcyB2ZXJzaW9uaW5nIGF0IGNyZWF0aW9uLCBzbyBhIHRlbXBsYXRlIHRoYXQgYWxzb1xcbiMgc3VzcGVuZHMgdmVyc2lvbmluZyBjb250cmFkaWN0cyBpdHNlbGYgYW5kIHRoZSBoYW5kbGVyJ3MgUHV0QnVja2V0VmVyc2lvbmluZ1xcbiMgY2FsbCBpcyByZWplY3RlZC4gRmlyZXMgb25seSBvbiBhIGxpdGVyYWwgXFxcIlN1c3BlbmRlZFxcXCIuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1zMy1vYmplY3Rsb2NrLXZlcnNpb25pbmctc3VzcGVuZGVkXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5WZXJzaW9uaW5nQ29uZmlndXJhdGlvbi5TdGF0dXNcXFwiLFxcblxcdFxcXCJPYmplY3RMb2NrRW5hYmxlZCBpcyB0cnVlIGJ1dCBWZXJzaW9uaW5nQ29uZmlndXJhdGlvbiBzdXNwZW5kcyB2ZXJzaW9uaW5nOyBTMyByZWplY3RzIGl0IHdpdGggXFxcXFxcXCJBbiBPYmplY3QgTG9jayBjb25maWd1cmF0aW9uIGlzIHByZXNlbnQgb24gdGhpcyBidWNrZXQsIHNvIHRoZSB2ZXJzaW9uaW5nIHN0YXRlIGNhbm5vdCBiZSBjaGFuZ2VkLlxcXFxcXFwiXFxcIixcXG5cXHRcXFwiU2V0IFZlcnNpb25pbmdDb25maWd1cmF0aW9uLlN0YXR1cyB0byAnRW5hYmxlZCcgKG9yIGRyb3AgaXQg4oCUIE9iamVjdCBMb2NrIGVuYWJsZXMgdmVyc2lvbmluZyBpdHNlbGYpXFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvb2JqZWN0LWxvY2suaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6UzM6OkJ1Y2tldFxcXCIpXFxuXFx0Y29lcmNlX3RvX2Jvb2wocmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5PYmplY3RMb2NrRW5hYmxlZFxcXCIpKSA9PSB0cnVlXFxuXFx0cmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5WZXJzaW9uaW5nQ29uZmlndXJhdGlvbi5TdGF0dXNcXFwiKSA9PSBcXFwiU3VzcGVuZGVkXFxcIlxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXMzLXJlcGxpY2F0aW9uLWRlc3QtdmVyc2lvbmluZ1wiLFxuICAgIFwic2VydmljZVwiOiBcInMzXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIlRoZSByZXBsaWNhdGlvbiBkZXN0aW5hdGlvbiBidWNrZXQgbmVlZHMgdmVyc2lvbmluZyBlbmFibGVkXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlMzOjpCdWNrZXRcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG4jIFRoZSBkZXN0aW5hdGlvbiBzaWRlIG9mIHdoYXQgcGYtczMtcmVwbGljYXRpb24tcmVxdWlyZXMtdmVyc2lvbmluZyBjaGVja3Mgb25cXG4jIHRoZSBzb3VyY2UuIERlc3RpbmF0aW9uLkJ1Y2tldCBpcyBub3JtYWxseSBGbjo6R2V0QXR0L1JlZiB0byBhbiBpbi10ZW1wbGF0ZVxcbiMgYnVja2V0OyByZXNvbHZlKCkgdHVybnMgYm90aCBpbnRvIHRoZSB0YXJnZXQncyBsb2dpY2FsIElELCBzbyB0aGVcXG4jIGRlc3RpbmF0aW9uJ3Mgb3duIHByb3BlcnRpZXMgYXJlIHJlYWRhYmxlLiBFeHRlcm5hbCBkZXN0aW5hdGlvbiBBUk5zIHJlc29sdmVcXG4jIHRvIHN0cmluZ3MgdGhhdCBhcmUgbm90IGxvZ2ljYWwgSURzIGFuZCBza2lwLiBWZXJzaW9uaW5nIGlzIFxcXCJub3QgZW5hYmxlZFxcXCJcXG4jIHdoZW4gVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb24gaXMgbGl0ZXJhbGx5IGFic2VudCAocHJvdmVuIHZpYVxcbiMgaW5wdXQucmVzb3VyY2VzLCBzZWUgQUdFTlRTLm1kKSBvciBTdGF0dXMgcmVzb2x2ZXMgdG8gXFxcIlN1c3BlbmRlZFxcXCI7IGFuXFxuIyB1bnJlc29sdmFibGUgU3RhdHVzIHNraXBzLlxcbl9wZl9zM3Jkdl9iYWRfdmVyc2lvbmluZyhkZXN0KSBpZiB7XFxuXFx0cHJvcHMgOj0gaW5wdXQucmVzb3VyY2VzW2Rlc3RdLnByb3BlcnRpZXNcXG5cXHRpc19vYmplY3QocHJvcHMpXFxuXFx0b2JqZWN0LmdldChwcm9wcywgXFxcIlZlcnNpb25pbmdDb25maWd1cmF0aW9uXFxcIiwgXFxcIl9fcGZfYWJzZW50XFxcIikgPT0gXFxcIl9fcGZfYWJzZW50XFxcIlxcbn1cXG5cXG5fcGZfczNyZHZfYmFkX3ZlcnNpb25pbmcoZGVzdCkgaWYge1xcblxcdHJlc29sdmUoZGVzdCwgXFxcIlByb3BlcnRpZXMuVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb24uU3RhdHVzXFxcIikgPT0gXFxcIlN1c3BlbmRlZFxcXCJcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1zMy1yZXBsaWNhdGlvbi1kZXN0LXZlcnNpb25pbmdcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuUmVwbGljYXRpb25Db25maWd1cmF0aW9uLlJ1bGVzLiVkLkRlc3RpbmF0aW9uLkJ1Y2tldFxcXCIsIFtyLmluZGV4XSksXFxuXFx0c3ByaW50ZihcXFwiUmVwbGljYXRpb24gZGVzdGluYXRpb24gYnVja2V0ICclcycgZG9lcyBub3QgaGF2ZSB2ZXJzaW9uaW5nIGVuYWJsZWQ7IFMzIHJlamVjdHMgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBcXFxcXFxcIkRlc3RpbmF0aW9uIGJ1Y2tldCBtdXN0IGhhdmUgdmVyc2lvbmluZyBlbmFibGVkXFxcXFxcXCJcXFwiLCBbZGVzdF0pLFxcblxcdFxcXCJTZXQgVmVyc2lvbmluZ0NvbmZpZ3VyYXRpb24uU3RhdHVzIHRvICdFbmFibGVkJyBvbiB0aGUgZGVzdGluYXRpb24gYnVja2V0XFxcIixcXG5cXHRcXFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvcmVwbGljYXRpb24tcmVxdWlyZW1lbnRzLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlMzOjpCdWNrZXRcXFwiKVxcblxcdHNvbWUgciBpbiBmbGF0dGVuX2xpc3QobmFtZSwgXFxcIlByb3BlcnRpZXMuUmVwbGljYXRpb25Db25maWd1cmF0aW9uLlJ1bGVzXFxcIilcXG5cXHRkZXN0IDo9IHJlc29sdmUobmFtZSwgc3ByaW50ZihcXFwiUHJvcGVydGllcy5SZXBsaWNhdGlvbkNvbmZpZ3VyYXRpb24uUnVsZXMuJWQuRGVzdGluYXRpb24uQnVja2V0XFxcIiwgW3IuaW5kZXhdKSlcXG5cXHRpc19zdHJpbmcoZGVzdClcXG5cXHRkZXN0IGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlMzOjpCdWNrZXRcXFwiKVxcblxcdF9wZl9zM3Jkdl9iYWRfdmVyc2lvbmluZyhkZXN0KVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXMzLXJlcGxpY2F0aW9uLXJlcXVpcmVzLXZlcnNpb25pbmdcIixcbiAgICBcInNlcnZpY2VcIjogXCJzM1wiLFxuICAgIFwic2V2ZXJpdHlcIjogXCJFUlJPUlwiLFxuICAgIFwidGl0bGVcIjogXCJSZXBsaWNhdGlvbkNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgdmVyc2lvbmluZyB0byBiZSBlbmFibGVkIG9uIHRoZSBzb3VyY2UgYnVja2V0XCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlMzOjpCdWNrZXRcIlxuICAgIF0sXG4gICAgXCJyZWdvXCI6IFwicGFja2FnZSBjZGtfcHJlZmxpZ2h0XFxuXFxuaW1wb3J0IHJlZ28udjFcXG5cXG4jIOmBleWPjeOBq+OBmeOCi+OBruOBryBWZXJzaW9uaW5nQ29uZmlndXJhdGlvbiDjgYzmloflrZfjganjgYrjgorkuI3lnKjvvIhpbnB1dC5yZXNvdXJjZXMg44GnXFxuIyDoqLzmmI7jgIFBR0VOVFMubWQg5Y+C54Wn77yJ44GL44CBU3RhdHVzIOOBjOODquODhuODqeODq+OBpyBcXFwiU3VzcGVuZGVkXFxcIiDjga7jgajjgY3jgaDjgZHjgIJcXG4jIOacquino+axuuODiOODvOOCr+ODs+OBryBPSyDmibHjgYTvvIhyZXNvbHZlKCkg44Gv44Kt44O85LiN5Zyo44Go5pyq6Kej5rG644Gu5Lih5pa544GnIHVuZGVmaW5lZCDjgatcXG4jIOOBquOCi+OBn+OCgeOAgWBub3QgcmVzb2x2ZSguLi4pYCDjgafjga/kuI3lnKjjgpLoqLzmmI7jgafjgY3jgarjgYQg4oCUIDIwMjYtMDktMDIg5a6f5ris77yJ44CCXFxuX3BmX3MzcmVwbF9iYWRfdmVyc2lvbmluZyhuYW1lKSBpZiB7XFxuXFx0cHJvcHMgOj0gaW5wdXQucmVzb3VyY2VzW25hbWVdLnByb3BlcnRpZXNcXG5cXHRpc19vYmplY3QocHJvcHMpXFxuXFx0b2JqZWN0LmdldChwcm9wcywgXFxcIlZlcnNpb25pbmdDb25maWd1cmF0aW9uXFxcIiwgXFxcIl9fcGZfYWJzZW50XFxcIikgPT0gXFxcIl9fcGZfYWJzZW50XFxcIlxcbn1cXG5cXG5fcGZfczNyZXBsX2JhZF92ZXJzaW9uaW5nKG5hbWUpIGlmIHtcXG5cXHRyZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlZlcnNpb25pbmdDb25maWd1cmF0aW9uLlN0YXR1c1xcXCIpID09IFxcXCJTdXNwZW5kZWRcXFwiXFxufVxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtczMtcmVwbGljYXRpb24tcmVxdWlyZXMtdmVyc2lvbmluZ1xcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuUmVwbGljYXRpb25Db25maWd1cmF0aW9uXFxcIixcXG5cXHRcXFwiUmVwbGljYXRpb25Db25maWd1cmF0aW9uIGlzIHNldCBidXQgYnVja2V0IHZlcnNpb25pbmcgaXMgbm90IGVuYWJsZWQ7IFMzIHJlamVjdHMgdGhlIHJlcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gYXQgZGVwbG95IHRpbWUgKEludmFsaWRSZXF1ZXN0OiBWZXJzaW9uaW5nIG11c3QgYmUgJ0VuYWJsZWQnIG9uIHRoZSBidWNrZXQpXFxcIixcXG5cXHRcXFwiU2V0IFZlcnNpb25pbmdDb25maWd1cmF0aW9uLlN0YXR1cyB0byAnRW5hYmxlZCcgb24gdGhlIHNvdXJjZSBidWNrZXRcXFwiLFxcblxcdFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9yZXBsaWNhdGlvbi1yZXF1aXJlbWVudHMuaHRtbFxcXCIpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6UzM6OkJ1Y2tldFxcXCIpXFxuXFx0aXNfb2JqZWN0KHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuUmVwbGljYXRpb25Db25maWd1cmF0aW9uXFxcIikpXFxuXFx0X3BmX3MzcmVwbF9iYWRfdmVyc2lvbmluZyhuYW1lKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXMzLXdlYnNpdGUtcmVkaXJlY3QtZXhjbHVzaXZlXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwiczNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiUmVkaXJlY3RBbGxSZXF1ZXN0c1RvIGV4Y2x1ZGVzIGV2ZXJ5IG90aGVyIHdlYnNpdGUgc2V0dGluZ1wiLFxuICAgIFwidXBzdHJlYW1cIjogXCJub25lXCIsXG4gICAgXCJyZXNvdXJjZVR5cGVzXCI6IFtcbiAgICAgIFwiQVdTOjpTMzo6QnVja2V0XCJcbiAgICBdLFxuICAgIFwicmVnb1wiOiBcInBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuIyBSZWRpcmVjdEFsbFJlcXVlc3RzVG8gcmVkaXJlY3RzIHRoZSB3aG9sZSBzaXRlLCBzbyBTMyByZWplY3RzIGFueSBzaWJsaW5nXFxuIyB3ZWJzaXRlIHNldHRpbmcgYWxvbmdzaWRlIGl0LlxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtczMtd2Vic2l0ZS1yZWRpcmVjdC1leGNsdXNpdmVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdHNwcmludGYoXFxcIlByb3BlcnRpZXMuV2Vic2l0ZUNvbmZpZ3VyYXRpb24uJXNcXFwiLCBba10pLFxcblxcdHNwcmludGYoXFxcIldlYnNpdGVDb25maWd1cmF0aW9uIGNvbWJpbmVzIFJlZGlyZWN0QWxsUmVxdWVzdHNUbyB3aXRoICVzOyBTMyByZWplY3RzIGl0IHdpdGggXFxcXFxcXCJbSW5kZXhEb2N1bWVudCwgRXJyb3JEb2N1bWVudCwgUm91dGluZ1J1bGVzXSBzaG91bGQgbm90IGJlIHNwZWNpZmllZCBpZiBSZWRpcmVjdEFsbFJlcXVlc3RzVG8gaXMgc3BlY2lmaWVkXFxcXFxcXCJcXFwiLCBba10pLFxcblxcdFxcXCJLZWVwIFJlZGlyZWN0QWxsUmVxdWVzdHNUbyBhbG9uZSwgb3IgZHJvcCBpdCBhbmQgY29uZmlndXJlIHRoZSB3ZWJzaXRlIHdpdGggSW5kZXhEb2N1bWVudC9FcnJvckRvY3VtZW50L1JvdXRpbmdSdWxlc1xcXCIsXFxuXFx0XFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXByb3BlcnRpZXMtczMtYnVja2V0LXdlYnNpdGVjb25maWd1cmF0aW9uLmh0bWxcXFwiKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlMzOjpCdWNrZXRcXFwiKVxcblxcdHdjIDo9IHJlc29sdmUobmFtZSwgXFxcIlByb3BlcnRpZXMuV2Vic2l0ZUNvbmZpZ3VyYXRpb25cXFwiKVxcblxcdGlzX29iamVjdCh3YylcXG5cXHRvYmplY3QuZ2V0KHdjLCBcXFwiUmVkaXJlY3RBbGxSZXF1ZXN0c1RvXFxcIiwgXFxcIl9fcGZfYWJzZW50XFxcIikgIT0gXFxcIl9fcGZfYWJzZW50XFxcIlxcblxcdHNvbWUgayBpbiB7XFxcIkluZGV4RG9jdW1lbnRcXFwiLCBcXFwiRXJyb3JEb2N1bWVudFxcXCIsIFxcXCJSb3V0aW5nUnVsZXNcXFwifVxcblxcdG9iamVjdC5nZXQod2MsIGssIFxcXCJfX3BmX2Fic2VudFxcXCIpICE9IFxcXCJfX3BmX2Fic2VudFxcXCJcXG59XFxuXCJcbiAgfSxcbiAge1xuICAgIFwiaWRcIjogXCJwZi1zbnMtZmlmby10b3BpYy1uYW1lXCIsXG4gICAgXCJzZXJ2aWNlXCI6IFwic25zXCIsXG4gICAgXCJzZXZlcml0eVwiOiBcIkVSUk9SXCIsXG4gICAgXCJ0aXRsZVwiOiBcIkZJRk8gdG9waWMgbmFtZXMgbXVzdCBlbmQgd2l0aCAnLmZpZm8nIChhbmQgJy5maWZvJyBuYW1lcyByZXF1aXJlIEZpZm9Ub3BpYylcIixcbiAgICBcInVwc3RyZWFtXCI6IFwibm9uZVwiLFxuICAgIFwicmVzb3VyY2VUeXBlc1wiOiBbXG4gICAgICBcIkFXUzo6U05TOjpUb3BpY1wiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9zbnNmaWZvX2ZpeCA6PSBcXFwiR2l2ZSBGSUZPIHRvcGljcyBhIFRvcGljTmFtZSBlbmRpbmcgaW4gJy5maWZvJyAob3IgZHJvcCBUb3BpY05hbWUgdG8gbGV0IENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlIG9uZSksIGFuZCBzZXQgRmlmb1RvcGljOiB0cnVlIHdoZW5ldmVyIHRoZSBuYW1lIGVuZHMgaW4gJy5maWZvJ1xcXCJcXG5cXG5fcGZfc25zZmlmb191cmwgOj0gXFxcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zbnMvbGF0ZXN0L2RnL3Nucy1jcmVhdGUtZmlmby10b3BpYy5odG1sXFxcIlxcblxcbl9wZl9zbnNmaWZvX3RydWUobmFtZSkgaWYgcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5GaWZvVG9waWNcXFwiKSBpbiB7dHJ1ZSwgXFxcInRydWVcXFwifVxcblxcbiMgRmlmb1RvcGljIOOBjOWtmOWcqOOBl+OAgeODquODhuODqeODqyBmYWxzZSDku6XlpJbvvIh0cnVlIOOChOODiOODvOOCr+ODs++8ieOBquOCieOAjEZJRk8g44GL44KC44GX44KM44Gq44GE44CN5omx44GEXFxuX3BmX3Nuc2ZpZm9fbWF5YmVfZmlmbyhuYW1lKSBpZiB7XFxuXFx0diA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLkZpZm9Ub3BpY1xcXCIpXFxuXFx0bm90IHYgaW4ge2ZhbHNlLCBcXFwiZmFsc2VcXFwifVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXNucy1maWZvLXRvcGljLW5hbWVcXFwiLCBcXFwiRVJST1JcXFwiLCBuYW1lLFxcblxcdFxcXCJQcm9wZXJ0aWVzLlRvcGljTmFtZVxcXCIsXFxuXFx0c3ByaW50ZihcXFwiRmlmb1RvcGljIGlzIHRydWUgYnV0IFRvcGljTmFtZSAnJXMnIGRvZXMgbm90IGVuZCB3aXRoICcuZmlmbyc7IFNOUyByZWplY3RzIHRoZSB0b3BpYyBhdCBkZXBsb3kgdGltZVxcXCIsIFt0bl0pLFxcblxcdF9wZl9zbnNmaWZvX2ZpeCwgX3BmX3Nuc2ZpZm9fdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlNOUzo6VG9waWNcXFwiKVxcblxcdF9wZl9zbnNmaWZvX3RydWUobmFtZSlcXG5cXHR0biA6PSByZXNvbHZlKG5hbWUsIFxcXCJQcm9wZXJ0aWVzLlRvcGljTmFtZVxcXCIpXFxuXFx0aXNfc3RyaW5nKHRuKVxcblxcdG5vdCBlbmRzd2l0aCh0biwgXFxcIi5maWZvXFxcIilcXG59XFxuXFxudmlvbGF0aW9uIGNvbnRhaW5zIG1ha2VfZGlhZ19mdWxsKFxcXCJwZi1zbnMtZmlmby10b3BpYy1uYW1lXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5Ub3BpY05hbWVcXFwiLFxcblxcdHNwcmludGYoXFxcIlRvcGljTmFtZSAnJXMnIGVuZHMgd2l0aCAnLmZpZm8nIGJ1dCBGaWZvVG9waWMgaXMgbm90IHRydWU7IFNOUyByZWplY3RzIHRoZSB0b3BpYyBuYW1lIGF0IGRlcGxveSB0aW1lXFxcIiwgW3RuXSksXFxuXFx0X3BmX3Nuc2ZpZm9fZml4LCBfcGZfc25zZmlmb191cmwpIGlmIHtcXG5cXHRzb21lIG5hbWUgaW4gcmVzb3VyY2VzX29mX3R5cGUoXFxcIkFXUzo6U05TOjpUb3BpY1xcXCIpXFxuXFx0dG4gOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5Ub3BpY05hbWVcXFwiKVxcblxcdGlzX3N0cmluZyh0bilcXG5cXHRlbmRzd2l0aCh0biwgXFxcIi5maWZvXFxcIilcXG5cXHRub3QgX3BmX3Nuc2ZpZm9fbWF5YmVfZmlmbyhuYW1lKVxcbn1cXG5cIlxuICB9LFxuICB7XG4gICAgXCJpZFwiOiBcInBmLXNmbi1hc2wtbWlzc2luZy1zdGF0ZVwiLFxuICAgIFwic2VydmljZVwiOiBcInN0ZXBmdW5jdGlvbnNcIixcbiAgICBcInNldmVyaXR5XCI6IFwiRVJST1JcIixcbiAgICBcInRpdGxlXCI6IFwiQVNMIE5leHQvRGVmYXVsdC9DaG9pY2VzIG11c3QgcmVmZXJlbmNlIGEgZGVmaW5lZCBzdGF0ZSAodG9wLWxldmVsIHN0YXRlczsgYSBkYW5nbGluZyBTdGFydEF0IGlzIGNvdmVyZWQgYnkgZW5naW5lIHJ1bGUgRTM2MDEpXCIsXG4gICAgXCJ1cHN0cmVhbVwiOiBcIm5vbmVcIixcbiAgICBcInJlc291cmNlVHlwZXNcIjogW1xuICAgICAgXCJBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZVwiXG4gICAgXSxcbiAgICBcInJlZ29cIjogXCJwYWNrYWdlIGNka19wcmVmbGlnaHRcXG5cXG5pbXBvcnQgcmVnby52MVxcblxcbl9wZl9zZm5fZml4IDo9IFxcXCJQb2ludCBOZXh0L0RlZmF1bHQvQ2hvaWNlcyBhdCBhbiBleGlzdGluZyBzdGF0ZSBuYW1lXFxcIlxcblxcbl9wZl9zZm5fdXJsIDo9IFxcXCJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc3RlcC1mdW5jdGlvbnMvbGF0ZXN0L2RnL2FtYXpvbi1zdGF0ZXMtbGFuZ3VhZ2Utc3RhdGVzLmh0bWxcXFwiXFxuXFxuX3BmX3Nmbl9hc2wobmFtZSkgOj0gYXNsIGlmIHtcXG5cXHRkZWYgOj0gcmVzb2x2ZShuYW1lLCBcXFwiUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nXFxcIilcXG5cXHRpc19zdHJpbmcoZGVmKVxcblxcdGFzbCA6PSBqc29uLnVubWFyc2hhbChkZWYpXFxuXFx0aXNfb2JqZWN0KGFzbClcXG59XFxuXFxuX3BmX3Nmbl9kZWZpbmVkKGFzbCkgOj0ge3NuIHwgc29tZSBzbiwgXyBpbiBvYmplY3QuZ2V0KGFzbCwgXFxcIlN0YXRlc1xcXCIsIHt9KX1cXG5cXG4jIE5PVEU6IGEgZGFuZ2xpbmcgU3RhcnRBdCBpcyBkZWxpYmVyYXRlbHkgTk9UIGNoZWNrZWQgaGVyZSDigJQgdGhlIGVuZ2luZSdzXFxuIyBidWlsdC1pbiBydWxlIEUzNjAxIChFUlJPUi9DRk5fTElOVCkgYWxyZWFkeSBjb3ZlcnMgaXQuIFZlcmlmaWVkIGFnYWluc3RcXG4jIEBhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUgMS43LjAtYmV0YSBvbiAyMDI2LTA5LTAxOiBFMzYwMSBmaXJlcyBmb3JcXG4jIFN0YXJ0QXQgb25seSBhbmQgZG9lcyBub3QgY2hlY2sgTmV4dC9EZWZhdWx0L0Nob2ljZXMsIHdoaWNoIGlzIHdoYXQgdGhpc1xcbiMgcnVsZSBhZGRzLlxcblxcbnZpb2xhdGlvbiBjb250YWlucyBtYWtlX2RpYWdfZnVsbChcXFwicGYtc2ZuLWFzbC1taXNzaW5nLXN0YXRlXFxcIiwgXFxcIkVSUk9SXFxcIiwgbmFtZSxcXG5cXHRcXFwiUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nXFxcIixcXG5cXHRzcHJpbnRmKFxcXCJzdGF0ZSAnJXMnIHJlZmVyZW5jZXMgc3RhdGUgJyVzJyB2aWEgJXMsIGJ1dCBubyBzdGF0ZSB3aXRoIHRoYXQgbmFtZSBpcyBkZWZpbmVkXFxcIiwgW3NuYW1lLCB0YXJnZXQsIGtleV0pLFxcblxcdF9wZl9zZm5fZml4LCBfcGZfc2ZuX3VybCkgaWYge1xcblxcdHNvbWUgbmFtZSBpbiByZXNvdXJjZXNfb2ZfdHlwZShcXFwiQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmVcXFwiKVxcblxcdGFzbCA6PSBfcGZfc2ZuX2FzbChuYW1lKVxcblxcdHNvbWUgc25hbWUsIHN0IGluIG9iamVjdC5nZXQoYXNsLCBcXFwiU3RhdGVzXFxcIiwge30pXFxuXFx0aXNfb2JqZWN0KHN0KVxcblxcdHNvbWUga2V5IGluIHtcXFwiTmV4dFxcXCIsIFxcXCJEZWZhdWx0XFxcIn1cXG5cXHR0YXJnZXQgOj0gb2JqZWN0LmdldChzdCwga2V5LCBudWxsKVxcblxcdGlzX3N0cmluZyh0YXJnZXQpXFxuXFx0bm90IHRhcmdldCBpbiBfcGZfc2ZuX2RlZmluZWQoYXNsKVxcbn1cXG5cXG52aW9sYXRpb24gY29udGFpbnMgbWFrZV9kaWFnX2Z1bGwoXFxcInBmLXNmbi1hc2wtbWlzc2luZy1zdGF0ZVxcXCIsIFxcXCJFUlJPUlxcXCIsIG5hbWUsXFxuXFx0XFxcIlByb3BlcnRpZXMuRGVmaW5pdGlvblN0cmluZ1xcXCIsXFxuXFx0c3ByaW50ZihcXFwic3RhdGUgJyVzJyBoYXMgYSBDaG9pY2UgcnVsZSByZWZlcmVuY2luZyBzdGF0ZSAnJXMnLCBidXQgbm8gc3RhdGUgd2l0aCB0aGF0IG5hbWUgaXMgZGVmaW5lZFxcXCIsIFtzbmFtZSwgdGFyZ2V0XSksXFxuXFx0X3BmX3Nmbl9maXgsIF9wZl9zZm5fdXJsKSBpZiB7XFxuXFx0c29tZSBuYW1lIGluIHJlc291cmNlc19vZl90eXBlKFxcXCJBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZVxcXCIpXFxuXFx0YXNsIDo9IF9wZl9zZm5fYXNsKG5hbWUpXFxuXFx0c29tZSBzbmFtZSwgc3QgaW4gb2JqZWN0LmdldChhc2wsIFxcXCJTdGF0ZXNcXFwiLCB7fSlcXG5cXHRpc19vYmplY3Qoc3QpXFxuXFx0Y2hvaWNlcyA6PSBvYmplY3QuZ2V0KHN0LCBcXFwiQ2hvaWNlc1xcXCIsIFtdKVxcblxcdGlzX2FycmF5KGNob2ljZXMpXFxuXFx0c29tZSBjIGluIGNob2ljZXNcXG5cXHRpc19vYmplY3QoYylcXG5cXHR0YXJnZXQgOj0gb2JqZWN0LmdldChjLCBcXFwiTmV4dFxcXCIsIG51bGwpXFxuXFx0aXNfc3RyaW5nKHRhcmdldClcXG5cXHRub3QgdGFyZ2V0IGluIF9wZl9zZm5fZGVmaW5lZChhc2wpXFxufVxcblwiXG4gIH1cbl07XG4iXX0=
|