cdk8s-plus-36 0.0.1 → 2.0.0

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.
Files changed (156) hide show
  1. package/.jsii +105714 -0
  2. package/CODE_OF_CONDUCT.md +3 -0
  3. package/CONTRIBUTING.md +185 -0
  4. package/DCO +34 -0
  5. package/LICENSE +202 -0
  6. package/NOTICE +1 -0
  7. package/OWNERS.md +5 -0
  8. package/README.md +21 -34
  9. package/SECURITY.md +5 -0
  10. package/cdk8s.yaml +13 -0
  11. package/docs/java.md +156096 -0
  12. package/docs/plus/config-map.md +98 -0
  13. package/docs/plus/container.md +133 -0
  14. package/docs/plus/cronjob.md +67 -0
  15. package/docs/plus/deployment.md +232 -0
  16. package/docs/plus/horizontal-pod-autoscaler.md +226 -0
  17. package/docs/plus/ingress.md +68 -0
  18. package/docs/plus/job.md +48 -0
  19. package/docs/plus/namespace.md +58 -0
  20. package/docs/plus/network-policy.md +341 -0
  21. package/docs/plus/pod.md +455 -0
  22. package/docs/plus/pv.md +82 -0
  23. package/docs/plus/pvc.md +77 -0
  24. package/docs/plus/rbac.md +104 -0
  25. package/docs/plus/secret.md +32 -0
  26. package/docs/plus/service-account.md +35 -0
  27. package/docs/plus/service.md +41 -0
  28. package/docs/plus/volume.md +84 -0
  29. package/docs/python.md +167536 -0
  30. package/docs/typescript.md +145485 -0
  31. package/git-hooks/README.md +9 -0
  32. package/git-hooks/prepare-commit-msg +18 -0
  33. package/git-hooks/setup.sh +10 -0
  34. package/lib/_action.d.ts +26 -0
  35. package/lib/_action.js +72 -0
  36. package/lib/api-resource.d.ts +298 -0
  37. package/lib/api-resource.js +438 -0
  38. package/lib/base.d.ts +79 -0
  39. package/lib/base.js +124 -0
  40. package/lib/config-map.d.ts +126 -0
  41. package/lib/config-map.js +199 -0
  42. package/lib/container.d.ts +1057 -0
  43. package/lib/container.js +944 -0
  44. package/lib/cron-job.d.ts +138 -0
  45. package/lib/cron-job.js +170 -0
  46. package/lib/daemon-set.d.ts +45 -0
  47. package/lib/daemon-set.js +91 -0
  48. package/lib/deployment.d.ts +235 -0
  49. package/lib/deployment.js +274 -0
  50. package/lib/handler.d.ts +62 -0
  51. package/lib/handler.js +88 -0
  52. package/lib/horizontal-pod-autoscaler.d.ts +500 -0
  53. package/lib/horizontal-pod-autoscaler.js +629 -0
  54. package/lib/imports/k8s.d.ts +27283 -0
  55. package/lib/imports/k8s.js +20112 -0
  56. package/lib/index.d.ts +26 -0
  57. package/lib/index.js +66 -0
  58. package/lib/ingress.d.ts +230 -0
  59. package/lib/ingress.js +282 -0
  60. package/lib/job.d.ts +64 -0
  61. package/lib/job.js +101 -0
  62. package/lib/namespace.d.ts +128 -0
  63. package/lib/namespace.js +148 -0
  64. package/lib/network-policy.d.ts +311 -0
  65. package/lib/network-policy.js +383 -0
  66. package/lib/pod.d.ts +1097 -0
  67. package/lib/pod.js +1227 -0
  68. package/lib/probe.d.ts +181 -0
  69. package/lib/probe.js +124 -0
  70. package/lib/pv.d.ts +375 -0
  71. package/lib/pv.js +387 -0
  72. package/lib/pvc.d.ts +163 -0
  73. package/lib/pvc.js +204 -0
  74. package/lib/role-binding.d.ts +138 -0
  75. package/lib/role-binding.js +207 -0
  76. package/lib/role.d.ts +268 -0
  77. package/lib/role.js +441 -0
  78. package/lib/secret.d.ts +195 -0
  79. package/lib/secret.js +221 -0
  80. package/lib/service-account.d.ts +83 -0
  81. package/lib/service-account.js +148 -0
  82. package/lib/service.d.ts +289 -0
  83. package/lib/service.js +235 -0
  84. package/lib/stateful-set.d.ts +206 -0
  85. package/lib/stateful-set.js +291 -0
  86. package/lib/utils.d.ts +4 -0
  87. package/lib/utils.js +33 -0
  88. package/lib/volume.d.ts +577 -0
  89. package/lib/volume.js +410 -0
  90. package/lib/workload.d.ts +121 -0
  91. package/lib/workload.js +158 -0
  92. package/node_modules/balanced-match/.github/FUNDING.yml +2 -0
  93. package/node_modules/balanced-match/LICENSE.md +21 -0
  94. package/node_modules/balanced-match/README.md +97 -0
  95. package/node_modules/balanced-match/index.js +62 -0
  96. package/node_modules/balanced-match/package.json +48 -0
  97. package/node_modules/brace-expansion/.github/FUNDING.yml +2 -0
  98. package/node_modules/brace-expansion/LICENSE +21 -0
  99. package/node_modules/brace-expansion/README.md +157 -0
  100. package/node_modules/brace-expansion/index.js +394 -0
  101. package/node_modules/brace-expansion/package.json +49 -0
  102. package/node_modules/minimatch/LICENSE +15 -0
  103. package/node_modules/minimatch/README.md +491 -0
  104. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +2 -0
  105. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +1 -0
  106. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +14 -0
  107. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +1 -0
  108. package/node_modules/minimatch/dist/commonjs/ast.d.ts +20 -0
  109. package/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -0
  110. package/node_modules/minimatch/dist/commonjs/ast.js +747 -0
  111. package/node_modules/minimatch/dist/commonjs/ast.js.map +1 -0
  112. package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +8 -0
  113. package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -0
  114. package/node_modules/minimatch/dist/commonjs/brace-expressions.js +152 -0
  115. package/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -0
  116. package/node_modules/minimatch/dist/commonjs/escape.d.ts +12 -0
  117. package/node_modules/minimatch/dist/commonjs/escape.d.ts.map +1 -0
  118. package/node_modules/minimatch/dist/commonjs/escape.js +22 -0
  119. package/node_modules/minimatch/dist/commonjs/escape.js.map +1 -0
  120. package/node_modules/minimatch/dist/commonjs/index.d.ts +98 -0
  121. package/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -0
  122. package/node_modules/minimatch/dist/commonjs/index.js +1023 -0
  123. package/node_modules/minimatch/dist/commonjs/index.js.map +1 -0
  124. package/node_modules/minimatch/dist/commonjs/package.json +3 -0
  125. package/node_modules/minimatch/dist/commonjs/unescape.d.ts +17 -0
  126. package/node_modules/minimatch/dist/commonjs/unescape.d.ts.map +1 -0
  127. package/node_modules/minimatch/dist/commonjs/unescape.js +24 -0
  128. package/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -0
  129. package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +2 -0
  130. package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map +1 -0
  131. package/node_modules/minimatch/dist/esm/assert-valid-pattern.js +10 -0
  132. package/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
  133. package/node_modules/minimatch/dist/esm/ast.d.ts +20 -0
  134. package/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -0
  135. package/node_modules/minimatch/dist/esm/ast.js +743 -0
  136. package/node_modules/minimatch/dist/esm/ast.js.map +1 -0
  137. package/node_modules/minimatch/dist/esm/brace-expressions.d.ts +8 -0
  138. package/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -0
  139. package/node_modules/minimatch/dist/esm/brace-expressions.js +148 -0
  140. package/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
  141. package/node_modules/minimatch/dist/esm/escape.d.ts +12 -0
  142. package/node_modules/minimatch/dist/esm/escape.d.ts.map +1 -0
  143. package/node_modules/minimatch/dist/esm/escape.js +18 -0
  144. package/node_modules/minimatch/dist/esm/escape.js.map +1 -0
  145. package/node_modules/minimatch/dist/esm/index.d.ts +98 -0
  146. package/node_modules/minimatch/dist/esm/index.d.ts.map +1 -0
  147. package/node_modules/minimatch/dist/esm/index.js +1007 -0
  148. package/node_modules/minimatch/dist/esm/index.js.map +1 -0
  149. package/node_modules/minimatch/dist/esm/package.json +3 -0
  150. package/node_modules/minimatch/dist/esm/unescape.d.ts +17 -0
  151. package/node_modules/minimatch/dist/esm/unescape.d.ts.map +1 -0
  152. package/node_modules/minimatch/dist/esm/unescape.js +20 -0
  153. package/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
  154. package/node_modules/minimatch/package.json +82 -0
  155. package/package.json +172 -6
  156. package/rotate.md +82 -0
