terraconstructs 0.0.10 → 0.0.12
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 +104486 -34582
- package/lib/aws/arn.js +1 -1
- package/lib/aws/aws-construct.d.ts +1 -1
- package/lib/aws/aws-construct.js +28 -2
- package/lib/aws/aws-stack.d.ts +2 -4
- package/lib/aws/aws-stack.js +21 -8
- package/lib/aws/aws-tags.d.ts +58 -0
- package/lib/aws/aws-tags.js +77 -0
- package/lib/aws/cloudwatch/actions/ec2.js +1 -1
- package/lib/aws/cloudwatch/actions/lambda.js +1 -1
- package/lib/aws/cloudwatch/alarm-base.js +1 -1
- package/lib/aws/cloudwatch/alarm-rule.js +1 -1
- package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
- package/lib/aws/cloudwatch/alarm.js +1 -1
- package/lib/aws/cloudwatch/composite-alarm.js +1 -1
- package/lib/aws/cloudwatch/dashboard.js +1 -1
- package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
- package/lib/aws/cloudwatch/graph.js +8 -8
- package/lib/aws/cloudwatch/layout.js +3 -3
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
- package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
- package/lib/aws/cloudwatch/log-group.js +1 -1
- package/lib/aws/cloudwatch/log-query.js +1 -1
- package/lib/aws/cloudwatch/log-stream.js +1 -1
- package/lib/aws/cloudwatch/metric-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/metric-filter.js +4 -4
- package/lib/aws/cloudwatch/metric.js +2 -2
- package/lib/aws/cloudwatch/pattern.js +3 -3
- package/lib/aws/cloudwatch/policy.js +1 -1
- package/lib/aws/cloudwatch/private/env-tokens.js +5 -6
- package/lib/aws/cloudwatch/private/metric-util.js +4 -5
- package/lib/aws/cloudwatch/private/object.js +2 -3
- package/lib/aws/cloudwatch/private/rendering.js +3 -3
- package/lib/aws/cloudwatch/private/statistic.js +6 -7
- package/lib/aws/cloudwatch/query-definition.js +2 -2
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +4 -4
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.d.ts +1 -1
- package/lib/aws/cloudwatch/widget.js +4 -4
- package/lib/aws/compute/activity.js +3 -2
- package/lib/aws/compute/alb/application-listener-action.d.ts +334 -0
- package/lib/aws/compute/alb/application-listener-action.js +281 -0
- package/lib/aws/compute/alb/application-listener-certificate.d.ts +35 -0
- package/lib/aws/compute/alb/application-listener-certificate.js +35 -0
- package/lib/aws/compute/alb/application-listener-rule.d.ts +233 -0
- package/lib/aws/compute/alb/application-listener-rule.js +220 -0
- package/lib/aws/compute/alb/application-listener.d.ts +574 -0
- package/lib/aws/compute/alb/application-listener.js +538 -0
- package/lib/aws/compute/alb/application-load-balancer.d.ts +715 -0
- package/lib/aws/compute/alb/application-load-balancer.js +780 -0
- package/lib/aws/compute/alb/application-target-group.d.ts +339 -0
- package/lib/aws/compute/alb/application-target-group.js +427 -0
- package/lib/aws/compute/alb/conditions.d.ts +61 -0
- package/lib/aws/compute/alb/conditions.js +164 -0
- package/lib/aws/compute/alb/trust-store-revocation.d.ts +59 -0
- package/lib/aws/compute/alb/trust-store-revocation.js +46 -0
- package/lib/aws/compute/alb/trust-store.d.ts +86 -0
- package/lib/aws/compute/alb/trust-store.js +79 -0
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.d.ts +75 -0
- package/lib/aws/compute/aspects/require-imdsv2-aspect.js +106 -0
- package/lib/aws/compute/bastion-host.d.ts +172 -0
- package/lib/aws/compute/bastion-host.js +114 -0
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/cidr-splits.d.ts +49 -0
- package/lib/aws/compute/cidr-splits.js +59 -0
- package/lib/aws/compute/client-vpn-authorization-rule.d.ts +43 -0
- package/lib/aws/compute/client-vpn-authorization-rule.js +30 -0
- package/lib/aws/compute/client-vpn-endpoint-types.d.ts +62 -0
- package/lib/aws/compute/client-vpn-endpoint-types.js +25 -0
- package/lib/aws/compute/client-vpn-endpoint.d.ts +239 -0
- package/lib/aws/compute/client-vpn-endpoint.js +259 -0
- package/lib/aws/compute/client-vpn-route.d.ts +67 -0
- package/lib/aws/compute/client-vpn-route.js +57 -0
- package/lib/aws/compute/condition.js +1 -1
- package/lib/aws/compute/connections.d.ts +137 -0
- package/lib/aws/compute/connections.js +208 -0
- package/lib/aws/compute/ec2-augmentations.generated.d.ts +53 -0
- package/lib/aws/compute/ec2-augmentations.generated.js +35 -0
- package/lib/aws/compute/ec2-canned-metrics.generated.d.ts +555 -0
- package/lib/aws/compute/ec2-canned-metrics.generated.js +681 -0
- package/lib/aws/compute/ec2-util-v2.d.ts +141 -0
- package/lib/aws/compute/ec2-util-v2.js +286 -0
- package/lib/aws/compute/ec2-util.d.ts +52 -0
- package/lib/aws/compute/ec2-util.js +138 -0
- package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.d.ts +176 -0
- package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.js +119 -0
- package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.d.ts +860 -0
- package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.js +597 -0
- package/lib/aws/compute/event-invoke-config.js +1 -1
- package/lib/aws/compute/event-source-filter.js +2 -2
- package/lib/aws/compute/event-source-mapping.js +1 -1
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
- package/lib/aws/compute/event-sources/s3.js +1 -1
- package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
- package/lib/aws/compute/event-sources/sqs.js +1 -1
- package/lib/aws/compute/fields.js +4 -4
- package/lib/aws/compute/function-alias.js +1 -1
- package/lib/aws/compute/function-base.js +2 -2
- package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
- package/lib/aws/compute/function-destinations/function.js +1 -1
- package/lib/aws/compute/function-destinations/sqs.js +1 -1
- package/lib/aws/compute/function-nodejs.js +1 -1
- package/lib/aws/compute/function-url.js +1 -1
- package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
- package/lib/aws/compute/function-vpc-config.generated.js +1 -1
- package/lib/aws/compute/function.d.ts +1 -1
- package/lib/aws/compute/function.js +5 -5
- package/lib/aws/compute/index-alpha.d.ts +5 -0
- package/lib/aws/compute/index-alpha.js +22 -0
- package/lib/aws/compute/index.d.ts +60 -0
- package/lib/aws/compute/index.js +70 -2
- package/lib/aws/compute/instance-types.d.ts +1354 -0
- package/lib/aws/compute/instance-types.js +1683 -0
- package/lib/aws/compute/instance.d.ts +436 -0
- package/lib/aws/compute/instance.js +262 -0
- package/lib/aws/compute/ip-addresses.d.ts +249 -0
- package/lib/aws/compute/ip-addresses.js +248 -0
- package/lib/aws/compute/ipam.d.ts +309 -0
- package/lib/aws/compute/ipam.js +306 -0
- package/lib/aws/compute/key-pair.d.ts +178 -0
- package/lib/aws/compute/key-pair.js +194 -0
- package/lib/aws/compute/lambda-augmentations.generated.d.ts +65 -0
- package/lib/aws/compute/lambda-augmentations.generated.js +41 -0
- package/lib/aws/compute/lambda-canned-metrics.generated.d.ts +316 -0
- package/lib/aws/compute/lambda-canned-metrics.generated.js +119 -0
- package/lib/aws/compute/launch-template.d.ts +540 -0
- package/lib/aws/compute/launch-template.js +468 -0
- package/lib/aws/compute/lb-shared/access-logs-accounts.d.ts +7 -0
- package/lib/aws/compute/lb-shared/access-logs-accounts.js +46 -0
- package/lib/aws/compute/lb-shared/base-listener.d.ts +113 -0
- package/lib/aws/compute/lb-shared/base-listener.js +181 -0
- package/lib/aws/compute/lb-shared/base-load-balancer.d.ts +212 -0
- package/lib/aws/compute/lb-shared/base-load-balancer.js +290 -0
- package/lib/aws/compute/lb-shared/base-target-group.d.ts +382 -0
- package/lib/aws/compute/lb-shared/base-target-group.js +364 -0
- package/lib/aws/compute/lb-shared/enums.d.ts +282 -0
- package/lib/aws/compute/lb-shared/enums.js +301 -0
- package/lib/aws/compute/lb-shared/grid-lookup-types.d.ts +42 -0
- package/lib/aws/compute/lb-shared/grid-lookup-types.js +53 -0
- package/lib/aws/compute/lb-shared/imported.d.ts +24 -0
- package/lib/aws/compute/lb-shared/imported.js +27 -0
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +194 -0
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +3 -0
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +56 -0
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +3 -0
- package/lib/aws/compute/lb-shared/listener-action.d.ts +14 -0
- package/lib/aws/compute/lb-shared/listener-action.js +4 -0
- package/lib/aws/compute/lb-shared/listener-certificate.d.ts +28 -0
- package/lib/aws/compute/lb-shared/listener-certificate.js +29 -0
- package/lib/aws/compute/lb-shared/load-balancer-targets.d.ts +93 -0
- package/lib/aws/compute/lb-shared/load-balancer-targets.js +127 -0
- package/lib/aws/compute/lb-shared/util.d.ts +113 -0
- package/lib/aws/compute/lb-shared/util.js +264 -0
- package/lib/aws/compute/lb-targets/alb-target.d.ts +67 -0
- package/lib/aws/compute/lb-targets/alb-target.js +100 -0
- package/lib/aws/compute/lb-targets/index.d.ts +4 -0
- package/lib/aws/compute/lb-targets/index.js +22 -0
- package/lib/aws/compute/lb-targets/instance-target.d.ts +42 -0
- package/lib/aws/compute/lb-targets/instance-target.js +67 -0
- package/lib/aws/compute/lb-targets/ip-target.d.ts +55 -0
- package/lib/aws/compute/lb-targets/ip-target.js +79 -0
- package/lib/aws/compute/lb-targets/lambda-target.d.ts +25 -0
- package/lib/aws/compute/lb-targets/lambda-target.js +50 -0
- package/lib/aws/compute/load-balancer.d.ts +336 -0
- package/lib/aws/compute/load-balancer.js +287 -0
- package/lib/aws/compute/machine-image/amazon-linux-2022.d.ts +63 -0
- package/lib/aws/compute/machine-image/amazon-linux-2022.js +84 -0
- package/lib/aws/compute/machine-image/amazon-linux-2023.d.ts +63 -0
- package/lib/aws/compute/machine-image/amazon-linux-2023.js +84 -0
- package/lib/aws/compute/machine-image/amazon-linux2.d.ts +76 -0
- package/lib/aws/compute/machine-image/amazon-linux2.js +87 -0
- package/lib/aws/compute/machine-image/common.d.ts +181 -0
- package/lib/aws/compute/machine-image/common.js +122 -0
- package/lib/aws/compute/machine-image/index.d.ts +5 -0
- package/lib/aws/compute/machine-image/index.js +22 -0
- package/lib/aws/compute/machine-image/machine-image.d.ts +463 -0
- package/lib/aws/compute/machine-image/machine-image.js +566 -0
- package/lib/aws/compute/machine-image/utils.d.ts +2 -0
- package/lib/aws/compute/machine-image/utils.js +17 -0
- package/lib/aws/compute/nat.d.ts +325 -0
- package/lib/aws/compute/nat.js +455 -0
- package/lib/aws/compute/network-acl-types.d.ts +152 -0
- package/lib/aws/compute/network-acl-types.js +156 -0
- package/lib/aws/compute/network-acl.d.ts +285 -0
- package/lib/aws/compute/network-acl.js +207 -0
- package/lib/aws/compute/network-util.d.ts +116 -0
- package/lib/aws/compute/network-util.js +241 -0
- package/lib/aws/compute/nlb/network-listener-action.d.ts +92 -0
- package/lib/aws/compute/nlb/network-listener-action.js +146 -0
- package/lib/aws/compute/nlb/network-listener-certificate.d.ts +24 -0
- package/lib/aws/compute/nlb/network-listener-certificate.js +25 -0
- package/lib/aws/compute/nlb/network-listener.d.ts +248 -0
- package/lib/aws/compute/nlb/network-listener.js +217 -0
- package/lib/aws/compute/nlb/network-load-balancer.d.ts +315 -0
- package/lib/aws/compute/nlb/network-load-balancer.js +360 -0
- package/lib/aws/compute/nlb/network-target-group.d.ts +153 -0
- package/lib/aws/compute/nlb/network-target-group.js +223 -0
- package/lib/aws/compute/peer.d.ts +64 -0
- package/lib/aws/compute/peer.js +235 -0
- package/lib/aws/compute/placement-group.d.ts +161 -0
- package/lib/aws/compute/placement-group.js +133 -0
- package/lib/aws/compute/port.d.ts +287 -0
- package/lib/aws/compute/port.js +390 -0
- package/lib/aws/compute/prefix-list.d.ts +131 -0
- package/lib/aws/compute/prefix-list.js +114 -0
- package/lib/aws/compute/private/context-stub.d.ts +7 -0
- package/lib/aws/compute/private/context-stub.js +43 -0
- package/lib/aws/compute/private/ebs-util.d.ts +14 -0
- package/lib/aws/compute/private/ebs-util.js +145 -0
- package/lib/aws/compute/private/intrinstics.js +2 -1
- package/lib/aws/compute/private/json-path.js +8 -8
- package/lib/aws/compute/private/util.js +2 -3
- package/lib/aws/compute/route.d.ts +547 -0
- package/lib/aws/compute/route.js +469 -0
- package/lib/aws/compute/security-group.d.ts +414 -0
- package/lib/aws/compute/security-group.js +538 -0
- package/lib/aws/compute/state-graph.js +1 -1
- package/lib/aws/compute/state-machine-fragment.js +1 -1
- package/lib/aws/compute/state-machine.d.ts +2 -2
- package/lib/aws/compute/state-machine.js +14 -12
- package/lib/aws/compute/states/choice.js +1 -1
- package/lib/aws/compute/states/custom-state.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
- package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
- package/lib/aws/compute/states/distributed-map.js +1 -1
- package/lib/aws/compute/states/fail.js +1 -1
- package/lib/aws/compute/states/map-base.js +1 -1
- package/lib/aws/compute/states/map.js +1 -1
- package/lib/aws/compute/states/parallel.js +1 -1
- package/lib/aws/compute/states/pass.js +2 -2
- package/lib/aws/compute/states/state.js +5 -5
- package/lib/aws/compute/states/succeed.js +1 -1
- package/lib/aws/compute/states/task-base.js +2 -2
- package/lib/aws/compute/states/task.js +1 -1
- package/lib/aws/compute/states/wait.js +2 -2
- package/lib/aws/compute/stepfunctions-canned-metrics.generated.d.ts +83 -0
- package/lib/aws/compute/stepfunctions-canned-metrics.generated.js +127 -0
- package/lib/aws/compute/subnet-v2.d.ts +213 -0
- package/lib/aws/compute/subnet-v2.js +405 -0
- package/lib/aws/compute/subnet.d.ts +37 -0
- package/lib/aws/compute/subnet.js +181 -0
- package/lib/aws/compute/task-credentials.js +1 -1
- package/lib/aws/compute/task-input.js +1 -1
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
- package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
- package/lib/aws/compute/tasks/http/invoke.js +1 -1
- package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
- package/lib/aws/compute/tasks/private/task-utils.js +3 -4
- package/lib/aws/compute/tasks/resource-arn-suffix.js +2 -3
- package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
- package/lib/aws/compute/types.js +2 -2
- package/lib/aws/compute/user-data.d.ts +270 -0
- package/lib/aws/compute/user-data.js +487 -0
- package/lib/aws/compute/util.d.ts +1 -1
- package/lib/aws/compute/util.js +4 -5
- package/lib/aws/compute/volume.d.ts +480 -0
- package/lib/aws/compute/volume.js +426 -0
- package/lib/aws/compute/vpc-endpoint-service.d.ts +149 -0
- package/lib/aws/compute/vpc-endpoint-service.js +90 -0
- package/lib/aws/compute/vpc-endpoint.d.ts +742 -0
- package/lib/aws/compute/vpc-endpoint.js +811 -0
- package/lib/aws/compute/vpc-flow-logs.d.ts +551 -0
- package/lib/aws/compute/vpc-flow-logs.js +693 -0
- package/lib/aws/compute/vpc-lookup.d.ts +73 -0
- package/lib/aws/compute/vpc-lookup.js +3 -0
- package/lib/aws/compute/vpc-v2-base.d.ts +353 -0
- package/lib/aws/compute/vpc-v2-base.js +493 -0
- package/lib/aws/compute/vpc-v2.d.ts +385 -0
- package/lib/aws/compute/vpc-v2.js +408 -0
- package/lib/aws/compute/vpc.d.ts +1448 -0
- package/lib/aws/compute/vpc.js +1495 -0
- package/lib/aws/compute/vpn.d.ts +443 -0
- package/lib/aws/compute/vpn.js +397 -0
- package/lib/aws/compute/windows-versions.d.ts +418 -0
- package/lib/aws/compute/windows-versions.js +426 -0
- package/lib/aws/edge/certificate-base.d.ts +20 -0
- package/lib/aws/edge/certificate-base.js +28 -0
- package/lib/aws/edge/certificate.d.ts +23 -2
- package/lib/aws/edge/certificate.js +54 -4
- package/lib/aws/edge/distribution.js +3 -3
- package/lib/aws/edge/dns-alias-record-targets.js +2 -2
- package/lib/aws/edge/dns-record.js +16 -16
- package/lib/aws/edge/dns-zone.d.ts +20 -2
- package/lib/aws/edge/dns-zone.js +25 -10
- package/lib/aws/edge/function.js +2 -2
- package/lib/aws/edge/index.d.ts +1 -0
- package/lib/aws/edge/index.js +2 -1
- package/lib/aws/edge/key-value-store.js +4 -4
- package/lib/aws/edge/origin.js +8 -6
- package/lib/aws/edge/response-headers-policy.js +1 -1
- package/lib/aws/encryption/alias.js +1 -1
- package/lib/aws/encryption/key.js +1 -1
- package/lib/aws/encryption/via-service-principal.js +1 -1
- package/lib/aws/iam/grant.js +2 -2
- package/lib/aws/iam/index.d.ts +1 -0
- package/lib/aws/iam/index.js +2 -1
- package/lib/aws/iam/instance-profile.d.ts +155 -0
- package/lib/aws/iam/instance-profile.js +124 -0
- package/lib/aws/iam/managed-policy.js +1 -1
- package/lib/aws/iam/oidc-provider.js +1 -1
- package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
- package/lib/aws/iam/policy-document-config.generated.js +1 -1
- package/lib/aws/iam/policy-document.js +1 -1
- package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
- package/lib/aws/iam/policy-statement-props.generated.js +1 -1
- package/lib/aws/iam/policy-statement.js +9 -9
- package/lib/aws/iam/policy.js +1 -1
- package/lib/aws/iam/principals.js +26 -26
- package/lib/aws/iam/private/assume-role-policy.js +2 -3
- package/lib/aws/iam/private/comparable-principal.js +2 -3
- package/lib/aws/iam/private/immutable-role.d.ts +2 -1
- package/lib/aws/iam/private/immutable-role.js +3 -3
- package/lib/aws/iam/private/imported-role.d.ts +1 -1
- package/lib/aws/iam/private/imported-role.js +3 -3
- package/lib/aws/iam/private/merge-statements.js +2 -3
- package/lib/aws/iam/private/util.js +4 -4
- package/lib/aws/iam/role.js +1 -1
- package/lib/aws/iam/saml-provider.d.ts +1 -1
- package/lib/aws/iam/saml-provider.js +6 -6
- package/lib/aws/iam/unknown-principal.js +1 -1
- package/lib/aws/iam/utils.js +2 -3
- package/lib/aws/index.d.ts +1 -0
- package/lib/aws/index.js +4 -1
- package/lib/aws/network/simple-ipv4-vpc.js +5 -5
- package/lib/aws/network/subnet-group.js +3 -3
- package/lib/aws/network/subnet.d.ts +1 -1
- package/lib/aws/network/subnet.js +7 -7
- package/lib/aws/notify/archive.js +3 -2
- package/lib/aws/notify/connection.js +5 -4
- package/lib/aws/notify/event-bus.js +5 -4
- package/lib/aws/notify/event-pattern.js +3 -3
- package/lib/aws/notify/index.js +3 -1
- package/lib/aws/notify/input.js +4 -3
- package/lib/aws/notify/kinesis-stream.js +3 -2
- package/lib/aws/notify/on-event-options.js +2 -1
- package/lib/aws/notify/queue-config.generated.d.ts +18 -11
- package/lib/aws/notify/queue-config.generated.js +1 -1
- package/lib/aws/notify/queue-policy.js +1 -1
- package/lib/aws/notify/queue.js +1 -1
- package/lib/aws/notify/resource-policy.js +1 -1
- package/lib/aws/notify/rule.js +3 -2
- package/lib/aws/notify/schedule.js +2 -2
- package/lib/aws/notify/sqs-augmentations.generated.d.ts +125 -0
- package/lib/aws/notify/sqs-augmentations.generated.js +74 -0
- package/lib/aws/notify/target.js +2 -1
- package/lib/aws/notify/targets/event-bus.js +1 -1
- package/lib/aws/notify/targets/function.js +1 -1
- package/lib/aws/notify/targets/log-group.js +2 -2
- package/lib/aws/notify/targets/sqs.js +1 -1
- package/lib/aws/notify/targets/state-machine.js +1 -1
- package/lib/aws/notify/targets/util.d.ts +1 -1
- package/lib/aws/notify/targets/util.js +10 -11
- package/lib/aws/notify/util.js +4 -4
- package/lib/aws/provider-config.generated.d.ts +33 -33
- package/lib/aws/provider-config.generated.js +1 -1
- package/lib/aws/storage/bucket-notifications.js +1 -1
- package/lib/aws/storage/bucket-policy.js +1 -1
- package/lib/aws/storage/bucket-source.js +1 -1
- package/lib/aws/storage/bucket.d.ts +298 -65
- package/lib/aws/storage/bucket.js +548 -225
- package/lib/aws/storage/cors-config.generated.d.ts +3 -3
- package/lib/aws/storage/cors-config.generated.js +1 -1
- package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
- package/lib/aws/storage/cors-rule-config.generated.js +1 -1
- package/lib/aws/storage/index.d.ts +1 -0
- package/lib/aws/storage/index.js +2 -1
- package/lib/aws/storage/lifecycle-config.generated.d.ts +11 -11
- package/lib/aws/storage/lifecycle-config.generated.js +1 -1
- package/lib/aws/storage/notification-targets/function.js +6 -6
- package/lib/aws/storage/notification-targets/queue.js +1 -1
- package/lib/aws/storage/origin-access-identity.d.ts +1 -1
- package/lib/aws/storage/origin-access-identity.js +5 -4
- package/lib/aws/storage/parameter-util.d.ts +12 -0
- package/lib/aws/storage/parameter-util.js +65 -0
- package/lib/aws/storage/parameter.d.ts +526 -0
- package/lib/aws/storage/parameter.js +606 -0
- package/lib/aws/storage/s3-canned-metrics.generated.d.ts +22 -0
- package/lib/aws/storage/s3-canned-metrics.generated.js +23 -0
- package/lib/aws/storage/util.d.ts +25 -3
- package/lib/aws/storage/util.js +84 -17
- package/lib/aws/storage/website-config.generated.d.ts +5 -5
- package/lib/aws/storage/website-config.generated.js +1 -1
- package/lib/aws/util.js +2 -3
- package/lib/construct-base.d.ts +10 -1
- package/lib/construct-base.js +9 -6
- package/lib/duration.js +1 -1
- package/lib/expiration.d.ts +48 -0
- package/lib/expiration.js +68 -0
- package/lib/helpers-internal/index.d.ts +1 -0
- package/lib/helpers-internal/index.js +7 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/private/md5.d.ts +4 -0
- package/lib/private/md5.js +14 -0
- package/lib/private/unique-resource-name.js +3 -4
- package/lib/size.js +2 -2
- package/lib/stack-base.d.ts +4 -23
- package/lib/stack-base.js +9 -30
- package/lib/terra-func.d.ts +103 -0
- package/lib/terra-func.js +170 -0
- package/lib/token.js +5 -5
- package/package.json +15 -8
- package/bun.lockb +0 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.NetworkTargetGroup = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
// https://github.com/aws/aws-cdk/blob/v2.175.1/packages/aws-cdk-lib/aws-elasticloadbalancingv2/lib/nlb/network-target-group.ts
|
|
7
|
+
const cdktf_1 = require("cdktf");
|
|
8
|
+
const cloudwatch = require("../../cloudwatch");
|
|
9
|
+
const base_target_group_1 = require("../lb-shared/base-target-group");
|
|
10
|
+
const enums_1 = require("../lb-shared/enums");
|
|
11
|
+
const imported_1 = require("../lb-shared/imported");
|
|
12
|
+
const util_1 = require("../lb-shared/util");
|
|
13
|
+
/**
|
|
14
|
+
* The metrics for a network load balancer.
|
|
15
|
+
*/
|
|
16
|
+
class NetworkTargetGroupMetrics {
|
|
17
|
+
constructor(scope, targetGroupFullName, loadBalancerFullName) {
|
|
18
|
+
this.scope = scope;
|
|
19
|
+
this.targetGroupFullName = targetGroupFullName;
|
|
20
|
+
this.loadBalancerFullName = loadBalancerFullName;
|
|
21
|
+
}
|
|
22
|
+
custom(metricName, props) {
|
|
23
|
+
return new cloudwatch.Metric({
|
|
24
|
+
namespace: "AWS/NetworkELB",
|
|
25
|
+
metricName,
|
|
26
|
+
dimensionsMap: {
|
|
27
|
+
LoadBalancer: this.loadBalancerFullName,
|
|
28
|
+
TargetGroup: this.targetGroupFullName,
|
|
29
|
+
},
|
|
30
|
+
...props,
|
|
31
|
+
}).attachTo(this.scope);
|
|
32
|
+
}
|
|
33
|
+
healthyHostCount(props) {
|
|
34
|
+
return this.custom("HealthyHostCount", {
|
|
35
|
+
statistic: "Average",
|
|
36
|
+
...props,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
unHealthyHostCount(props) {
|
|
40
|
+
return this.custom("UnHealthyHostCount", {
|
|
41
|
+
statistic: "Average",
|
|
42
|
+
...props,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Define a Network Target Group
|
|
48
|
+
*/
|
|
49
|
+
class NetworkTargetGroup extends base_target_group_1.TargetGroupBase {
|
|
50
|
+
/**
|
|
51
|
+
* Import an existing target group
|
|
52
|
+
*/
|
|
53
|
+
static fromTargetGroupAttributes(scope, id, attrs) {
|
|
54
|
+
return new ImportedNetworkTargetGroup(scope, id, attrs);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Import an existing listener
|
|
58
|
+
*
|
|
59
|
+
* @deprecated Use `fromTargetGroupAttributes` instead
|
|
60
|
+
*/
|
|
61
|
+
static import(scope, id, props) {
|
|
62
|
+
return NetworkTargetGroup.fromTargetGroupAttributes(scope, id, props);
|
|
63
|
+
}
|
|
64
|
+
constructor(scope, id, props) {
|
|
65
|
+
const proto = props.protocol || enums_1.LbProtocol.TCP;
|
|
66
|
+
(0, util_1.validateNetworkProtocol)(proto);
|
|
67
|
+
super(scope, id, props, {
|
|
68
|
+
protocol: proto,
|
|
69
|
+
port: props.port,
|
|
70
|
+
});
|
|
71
|
+
this.listeners = [];
|
|
72
|
+
if (props.proxyProtocolV2 != null) {
|
|
73
|
+
this.setAttribute("proxy_protocol_v2.enabled", props.proxyProtocolV2 ? "true" : "false");
|
|
74
|
+
}
|
|
75
|
+
if (props.preserveClientIp !== undefined) {
|
|
76
|
+
this.setAttribute("preserve_client_ip.enabled", props.preserveClientIp ? "true" : "false");
|
|
77
|
+
}
|
|
78
|
+
if (props.connectionTermination !== undefined) {
|
|
79
|
+
this.setAttribute("deregistration_delay.connection_termination.enabled", props.connectionTermination ? "true" : "false");
|
|
80
|
+
}
|
|
81
|
+
this.addTarget(...(props.targets || []));
|
|
82
|
+
}
|
|
83
|
+
get metrics() {
|
|
84
|
+
if (!this._metrics) {
|
|
85
|
+
this._metrics = new NetworkTargetGroupMetrics(this, this.targetGroupFullName, this.firstLoadBalancerFullName);
|
|
86
|
+
}
|
|
87
|
+
return this._metrics;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Add a load balancing target to this target group
|
|
91
|
+
*/
|
|
92
|
+
addTarget(...targets) {
|
|
93
|
+
for (const target of targets) {
|
|
94
|
+
const result = target.attachToNetworkTargetGroup(this);
|
|
95
|
+
this.addLoadBalancerTarget(result);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Register a listener that is load balancing to this target group.
|
|
100
|
+
*
|
|
101
|
+
* Don't call this directly. It will be called by listeners.
|
|
102
|
+
*/
|
|
103
|
+
registerListener(listener) {
|
|
104
|
+
this.loadBalancerAttachedDependencies.add(listener);
|
|
105
|
+
this.listeners.push(listener);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The number of targets that are considered healthy.
|
|
109
|
+
*
|
|
110
|
+
* @default Average over 5 minutes
|
|
111
|
+
* @deprecated Use ``NetworkTargetGroup.metrics.healthyHostCount`` instead
|
|
112
|
+
*/
|
|
113
|
+
metricHealthyHostCount(props) {
|
|
114
|
+
return this.metrics.healthyHostCount(props);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The number of targets that are considered unhealthy.
|
|
118
|
+
*
|
|
119
|
+
* @default Average over 5 minutes
|
|
120
|
+
* @deprecated Use ``NetworkTargetGroup.metrics.healthyHostCount`` instead
|
|
121
|
+
*/
|
|
122
|
+
metricUnHealthyHostCount(props) {
|
|
123
|
+
return this.metrics.unHealthyHostCount(props);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Full name of first load balancer
|
|
127
|
+
*/
|
|
128
|
+
get firstLoadBalancerFullName() {
|
|
129
|
+
if (this.listeners.length === 0) {
|
|
130
|
+
throw new Error("The TargetGroup needs to be attached to a LoadBalancer before you can call this method");
|
|
131
|
+
}
|
|
132
|
+
return (0, base_target_group_1.loadBalancerNameFromListenerArn)(this.listeners[0].listenerArn);
|
|
133
|
+
}
|
|
134
|
+
validateTargetGroup() {
|
|
135
|
+
const ret = super.validateTargetGroup();
|
|
136
|
+
const healthCheck = this.healthCheck || {};
|
|
137
|
+
const lowHealthCheckInterval = 5;
|
|
138
|
+
const highHealthCheckInterval = 300;
|
|
139
|
+
if (healthCheck.interval) {
|
|
140
|
+
const seconds = healthCheck.interval.toSeconds();
|
|
141
|
+
if (!cdktf_1.Token.isUnresolved(seconds) &&
|
|
142
|
+
(seconds < lowHealthCheckInterval || seconds > highHealthCheckInterval)) {
|
|
143
|
+
ret.push(`Health check interval '${seconds}' not supported. Must be between ${lowHealthCheckInterval} and ${highHealthCheckInterval}.`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (healthCheck.healthyThresholdCount) {
|
|
147
|
+
const thresholdCount = healthCheck.healthyThresholdCount;
|
|
148
|
+
if (thresholdCount < 2 || thresholdCount > 10) {
|
|
149
|
+
ret.push(`Healthy Threshold Count '${thresholdCount}' not supported. Must be a number between 2 and 10.`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (healthCheck.unhealthyThresholdCount) {
|
|
153
|
+
const thresholdCount = healthCheck.unhealthyThresholdCount;
|
|
154
|
+
if (thresholdCount < 2 || thresholdCount > 10) {
|
|
155
|
+
ret.push(`Unhealthy Threshold Count '${thresholdCount}' not supported. Must be a number between 2 and 10.`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (!healthCheck.protocol) {
|
|
159
|
+
return ret;
|
|
160
|
+
}
|
|
161
|
+
if (!NLB_HEALTH_CHECK_PROTOCOLS.includes(healthCheck.protocol)) {
|
|
162
|
+
ret.push(`Health check protocol '${healthCheck.protocol}' is not supported. Must be one of [${NLB_HEALTH_CHECK_PROTOCOLS.join(", ")}]`);
|
|
163
|
+
}
|
|
164
|
+
if (healthCheck.path &&
|
|
165
|
+
!NLB_PATH_HEALTH_CHECK_PROTOCOLS.includes(healthCheck.protocol)) {
|
|
166
|
+
ret.push([
|
|
167
|
+
`'${healthCheck.protocol}' health checks do not support the path property.`,
|
|
168
|
+
`Must be one of [${NLB_PATH_HEALTH_CHECK_PROTOCOLS.join(", ")}]`,
|
|
169
|
+
].join(" "));
|
|
170
|
+
}
|
|
171
|
+
const lowHealthCheckTimeout = 2;
|
|
172
|
+
const highHealthCheckTimeout = 120;
|
|
173
|
+
if (healthCheck.timeout) {
|
|
174
|
+
const timeoutSeconds = healthCheck.timeout.toSeconds();
|
|
175
|
+
if (timeoutSeconds < lowHealthCheckTimeout ||
|
|
176
|
+
timeoutSeconds > highHealthCheckTimeout) {
|
|
177
|
+
ret.push(`Health check timeout '${timeoutSeconds}' not supported. Must be a number between ${lowHealthCheckTimeout} and ${highHealthCheckTimeout}.`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return ret;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
exports.NetworkTargetGroup = NetworkTargetGroup;
|
|
184
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
185
|
+
NetworkTargetGroup[_a] = { fqn: "terraconstructs.aws.compute.NetworkTargetGroup", version: "0.0.12" };
|
|
186
|
+
/**
|
|
187
|
+
* An imported network target group
|
|
188
|
+
*/
|
|
189
|
+
class ImportedNetworkTargetGroup extends imported_1.ImportedTargetGroupBase {
|
|
190
|
+
constructor(scope, id, props) {
|
|
191
|
+
super(scope, id, props);
|
|
192
|
+
if (this.loadBalancerArns != util_1.NO_LOADBALANCER_ARNS) {
|
|
193
|
+
const targetGroupFullName = (0, util_1.parseTargetGroupFullName)(this.targetGroupArn);
|
|
194
|
+
const firstLoadBalancerFullName = (0, util_1.parseLoadBalancerFullName)(this.loadBalancerArns);
|
|
195
|
+
this._metrics = new NetworkTargetGroupMetrics(this, targetGroupFullName, firstLoadBalancerFullName);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
get metrics() {
|
|
199
|
+
if (!this._metrics) {
|
|
200
|
+
throw new Error("The imported NetworkTargetGroup needs the associated NetworkLoadBalancer to be able to provide metrics. " +
|
|
201
|
+
"Please specify the ARN value when importing it.");
|
|
202
|
+
}
|
|
203
|
+
return this._metrics;
|
|
204
|
+
}
|
|
205
|
+
registerListener(_listener) {
|
|
206
|
+
// Nothing to do, we know nothing of our members
|
|
207
|
+
}
|
|
208
|
+
addTarget(...targets) {
|
|
209
|
+
for (const target of targets) {
|
|
210
|
+
const result = target.attachToNetworkTargetGroup(this);
|
|
211
|
+
if (result.targetJson !== undefined) {
|
|
212
|
+
throw new Error("Cannot add a non-self registering target to an imported TargetGroup. Create a new TargetGroup instead.");
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const NLB_HEALTH_CHECK_PROTOCOLS = [
|
|
218
|
+
enums_1.LbProtocol.HTTP,
|
|
219
|
+
enums_1.LbProtocol.HTTPS,
|
|
220
|
+
enums_1.LbProtocol.TCP,
|
|
221
|
+
];
|
|
222
|
+
const NLB_PATH_HEALTH_CHECK_PROTOCOLS = [enums_1.LbProtocol.HTTP, enums_1.LbProtocol.HTTPS];
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay10YXJnZXQtZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvbmxiL25ldHdvcmstdGFyZ2V0LWdyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0hBQStIO0FBRS9ILGlDQUE4QjtBQUc5QiwrQ0FBK0M7QUFDL0Msc0VBU3dDO0FBQ3hDLDhDQUFnRDtBQUNoRCxvREFBZ0U7QUFDaEUsNENBSzJCO0FBbUYzQjs7R0FFRztBQUNILE1BQU0seUJBQXlCO0lBSzdCLFlBQ0UsS0FBZ0IsRUFDaEIsbUJBQTJCLEVBQzNCLG9CQUE0QjtRQUU1QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7UUFDL0MsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO0lBQ25ELENBQUM7SUFFTSxNQUFNLENBQ1gsVUFBa0IsRUFDbEIsS0FBZ0M7UUFFaEMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDM0IsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixVQUFVO1lBQ1YsYUFBYSxFQUFFO2dCQUNiLFlBQVksRUFBRSxJQUFJLENBQUMsb0JBQW9CO2dCQUN2QyxXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjthQUN0QztZQUNELEdBQUcsS0FBSztTQUNULENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxLQUFnQztRQUN0RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUU7WUFDckMsU0FBUyxFQUFFLFNBQVM7WUFDcEIsR0FBRyxLQUFLO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGtCQUFrQixDQUFDLEtBQWdDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxv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LFFBQVEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQ2IsMEdBQTBHO2dCQUN4RyxpREFBaUQsQ0FDcEQsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLFNBQTJCO1FBQ2pELGdEQUFnRDtJQUNsRCxDQUFDO0lBRU0sU0FBUyxDQUFDLEdBQUcsT0FBcUM7UUFDdkQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkQsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLElBQUksS0FBSyxDQUNiLHdHQUF3RyxDQUN6RyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFpQkQsTUFBTSwwQkFBMEIsR0FBRztJQUNqQyxrQkFBVSxDQUFDLElBQUk7SUFDZixrQkFBVSxDQUFDLEtBQUs7SUFDaEIsa0JBQVUsQ0FBQyxHQUFHO0NBQ2YsQ0FBQztBQUNGLE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxrQkFBVSxDQUFDLElBQUksRUFBRSxrQkFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTc1LjEvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjIvbGliL25sYi9uZXR3b3JrLXRhcmdldC1ncm91cC50c1xuXG5pbXBvcnQgeyBUb2tlbiB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElOZXR3b3JrTGlzdGVuZXIgfSBmcm9tIFwiLi9uZXR3b3JrLWxpc3RlbmVyXCI7XG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gXCIuLi8uLi9jbG91ZHdhdGNoXCI7XG5pbXBvcnQge1xuICBCYXNlVGFyZ2V0R3JvdXBQcm9wcyxcbiAgSGVhbHRoQ2hlY2ssXG4gIElUYXJnZXRHcm91cCxcbiAgbG9hZEJhbGFuY2VyTmFtZUZyb21MaXN0ZW5lckFybixcbiAgTG9hZEJhbGFuY2VyVGFyZ2V0UHJvcHMsXG4gIFRhcmdldEdyb3VwQXR0cmlidXRlcyxcbiAgVGFyZ2V0R3JvdXBCYXNlLFxuICBUYXJnZXRHcm91cEltcG9ydFByb3BzLFxufSBmcm9tIFwiLi4vbGItc2hhcmVkL2Jhc2UtdGFyZ2V0LWdyb3VwXCI7XG5pbXBvcnQgeyBMYlByb3RvY29sIH0gZnJvbSBcIi4uL2xiLXNoYXJlZC9lbnVtc1wiO1xuaW1wb3J0IHsgSW1wb3J0ZWRUYXJnZXRHcm91cEJhc2UgfSBmcm9tIFwiLi4vbGItc2hhcmVkL2ltcG9ydGVkXCI7XG5pbXBvcnQge1xuICBwYXJzZUxvYWRCYWxhbmNlckZ1bGxOYW1lLFxuICBwYXJzZVRhcmdldEdyb3VwRnVsbE5hbWUsXG4gIHZhbGlkYXRlTmV0d29ya1Byb3RvY29sLFxuICBOT19MT0FEQkFMQU5DRVJfQVJOUyxcbn0gZnJvbSBcIi4uL2xiLXNoYXJlZC91dGlsXCI7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBuZXcgTmV0d29yayBUYXJnZXQgR3JvdXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrVGFyZ2V0R3JvdXBQcm9wcyBleHRlbmRzIEJhc2VUYXJnZXRHcm91cFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBwb3J0IG9uIHdoaWNoIHRoZSB0YXJnZXQgcmVjZWl2ZXMgdHJhZmZpYy5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogUHJvdG9jb2wgZm9yIHRhcmdldCBncm91cCwgZXhwZWN0cyBUQ1AsIFRMUywgVURQLCBvciBUQ1BfVURQLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRDUFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2w/OiBMYlByb3RvY29sO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBQcm94eSBQcm90b2NvbCB2ZXJzaW9uIDIgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5UHJvdG9jb2xWMj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGNsaWVudCBJUCBwcmVzZXJ2YXRpb24gaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UgaWYgdGhlIHRhcmdldCBncm91cCB0eXBlIGlzIElQIGFkZHJlc3MgYW5kIHRoZVxuICAgKiB0YXJnZXQgZ3JvdXAgcHJvdG9jb2wgaXMgVENQIG9yIFRMUy4gT3RoZXJ3aXNlLCB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlc2VydmVDbGllbnRJcD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0YXJnZXRzIHRvIGFkZCB0byB0aGlzIHRhcmdldCBncm91cC5cbiAgICpcbiAgICogQ2FuIGJlIGBJbnN0YW5jZWAsIGBJUEFkZHJlc3NgLCBvciBhbnkgc2VsZi1yZWdpc3RlcmluZyBsb2FkIGJhbGFuY2luZ1xuICAgKiB0YXJnZXQuIElmIHlvdSB1c2UgZWl0aGVyIGBJbnN0YW5jZWAgb3IgYElQQWRkcmVzc2AgYXMgdGFyZ2V0cywgYWxsXG4gICAqIHRhcmdldCBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gdGFyZ2V0cy5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldHM/OiBJTmV0d29ya0xvYWRCYWxhbmNlclRhcmdldFtdO1xuXG4gIC8qKlxuICAgKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbG9hZCBiYWxhbmNlciB0ZXJtaW5hdGVzIGNvbm5lY3Rpb25zIGF0XG4gICAqIHRoZSBlbmQgb2YgdGhlIGRlcmVnaXN0cmF0aW9uIHRpbWVvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjb25uZWN0aW9uVGVybWluYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGFsbCBtZXRyaWNzIGZvciBhIFRhcmdldCBHcm91cCBvZiBhIE5ldHdvcmsgTG9hZCBCYWxhbmNlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTmV0d29ya1RhcmdldEdyb3VwTWV0cmljcyB7XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGdpdmVuIG5hbWVkIG1ldHJpYyBmb3IgdGhpcyBOZXR3b3JrIFRhcmdldCBHcm91cFxuICAgKlxuICAgKiBAZGVmYXVsdCBBdmVyYWdlIG92ZXIgNSBtaW51dGVzXG4gICAqL1xuICBjdXN0b20oXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zLFxuICApOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiB0YXJnZXRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgaGVhbHRoeS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXZlcmFnZSBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgaGVhbHRoeUhvc3RDb3VudChwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHRhcmdldHMgdGhhdCBhcmUgY29uc2lkZXJlZCB1bmhlYWx0aHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF2ZXJhZ2Ugb3ZlciA1IG1pbnV0ZXNcbiAgICovXG4gIHVuSGVhbHRoeUhvc3RDb3VudChwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljO1xufVxuXG4vKipcbiAqIFRoZSBtZXRyaWNzIGZvciBhIG5ldHdvcmsgbG9hZCBiYWxhbmNlci5cbiAqL1xuY2xhc3MgTmV0d29ya1RhcmdldEdyb3VwTWV0cmljcyBpbXBsZW1lbnRzIElOZXR3b3JrVGFyZ2V0R3JvdXBNZXRyaWNzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzY29wZTogQ29uc3RydWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRCYWxhbmNlckZ1bGxOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0R3JvdXBGdWxsTmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIHRhcmdldEdyb3VwRnVsbE5hbWU6IHN0cmluZyxcbiAgICBsb2FkQmFsYW5jZXJGdWxsTmFtZTogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgdGhpcy50YXJnZXRHcm91cEZ1bGxOYW1lID0gdGFyZ2V0R3JvdXBGdWxsTmFtZTtcbiAgICB0aGlzLmxvYWRCYWxhbmNlckZ1bGxOYW1lID0gbG9hZEJhbGFuY2VyRnVsbE5hbWU7XG4gIH1cblxuICBwdWJsaWMgY3VzdG9tKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyxcbiAgKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbmFtZXNwYWNlOiBcIkFXUy9OZXR3b3JrRUxCXCIsXG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBMb2FkQmFsYW5jZXI6IHRoaXMubG9hZEJhbGFuY2VyRnVsbE5hbWUsXG4gICAgICAgIFRhcmdldEdyb3VwOiB0aGlzLnRhcmdldEdyb3VwRnVsbE5hbWUsXG4gICAgICB9LFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSkuYXR0YWNoVG8odGhpcy5zY29wZSk7XG4gIH1cblxuICBwdWJsaWMgaGVhbHRoeUhvc3RDb3VudChwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b20oXCJIZWFsdGh5SG9zdENvdW50XCIsIHtcbiAgICAgIHN0YXRpc3RpYzogXCJBdmVyYWdlXCIsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1bkhlYWx0aHlIb3N0Q291bnQocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b20oXCJVbkhlYWx0aHlIb3N0Q291bnRcIiwge1xuICAgICAgc3RhdGlzdGljOiBcIkF2ZXJhZ2VcIixcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGVmaW5lIGEgTmV0d29yayBUYXJnZXQgR3JvdXBcbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtUYXJnZXRHcm91cFxuICBleHRlbmRzIFRhcmdldEdyb3VwQmFzZVxuICBpbXBsZW1lbnRzIElOZXR3b3JrVGFyZ2V0R3JvdXBcbntcbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyB0YXJnZXQgZ3JvdXBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVRhcmdldEdyb3VwQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IFRhcmdldEdyb3VwQXR0cmlidXRlcyxcbiAgKTogSU5ldHdvcmtUYXJnZXRHcm91cCB7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZE5ldHdvcmtUYXJnZXRHcm91cChzY29wZSwgaWQsIGF0dHJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgbGlzdGVuZXJcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBmcm9tVGFyZ2V0R3JvdXBBdHRyaWJ1dGVzYCBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGltcG9ydChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFRhcmdldEdyb3VwSW1wb3J0UHJvcHMsXG4gICk6IElOZXR3b3JrVGFyZ2V0R3JvdXAge1xuICAgIHJldHVybiBOZXR3b3JrVGFyZ2V0R3JvdXAuZnJvbVRhcmdldEdyb3VwQXR0cmlidXRlcyhzY29wZSwgaWQsIHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzOiBJTmV0d29ya0xpc3RlbmVyW107XG4gIHByaXZhdGUgX21ldHJpY3M/OiBJTmV0d29ya1RhcmdldEdyb3VwTWV0cmljcztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV0d29ya1RhcmdldEdyb3VwUHJvcHMpIHtcbiAgICBjb25zdCBwcm90byA9IHByb3BzLnByb3RvY29sIHx8IExiUHJvdG9jb2wuVENQO1xuICAgIHZhbGlkYXRlTmV0d29ya1Byb3RvY29sKHByb3RvKTtcblxuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMsIHtcbiAgICAgIHByb3RvY29sOiBwcm90byxcbiAgICAgIHBvcnQ6IHByb3BzLnBvcnQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xuXG4gICAgaWYgKHByb3BzLnByb3h5UHJvdG9jb2xWMiAhPSBudWxsKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShcbiAgICAgICAgXCJwcm94eV9wcm90b2NvbF92Mi5lbmFibGVkXCIsXG4gICAgICAgIHByb3BzLnByb3h5UHJvdG9jb2xWMiA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMucHJlc2VydmVDbGllbnRJcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShcbiAgICAgICAgXCJwcmVzZXJ2ZV9jbGllbnRfaXAuZW5hYmxlZFwiLFxuICAgICAgICBwcm9wcy5wcmVzZXJ2ZUNsaWVudElwID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuY29ubmVjdGlvblRlcm1pbmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKFxuICAgICAgICBcImRlcmVnaXN0cmF0aW9uX2RlbGF5LmNvbm5lY3Rpb25fdGVybWluYXRpb24uZW5hYmxlZFwiLFxuICAgICAgICBwcm9wcy5jb25uZWN0aW9uVGVybWluYXRpb24gPyBcInRydWVcIiA6IFwiZmFsc2VcIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYWRkVGFyZ2V0KC4uLihwcm9wcy50YXJnZXRzIHx8IFtdKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1ldHJpY3MoKTogSU5ldHdvcmtUYXJnZXRHcm91cE1ldHJpY3Mge1xuICAgIGlmICghdGhpcy5fbWV0cmljcykge1xuICAgICAgdGhpcy5fbWV0cmljcyA9IG5ldyBOZXR3b3JrVGFyZ2V0R3JvdXBNZXRyaWNzKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLnRhcmdldEdyb3VwRnVsbE5hbWUsXG4gICAgICAgIHRoaXMuZmlyc3RMb2FkQmFsYW5jZXJGdWxsTmFtZSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGxvYWQgYmFsYW5jaW5nIHRhcmdldCB0byB0aGlzIHRhcmdldCBncm91cFxuICAgKi9cbiAgcHVibGljIGFkZFRhcmdldCguLi50YXJnZXRzOiBJTmV0d29ya0xvYWRCYWxhbmNlclRhcmdldFtdKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGFyZ2V0LmF0dGFjaFRvTmV0d29ya1RhcmdldEdyb3VwKHRoaXMpO1xuICAgICAgdGhpcy5hZGRMb2FkQmFsYW5jZXJUYXJnZXQocmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciB0aGF0IGlzIGxvYWQgYmFsYW5jaW5nIHRvIHRoaXMgdGFyZ2V0IGdyb3VwLlxuICAgKlxuICAgKiBEb24ndCBjYWxsIHRoaXMgZGlyZWN0bHkuIEl0IHdpbGwgYmUgY2FsbGVkIGJ5IGxpc3RlbmVycy5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyOiBJTmV0d29ya0xpc3RlbmVyKSB7XG4gICAgdGhpcy5sb2FkQmFsYW5jZXJBdHRhY2hlZERlcGVuZGVuY2llcy5hZGQobGlzdGVuZXIpO1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgdGFyZ2V0cyB0aGF0IGFyZSBjb25zaWRlcmVkIGhlYWx0aHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF2ZXJhZ2Ugb3ZlciA1IG1pbnV0ZXNcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBgTmV0d29ya1RhcmdldEdyb3VwLm1ldHJpY3MuaGVhbHRoeUhvc3RDb3VudGBgIGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNIZWFsdGh5SG9zdENvdW50KHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljcy5oZWFsdGh5SG9zdENvdW50KHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHRhcmdldHMgdGhhdCBhcmUgY29uc2lkZXJlZCB1bmhlYWx0aHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF2ZXJhZ2Ugb3ZlciA1IG1pbnV0ZXNcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBgTmV0d29ya1RhcmdldEdyb3VwLm1ldHJpY3MuaGVhbHRoeUhvc3RDb3VudGBgIGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNVbkhlYWx0aHlIb3N0Q291bnQocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNzLnVuSGVhbHRoeUhvc3RDb3VudChwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbCBuYW1lIG9mIGZpcnN0IGxvYWQgYmFsYW5jZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZmlyc3RMb2FkQmFsYW5jZXJGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUaGUgVGFyZ2V0R3JvdXAgbmVlZHMgdG8gYmUgYXR0YWNoZWQgdG8gYSBMb2FkQmFsYW5jZXIgYmVmb3JlIHlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvYWRCYWxhbmNlck5hbWVGcm9tTGlzdGVuZXJBcm4odGhpcy5saXN0ZW5lcnNbMF0ubGlzdGVuZXJBcm4pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlVGFyZ2V0R3JvdXAoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJldCA9IHN1cGVyLnZhbGlkYXRlVGFyZ2V0R3JvdXAoKTtcblxuICAgIGNvbnN0IGhlYWx0aENoZWNrOiBIZWFsdGhDaGVjayA9IHRoaXMuaGVhbHRoQ2hlY2sgfHwge307XG5cbiAgICBjb25zdCBsb3dIZWFsdGhDaGVja0ludGVydmFsID0gNTtcbiAgICBjb25zdCBoaWdoSGVhbHRoQ2hlY2tJbnRlcnZhbCA9IDMwMDtcbiAgICBpZiAoaGVhbHRoQ2hlY2suaW50ZXJ2YWwpIHtcbiAgICAgIGNvbnN0IHNlY29uZHMgPSBoZWFsdGhDaGVjay5pbnRlcnZhbC50b1NlY29uZHMoKTtcbiAgICAgIGlmIChcbiAgICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChzZWNvbmRzKSAmJlxuICAgICAgICAoc2Vjb25kcyA8IGxvd0hlYWx0aENoZWNrSW50ZXJ2YWwgfHwgc2Vjb25kcyA+IGhpZ2hIZWFsdGhDaGVja0ludGVydmFsKVxuICAgICAgKSB7XG4gICAgICAgIHJldC5wdXNoKFxuICAgICAgICAgIGBIZWFsdGggY2hlY2sgaW50ZXJ2YWwgJyR7c2Vjb25kc30nIG5vdCBzdXBwb3J0ZWQuIE11c3QgYmUgYmV0d2VlbiAke2xvd0hlYWx0aENoZWNrSW50ZXJ2YWx9IGFuZCAke2hpZ2hIZWFsdGhDaGVja0ludGVydmFsfS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoZWFsdGhDaGVjay5oZWFsdGh5VGhyZXNob2xkQ291bnQpIHtcbiAgICAgIGNvbnN0IHRocmVzaG9sZENvdW50ID0gaGVhbHRoQ2hlY2suaGVhbHRoeVRocmVzaG9sZENvdW50O1xuICAgICAgaWYgKHRocmVzaG9sZENvdW50IDwgMiB8fCB0aHJlc2hvbGRDb3VudCA+IDEwKSB7XG4gICAgICAgIHJldC5wdXNoKFxuICAgICAgICAgIGBIZWFsdGh5IFRocmVzaG9sZCBDb3VudCAnJHt0aHJlc2hvbGRDb3VudH0nIG5vdCBzdXBwb3J0ZWQuIE11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAyIGFuZCAxMC5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoZWFsdGhDaGVjay51bmhlYWx0aHlUaHJlc2hvbGRDb3VudCkge1xuICAgICAgY29uc3QgdGhyZXNob2xkQ291bnQgPSBoZWFsdGhDaGVjay51bmhlYWx0aHlUaHJlc2hvbGRDb3VudDtcbiAgICAgIGlmICh0aHJlc2hvbGRDb3VudCA8IDIgfHwgdGhyZXNob2xkQ291bnQgPiAxMCkge1xuICAgICAgICByZXQucHVzaChcbiAgICAgICAgICBgVW5oZWFsdGh5IFRocmVzaG9sZCBDb3VudCAnJHt0aHJlc2hvbGRDb3VudH0nIG5vdCBzdXBwb3J0ZWQuIE11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAyIGFuZCAxMC5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaGVhbHRoQ2hlY2sucHJvdG9jb2wpIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgaWYgKCFOTEJfSEVBTFRIX0NIRUNLX1BST1RPQ09MUy5pbmNsdWRlcyhoZWFsdGhDaGVjay5wcm90b2NvbCkpIHtcbiAgICAgIHJldC5wdXNoKFxuICAgICAgICBgSGVhbHRoIGNoZWNrIHByb3RvY29sICcke2hlYWx0aENoZWNrLnByb3RvY29sfScgaXMgbm90IHN1cHBvcnRlZC4gTXVzdCBiZSBvbmUgb2YgWyR7TkxCX0hFQUxUSF9DSEVDS19QUk9UT0NPTFMuam9pbihcIiwgXCIpfV1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgaGVhbHRoQ2hlY2sucGF0aCAmJlxuICAgICAgIU5MQl9QQVRIX0hFQUxUSF9DSEVDS19QUk9UT0NPTFMuaW5jbHVkZXMoaGVhbHRoQ2hlY2sucHJvdG9jb2wpXG4gICAgKSB7XG4gICAgICByZXQucHVzaChcbiAgICAgICAgW1xuICAgICAgICAgIGAnJHtoZWFsdGhDaGVjay5wcm90b2NvbH0nIGhlYWx0aCBjaGVja3MgZG8gbm90IHN1cHBvcnQgdGhlIHBhdGggcHJvcGVydHkuYCxcbiAgICAgICAgICBgTXVzdCBiZSBvbmUgb2YgWyR7TkxCX1BBVEhfSEVBTFRIX0NIRUNLX1BST1RPQ09MUy5qb2luKFwiLCBcIil9XWAsXG4gICAgICAgIF0uam9pbihcIiBcIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGxvd0hlYWx0aENoZWNrVGltZW91dCA9IDI7XG4gICAgY29uc3QgaGlnaEhlYWx0aENoZWNrVGltZW91dCA9IDEyMDtcbiAgICBpZiAoaGVhbHRoQ2hlY2sudGltZW91dCkge1xuICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBoZWFsdGhDaGVjay50aW1lb3V0LnRvU2Vjb25kcygpO1xuICAgICAgaWYgKFxuICAgICAgICB0aW1lb3V0U2Vjb25kcyA8IGxvd0hlYWx0aENoZWNrVGltZW91dCB8fFxuICAgICAgICB0aW1lb3V0U2Vjb25kcyA+IGhpZ2hIZWFsdGhDaGVja1RpbWVvdXRcbiAgICAgICkge1xuICAgICAgICByZXQucHVzaChcbiAgICAgICAgICBgSGVhbHRoIGNoZWNrIHRpbWVvdXQgJyR7dGltZW91dFNlY29uZHN9JyBub3Qgc3VwcG9ydGVkLiBNdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gJHtsb3dIZWFsdGhDaGVja1RpbWVvdXR9IGFuZCAke2hpZ2hIZWFsdGhDaGVja1RpbWVvdXR9LmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxufVxuXG4vKipcbiAqIEEgbmV0d29yayB0YXJnZXQgZ3JvdXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTmV0d29ya1RhcmdldEdyb3VwIGV4dGVuZHMgSVRhcmdldEdyb3VwIHtcbiAgLyoqXG4gICAqIEFsbCBtZXRyaWNzIGF2YWlsYWJsZSBmb3IgdGhpcyB0YXJnZXQgZ3JvdXAuXG4gICAqL1xuICByZWFkb25seSBtZXRyaWNzOiBJTmV0d29ya1RhcmdldEdyb3VwTWV0cmljcztcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciB0aGF0IGlzIGxvYWQgYmFsYW5jaW5nIHRvIHRoaXMgdGFyZ2V0IGdyb3VwLlxuICAgKlxuICAgKiBEb24ndCBjYWxsIHRoaXMgZGlyZWN0bHkuIEl0IHdpbGwgYmUgY2FsbGVkIGJ5IGxpc3RlbmVycy5cbiAgICovXG4gIHJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXI6IElOZXR3b3JrTGlzdGVuZXIpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGQgYSBsb2FkIGJhbGFuY2luZyB0YXJnZXQgdG8gdGhpcyB0YXJnZXQgZ3JvdXBcbiAgICovXG4gIGFkZFRhcmdldCguLi50YXJnZXRzOiBJTmV0d29ya0xvYWRCYWxhbmNlclRhcmdldFtdKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBbiBpbXBvcnRlZCBuZXR3b3JrIHRhcmdldCBncm91cFxuICovXG5jbGFzcyBJbXBvcnRlZE5ldHdvcmtUYXJnZXRHcm91cFxuICBleHRlbmRzIEltcG9ydGVkVGFyZ2V0R3JvdXBCYXNlXG4gIGltcGxlbWVudHMgSU5ldHdvcmtUYXJnZXRHcm91cFxue1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZXRyaWNzPzogSU5ldHdvcmtUYXJnZXRHcm91cE1ldHJpY3M7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogVGFyZ2V0R3JvdXBJbXBvcnRQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgaWYgKHRoaXMubG9hZEJhbGFuY2VyQXJucyAhPSBOT19MT0FEQkFMQU5DRVJfQVJOUykge1xuICAgICAgY29uc3QgdGFyZ2V0R3JvdXBGdWxsTmFtZSA9IHBhcnNlVGFyZ2V0R3JvdXBGdWxsTmFtZSh0aGlzLnRhcmdldEdyb3VwQXJuKTtcbiAgICAgIGNvbnN0IGZpcnN0TG9hZEJhbGFuY2VyRnVsbE5hbWUgPSBwYXJzZUxvYWRCYWxhbmNlckZ1bGxOYW1lKFxuICAgICAgICB0aGlzLmxvYWRCYWxhbmNlckFybnMsXG4gICAgICApO1xuICAgICAgdGhpcy5fbWV0cmljcyA9IG5ldyBOZXR3b3JrVGFyZ2V0R3JvdXBNZXRyaWNzKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0YXJnZXRHcm91cEZ1bGxOYW1lLFxuICAgICAgICBmaXJzdExvYWRCYWxhbmNlckZ1bGxOYW1lLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1ldHJpY3MoKTogSU5ldHdvcmtUYXJnZXRHcm91cE1ldHJpY3Mge1xuICAgIGlmICghdGhpcy5fbWV0cmljcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSBpbXBvcnRlZCBOZXR3b3JrVGFyZ2V0R3JvdXAgbmVlZHMgdGhlIGFzc29jaWF0ZWQgTmV0d29ya0xvYWRCYWxhbmNlciB0byBiZSBhYmxlIHRvIHByb3ZpZGUgbWV0cmljcy4gXCIgK1xuICAgICAgICAgIFwiUGxlYXNlIHNwZWNpZnkgdGhlIEFSTiB2YWx1ZSB3aGVuIGltcG9ydGluZyBpdC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyTGlzdGVuZXIoX2xpc3RlbmVyOiBJTmV0d29ya0xpc3RlbmVyKSB7XG4gICAgLy8gTm90aGluZyB0byBkbywgd2Uga25vdyBub3RoaW5nIG9mIG91ciBtZW1iZXJzXG4gIH1cblxuICBwdWJsaWMgYWRkVGFyZ2V0KC4uLnRhcmdldHM6IElOZXR3b3JrTG9hZEJhbGFuY2VyVGFyZ2V0W10pIHtcbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0YXJnZXQuYXR0YWNoVG9OZXR3b3JrVGFyZ2V0R3JvdXAodGhpcyk7XG4gICAgICBpZiAocmVzdWx0LnRhcmdldEpzb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDYW5ub3QgYWRkIGEgbm9uLXNlbGYgcmVnaXN0ZXJpbmcgdGFyZ2V0IHRvIGFuIGltcG9ydGVkIFRhcmdldEdyb3VwLiBDcmVhdGUgYSBuZXcgVGFyZ2V0R3JvdXAgaW5zdGVhZC5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNvbnN0cnVjdHMgdGhhdCBjYW4gYmUgdGFyZ2V0cyBvZiBhbiBuZXR3b3JrIGxvYWQgYmFsYW5jZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTmV0d29ya0xvYWRCYWxhbmNlclRhcmdldCB7XG4gIC8qKlxuICAgKiBBdHRhY2ggbG9hZC1iYWxhbmNlZCB0YXJnZXQgdG8gYSBUYXJnZXRHcm91cFxuICAgKlxuICAgKiBNYXkgcmV0dXJuIEpTT04gdG8gZGlyZWN0bHkgYWRkIHRvIHRoZSBbVGFyZ2V0c10gbGlzdCwgb3IgcmV0dXJuIHVuZGVmaW5lZFxuICAgKiBpZiB0aGUgdGFyZ2V0IHdpbGwgcmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlIGxvYWQgYmFsYW5jZXIuXG4gICAqL1xuICBhdHRhY2hUb05ldHdvcmtUYXJnZXRHcm91cChcbiAgICB0YXJnZXRHcm91cDogSU5ldHdvcmtUYXJnZXRHcm91cCxcbiAgKTogTG9hZEJhbGFuY2VyVGFyZ2V0UHJvcHM7XG59XG5cbmNvbnN0IE5MQl9IRUFMVEhfQ0hFQ0tfUFJPVE9DT0xTID0gW1xuICBMYlByb3RvY29sLkhUVFAsXG4gIExiUHJvdG9jb2wuSFRUUFMsXG4gIExiUHJvdG9jb2wuVENQLFxuXTtcbmNvbnN0IE5MQl9QQVRIX0hFQUxUSF9DSEVDS19QUk9UT0NPTFMgPSBbTGJQcm90b2NvbC5IVFRQLCBMYlByb3RvY29sLkhUVFBTXTtcbiJdfQ==
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { IConnectable } from "./connections";
|
|
2
|
+
/**
|
|
3
|
+
* Interface for classes that provide the peer-specification parts of a security group rule
|
|
4
|
+
*/
|
|
5
|
+
export interface IPeer extends IConnectable {
|
|
6
|
+
/**
|
|
7
|
+
* Whether the rule can be inlined into a SecurityGroup or not
|
|
8
|
+
*/
|
|
9
|
+
readonly canInlineRule: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* A unique identifier for this connection peer
|
|
12
|
+
*/
|
|
13
|
+
readonly uniqueId: string;
|
|
14
|
+
/**
|
|
15
|
+
* Produce the ingress rule JSON for the given connection
|
|
16
|
+
*/
|
|
17
|
+
toIngressRuleConfig(): any;
|
|
18
|
+
/**
|
|
19
|
+
* Produce the egress rule JSON for the given connection
|
|
20
|
+
*/
|
|
21
|
+
toEgressRuleConfig(): any;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Peer object factories (to be used in Security Group management)
|
|
25
|
+
*
|
|
26
|
+
* The static methods on this object can be used to create peer objects
|
|
27
|
+
* which represent a connection partner in Security Group rules.
|
|
28
|
+
*
|
|
29
|
+
* Use this object if you need to represent connection partners using plain IP
|
|
30
|
+
* addresses, or a prefix list ID.
|
|
31
|
+
*
|
|
32
|
+
* If you want to address a connection partner by Security Group, you can just
|
|
33
|
+
* use the Security Group (or the construct that contains a Security Group)
|
|
34
|
+
* directly, as it already implements `IPeer`.
|
|
35
|
+
*/
|
|
36
|
+
export declare class Peer {
|
|
37
|
+
/**
|
|
38
|
+
* Create an IPv4 peer from a CIDR
|
|
39
|
+
*/
|
|
40
|
+
static ipv4(cidrIp: string): IPeer;
|
|
41
|
+
/**
|
|
42
|
+
* Any IPv4 address
|
|
43
|
+
*/
|
|
44
|
+
static anyIpv4(): IPeer;
|
|
45
|
+
/**
|
|
46
|
+
* Create an IPv6 peer from a CIDR
|
|
47
|
+
*/
|
|
48
|
+
static ipv6(cidrIp: string): IPeer;
|
|
49
|
+
/**
|
|
50
|
+
* Any IPv6 address
|
|
51
|
+
*/
|
|
52
|
+
static anyIpv6(): IPeer;
|
|
53
|
+
/**
|
|
54
|
+
* A prefix list
|
|
55
|
+
*/
|
|
56
|
+
static prefixList(prefixListId: string): IPeer;
|
|
57
|
+
/**
|
|
58
|
+
* A security group ID
|
|
59
|
+
*
|
|
60
|
+
* NOTE: Terraform provider AWS does not support sourceSecurityGroupOwnerId
|
|
61
|
+
*/
|
|
62
|
+
static securityGroupId(securityGroupId: string, sourceSecurityGroupOwnerId?: string): IPeer;
|
|
63
|
+
protected constructor();
|
|
64
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Peer = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
// https://github.com/aws/aws-cdk/blob/v2.175.1/packages/aws-cdk-lib/aws-ec2/lib/peer.ts
|
|
7
|
+
const cdktf_1 = require("cdktf");
|
|
8
|
+
const connections_1 = require("./connections");
|
|
9
|
+
/**
|
|
10
|
+
* Peer object factories (to be used in Security Group management)
|
|
11
|
+
*
|
|
12
|
+
* The static methods on this object can be used to create peer objects
|
|
13
|
+
* which represent a connection partner in Security Group rules.
|
|
14
|
+
*
|
|
15
|
+
* Use this object if you need to represent connection partners using plain IP
|
|
16
|
+
* addresses, or a prefix list ID.
|
|
17
|
+
*
|
|
18
|
+
* If you want to address a connection partner by Security Group, you can just
|
|
19
|
+
* use the Security Group (or the construct that contains a Security Group)
|
|
20
|
+
* directly, as it already implements `IPeer`.
|
|
21
|
+
*/
|
|
22
|
+
class Peer {
|
|
23
|
+
/**
|
|
24
|
+
* Create an IPv4 peer from a CIDR
|
|
25
|
+
*/
|
|
26
|
+
static ipv4(cidrIp) {
|
|
27
|
+
return new CidrIPv4(cidrIp);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Any IPv4 address
|
|
31
|
+
*/
|
|
32
|
+
static anyIpv4() {
|
|
33
|
+
return new AnyIPv4();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create an IPv6 peer from a CIDR
|
|
37
|
+
*/
|
|
38
|
+
static ipv6(cidrIp) {
|
|
39
|
+
return new CidrIPv6(cidrIp);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Any IPv6 address
|
|
43
|
+
*/
|
|
44
|
+
static anyIpv6() {
|
|
45
|
+
return new AnyIPv6();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* A prefix list
|
|
49
|
+
*/
|
|
50
|
+
static prefixList(prefixListId) {
|
|
51
|
+
return new PrefixList(prefixListId);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A security group ID
|
|
55
|
+
*
|
|
56
|
+
* NOTE: Terraform provider AWS does not support sourceSecurityGroupOwnerId
|
|
57
|
+
*/
|
|
58
|
+
static securityGroupId(securityGroupId, sourceSecurityGroupOwnerId) {
|
|
59
|
+
return new SecurityGroupId(securityGroupId, sourceSecurityGroupOwnerId);
|
|
60
|
+
}
|
|
61
|
+
constructor() { }
|
|
62
|
+
}
|
|
63
|
+
exports.Peer = Peer;
|
|
64
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
65
|
+
Peer[_a] = { fqn: "terraconstructs.aws.compute.Peer", version: "0.0.12" };
|
|
66
|
+
/**
|
|
67
|
+
* A connection to and from a given IP range
|
|
68
|
+
*/
|
|
69
|
+
class CidrIPv4 {
|
|
70
|
+
constructor(cidrIp) {
|
|
71
|
+
this.cidrIp = cidrIp;
|
|
72
|
+
this.canInlineRule = true;
|
|
73
|
+
this.connections = new connections_1.Connections({ peer: this });
|
|
74
|
+
if (!cdktf_1.Token.isUnresolved(cidrIp)) {
|
|
75
|
+
const cidrMatch = cidrIp.match(/^(\d{1,3}\.){3}\d{1,3}(\/\d+)?$/);
|
|
76
|
+
if (!cidrMatch) {
|
|
77
|
+
throw new Error(`Invalid IPv4 CIDR: "${cidrIp}"`);
|
|
78
|
+
}
|
|
79
|
+
if (!cidrMatch[2]) {
|
|
80
|
+
throw new Error(`CIDR mask is missing in IPv4: "${cidrIp}". Did you mean "${cidrIp}/32"?`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
this.uniqueId = cidrIp;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Produce the ingress rule JSON for the given connection
|
|
87
|
+
*/
|
|
88
|
+
toIngressRuleConfig() {
|
|
89
|
+
return {
|
|
90
|
+
cidrIpv4: this.cidrIp,
|
|
91
|
+
cidrBlocks: [this.cidrIp],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Produce the egress rule JSON for the given connection
|
|
96
|
+
*/
|
|
97
|
+
toEgressRuleConfig() {
|
|
98
|
+
return {
|
|
99
|
+
cidrIpv4: this.cidrIp,
|
|
100
|
+
cidrBlocks: [this.cidrIp],
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Any IPv4 address
|
|
106
|
+
*/
|
|
107
|
+
class AnyIPv4 extends CidrIPv4 {
|
|
108
|
+
constructor() {
|
|
109
|
+
super("0.0.0.0/0");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* A connection to a from a given IPv6 range
|
|
114
|
+
*/
|
|
115
|
+
class CidrIPv6 {
|
|
116
|
+
constructor(cidrIpv6) {
|
|
117
|
+
this.cidrIpv6 = cidrIpv6;
|
|
118
|
+
this.canInlineRule = true;
|
|
119
|
+
this.connections = new connections_1.Connections({ peer: this });
|
|
120
|
+
if (!cdktf_1.Token.isUnresolved(cidrIpv6)) {
|
|
121
|
+
const cidrMatch = cidrIpv6.match(/^([\da-f]{0,4}:){2,7}([\da-f]{0,4})?(\/\d+)?$/);
|
|
122
|
+
if (!cidrMatch) {
|
|
123
|
+
throw new Error(`Invalid IPv6 CIDR: "${cidrIpv6}"`);
|
|
124
|
+
}
|
|
125
|
+
if (!cidrMatch[3]) {
|
|
126
|
+
throw new Error(`CIDR mask is missing in IPv6: "${cidrIpv6}". Did you mean "${cidrIpv6}/128"?`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
this.uniqueId = cidrIpv6;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Produce the ingress rule JSON for the given connection
|
|
133
|
+
*/
|
|
134
|
+
toIngressRuleConfig() {
|
|
135
|
+
return {
|
|
136
|
+
cidrIpv6: this.cidrIpv6,
|
|
137
|
+
ipv6CidrBlocks: [this.cidrIpv6],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Produce the egress rule JSON for the given connection
|
|
142
|
+
*/
|
|
143
|
+
toEgressRuleConfig() {
|
|
144
|
+
return {
|
|
145
|
+
cidrIpv6: this.cidrIpv6,
|
|
146
|
+
ipv6CidrBlocks: [this.cidrIpv6],
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Any IPv6 address
|
|
152
|
+
*/
|
|
153
|
+
class AnyIPv6 extends CidrIPv6 {
|
|
154
|
+
constructor() {
|
|
155
|
+
super("::/0");
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* A prefix list
|
|
160
|
+
*
|
|
161
|
+
* Prefix lists are used to allow traffic to VPC-local service endpoints.
|
|
162
|
+
*
|
|
163
|
+
* For more information, see this page:
|
|
164
|
+
*
|
|
165
|
+
* https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-endpoints.html
|
|
166
|
+
*/
|
|
167
|
+
class PrefixList {
|
|
168
|
+
constructor(prefixListId) {
|
|
169
|
+
this.prefixListId = prefixListId;
|
|
170
|
+
this.canInlineRule = false;
|
|
171
|
+
this.connections = new connections_1.Connections({ peer: this });
|
|
172
|
+
this.uniqueId = prefixListId;
|
|
173
|
+
}
|
|
174
|
+
toIngressRuleConfig() {
|
|
175
|
+
return {
|
|
176
|
+
prefixListId: this.prefixListId,
|
|
177
|
+
prefixListIds: [this.prefixListId],
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
toEgressRuleConfig() {
|
|
181
|
+
return {
|
|
182
|
+
prefixListId: this.prefixListId,
|
|
183
|
+
prefixListIds: [this.prefixListId],
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* A connection to or from a given security group ID
|
|
189
|
+
*
|
|
190
|
+
* For ingress rules, a sourceSecurityGroupOwnerId parameter can be specified if
|
|
191
|
+
* the security group exists in another account.
|
|
192
|
+
* This parameter will be ignored for egress rules.
|
|
193
|
+
*/
|
|
194
|
+
class SecurityGroupId {
|
|
195
|
+
// private readonly sourceSecurityGroupOwnerId?: string;
|
|
196
|
+
constructor(securityGroupId, sourceSecurityGroupOwnerId) {
|
|
197
|
+
this.securityGroupId = securityGroupId;
|
|
198
|
+
this.canInlineRule = true;
|
|
199
|
+
this.connections = new connections_1.Connections({ peer: this });
|
|
200
|
+
// this.sourceSecurityGroupOwnerId = _sourceSecurityGroupOwnerId;
|
|
201
|
+
if (!cdktf_1.Token.isUnresolved(securityGroupId)) {
|
|
202
|
+
const securityGroupMatch = securityGroupId.match(/^sg-[a-z0-9]{8,17}$/);
|
|
203
|
+
if (!securityGroupMatch) {
|
|
204
|
+
throw new Error(`Invalid security group ID: "${securityGroupId}"`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (sourceSecurityGroupOwnerId &&
|
|
208
|
+
!cdktf_1.Token.isUnresolved(sourceSecurityGroupOwnerId)) {
|
|
209
|
+
const accountNumberMatch = sourceSecurityGroupOwnerId.match(/^[0-9]{12}$/);
|
|
210
|
+
if (!accountNumberMatch) {
|
|
211
|
+
throw new Error(`Invalid security group owner ID: "${sourceSecurityGroupOwnerId}"`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
this.uniqueId = securityGroupId;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Produce the ingress rule JSON for the given connection
|
|
218
|
+
*/
|
|
219
|
+
toIngressRuleConfig() {
|
|
220
|
+
return {
|
|
221
|
+
securityGroups: [this.securityGroupId],
|
|
222
|
+
// TODO: Terraform provider aws does not support sourceSecurityGroupOwnerId
|
|
223
|
+
// ...(this.sourceSecurityGroupOwnerId && {
|
|
224
|
+
// sourceSecurityGroupOwnerId: this.sourceSecurityGroupOwnerId,
|
|
225
|
+
// }),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Produce the egress rule JSON for the given connection
|
|
230
|
+
*/
|
|
231
|
+
toEgressRuleConfig() {
|
|
232
|
+
return { securityGroups: [this.securityGroupId] };
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvY29tcHV0ZS9wZWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0ZBQXdGO0FBRXhGLGlDQUE4QjtBQUM5QiwrQ0FBMEQ7QUEyQjFEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQWEsSUFBSTtJQUNmOztPQUVHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFjO1FBQy9CLE9BQU8sSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE9BQU87UUFDbkIsT0FBTyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBYztRQUMvQixPQUFPLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxPQUFPO1FBQ25CLE9BQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLFlBQW9CO1FBQzNDLE9BQU8sSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsZUFBZSxDQUMzQixlQUF1QixFQUN2QiwwQkFBbUM7UUFFbkMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxlQUFlLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsZ0JBQXlCLENBQUM7O0FBaEQ1QixvQkFpREM7OztBQUVEOztHQUVHO0FBQ0gsTUFBTSxRQUFRO0lBS1osWUFBNkIsTUFBYztRQUFkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFKM0Isa0JBQWEsR0FBRyxJQUFJLENBQUM7UUFDckIsZ0JBQVcsR0FBZ0IsSUFBSSx5QkFB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SSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQ2IscUNBQXFDLDBCQUEwQixHQUFHLENBQ25FLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPO1lBQ0wsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUN0QywyRUFBMkU7WUFDM0UsMkNBQTJDO1lBQzNDLGlFQUFpRTtZQUNqRSxNQUFNO1NBQ1AsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7SUFDcEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTc1LjEvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWVjMi9saWIvcGVlci50c1xuXG5pbXBvcnQgeyBUb2tlbiB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbnMsIElDb25uZWN0YWJsZSB9IGZyb20gXCIuL2Nvbm5lY3Rpb25zXCI7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBjbGFzc2VzIHRoYXQgcHJvdmlkZSB0aGUgcGVlci1zcGVjaWZpY2F0aW9uIHBhcnRzIG9mIGEgc2VjdXJpdHkgZ3JvdXAgcnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElQZWVyIGV4dGVuZHMgSUNvbm5lY3RhYmxlIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJ1bGUgY2FuIGJlIGlubGluZWQgaW50byBhIFNlY3VyaXR5R3JvdXAgb3Igbm90XG4gICAqL1xuICByZWFkb25seSBjYW5JbmxpbmVSdWxlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGNvbm5lY3Rpb24gcGVlclxuICAgKi9cbiAgcmVhZG9ubHkgdW5pcXVlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogUHJvZHVjZSB0aGUgaW5ncmVzcyBydWxlIEpTT04gZm9yIHRoZSBnaXZlbiBjb25uZWN0aW9uXG4gICAqL1xuICB0b0luZ3Jlc3NSdWxlQ29uZmlnKCk6IGFueTtcblxuICAvKipcbiAgICogUHJvZHVjZSB0aGUgZWdyZXNzIHJ1bGUgSlNPTiBmb3IgdGhlIGdpdmVuIGNvbm5lY3Rpb25cbiAgICovXG4gIHRvRWdyZXNzUnVsZUNvbmZpZygpOiBhbnk7XG59XG5cbi8qKlxuICogUGVlciBvYmplY3QgZmFjdG9yaWVzICh0byBiZSB1c2VkIGluIFNlY3VyaXR5IEdyb3VwIG1hbmFnZW1lbnQpXG4gKlxuICogVGhlIHN0YXRpYyBtZXRob2RzIG9uIHRoaXMgb2JqZWN0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBwZWVyIG9iamVjdHNcbiAqIHdoaWNoIHJlcHJlc2VudCBhIGNvbm5lY3Rpb24gcGFydG5lciBpbiBTZWN1cml0eSBHcm91cCBydWxlcy5cbiAqXG4gKiBVc2UgdGhpcyBvYmplY3QgaWYgeW91IG5lZWQgdG8gcmVwcmVzZW50IGNvbm5lY3Rpb24gcGFydG5lcnMgdXNpbmcgcGxhaW4gSVBcbiAqIGFkZHJlc3Nlcywgb3IgYSBwcmVmaXggbGlzdCBJRC5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byBhZGRyZXNzIGEgY29ubmVjdGlvbiBwYXJ0bmVyIGJ5IFNlY3VyaXR5IEdyb3VwLCB5b3UgY2FuIGp1c3RcbiAqIHVzZSB0aGUgU2VjdXJpdHkgR3JvdXAgKG9yIHRoZSBjb25zdHJ1Y3QgdGhhdCBjb250YWlucyBhIFNlY3VyaXR5IEdyb3VwKVxuICogZGlyZWN0bHksIGFzIGl0IGFscmVhZHkgaW1wbGVtZW50cyBgSVBlZXJgLlxuICovXG5leHBvcnQgY2xhc3MgUGVlciB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSVB2NCBwZWVyIGZyb20gYSBDSURSXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlwdjQoY2lkcklwOiBzdHJpbmcpOiBJUGVlciB7XG4gICAgcmV0dXJuIG5ldyBDaWRySVB2NChjaWRySXApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFueSBJUHY0IGFkZHJlc3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYW55SXB2NCgpOiBJUGVlciB7XG4gICAgcmV0dXJuIG5ldyBBbnlJUHY0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIElQdjYgcGVlciBmcm9tIGEgQ0lEUlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpcHY2KGNpZHJJcDogc3RyaW5nKTogSVBlZXIge1xuICAgIHJldHVybiBuZXcgQ2lkcklQdjYoY2lkcklwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbnkgSVB2NiBhZGRyZXNzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFueUlwdjYoKTogSVBlZXIge1xuICAgIHJldHVybiBuZXcgQW55SVB2NigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgcHJlZml4IGxpc3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcHJlZml4TGlzdChwcmVmaXhMaXN0SWQ6IHN0cmluZyk6IElQZWVyIHtcbiAgICByZXR1cm4gbmV3IFByZWZpeExpc3QocHJlZml4TGlzdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNlY3VyaXR5IGdyb3VwIElEXG4gICAqXG4gICAqIE5PVEU6IFRlcnJhZm9ybSBwcm92aWRlciBBV1MgZG9lcyBub3Qgc3VwcG9ydCBzb3VyY2VTZWN1cml0eUdyb3VwT3duZXJJZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZWN1cml0eUdyb3VwSWQoXG4gICAgc2VjdXJpdHlHcm91cElkOiBzdHJpbmcsXG4gICAgc291cmNlU2VjdXJpdHlHcm91cE93bmVySWQ/OiBzdHJpbmcsXG4gICk6IElQZWVyIHtcbiAgICByZXR1cm4gbmV3IFNlY3VyaXR5R3JvdXBJZChzZWN1cml0eUdyb3VwSWQsIHNvdXJjZVNlY3VyaXR5R3JvdXBPd25lcklkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHt9XG59XG5cbi8qKlxuICogQSBjb25uZWN0aW9uIHRvIGFuZCBmcm9tIGEgZ2l2ZW4gSVAgcmFuZ2VcbiAqL1xuY2xhc3MgQ2lkcklQdjQgaW1wbGVtZW50cyBJUGVlciB7XG4gIHB1YmxpYyByZWFkb25seSBjYW5JbmxpbmVSdWxlID0gdHJ1ZTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucyh7IHBlZXI6IHRoaXMgfSk7XG4gIHB1YmxpYyByZWFkb25seSB1bmlxdWVJZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2lkcklwOiBzdHJpbmcpIHtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChjaWRySXApKSB7XG4gICAgICBjb25zdCBjaWRyTWF0Y2ggPSBjaWRySXAubWF0Y2goL14oXFxkezEsM31cXC4pezN9XFxkezEsM30oXFwvXFxkKyk/JC8pO1xuXG4gICAgICBpZiAoIWNpZHJNYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSVB2NCBDSURSOiBcIiR7Y2lkcklwfVwiYCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghY2lkck1hdGNoWzJdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ0lEUiBtYXNrIGlzIG1pc3NpbmcgaW4gSVB2NDogXCIke2NpZHJJcH1cIi4gRGlkIHlvdSBtZWFuIFwiJHtjaWRySXB9LzMyXCI/YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVuaXF1ZUlkID0gY2lkcklwO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2R1Y2UgdGhlIGluZ3Jlc3MgcnVsZSBKU09OIGZvciB0aGUgZ2l2ZW4gY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIHRvSW5ncmVzc1J1bGVDb25maWcoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2lkcklwdjQ6IHRoaXMuY2lkcklwLFxuICAgICAgY2lkckJsb2NrczogW3RoaXMuY2lkcklwXSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBQcm9kdWNlIHRoZSBlZ3Jlc3MgcnVsZSBKU09OIGZvciB0aGUgZ2l2ZW4gY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIHRvRWdyZXNzUnVsZUNvbmZpZygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBjaWRySXB2NDogdGhpcy5jaWRySXAsXG4gICAgICBjaWRyQmxvY2tzOiBbdGhpcy5jaWRySXBdLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBBbnkgSVB2NCBhZGRyZXNzXG4gKi9cbmNsYXNzIEFueUlQdjQgZXh0ZW5kcyBDaWRySVB2NCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiMC4wLjAuMC8wXCIpO1xuICB9XG59XG5cbi8qKlxuICogQSBjb25uZWN0aW9uIHRvIGEgZnJvbSBhIGdpdmVuIElQdjYgcmFuZ2VcbiAqL1xuY2xhc3MgQ2lkcklQdjYgaW1wbGVtZW50cyBJUGVlciB7XG4gIHB1YmxpYyByZWFkb25seSBjYW5JbmxpbmVSdWxlID0gdHJ1ZTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucyh7IHBlZXI6IHRoaXMgfSk7XG4gIHB1YmxpYyByZWFkb25seSB1bmlxdWVJZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2lkcklwdjY6IHN0cmluZykge1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGNpZHJJcHY2KSkge1xuICAgICAgY29uc3QgY2lkck1hdGNoID0gY2lkcklwdjYubWF0Y2goXG4gICAgICAgIC9eKFtcXGRhLWZdezAsNH06KXsyLDd9KFtcXGRhLWZdezAsNH0pPyhcXC9cXGQrKT8kLyxcbiAgICAgICk7XG5cbiAgICAgIGlmICghY2lkck1hdGNoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBJUHY2IENJRFI6IFwiJHtjaWRySXB2Nn1cImApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWNpZHJNYXRjaFszXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENJRFIgbWFzayBpcyBtaXNzaW5nIGluIElQdjY6IFwiJHtjaWRySXB2Nn1cIi4gRGlkIHlvdSBtZWFuIFwiJHtjaWRySXB2Nn0vMTI4XCI/YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVuaXF1ZUlkID0gY2lkcklwdjY7XG4gIH1cblxuICAvKipcbiAgICogUHJvZHVjZSB0aGUgaW5ncmVzcyBydWxlIEpTT04gZm9yIHRoZSBnaXZlbiBjb25uZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgdG9JbmdyZXNzUnVsZUNvbmZpZygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBjaWRySXB2NjogdGhpcy5jaWRySXB2NixcbiAgICAgIGlwdjZDaWRyQmxvY2tzOiBbdGhpcy5jaWRySXB2Nl0sXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogUHJvZHVjZSB0aGUgZWdyZXNzIHJ1bGUgSlNPTiBmb3IgdGhlIGdpdmVuIGNvbm5lY3Rpb25cbiAgICovXG4gIHB1YmxpYyB0b0VncmVzc1J1bGVDb25maWcoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2lkcklwdjY6IHRoaXMuY2lkcklwdjYsXG4gICAgICBpcHY2Q2lkckJsb2NrczogW3RoaXMuY2lkcklwdjZdLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBBbnkgSVB2NiBhZGRyZXNzXG4gKi9cbmNsYXNzIEFueUlQdjYgZXh0ZW5kcyBDaWRySVB2NiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiOjovMFwiKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJlZml4IGxpc3RcbiAqXG4gKiBQcmVmaXggbGlzdHMgYXJlIHVzZWQgdG8gYWxsb3cgdHJhZmZpYyB0byBWUEMtbG9jYWwgc2VydmljZSBlbmRwb2ludHMuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGlzIHBhZ2U6XG4gKlxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblZQQy9sYXRlc3QvVXNlckd1aWRlL3ZwYy1lbmRwb2ludHMuaHRtbFxuICovXG5jbGFzcyBQcmVmaXhMaXN0IGltcGxlbWVudHMgSVBlZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuSW5saW5lUnVsZSA9IGZhbHNlO1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zID0gbmV3IENvbm5lY3Rpb25zKHsgcGVlcjogdGhpcyB9KTtcbiAgcHVibGljIHJlYWRvbmx5IHVuaXF1ZUlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcmVmaXhMaXN0SWQ6IHN0cmluZykge1xuICAgIHRoaXMudW5pcXVlSWQgPSBwcmVmaXhMaXN0SWQ7XG4gIH1cblxuICBwdWJsaWMgdG9JbmdyZXNzUnVsZUNvbmZpZygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBwcmVmaXhMaXN0SWQ6IHRoaXMucHJlZml4TGlzdElkLFxuICAgICAgcHJlZml4TGlzdElkczogW3RoaXMucHJlZml4TGlzdElkXSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHRvRWdyZXNzUnVsZUNvbmZpZygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBwcmVmaXhMaXN0SWQ6IHRoaXMucHJlZml4TGlzdElkLFxuICAgICAgcHJlZml4TGlzdElkczogW3RoaXMucHJlZml4TGlzdElkXSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogQSBjb25uZWN0aW9uIHRvIG9yIGZyb20gYSBnaXZlbiBzZWN1cml0eSBncm91cCBJRFxuICpcbiAqIEZvciBpbmdyZXNzIHJ1bGVzLCBhIHNvdXJjZVNlY3VyaXR5R3JvdXBPd25lcklkIHBhcmFtZXRlciBjYW4gYmUgc3BlY2lmaWVkIGlmXG4gKiB0aGUgc2VjdXJpdHkgZ3JvdXAgZXhpc3RzIGluIGFub3RoZXIgYWNjb3VudC5cbiAqIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZCBmb3IgZWdyZXNzIHJ1bGVzLlxuICovXG5jbGFzcyBTZWN1cml0eUdyb3VwSWQgaW1wbGVtZW50cyBJUGVlciB7XG4gIHB1YmxpYyByZWFkb25seSBjYW5JbmxpbmVSdWxlID0gdHJ1ZTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucyh7IHBlZXI6IHRoaXMgfSk7XG4gIHB1YmxpYyByZWFkb25seSB1bmlxdWVJZDogc3RyaW5nO1xuXG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgc291cmNlU2VjdXJpdHlHcm91cE93bmVySWQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZWN1cml0eUdyb3VwSWQ6IHN0cmluZyxcbiAgICBzb3VyY2VTZWN1cml0eUdyb3VwT3duZXJJZD86IHN0cmluZyxcbiAgKSB7XG4gICAgLy8gdGhpcy5zb3VyY2VTZWN1cml0eUdyb3VwT3duZXJJZCA9IF9zb3VyY2VTZWN1cml0eUdyb3VwT3duZXJJZDtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChzZWN1cml0eUdyb3VwSWQpKSB7XG4gICAgICBjb25zdCBzZWN1cml0eUdyb3VwTWF0Y2ggPSBzZWN1cml0eUdyb3VwSWQubWF0Y2goL15zZy1bYS16MC05XXs4LDE3fSQvKTtcblxuICAgICAgaWYgKCFzZWN1cml0eUdyb3VwTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlY3VyaXR5IGdyb3VwIElEOiBcIiR7c2VjdXJpdHlHcm91cElkfVwiYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgc291cmNlU2VjdXJpdHlHcm91cE93bmVySWQgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQoc291cmNlU2VjdXJpdHlHcm91cE93bmVySWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBhY2NvdW50TnVtYmVyTWF0Y2ggPVxuICAgICAgICBzb3VyY2VTZWN1cml0eUdyb3VwT3duZXJJZC5tYXRjaCgvXlswLTldezEyfSQvKTtcblxuICAgICAgaWYgKCFhY2NvdW50TnVtYmVyTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHNlY3VyaXR5IGdyb3VwIG93bmVyIElEOiBcIiR7c291cmNlU2VjdXJpdHlHcm91cE93bmVySWR9XCJgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVuaXF1ZUlkID0gc2VjdXJpdHlHcm91cElkO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2R1Y2UgdGhlIGluZ3Jlc3MgcnVsZSBKU09OIGZvciB0aGUgZ2l2ZW4gY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIHRvSW5ncmVzc1J1bGVDb25maWcoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VjdXJpdHlHcm91cHM6IFt0aGlzLnNlY3VyaXR5R3JvdXBJZF0sXG4gICAgICAvLyBUT0RPOiBUZXJyYWZvcm0gcHJvdmlkZXIgYXdzIGRvZXMgbm90IHN1cHBvcnQgc291cmNlU2VjdXJpdHlHcm91cE93bmVySWRcbiAgICAgIC8vIC4uLih0aGlzLnNvdXJjZVNlY3VyaXR5R3JvdXBPd25lcklkICYmIHtcbiAgICAgIC8vICAgc291cmNlU2VjdXJpdHlHcm91cE93bmVySWQ6IHRoaXMuc291cmNlU2VjdXJpdHlHcm91cE93bmVySWQsXG4gICAgICAvLyB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2R1Y2UgdGhlIGVncmVzcyBydWxlIEpTT04gZm9yIHRoZSBnaXZlbiBjb25uZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgdG9FZ3Jlc3NSdWxlQ29uZmlnKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgc2VjdXJpdHlHcm91cHM6IFt0aGlzLnNlY3VyaXR5R3JvdXBJZF0gfTtcbiAgfVxufVxuIl19
|