@@ -0,0 +1,383 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.NetworkPolicy = exports.NetworkPolicyTrafficDefault = exports.NetworkProtocol = exports.NetworkPolicyIpBlock = exports.NetworkPolicyPort = void 0;
37
+ exports.validatePeerConfig = validatePeerConfig;
38
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
39
+ const cdk8s_1 = require("cdk8s");
40
+ const constructs_1 = require("constructs");
41
+ const base = __importStar(require("./base"));
42
+ const k8s = __importStar(require("./imports/k8s"));
43
+ const namespace = __importStar(require("./namespace"));
44
+ const pod = __importStar(require("./pod"));
45
+ const utils_1 = require("./utils");
46
+ /**
47
+ * Describes a port to allow traffic on.
48
+ */
49
+ class NetworkPolicyPort {
50
+ port;
51
+ endPort;
52
+ protocol;
53
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.NetworkPolicyPort", version: "2.0.0" };
54
+ /**
55
+ * Distinct TCP ports
56
+ */
57
+ static tcp(port) {
58
+ return new NetworkPolicyPort(k8s.IntOrString.fromNumber(port), undefined, NetworkProtocol.TCP);
59
+ }
60
+ /**
61
+ * A TCP port range
62
+ */
63
+ static tcpRange(startPort, endPort) {
64
+ return new NetworkPolicyPort(k8s.IntOrString.fromNumber(startPort), endPort, NetworkProtocol.TCP);
65
+ }
66
+ /**
67
+ * Any TCP traffic
68
+ */
69
+ static allTcp() {
70
+ return new NetworkPolicyPort(k8s.IntOrString.fromNumber(0), 65535, NetworkProtocol.TCP);
71
+ }
72
+ /**
73
+ * Distinct UDP ports
74
+ */
75
+ static udp(port) {
76
+ return new NetworkPolicyPort(k8s.IntOrString.fromNumber(port), undefined, NetworkProtocol.UDP);
77
+ }
78
+ /**
79
+ * A UDP port range
80
+ */
81
+ static udpRange(startPort, endPort) {
82
+ return new NetworkPolicyPort(k8s.IntOrString.fromNumber(startPort), endPort, NetworkProtocol.UDP);
83
+ }
84
+ /**
85
+ * Any UDP traffic
86
+ */
87
+ static allUdp() {
88
+ return new NetworkPolicyPort(k8s.IntOrString.fromNumber(0), 65535, NetworkProtocol.UDP);
89
+ }
90
+ /**
91
+ * Custom port configuration.
92
+ */
93
+ static of(props) {
94
+ return new NetworkPolicyPort(props.port ? k8s.IntOrString.fromNumber(props.port) : undefined, props.endPort, props.protocol);
95
+ }
96
+ constructor(port, endPort, protocol) {
97
+ this.port = port;
98
+ this.endPort = endPort;
99
+ this.protocol = protocol;
100
+ }
101
+ /**
102
+ * @internal
103
+ */
104
+ _toKube() {
105
+ return { port: this.port, endPort: this.endPort, protocol: this.protocol };
106
+ }
107
+ }
108
+ exports.NetworkPolicyPort = NetworkPolicyPort;
109
+ /**
110
+ * Describes a particular CIDR (Ex. "192.168.1.1/24","2001:db9::/64") that is
111
+ * allowed to the pods matched by a network policy selector.
112
+ * The except entry describes CIDRs that should not be included within this rule.
113
+ */
114
+ class NetworkPolicyIpBlock extends constructs_1.Construct {
115
+ cidr;
116
+ except;
117
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.NetworkPolicyIpBlock", version: "2.0.0" };
118
+ /**
119
+ * Create an IPv4 peer from a CIDR
120
+ */
121
+ static ipv4(scope, id, cidrIp, except) {
122
+ const cidrMatch = cidrIp.match(/^(\d{1,3}\.){3}\d{1,3}(\/\d+)?$/);
123
+ if (!cidrMatch) {
124
+ throw new Error(`Invalid IPv4 CIDR: "${cidrIp}"`);
125
+ }
126
+ if (!cidrMatch[2]) {
127
+ throw new Error(`CIDR mask is missing in IPv4: "${cidrIp}". Did you mean "${cidrIp}/32"?`);
128
+ }
129
+ return new NetworkPolicyIpBlock(scope, id, cidrIp, except);
130
+ }
131
+ /**
132
+ * Any IPv4 address
133
+ */
134
+ static anyIpv4(scope, id) {
135
+ return new NetworkPolicyIpBlock(scope, id, '0.0.0.0/0');
136
+ }
137
+ /**
138
+ * Create an IPv6 peer from a CIDR
139
+ */
140
+ static ipv6(scope, id, cidrIp, except) {
141
+ const cidrMatch = cidrIp.match(/^([\da-f]{0,4}:){2,7}([\da-f]{0,4})?(\/\d+)?$/);
142
+ if (!cidrMatch) {
143
+ throw new Error(`Invalid IPv6 CIDR: "${cidrIp}"`);
144
+ }
145
+ if (!cidrMatch[3]) {
146
+ throw new Error(`CIDR mask is missing in IPv6: "${cidrIp}". Did you mean "${cidrIp}/128"?`);
147
+ }
148
+ return new NetworkPolicyIpBlock(scope, id, cidrIp, except);
149
+ }
150
+ /**
151
+ * Any IPv6 address
152
+ */
153
+ static anyIpv6(scope, id) {
154
+ return new NetworkPolicyIpBlock(scope, id, '::/0');
155
+ }
156
+ constructor(scope, id,
157
+ /**
158
+ * A string representing the IP Block Valid examples are "192.168.1.1/24" or "2001:db9::/64".
159
+ */
160
+ cidr,
161
+ /**
162
+ * A slice of CIDRs that should not be included within an IP Block Valid examples are "192.168.1.1/24" or "2001:db9::/64".
163
+ * Except values will be rejected if they are outside the CIDR range.
164
+ */
165
+ except) {
166
+ super(scope, id);
167
+ this.cidr = cidr;
168
+ this.except = except;
169
+ }
170
+ /**
171
+ * @see INetworkPolicyPeer.toNetworkPolicyPeerConfig()
172
+ */
173
+ toNetworkPolicyPeerConfig() {
174
+ return { ipBlock: this };
175
+ }
176
+ /**
177
+ * @see INetworkPolicyPeer.toPodSelector()
178
+ */
179
+ toPodSelector() {
180
+ return undefined;
181
+ }
182
+ /**
183
+ * @internal
184
+ */
185
+ _toKube() {
186
+ return { cidr: this.cidr, except: this.except };
187
+ }
188
+ }
189
+ exports.NetworkPolicyIpBlock = NetworkPolicyIpBlock;
190
+ /**
191
+ * Network protocols.
192
+ */
193
+ var NetworkProtocol;
194
+ (function (NetworkProtocol) {
195
+ /**
196
+ * TCP.
197
+ */
198
+ NetworkProtocol["TCP"] = "TCP";
199
+ /**
200
+ * UDP.
201
+ */
202
+ NetworkProtocol["UDP"] = "UDP";
203
+ /**
204
+ * SCTP.
205
+ */
206
+ NetworkProtocol["SCTP"] = "SCTP";
207
+ })(NetworkProtocol || (exports.NetworkProtocol = NetworkProtocol = {}));
208
+ /**
209
+ * Default behaviors of network traffic in policies.
210
+ */
211
+ var NetworkPolicyTrafficDefault;
212
+ (function (NetworkPolicyTrafficDefault) {
213
+ /**
214
+ * The policy denies all traffic.
215
+ * Since rules are additive, additional rules or policies can allow
216
+ * specific traffic.
217
+ */
218
+ NetworkPolicyTrafficDefault["DENY"] = "DENY";
219
+ /**
220
+ * The policy allows all traffic (either ingress or egress).
221
+ * Since rules are additive, no additional rule or policies can
222
+ * subsequently deny the traffic.
223
+ */
224
+ NetworkPolicyTrafficDefault["ALLOW"] = "ALLOW";
225
+ })(NetworkPolicyTrafficDefault || (exports.NetworkPolicyTrafficDefault = NetworkPolicyTrafficDefault = {}));
226
+ /**
227
+ * Control traffic flow at the IP address or port level (OSI layer 3 or 4),
228
+ * network policies are an application-centric construct which allow you
229
+ * to specify how a pod is allowed to communicate with various network peers.
230
+ *
231
+ * - Outgoing traffic is allowed if there are no network policies selecting
232
+ * the pod (and cluster policy otherwise allows the traffic),
233
+ * OR if the traffic matches at least one egress rule across all of the
234
+ * network policies that select the pod.
235
+ *
236
+ * - Incoming traffic is allowed to a pod if there are no network policies
237
+ * selecting the pod (and cluster policy otherwise allows the traffic),
238
+ * OR if the traffic source is the pod's local node,
239
+ * OR if the traffic matches at least one ingress rule across all of
240
+ * the network policies that select the pod.
241
+ *
242
+ * Network policies do not conflict; they are additive.
243
+ * If any policy or policies apply to a given pod for a given
244
+ * direction, the connections allowed in that direction from
245
+ * that pod is the union of what the applicable policies allow.
246
+ * Thus, order of evaluation does not affect the policy result.
247
+ *
248
+ * For a connection from a source pod to a destination pod to be allowed,
249
+ * both the egress policy on the source pod and the ingress policy on the
250
+ * destination pod need to allow the connection.
251
+ * If either side does not allow the connection, it will not happen.
252
+ *
253
+ * @see https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource
254
+ */
255
+ class NetworkPolicy extends base.Resource {
256
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.NetworkPolicy", version: "2.0.0" };
257
+ /**
258
+ * @see base.Resource.apiObject
259
+ */
260
+ apiObject;
261
+ resourceType = 'networkpolicies';
262
+ _podSelectorConfig;
263
+ _egressRules = [];
264
+ _ingressRules = [];
265
+ _policyTypes = new Set();
266
+ constructor(scope, id, props = {}) {
267
+ super(scope, id);
268
+ const podSelector = props.selector ?? pod.Pods.all(this, 'AllPods');
269
+ this._podSelectorConfig = podSelector.toPodSelectorConfig();
270
+ let ns;
271
+ if (!props.metadata?.namespace) {
272
+ if (this._podSelectorConfig.namespaces?.labelSelector && !this._podSelectorConfig.namespaces?.labelSelector.isEmpty()) {
273
+ throw new Error(`Unable to create a network policy for a selector (${podSelector.node.path}) that selects pods in namespaces based on labels`);
274
+ }
275
+ if (this._podSelectorConfig.namespaces?.names && this._podSelectorConfig.namespaces.names.length > 1) {
276
+ throw new Error(`Unable to create a network policy for a selector (${podSelector.node.path}) that selects pods in multiple namespaces`);
277
+ }
278
+ ns = this._podSelectorConfig.namespaces?.names ? this._podSelectorConfig.namespaces?.names[0] : undefined;
279
+ }
280
+ else {
281
+ ns = props.metadata.namespace;
282
+ }
283
+ this.apiObject = new k8s.KubeNetworkPolicy(this, 'Resource', {
284
+ metadata: { ...props.metadata, namespace: ns },
285
+ spec: cdk8s_1.Lazy.any({ produce: () => this._toKube() }),
286
+ });
287
+ this.configureDefaultBehavior('Egress', props.egress?.default);
288
+ this.configureDefaultBehavior('Ingress', props.ingress?.default);
289
+ for (const rule of props.egress?.rules ?? []) {
290
+ this.addEgressRule(rule.peer, rule.ports);
291
+ }
292
+ for (const rule of props.ingress?.rules ?? []) {
293
+ this.addIngressRule(rule.peer, rule.ports);
294
+ }
295
+ }
296
+ /**
297
+ * Allow outgoing traffic to the peer.
298
+ *
299
+ * If ports are not passed, traffic will be allowed on all ports.
300
+ */
301
+ addEgressRule(peer, ports) {
302
+ this._policyTypes.add('Egress');
303
+ this._egressRules.push({ ports: (ports ?? []).map(p => p._toKube()), to: this.createNetworkPolicyPeers(peer) });
304
+ }
305
+ /**
306
+ * Allow incoming traffic from the peer.
307
+ *
308
+ * If ports are not passed, traffic will be allowed on all ports.
309
+ */
310
+ addIngressRule(peer, ports) {
311
+ this._policyTypes.add('Ingress');
312
+ this._ingressRules.push({ ports: (ports ?? []).map(p => p._toKube()), from: this.createNetworkPolicyPeers(peer) });
313
+ }
314
+ createNetworkPolicyPeers(peer) {
315
+ const config = peer.toNetworkPolicyPeerConfig();
316
+ validatePeerConfig(config);
317
+ if (config.ipBlock) {
318
+ // ip block is a single peer.
319
+ return [{ ipBlock: config.ipBlock._toKube() }];
320
+ }
321
+ if (!config.podSelector.namespaces?.names) {
322
+ // when no explicit namespaces are defined we can just use
323
+ // the selector as is
324
+ return [{
325
+ namespaceSelector: config.podSelector.namespaces?.labelSelector?._toKube(),
326
+ podSelector: config.podSelector.labelSelector._toKube(),
327
+ }];
328
+ }
329
+ // when explicit namespaces are defined, we need to create a separate
330
+ // peer for each, since a label selector cannot have multiple name labels. (they will conflict)
331
+ const namespaceSelector = config.podSelector?.namespaces?.labelSelector?._toKube() ?? {};
332
+ return config.podSelector.namespaces.names.map(n => ({
333
+ podSelector: config.podSelector.labelSelector._toKube(),
334
+ namespaceSelector: {
335
+ matchExpressions: namespaceSelector.matchExpressions,
336
+ matchLabels: {
337
+ ...namespaceSelector.matchLabels,
338
+ [namespace.Namespace.NAME_LABEL]: n,
339
+ },
340
+ },
341
+ }));
342
+ }
343
+ configureDefaultBehavior(direction, _default) {
344
+ if (!_default) {
345
+ return;
346
+ }
347
+ if (_default === NetworkPolicyTrafficDefault.DENY) {
348
+ // https://kubernetes.io/docs/concepts/services-networking/network-policies/#default-deny-all-egress-traffic
349
+ this._policyTypes.add(direction);
350
+ }
351
+ if (_default === NetworkPolicyTrafficDefault.ALLOW) {
352
+ // https://kubernetes.io/docs/concepts/services-networking/network-policies/#allow-all-egress-traffic
353
+ this._policyTypes.add(direction);
354
+ if (direction === 'Egress') {
355
+ this._egressRules.push({});
356
+ }
357
+ else {
358
+ this._ingressRules.push({});
359
+ }
360
+ }
361
+ }
362
+ /**
363
+ * @internal
364
+ */
365
+ _toKube() {
366
+ return {
367
+ podSelector: this._podSelectorConfig.labelSelector._toKube(),
368
+ egress: (0, utils_1.undefinedIfEmpty)(this._egressRules),
369
+ ingress: (0, utils_1.undefinedIfEmpty)(this._ingressRules),
370
+ policyTypes: (0, utils_1.undefinedIfEmpty)(Array.from(this._policyTypes)),
371
+ };
372
+ }
373
+ }
374
+ exports.NetworkPolicy = NetworkPolicy;
375
+ function validatePeerConfig(peerConfig) {
376
+ if (!peerConfig.ipBlock && !peerConfig.podSelector) {
377
+ throw new Error('Inavlid peer: either \'ipBlock\' or \'podSelector\' must be defined');
378
+ }
379
+ if (peerConfig.ipBlock && peerConfig.podSelector) {
380
+ throw new Error('Inavlid peer: only one of \'ipBlock\' and \'podSelector\' must be defined');
381
+ }
382
+ }
383
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay1wb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ2hCQSxnREFPQzs7QUF2aEJELGlDQUF3QztBQUN4QywyQ0FBbUQ7QUFDbkQsNkNBQStCO0FBQy9CLG1EQUFxQztBQUNyQyx1REFBeUM7QUFDekMsMkNBQTZCO0FBQzdCLG1DQUEyQztBQThCM0M7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQW9EVDtJQUNBO0lBQ0E7O0lBcERuQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBWTtRQUM1QixPQUFPLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQWlCLEVBQUUsT0FBZTtRQUN2RCxPQUFPLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsTUFBTTtRQUNsQixPQUFPLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQVk7UUFDNUIsT0FBTyxJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxF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Q0FBQztJQUNELElBQUksVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO0lBQy9GLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBpT2JqZWN0LCBMYXp5IH0gZnJvbSAnY2RrOHMnO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBrOHMgZnJvbSAnLi9pbXBvcnRzL2s4cyc7XG5pbXBvcnQgKiBhcyBuYW1lc3BhY2UgZnJvbSAnLi9uYW1lc3BhY2UnO1xuaW1wb3J0ICogYXMgcG9kIGZyb20gJy4vcG9kJztcbmltcG9ydCB7IHVuZGVmaW5lZElmRW1wdHkgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBgTmV0d29ya1BvbGljeVBvcnRgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtQb2xpY3lQb3J0UHJvcHMge1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpYyBwb3J0IG51bWJlci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGwgcG9ydHMgYXJlIGFsbG93ZWQuXG4gICAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFbmQgcG9ydCAocmVsYXRpdmUgdG8gYHBvcnRgKS4gT25seSBhcHBsaWVzIGlmIGBwb3J0YCBpcyBkZWZpbmVkLlxuICAgKiBVc2UgdGhpcyB0byBzcGVjaWZ5IGEgcG9ydCByYW5nZSwgcmF0aGVyIHRoYXQgYSBzcGVjaWZpYyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm90IGEgcG9ydCByYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IGVuZFBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFByb3RvY29sLlxuICAgKlxuICAgKiBAZGVmYXVsdCBOZXR3b3JrUHJvdG9jb2wuVENQXG4gICAqL1xuICByZWFkb25seSBwcm90b2NvbD86IE5ldHdvcmtQcm90b2NvbDtcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgYSBwb3J0IHRvIGFsbG93IHRyYWZmaWMgb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXR3b3JrUG9saWN5UG9ydCB7XG5cbiAgLyoqXG4gICAqIERpc3RpbmN0IFRDUCBwb3J0c1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0Y3AocG9ydDogbnVtYmVyKTogTmV0d29ya1BvbGljeVBvcnQge1xuICAgIHJldHVybiBuZXcgTmV0d29ya1BvbGljeVBvcnQoazhzLkludE9yU3RyaW5nLmZyb21OdW1iZXIocG9ydCksIHVuZGVmaW5lZCwgTmV0d29ya1Byb3RvY29sLlRDUCk7XG4gIH1cblxuICAvKipcbiAgICogQSBUQ1AgcG9ydCByYW5nZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0Y3BSYW5nZShzdGFydFBvcnQ6IG51bWJlciwgZW5kUG9ydDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBOZXR3b3JrUG9saWN5UG9ydChrOHMuSW50T3JTdHJpbmcuZnJvbU51bWJlcihzdGFydFBvcnQpLCBlbmRQb3J0LCBOZXR3b3JrUHJvdG9jb2wuVENQKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbnkgVENQIHRyYWZmaWNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYWxsVGNwKCkge1xuICAgIHJldHVybiBuZXcgTmV0d29ya1BvbGljeVBvcnQoazhzLkludE9yU3RyaW5nLmZyb21OdW1iZXIoMCksIDY1NTM1LCBOZXR3b3JrUHJvdG9jb2wuVENQKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXN0aW5jdCBVRFAgcG9ydHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdWRwKHBvcnQ6IG51bWJlcik6IE5ldHdvcmtQb2xpY3lQb3J0IHtcbiAgICByZXR1cm4gbmV3IE5ldHdvcmtQb2xpY3lQb3J0KGs4cy5JbnRPclN0cmluZy5mcm9tTnVtYmVyKHBvcnQpLCB1bmRlZmluZWQsIE5ldHdvcmtQcm90b2NvbC5VRFApO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgVURQIHBvcnQgcmFuZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdWRwUmFuZ2Uoc3RhcnRQb3J0OiBudW1iZXIsIGVuZFBvcnQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgTmV0d29ya1BvbGljeVBvcnQoazhzLkludE9yU3RyaW5nLmZyb21OdW1iZXIoc3RhcnRQb3J0KSwgZW5kUG9ydCwgTmV0d29ya1Byb3RvY29sLlVEUCk7XG4gIH1cblxuICAvKipcbiAgICogQW55IFVEUCB0cmFmZmljXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFsbFVkcCgpIHtcbiAgICByZXR1cm4gbmV3IE5ldHdvcmtQb2xpY3lQb3J0KGs4cy5JbnRPclN0cmluZy5mcm9tTnVtYmVyKDApLCA2NTUzNSwgTmV0d29ya1Byb3RvY29sLlVEUCk7XG4gIH1cblxuICAvKipcbiAgICogQ3VzdG9tIHBvcnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YocHJvcHM6IE5ldHdvcmtQb2xpY3lQb3J0UHJvcHMpOiBOZXR3b3JrUG9saWN5UG9ydCB7XG4gICAgcmV0dXJuIG5ldyBOZXR3b3JrUG9saWN5UG9ydChwcm9wcy5wb3J0ID8gazhzLkludE9yU3RyaW5nLmZyb21OdW1iZXIocHJvcHMucG9ydCkgOiB1bmRlZmluZWQsIHByb3BzLmVuZFBvcnQsIHByb3BzLnByb3RvY29sKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb3J0PzogazhzLkludE9yU3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZW5kUG9ydD86IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3RvY29sPzogTmV0d29ya1Byb3RvY29sKSB7fVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9LdWJlKCk6IGs4cy5OZXR3b3JrUG9saWN5UG9ydCB7XG4gICAgcmV0dXJuIHsgcG9ydDogdGhpcy5wb3J0LCBlbmRQb3J0OiB0aGlzLmVuZFBvcnQsIHByb3RvY29sOiB0aGlzLnByb3RvY29sIH07XG4gIH1cblxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIG5ldHdvcmsgcGVlcnMuXG4gKiBBIHBlZXIgY2FuIGVpdGhlciBieSBhbiBpcCBibG9jaywgb3IgYSBzZWxlY3Rpb24gb2YgcG9kcywgbm90IGJvdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1BvbGljeVBlZXJDb25maWcge1xuXG4gIC8qKlxuICAgKiBUaGUgaXAgYmxvY2sgdGhpcyBwZWVyIHJlcHJlc2VudHMuXG4gICAqL1xuICByZWFkb25seSBpcEJsb2NrPzogTmV0d29ya1BvbGljeUlwQmxvY2s7XG5cbiAgLyoqXG4gICAqIFRoZSBwb2Qgc2VsZWN0b3IgdGhpcyBwZWVyIHJlcHJlc2VudHMuXG4gICAqL1xuICByZWFkb25seSBwb2RTZWxlY3Rvcj86IHBvZC5Qb2RTZWxlY3RvckNvbmZpZztcblxufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIHBlZXIgdG8gYWxsb3cgdHJhZmZpYyB0by9mcm9tLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElOZXR3b3JrUG9saWN5UGVlciBleHRlbmRzIElDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogUmV0dXJuIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgcGVlci5cbiAgICovXG4gIHRvTmV0d29ya1BvbGljeVBlZXJDb25maWcoKTogTmV0d29ya1BvbGljeVBlZXJDb25maWc7XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIHBlZXIgaW50byBhIHBvZCBzZWxlY3RvciwgaWYgcG9zc2libGUuXG4gICAqL1xuICB0b1BvZFNlbGVjdG9yKCk6IHBvZC5JUG9kU2VsZWN0b3IgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIGEgcnVsZSBhbGxvd2luZyB0cmFmZmljIGZyb20gLyB0byBwb2RzIG1hdGNoZWQgYnkgYSBuZXR3b3JrIHBvbGljeSBzZWxlY3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrUG9saWN5UnVsZSB7XG5cbiAgLyoqXG4gICAqIFRoZSBwb3J0cyBvZiB0aGUgcnVsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0cmFmZmljIGlzIGFsbG93ZWQgb24gYWxsIHBvcnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydHM/OiBOZXR3b3JrUG9saWN5UG9ydFtdO1xuXG4gIC8qKlxuICAgKiBQZWVyIHRoaXMgcnVsZSBpbnRlcmFjdHMgd2l0aC5cbiAgICovXG4gIHJlYWRvbmx5IHBlZXI6IElOZXR3b3JrUG9saWN5UGVlcjtcblxufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIHBhcnRpY3VsYXIgQ0lEUiAoRXguIFwiMTkyLjE2OC4xLjEvMjRcIixcIjIwMDE6ZGI5OjovNjRcIikgdGhhdCBpc1xuICogYWxsb3dlZCB0byB0aGUgcG9kcyBtYXRjaGVkIGJ5IGEgbmV0d29yayBwb2xpY3kgc2VsZWN0b3IuXG4gKiBUaGUgZXhjZXB0IGVudHJ5IGRlc2NyaWJlcyBDSURScyB0aGF0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgd2l0aGluIHRoaXMgcnVsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtQb2xpY3lJcEJsb2NrIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSU5ldHdvcmtQb2xpY3lQZWVyIHtcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIElQdjQgcGVlciBmcm9tIGEgQ0lEUlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpcHY0KHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNpZHJJcDogc3RyaW5nLCBleGNlcHQ/OiBzdHJpbmdbXSk6IE5ldHdvcmtQb2xpY3lJcEJsb2NrIHtcbiAgICBjb25zdCBjaWRyTWF0Y2ggPSBjaWRySXAubWF0Y2goL14oXFxkezEsM31cXC4pezN9XFxkezEsM30oXFwvXFxkKyk/JC8pO1xuXG4gICAgaWYgKCFjaWRyTWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBJUHY0IENJRFI6IFwiJHtjaWRySXB9XCJgKTtcbiAgICB9XG5cbiAgICBpZiAoIWNpZHJNYXRjaFsyXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDSURSIG1hc2sgaXMgbWlzc2luZyBpbiBJUHY0OiBcIiR7Y2lkcklwfVwiLiBEaWQgeW91IG1lYW4gXCIke2NpZHJJcH0vMzJcIj9gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE5ldHdvcmtQb2xpY3lJcEJsb2NrKHNjb3BlLCBpZCwgY2lkcklwLCBleGNlcHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFueSBJUHY0IGFkZHJlc3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYW55SXB2NChzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKTogTmV0d29ya1BvbGljeUlwQmxvY2sge1xuICAgIHJldHVybiBuZXcgTmV0d29ya1BvbGljeUlwQmxvY2soc2NvcGUsIGlkLCAnMC4wLjAuMC8wJyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIElQdjYgcGVlciBmcm9tIGEgQ0lEUlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpcHY2KHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNpZHJJcDogc3RyaW5nLCBleGNlcHQ/OiBzdHJpbmdbXSk6IE5ldHdvcmtQb2xpY3lJcEJsb2NrIHtcblxuICAgIGNvbnN0IGNpZHJNYXRjaCA9IGNpZHJJcC5tYXRjaCgvXihbXFxkYS1mXXswLDR9Oil7Miw3fShbXFxkYS1mXXswLDR9KT8oXFwvXFxkKyk/JC8pO1xuXG4gICAgaWYgKCFjaWRyTWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBJUHY2IENJRFI6IFwiJHtjaWRySXB9XCJgKTtcbiAgICB9XG5cbiAgICBpZiAoIWNpZHJNYXRjaFszXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDSURSIG1hc2sgaXMgbWlzc2luZyBpbiBJUHY2OiBcIiR7Y2lkcklwfVwiLiBEaWQgeW91IG1lYW4gXCIke2NpZHJJcH0vMTI4XCI/YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBOZXR3b3JrUG9saWN5SXBCbG9jayhzY29wZSwgaWQsIGNpZHJJcCwgZXhjZXB0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbnkgSVB2NiBhZGRyZXNzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFueUlwdjYoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZyk6IE5ldHdvcmtQb2xpY3lJcEJsb2NrIHtcbiAgICByZXR1cm4gbmV3IE5ldHdvcmtQb2xpY3lJcEJsb2NrKHNjb3BlLCBpZCwgJzo6LzAnKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIElQIEJsb2NrIFZhbGlkIGV4YW1wbGVzIGFyZSBcIjE5Mi4xNjguMS4xLzI0XCIgb3IgXCIyMDAxOmRiOTo6LzY0XCIuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGNpZHI6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBBIHNsaWNlIG9mIENJRFJzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCB3aXRoaW4gYW4gSVAgQmxvY2sgVmFsaWQgZXhhbXBsZXMgYXJlIFwiMTkyLjE2OC4xLjEvMjRcIiBvciBcIjIwMDE6ZGI5OjovNjRcIi5cbiAgICAgKiBFeGNlcHQgdmFsdWVzIHdpbGwgYmUgcmVqZWN0ZWQgaWYgdGhleSBhcmUgb3V0c2lkZSB0aGUgQ0lEUiByYW5nZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZXhjZXB0Pzogc3RyaW5nW10pIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgSU5ldHdvcmtQb2xpY3lQZWVyLnRvTmV0d29ya1BvbGljeVBlZXJDb25maWcoKVxuICAgKi9cbiAgcHVibGljIHRvTmV0d29ya1BvbGljeVBlZXJDb25maWcoKTogTmV0d29ya1BvbGljeVBlZXJDb25maWcge1xuICAgIHJldHVybiB7IGlwQmxvY2s6IHRoaXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIElOZXR3b3JrUG9saWN5UGVlci50b1BvZFNlbGVjdG9yKClcbiAgICovXG4gIHB1YmxpYyB0b1BvZFNlbGVjdG9yKCk6IHBvZC5JUG9kU2VsZWN0b3IgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3RvS3ViZSgpOiBrOHMuSXBCbG9jayB7XG4gICAgcmV0dXJuIHsgY2lkcjogdGhpcy5jaWRyLCBleGNlcHQ6IHRoaXMuZXhjZXB0IH07XG4gIH1cblxufVxuXG4vKipcbiAqIE5ldHdvcmsgcHJvdG9jb2xzLlxuICovXG5leHBvcnQgZW51bSBOZXR3b3JrUHJvdG9jb2wge1xuICAvKipcbiAgICogVENQLlxuICAgKi9cbiAgVENQID0gJ1RDUCcsXG4gIC8qKlxuICAgKiBVRFAuXG4gICAqL1xuICBVRFAgPSAnVURQJyxcbiAgLyoqXG4gICAqIFNDVFAuXG4gICAqL1xuICBTQ1RQID0gJ1NDVFAnLFxufVxuXG4vKipcbiAqIERlZmF1bHQgYmVoYXZpb3JzIG9mIG5ldHdvcmsgdHJhZmZpYyBpbiBwb2xpY2llcy5cbiAqL1xuZXhwb3J0IGVudW0gTmV0d29ya1BvbGljeVRyYWZmaWNEZWZhdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBwb2xpY3kgZGVuaWVzIGFsbCB0cmFmZmljLlxuICAgKiBTaW5jZSBydWxlcyBhcmUgYWRkaXRpdmUsIGFkZGl0aW9uYWwgcnVsZXMgb3IgcG9saWNpZXMgY2FuIGFsbG93XG4gICAqIHNwZWNpZmljIHRyYWZmaWMuXG4gICAqL1xuICBERU5ZID0gJ0RFTlknLFxuICAvKipcbiAgICogVGhlIHBvbGljeSBhbGxvd3MgYWxsIHRyYWZmaWMgKGVpdGhlciBpbmdyZXNzIG9yIGVncmVzcykuXG4gICAqIFNpbmNlIHJ1bGVzIGFyZSBhZGRpdGl2ZSwgbm8gYWRkaXRpb25hbCBydWxlIG9yIHBvbGljaWVzIGNhblxuICAgKiBzdWJzZXF1ZW50bHkgZGVueSB0aGUgdHJhZmZpYy5cbiAgICovXG4gIEFMTE9XID0gJ0FMTE9XJyxcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgaG93IHRoZSBuZXR3b3JrIHBvbGljeSBzaG91bGQgY29uZmlndXJlIGVncmVzcyAvIGluZ3Jlc3MgdHJhZmZpYy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrUG9saWN5VHJhZmZpYyB7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgcG9saWN5IHdoZW5cbiAgICogbm8gcnVsZXMgYXJlIGRlZmluZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5zZXQsIHRoZSBwb2xpY3kgZG9lcyBub3QgY2hhbmdlIHRoZSBiZWhhdmlvci5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHQ/OiBOZXR3b3JrUG9saWN5VHJhZmZpY0RlZmF1bHQ7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgcnVsZXMgdG8gYmUgYXBwbGllZCB0byB0aGUgc2VsZWN0ZWQgcG9kcy5cbiAgICogSWYgZW1wdHksIHRoZSBiZWhhdmlvciBvZiB0aGUgcG9saWN5IGlzIGRpY3RhdGVkIGJ5IHRoZSBgZGVmYXVsdGAgcHJvcGVydHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcnVsZXNcbiAgICovXG4gIHJlYWRvbmx5IHJ1bGVzPzogTmV0d29ya1BvbGljeVJ1bGVbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgTmV0d29ya1BvbGljeS5hZGRFZ3Jlc3NSdWxlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrUG9saWN5QWRkRWdyZXNzUnVsZU9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBQb3J0cyB0aGUgcnVsZSBzaG91bGQgYWxsb3cgb3V0Z29pbmcgdHJhZmZpYyB0by5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB0aGUgcGVlciBpcyBhIG1hbmFnZWQgcG9kLCB0YWtlIGl0cyBwb3J0cy4gT3RoZXJ3aXNlLCBhbGwgcG9ydHMgYXJlIGFsbG93ZWQuXG4gICAqL1xuICByZWFkb25seSBwb3J0cz86IE5ldHdvcmtQb2xpY3lQb3J0W107XG5cbn1cblxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGBOZXR3b3JrUG9saWN5YC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrUG9saWN5UHJvcHMgZXh0ZW5kcyBiYXNlLlJlc291cmNlUHJvcHMge1xuXG4gIC8qKlxuICAgKiBXaGljaCBwb2RzIGRvZXMgdGhpcyBwb2xpY3kgb2JqZWN0IGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIFRoaXMgY2FuIGVpdGhlciBiZSBhIHNpbmdsZSBwb2QgLyB3b3JrbG9hZCwgb3IgYSBncm91cGluZyBvZiBwb2RzIHNlbGVjdGVkXG4gICAqIHZpYSB0aGUgYFBvZHMuc2VsZWN0YCBmdW5jdGlvbi4gUnVsZXMgaXMgYXBwbGllZCB0byBhbnkgcG9kcyBzZWxlY3RlZCBieSB0aGlzIHByb3BlcnR5LlxuICAgKiBNdWx0aXBsZSBuZXR3b3JrIHBvbGljaWVzIGNhbiBzZWxlY3QgdGhlIHNhbWUgc2V0IG9mIHBvZHMuXG4gICAqIEluIHRoaXMgY2FzZSwgdGhlIHJ1bGVzIGZvciBlYWNoIGFyZSBjb21iaW5lZCBhZGRpdGl2ZWx5LlxuICAgKlxuICAgKiBOb3RlIHRoYXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSB3aWxsIHNlbGVjdCBhbGwgcG9kcyBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBwb2xpY3kuXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Rvcj86IHBvZC5JUG9kU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIEVncmVzcyB0cmFmZmljIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHBvbGljeSBkb2Vzbid0IGNoYW5nZSBlZ3Jlc3MgYmVoYXZpb3Igb2YgdGhlIHBvZHMgaXQgc2VsZWN0cy5cbiAgICovXG4gIHJlYWRvbmx5IGVncmVzcz86IE5ldHdvcmtQb2xpY3lUcmFmZmljO1xuXG4gIC8qKlxuICAgKiBJbmdyZXNzIHRyYWZmaWMgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgcG9saWN5IGRvZXNuJ3QgY2hhbmdlIGluZ3Jlc3MgYmVoYXZpb3Igb2YgdGhlIHBvZHMgaXQgc2VsZWN0cy5cbiAgICovXG4gIHJlYWRvbmx5IGluZ3Jlc3M/OiBOZXR3b3JrUG9saWN5VHJhZmZpYztcbn1cblxuLyoqXG4gKiBDb250cm9sIHRyYWZmaWMgZmxvdyBhdCB0aGUgSVAgYWRkcmVzcyBvciBwb3J0IGxldmVsIChPU0kgbGF5ZXIgMyBvciA0KSxcbiAqIG5ldHdvcmsgcG9saWNpZXMgYXJlIGFuIGFwcGxpY2F0aW9uLWNlbnRyaWMgY29uc3RydWN0IHdoaWNoIGFsbG93IHlvdVxuICogdG8gc3BlY2lmeSBob3cgYSBwb2QgaXMgYWxsb3dlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHZhcmlvdXMgbmV0d29yayBwZWVycy5cbiAqXG4gKiAtIE91dGdvaW5nIHRyYWZmaWMgaXMgYWxsb3dlZCBpZiB0aGVyZSBhcmUgbm8gbmV0d29yayBwb2xpY2llcyBzZWxlY3RpbmdcbiAqICAgdGhlIHBvZCAoYW5kIGNsdXN0ZXIgcG9saWN5IG90aGVyd2lzZSBhbGxvd3MgdGhlIHRyYWZmaWMpLFxuICogICBPUiBpZiB0aGUgdHJhZmZpYyBtYXRjaGVzIGF0IGxlYXN0IG9uZSBlZ3Jlc3MgcnVsZSBhY3Jvc3MgYWxsIG9mIHRoZVxuICogICBuZXR3b3JrIHBvbGljaWVzIHRoYXQgc2VsZWN0IHRoZSBwb2QuXG4gKlxuICogLSBJbmNvbWluZyB0cmFmZmljIGlzIGFsbG93ZWQgdG8gYSBwb2QgaWYgdGhlcmUgYXJlIG5vIG5ldHdvcmsgcG9saWNpZXNcbiAqICAgc2VsZWN0aW5nIHRoZSBwb2QgKGFuZCBjbHVzdGVyIHBvbGljeSBvdGhlcndpc2UgYWxsb3dzIHRoZSB0cmFmZmljKSxcbiAqICAgT1IgaWYgdGhlIHRyYWZmaWMgc291cmNlIGlzIHRoZSBwb2QncyBsb2NhbCBub2RlLFxuICogICBPUiBpZiB0aGUgdHJhZmZpYyBtYXRjaGVzIGF0IGxlYXN0IG9uZSBpbmdyZXNzIHJ1bGUgYWNyb3NzIGFsbCBvZlxuICogICB0aGUgbmV0d29yayBwb2xpY2llcyB0aGF0IHNlbGVjdCB0aGUgcG9kLlxuICpcbiAqIE5ldHdvcmsgcG9saWNpZXMgZG8gbm90IGNvbmZsaWN0OyB0aGV5IGFyZSBhZGRpdGl2ZS5cbiAqIElmIGFueSBwb2xpY3kgb3IgcG9saWNpZXMgYXBwbHkgdG8gYSBnaXZlbiBwb2QgZm9yIGEgZ2l2ZW5cbiAqIGRpcmVjdGlvbiwgdGhlIGNvbm5lY3Rpb25zIGFsbG93ZWQgaW4gdGhhdCBkaXJlY3Rpb24gZnJvbVxuICogdGhhdCBwb2QgaXMgdGhlIHVuaW9uIG9mIHdoYXQgdGhlIGFwcGxpY2FibGUgcG9saWNpZXMgYWxsb3cuXG4gKiBUaHVzLCBvcmRlciBvZiBldmFsdWF0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgcG9saWN5IHJlc3VsdC5cbiAqXG4gKiBGb3IgYSBjb25uZWN0aW9uIGZyb20gYSBzb3VyY2UgcG9kIHRvIGEgZGVzdGluYXRpb24gcG9kIHRvIGJlIGFsbG93ZWQsXG4gKiBib3RoIHRoZSBlZ3Jlc3MgcG9saWN5IG9uIHRoZSBzb3VyY2UgcG9kIGFuZCB0aGUgaW5ncmVzcyBwb2xpY3kgb24gdGhlXG4gKiBkZXN0aW5hdGlvbiBwb2QgbmVlZCB0byBhbGxvdyB0aGUgY29ubmVjdGlvbi5cbiAqIElmIGVpdGhlciBzaWRlIGRvZXMgbm90IGFsbG93IHRoZSBjb25uZWN0aW9uLCBpdCB3aWxsIG5vdCBoYXBwZW4uXG4gKlxuICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zZXJ2aWNlcy1uZXR3b3JraW5nL25ldHdvcmstcG9saWNpZXMvI25ldHdvcmtwb2xpY3ktcmVzb3VyY2VcbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtQb2xpY3kgZXh0ZW5kcyBiYXNlLlJlc291cmNlIHtcblxuICAvKipcbiAgICogQHNlZSBiYXNlLlJlc291cmNlLmFwaU9iamVjdFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwaU9iamVjdDogQXBpT2JqZWN0O1xuXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZVR5cGU6IHN0cmluZyA9ICduZXR3b3JrcG9saWNpZXMnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3BvZFNlbGVjdG9yQ29uZmlnOiBwb2QuUG9kU2VsZWN0b3JDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2VncmVzc1J1bGVzOiBrOHMuTmV0d29ya1BvbGljeUVncmVzc1J1bGVbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbmdyZXNzUnVsZXM6IGs4cy5OZXR3b3JrUG9saWN5SW5ncmVzc1J1bGVbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wb2xpY3lUeXBlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXR3b3JrUG9saWN5UHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBwb2RTZWxlY3RvciA9IHByb3BzLnNlbGVjdG9yID8/IHBvZC5Qb2RzLmFsbCh0aGlzLCAnQWxsUG9kcycpO1xuICAgIHRoaXMuX3BvZFNlbGVjdG9yQ29uZmlnID0gcG9kU2VsZWN0b3IudG9Qb2RTZWxlY3RvckNvbmZpZygpO1xuXG4gICAgbGV0IG5zO1xuXG4gICAgaWYgKCFwcm9wcy5tZXRhZGF0YT8ubmFtZXNwYWNlKSB7XG5cbiAgICAgIGlmICh0aGlzLl9wb2RTZWxlY3RvckNvbmZpZy5uYW1lc3BhY2VzPy5sYWJlbFNlbGVjdG9yICYmICF0aGlzLl9wb2RTZWxlY3RvckNvbmZpZy5uYW1lc3BhY2VzPy5sYWJlbFNlbGVjdG9yLmlzRW1wdHkoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjcmVhdGUgYSBuZXR3b3JrIHBvbGljeSBmb3IgYSBzZWxlY3RvciAoJHtwb2RTZWxlY3Rvci5ub2RlLnBhdGh9KSB0aGF0IHNlbGVjdHMgcG9kcyBpbiBuYW1lc3BhY2VzIGJhc2VkIG9uIGxhYmVsc2ApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcG9kU2VsZWN0b3JDb25maWcubmFtZXNwYWNlcz8ubmFtZXMgJiYgdGhpcy5fcG9kU2VsZWN0b3JDb25maWcubmFtZXNwYWNlcy5uYW1lcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNyZWF0ZSBhIG5ldHdvcmsgcG9saWN5IGZvciBhIHNlbGVjdG9yICgke3BvZFNlbGVjdG9yLm5vZGUucGF0aH0pIHRoYXQgc2VsZWN0cyBwb2RzIGluIG11bHRpcGxlIG5hbWVzcGFjZXNgKTtcbiAgICAgIH1cblxuICAgICAgbnMgPSB0aGlzLl9wb2RTZWxlY3RvckNvbmZpZy5uYW1lc3BhY2VzPy5uYW1lcyA/IHRoaXMuX3BvZFNlbGVjdG9yQ29uZmlnLm5hbWVzcGFjZXM/Lm5hbWVzWzBdIDogdW5kZWZpbmVkO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG5zID0gcHJvcHMubWV0YWRhdGEubmFtZXNwYWNlO1xuICAgIH1cblxuICAgIHRoaXMuYXBpT2JqZWN0ID0gbmV3IGs4cy5LdWJlTmV0d29ya1BvbGljeSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBtZXRhZGF0YTogeyAuLi5wcm9wcy5tZXRhZGF0YSwgbmFtZXNwYWNlOiBucyB9LFxuICAgICAgc3BlYzogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLl90b0t1YmUoKSB9KSxcbiAgICB9KTtcblxuICAgIHRoaXMuY29uZmlndXJlRGVmYXVsdEJlaGF2aW9yKCdFZ3Jlc3MnLCBwcm9wcy5lZ3Jlc3M/LmRlZmF1bHQpO1xuICAgIHRoaXMuY29uZmlndXJlRGVmYXVsdEJlaGF2aW9yKCdJbmdyZXNzJywgcHJvcHMuaW5ncmVzcz8uZGVmYXVsdCk7XG5cbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcHJvcHMuZWdyZXNzPy5ydWxlcyA/PyBbXSkge1xuICAgICAgdGhpcy5hZGRFZ3Jlc3NSdWxlKHJ1bGUucGVlciwgcnVsZS5wb3J0cyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBydWxlIG9mIHByb3BzLmluZ3Jlc3M/LnJ1bGVzID8/IFtdKSB7XG4gICAgICB0aGlzLmFkZEluZ3Jlc3NSdWxlKHJ1bGUucGVlciwgcnVsZS5wb3J0cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IG91dGdvaW5nIHRyYWZmaWMgdG8gdGhlIHBlZXIuXG4gICAqXG4gICAqIElmIHBvcnRzIGFyZSBub3QgcGFzc2VkLCB0cmFmZmljIHdpbGwgYmUgYWxsb3dlZCBvbiBhbGwgcG9ydHMuXG4gICAqL1xuICBwdWJsaWMgYWRkRWdyZXNzUnVsZShwZWVyOiBJTmV0d29ya1BvbGljeVBlZXIsIHBvcnRzPzogTmV0d29ya1BvbGljeVBvcnRbXSkge1xuICAgIHRoaXMuX3BvbGljeVR5cGVzLmFkZCgnRWdyZXNzJyk7XG4gICAgdGhpcy5fZWdyZXNzUnVsZXMucHVzaCh7IHBvcnRzOiAocG9ydHMgPz8gW10pLm1hcChwID0+IHAuX3RvS3ViZSgpKSwgdG86IHRoaXMuY3JlYXRlTmV0d29ya1BvbGljeVBlZXJzKHBlZXIpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IGluY29taW5nIHRyYWZmaWMgZnJvbSB0aGUgcGVlci5cbiAgICpcbiAgICogSWYgcG9ydHMgYXJlIG5vdCBwYXNzZWQsIHRyYWZmaWMgd2lsbCBiZSBhbGxvd2VkIG9uIGFsbCBwb3J0cy5cbiAgICovXG4gIHB1YmxpYyBhZGRJbmdyZXNzUnVsZShwZWVyOiBJTmV0d29ya1BvbGljeVBlZXIsIHBvcnRzPzogTmV0d29ya1BvbGljeVBvcnRbXSkge1xuICAgIHRoaXMuX3BvbGljeVR5cGVzLmFkZCgnSW5ncmVzcycpO1xuICAgIHRoaXMuX2luZ3Jlc3NSdWxlcy5wdXNoKHsgcG9ydHM6IChwb3J0cyA/PyBbXSkubWFwKHAgPT4gcC5fdG9LdWJlKCkpLCBmcm9tOiB0aGlzLmNyZWF0ZU5ldHdvcmtQb2xpY3lQZWVycyhwZWVyKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTmV0d29ya1BvbGljeVBlZXJzKHBlZXI6IElOZXR3b3JrUG9saWN5UGVlcik6IGs4cy5OZXR3b3JrUG9saWN5UGVlcltdIHtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHBlZXIudG9OZXR3b3JrUG9saWN5UGVlckNvbmZpZygpO1xuXG4gICAgdmFsaWRhdGVQZWVyQ29uZmlnKGNvbmZpZyk7XG5cbiAgICBpZiAoY29uZmlnLmlwQmxvY2spIHtcbiAgICAgIC8vIGlwIGJsb2NrIGlzIGEgc2luZ2xlIHBlZXIuXG4gICAgICByZXR1cm4gW3sgaXBCbG9jazogY29uZmlnLmlwQmxvY2suX3RvS3ViZSgpIH1dO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLnBvZFNlbGVjdG9yIS5uYW1lc3BhY2VzPy5uYW1lcykge1xuICAgICAgLy8gd2hlbiBubyBleHBsaWNpdCBuYW1lc3BhY2VzIGFyZSBkZWZpbmVkIHdlIGNhbiBqdXN0IHVzZVxuICAgICAgLy8gdGhlIHNlbGVjdG9yIGFzIGlzXG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgbmFtZXNwYWNlU2VsZWN0b3I6IGNvbmZpZy5wb2RTZWxlY3RvciEubmFtZXNwYWNlcz8ubGFiZWxTZWxlY3Rvcj8uX3RvS3ViZSgpLFxuICAgICAgICBwb2RTZWxlY3RvcjogY29uZmlnLnBvZFNlbGVjdG9yIS5sYWJlbFNlbGVjdG9yLl90b0t1YmUoKSxcbiAgICAgIH1dO1xuICAgIH1cblxuICAgIC8vIHdoZW4gZXhwbGljaXQgbmFtZXNwYWNlcyBhcmUgZGVmaW5lZCwgd2UgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZVxuICAgIC8vIHBlZXIgZm9yIGVhY2gsIHNpbmNlIGEgbGFiZWwgc2VsZWN0b3IgY2Fubm90IGhhdmUgbXVsdGlwbGUgbmFtZSBsYWJlbHMuICh0aGV5IHdpbGwgY29uZmxpY3QpXG4gICAgY29uc3QgbmFtZXNwYWNlU2VsZWN0b3IgPSBjb25maWcucG9kU2VsZWN0b3I/Lm5hbWVzcGFjZXM/LmxhYmVsU2VsZWN0b3I/Ll90b0t1YmUoKSA/PyB7fTtcbiAgICByZXR1cm4gY29uZmlnLnBvZFNlbGVjdG9yIS5uYW1lc3BhY2VzLm5hbWVzIS5tYXAobiA9PiAoe1xuICAgICAgcG9kU2VsZWN0b3I6IGNvbmZpZy5wb2RTZWxlY3RvciEubGFiZWxTZWxlY3Rvci5fdG9LdWJlKCksXG4gICAgICBuYW1lc3BhY2VTZWxlY3Rvcjoge1xuICAgICAgICBtYXRjaEV4cHJlc3Npb25zOiBuYW1lc3BhY2VTZWxlY3Rvci5tYXRjaEV4cHJlc3Npb25zLFxuICAgICAgICBtYXRjaExhYmVsczoge1xuICAgICAgICAgIC4uLm5hbWVzcGFjZVNlbGVjdG9yLm1hdGNoTGFiZWxzLFxuICAgICAgICAgIFtuYW1lc3BhY2UuTmFtZXNwYWNlLk5BTUVfTEFCRUxdOiBuLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZURlZmF1bHRCZWhhdmlvcihkaXJlY3Rpb246ICdJbmdyZXNzJyB8ICdFZ3Jlc3MnLCBfZGVmYXVsdD86IE5ldHdvcmtQb2xpY3lUcmFmZmljRGVmYXVsdCkge1xuXG4gICAgaWYgKCFfZGVmYXVsdCkgeyByZXR1cm47fVxuXG4gICAgaWYgKF9kZWZhdWx0ID09PSBOZXR3b3JrUG9saWN5VHJhZmZpY0RlZmF1bHQuREVOWSkge1xuICAgICAgLy8gaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc2VydmljZXMtbmV0d29ya2luZy9uZXR3b3JrLXBvbGljaWVzLyNkZWZhdWx0LWRlbnktYWxsLWVncmVzcy10cmFmZmljXG4gICAgICB0aGlzLl9wb2xpY3lUeXBlcy5hZGQoZGlyZWN0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoX2RlZmF1bHQgPT09IE5ldHdvcmtQb2xpY3lUcmFmZmljRGVmYXVsdC5BTExPVykge1xuICAgICAgLy8gaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc2VydmljZXMtbmV0d29ya2luZy9uZXR3b3JrLXBvbGljaWVzLyNhbGxvdy1hbGwtZWdyZXNzLXRyYWZmaWNcbiAgICAgIHRoaXMuX3BvbGljeVR5cGVzLmFkZChkaXJlY3Rpb24pO1xuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ0VncmVzcycpIHtcbiAgICAgICAgdGhpcy5fZWdyZXNzUnVsZXMucHVzaCh7fSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbmdyZXNzUnVsZXMucHVzaCh7fSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0t1YmUoKTogazhzLk5ldHdvcmtQb2xpY3lTcGVjIHtcbiAgICByZXR1cm4ge1xuICAgICAgcG9kU2VsZWN0b3I6IHRoaXMuX3BvZFNlbGVjdG9yQ29uZmlnLmxhYmVsU2VsZWN0b3IuX3RvS3ViZSgpLFxuICAgICAgZWdyZXNzOiB1bmRlZmluZWRJZkVtcHR5KHRoaXMuX2VncmVzc1J1bGVzKSxcbiAgICAgIGluZ3Jlc3M6IHVuZGVmaW5lZElmRW1wdHkodGhpcy5faW5ncmVzc1J1bGVzKSxcbiAgICAgIHBvbGljeVR5cGVzOiB1bmRlZmluZWRJZkVtcHR5KEFycmF5LmZyb20odGhpcy5fcG9saWN5VHlwZXMpKSxcbiAgICB9O1xuICB9XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUGVlckNvbmZpZyhwZWVyQ29uZmlnOiBOZXR3b3JrUG9saWN5UGVlckNvbmZpZykge1xuICBpZiAoIXBlZXJDb25maWcuaXBCbG9jayAmJiAhcGVlckNvbmZpZy5wb2RTZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcignSW5hdmxpZCBwZWVyOiBlaXRoZXIgXFwnaXBCbG9ja1xcJyBvciBcXCdwb2RTZWxlY3RvclxcJyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgfVxuICBpZiAocGVlckNvbmZpZy5pcEJsb2NrICYmIHBlZXJDb25maWcucG9kU2VsZWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0luYXZsaWQgcGVlcjogb25seSBvbmUgb2YgXFwnaXBCbG9ja1xcJyBhbmQgXFwncG9kU2VsZWN0b3JcXCcgbXVzdCBiZSBkZWZpbmVkJyk7XG4gIH1cbn1cbiJdfQ==