@k8slens/kubernetes-contracts 1.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.
package/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # @k8slens/kubernetes-contracts
2
+
3
+ What names and types a Kubernetes resource: every API version as a typed specifier, every kind Lens itself knows as a typed kind, and the types of the Kubernetes API, generated from [`@kubernetes/client-node`](https://github.com/kubernetes-client/javascript).
4
+
5
+ ```ts
6
+ import { podKind, coreV1, type V1PodSpec, type KubeResource } from "@k8slens/kubernetes-contracts";
7
+
8
+ type ServedPod = KubeResource<typeof podKind, typeof coreV1>; // metadata.name, metadata.uid and spec are required
9
+ ```
10
+
11
+ - `getKubernetesApiVersion` and `getKubeResourceKind` declare an API version and a kind of your own, typed; `coreV1`, `appsV1`, `autoscalingV2`, ... and `podKind`, `deploymentKind`, ... are the built-in ones.
12
+ - The schema types are named as client-node names them, the API version first: `V1Pod`, `V1PodSpec`, `V2HorizontalPodAutoscaler`. A kind carries its `apiVersion` and `kind` as literals, timestamps are the strings the API serves (`Time`, `MicroTime`), ports that may be named are `IntOrString`, and what the schema leaves open is `unknown`. Property names are the wire names. The few names client-node had to disambiguate keep their group prefix: `CoreV1Event` is the core `Event`, `EventsV1Event` the one of `events.k8s.io`.
13
+ - `PodV1`, `DeploymentV1`, ... are the built-in kinds' resources as the API serves them, with the fields a served resource always carries made required.
14
+
15
+ ## Regenerating
16
+
17
+ `src/generated/` is generated by `generator/` from the installed `@kubernetes/client-node` and the list of built-in kinds in `generator/built-in-kinds.ts`, and committed. When Dependabot bumps client-node, CI fails until the types are regenerated:
18
+
19
+ ```bash
20
+ npm run generate --workspace @k8slens/kubernetes-contracts
21
+ ```
22
+
23
+ `npm run generate:check --workspace @k8slens/kubernetes-contracts` is what CI runs. Which Kubernetes release the types describe, and which client-node version they came from, is recorded in the `kubernetes` field of `package.json` and in the header of every generated module.
24
+
25
+ ## Versioning
26
+
27
+ Semver from conventional commits, like every `@k8slens` package: a regeneration that only adds fields is a `feat`, one that removes an API version is a breaking change. The Kubernetes release is not the package version.
28
+
29
+ ## Provenance
30
+
31
+ Derived from `@kubernetes/client-node` (Apache-2.0), itself generated from the Kubernetes OpenAPI specification (Apache-2.0). This package is MIT like its siblings; the notices travel in the generated modules' headers. The field documentation is kept on purpose: it is the Kubernetes API reference, which is what an extension author needs at the call site.
@@ -0,0 +1,6 @@
1
+ export * from "./src/generated/kubernetes-types";
2
+ export { getKubernetesApiVersion, type KubernetesApiVersion } from "./src/kubernetes-api-version";
3
+ export * from "./src/generated/api-versions";
4
+ export { getKubeResourceKind, type KubeResource, type KubeResourceApiVersion, type KubeResourceBase, type KubeResourceKind, type KubeResourceShapes, type KubeResourceShapesOf, type KubeResourceType, } from "./src/kube-resource-kind";
5
+ export * from "./src/generated/kinds";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAClG,cAAc,8BAA8B,CAAC;AAC7C,OAAO,EACL,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ admissionregistrationV1: () => admissionregistrationV1,
24
+ admissionregistrationV1alpha1: () => admissionregistrationV1alpha1,
25
+ admissionregistrationV1beta1: () => admissionregistrationV1beta1,
26
+ apiextensionsV1: () => apiextensionsV1,
27
+ apiregistrationV1: () => apiregistrationV1,
28
+ appsV1: () => appsV1,
29
+ authenticationV1: () => authenticationV1,
30
+ authorizationV1: () => authorizationV1,
31
+ autoscalingV1: () => autoscalingV1,
32
+ autoscalingV2: () => autoscalingV2,
33
+ batchV1: () => batchV1,
34
+ certificatesV1: () => certificatesV1,
35
+ certificatesV1alpha1: () => certificatesV1alpha1,
36
+ certificatesV1beta1: () => certificatesV1beta1,
37
+ clusterRoleBindingKind: () => clusterRoleBindingKind,
38
+ clusterRoleKind: () => clusterRoleKind,
39
+ configMapKind: () => configMapKind,
40
+ coordinationV1: () => coordinationV1,
41
+ coordinationV1alpha2: () => coordinationV1alpha2,
42
+ coordinationV1beta1: () => coordinationV1beta1,
43
+ coreV1: () => coreV1,
44
+ cronJobKind: () => cronJobKind,
45
+ customResourceDefinitionKind: () => customResourceDefinitionKind,
46
+ daemonSetKind: () => daemonSetKind,
47
+ deploymentKind: () => deploymentKind,
48
+ discoveryV1: () => discoveryV1,
49
+ endpointSliceKind: () => endpointSliceKind,
50
+ endpointsKind: () => endpointsKind,
51
+ eventsV1: () => eventsV1,
52
+ flowcontrolApiserverV1: () => flowcontrolApiserverV1,
53
+ getKubeResourceKind: () => getKubeResourceKind,
54
+ getKubernetesApiVersion: () => getKubernetesApiVersion,
55
+ horizontalPodAutoscalerKind: () => horizontalPodAutoscalerKind,
56
+ ingressClassKind: () => ingressClassKind,
57
+ ingressKind: () => ingressKind,
58
+ internalApiserverV1alpha1: () => internalApiserverV1alpha1,
59
+ jobKind: () => jobKind,
60
+ leaseKind: () => leaseKind,
61
+ limitRangeKind: () => limitRangeKind,
62
+ mutatingWebhookConfigurationKind: () => mutatingWebhookConfigurationKind,
63
+ namespaceKind: () => namespaceKind,
64
+ networkPolicyKind: () => networkPolicyKind,
65
+ networkingV1: () => networkingV1,
66
+ networkingV1beta1: () => networkingV1beta1,
67
+ nodeKind: () => nodeKind,
68
+ nodeV1: () => nodeV1,
69
+ persistentVolumeClaimKind: () => persistentVolumeClaimKind,
70
+ persistentVolumeKind: () => persistentVolumeKind,
71
+ podDisruptionBudgetKind: () => podDisruptionBudgetKind,
72
+ podKind: () => podKind,
73
+ policyV1: () => policyV1,
74
+ priorityClassKind: () => priorityClassKind,
75
+ rbacAuthorizationV1: () => rbacAuthorizationV1,
76
+ replicaSetKind: () => replicaSetKind,
77
+ replicationControllerKind: () => replicationControllerKind,
78
+ resourceQuotaKind: () => resourceQuotaKind,
79
+ resourceV1: () => resourceV1,
80
+ resourceV1alpha3: () => resourceV1alpha3,
81
+ resourceV1beta1: () => resourceV1beta1,
82
+ resourceV1beta2: () => resourceV1beta2,
83
+ roleBindingKind: () => roleBindingKind,
84
+ roleKind: () => roleKind,
85
+ runtimeClassKind: () => runtimeClassKind,
86
+ schedulingV1: () => schedulingV1,
87
+ schedulingV1alpha2: () => schedulingV1alpha2,
88
+ secretKind: () => secretKind,
89
+ serviceAccountKind: () => serviceAccountKind,
90
+ serviceKind: () => serviceKind,
91
+ statefulSetKind: () => statefulSetKind,
92
+ storageClassKind: () => storageClassKind,
93
+ storageV1: () => storageV1,
94
+ storageV1beta1: () => storageV1beta1,
95
+ storagemigrationV1beta1: () => storagemigrationV1beta1,
96
+ validatingWebhookConfigurationKind: () => validatingWebhookConfigurationKind
97
+ });
98
+ module.exports = __toCommonJS(index_exports);
99
+
100
+ // src/kubernetes-api-version.ts
101
+ var import_injectable = require("@k8slens/injectable");
102
+ var getKubernetesApiVersion = (apiVersion) => (0, import_injectable.getTypedSpecifier)()(apiVersion);
103
+
104
+ // src/generated/api-versions.ts
105
+ var admissionregistrationV1 = getKubernetesApiVersion("admissionregistration.k8s.io/v1");
106
+ var admissionregistrationV1alpha1 = getKubernetesApiVersion("admissionregistration.k8s.io/v1alpha1");
107
+ var admissionregistrationV1beta1 = getKubernetesApiVersion("admissionregistration.k8s.io/v1beta1");
108
+ var apiextensionsV1 = getKubernetesApiVersion("apiextensions.k8s.io/v1");
109
+ var apiregistrationV1 = getKubernetesApiVersion("apiregistration.k8s.io/v1");
110
+ var appsV1 = getKubernetesApiVersion("apps/v1");
111
+ var authenticationV1 = getKubernetesApiVersion("authentication.k8s.io/v1");
112
+ var authorizationV1 = getKubernetesApiVersion("authorization.k8s.io/v1");
113
+ var autoscalingV1 = getKubernetesApiVersion("autoscaling/v1");
114
+ var autoscalingV2 = getKubernetesApiVersion("autoscaling/v2");
115
+ var batchV1 = getKubernetesApiVersion("batch/v1");
116
+ var certificatesV1 = getKubernetesApiVersion("certificates.k8s.io/v1");
117
+ var certificatesV1alpha1 = getKubernetesApiVersion("certificates.k8s.io/v1alpha1");
118
+ var certificatesV1beta1 = getKubernetesApiVersion("certificates.k8s.io/v1beta1");
119
+ var coordinationV1 = getKubernetesApiVersion("coordination.k8s.io/v1");
120
+ var coordinationV1alpha2 = getKubernetesApiVersion("coordination.k8s.io/v1alpha2");
121
+ var coordinationV1beta1 = getKubernetesApiVersion("coordination.k8s.io/v1beta1");
122
+ var coreV1 = getKubernetesApiVersion("v1");
123
+ var discoveryV1 = getKubernetesApiVersion("discovery.k8s.io/v1");
124
+ var eventsV1 = getKubernetesApiVersion("events.k8s.io/v1");
125
+ var flowcontrolApiserverV1 = getKubernetesApiVersion("flowcontrol.apiserver.k8s.io/v1");
126
+ var internalApiserverV1alpha1 = getKubernetesApiVersion("internal.apiserver.k8s.io/v1alpha1");
127
+ var networkingV1 = getKubernetesApiVersion("networking.k8s.io/v1");
128
+ var networkingV1beta1 = getKubernetesApiVersion("networking.k8s.io/v1beta1");
129
+ var nodeV1 = getKubernetesApiVersion("node.k8s.io/v1");
130
+ var policyV1 = getKubernetesApiVersion("policy/v1");
131
+ var rbacAuthorizationV1 = getKubernetesApiVersion("rbac.authorization.k8s.io/v1");
132
+ var resourceV1 = getKubernetesApiVersion("resource.k8s.io/v1");
133
+ var resourceV1alpha3 = getKubernetesApiVersion("resource.k8s.io/v1alpha3");
134
+ var resourceV1beta1 = getKubernetesApiVersion("resource.k8s.io/v1beta1");
135
+ var resourceV1beta2 = getKubernetesApiVersion("resource.k8s.io/v1beta2");
136
+ var schedulingV1 = getKubernetesApiVersion("scheduling.k8s.io/v1");
137
+ var schedulingV1alpha2 = getKubernetesApiVersion("scheduling.k8s.io/v1alpha2");
138
+ var storagemigrationV1beta1 = getKubernetesApiVersion("storagemigration.k8s.io/v1beta1");
139
+ var storageV1 = getKubernetesApiVersion("storage.k8s.io/v1");
140
+ var storageV1beta1 = getKubernetesApiVersion("storage.k8s.io/v1beta1");
141
+
142
+ // src/kube-resource-kind.ts
143
+ var import_injectable2 = require("@k8slens/injectable");
144
+ var getKubeResourceKind = (kind) => (0, import_injectable2.getTypedSpecifier)()(kind);
145
+
146
+ // src/generated/kinds.ts
147
+ var clusterRoleKind = getKubeResourceKind("ClusterRole");
148
+ var clusterRoleBindingKind = getKubeResourceKind("ClusterRoleBinding");
149
+ var configMapKind = getKubeResourceKind("ConfigMap");
150
+ var cronJobKind = getKubeResourceKind("CronJob");
151
+ var customResourceDefinitionKind = getKubeResourceKind("CustomResourceDefinition");
152
+ var daemonSetKind = getKubeResourceKind("DaemonSet");
153
+ var deploymentKind = getKubeResourceKind("Deployment");
154
+ var endpointsKind = getKubeResourceKind("Endpoints");
155
+ var endpointSliceKind = getKubeResourceKind("EndpointSlice");
156
+ var horizontalPodAutoscalerKind = getKubeResourceKind("HorizontalPodAutoscaler");
157
+ var ingressKind = getKubeResourceKind("Ingress");
158
+ var ingressClassKind = getKubeResourceKind("IngressClass");
159
+ var jobKind = getKubeResourceKind("Job");
160
+ var leaseKind = getKubeResourceKind("Lease");
161
+ var limitRangeKind = getKubeResourceKind("LimitRange");
162
+ var mutatingWebhookConfigurationKind = getKubeResourceKind("MutatingWebhookConfiguration");
163
+ var namespaceKind = getKubeResourceKind("Namespace");
164
+ var networkPolicyKind = getKubeResourceKind("NetworkPolicy");
165
+ var nodeKind = getKubeResourceKind("Node");
166
+ var persistentVolumeKind = getKubeResourceKind("PersistentVolume");
167
+ var persistentVolumeClaimKind = getKubeResourceKind("PersistentVolumeClaim");
168
+ var podKind = getKubeResourceKind("Pod");
169
+ var podDisruptionBudgetKind = getKubeResourceKind("PodDisruptionBudget");
170
+ var priorityClassKind = getKubeResourceKind("PriorityClass");
171
+ var replicaSetKind = getKubeResourceKind("ReplicaSet");
172
+ var replicationControllerKind = getKubeResourceKind("ReplicationController");
173
+ var resourceQuotaKind = getKubeResourceKind("ResourceQuota");
174
+ var roleKind = getKubeResourceKind("Role");
175
+ var roleBindingKind = getKubeResourceKind("RoleBinding");
176
+ var runtimeClassKind = getKubeResourceKind("RuntimeClass");
177
+ var secretKind = getKubeResourceKind("Secret");
178
+ var serviceKind = getKubeResourceKind("Service");
179
+ var serviceAccountKind = getKubeResourceKind("ServiceAccount");
180
+ var statefulSetKind = getKubeResourceKind("StatefulSet");
181
+ var storageClassKind = getKubeResourceKind("StorageClass");
182
+ var validatingWebhookConfigurationKind = getKubeResourceKind("ValidatingWebhookConfiguration");
183
+ // Annotate the CommonJS export names for ESM import in node:
184
+ 0 && (module.exports = {
185
+ admissionregistrationV1,
186
+ admissionregistrationV1alpha1,
187
+ admissionregistrationV1beta1,
188
+ apiextensionsV1,
189
+ apiregistrationV1,
190
+ appsV1,
191
+ authenticationV1,
192
+ authorizationV1,
193
+ autoscalingV1,
194
+ autoscalingV2,
195
+ batchV1,
196
+ certificatesV1,
197
+ certificatesV1alpha1,
198
+ certificatesV1beta1,
199
+ clusterRoleBindingKind,
200
+ clusterRoleKind,
201
+ configMapKind,
202
+ coordinationV1,
203
+ coordinationV1alpha2,
204
+ coordinationV1beta1,
205
+ coreV1,
206
+ cronJobKind,
207
+ customResourceDefinitionKind,
208
+ daemonSetKind,
209
+ deploymentKind,
210
+ discoveryV1,
211
+ endpointSliceKind,
212
+ endpointsKind,
213
+ eventsV1,
214
+ flowcontrolApiserverV1,
215
+ getKubeResourceKind,
216
+ getKubernetesApiVersion,
217
+ horizontalPodAutoscalerKind,
218
+ ingressClassKind,
219
+ ingressKind,
220
+ internalApiserverV1alpha1,
221
+ jobKind,
222
+ leaseKind,
223
+ limitRangeKind,
224
+ mutatingWebhookConfigurationKind,
225
+ namespaceKind,
226
+ networkPolicyKind,
227
+ networkingV1,
228
+ networkingV1beta1,
229
+ nodeKind,
230
+ nodeV1,
231
+ persistentVolumeClaimKind,
232
+ persistentVolumeKind,
233
+ podDisruptionBudgetKind,
234
+ podKind,
235
+ policyV1,
236
+ priorityClassKind,
237
+ rbacAuthorizationV1,
238
+ replicaSetKind,
239
+ replicationControllerKind,
240
+ resourceQuotaKind,
241
+ resourceV1,
242
+ resourceV1alpha3,
243
+ resourceV1beta1,
244
+ resourceV1beta2,
245
+ roleBindingKind,
246
+ roleKind,
247
+ runtimeClassKind,
248
+ schedulingV1,
249
+ schedulingV1alpha2,
250
+ secretKind,
251
+ serviceAccountKind,
252
+ serviceKind,
253
+ statefulSetKind,
254
+ storageClassKind,
255
+ storageV1,
256
+ storageV1beta1,
257
+ storagemigrationV1beta1,
258
+ validatingWebhookConfigurationKind
259
+ });
260
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiLCAiLi4vc3JjL2t1YmVybmV0ZXMtYXBpLXZlcnNpb24udHMiLCAiLi4vc3JjL2dlbmVyYXRlZC9hcGktdmVyc2lvbnMudHMiLCAiLi4vc3JjL2t1YmUtcmVzb3VyY2Uta2luZC50cyIsICIuLi9zcmMvZ2VuZXJhdGVkL2tpbmRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9zcmMvZ2VuZXJhdGVkL2t1YmVybmV0ZXMtdHlwZXNcIjtcbmV4cG9ydCB7IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uLCB0eXBlIEt1YmVybmV0ZXNBcGlWZXJzaW9uIH0gZnJvbSBcIi4vc3JjL2t1YmVybmV0ZXMtYXBpLXZlcnNpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NyYy9nZW5lcmF0ZWQvYXBpLXZlcnNpb25zXCI7XG5leHBvcnQge1xuICBnZXRLdWJlUmVzb3VyY2VLaW5kLFxuICB0eXBlIEt1YmVSZXNvdXJjZSxcbiAgdHlwZSBLdWJlUmVzb3VyY2VBcGlWZXJzaW9uLFxuICB0eXBlIEt1YmVSZXNvdXJjZUJhc2UsXG4gIHR5cGUgS3ViZVJlc291cmNlS2luZCxcbiAgdHlwZSBLdWJlUmVzb3VyY2VTaGFwZXMsXG4gIHR5cGUgS3ViZVJlc291cmNlU2hhcGVzT2YsXG4gIHR5cGUgS3ViZVJlc291cmNlVHlwZSxcbn0gZnJvbSBcIi4vc3JjL2t1YmUtcmVzb3VyY2Uta2luZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3JjL2dlbmVyYXRlZC9raW5kc1wiO1xuIiwgImltcG9ydCB7IGdldFR5cGVkU3BlY2lmaWVyLCB0eXBlIFR5cGVkU3BlY2lmaWVyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcblxuLyoqXG4gKiBJZGVudGlmaWVzIG9uZSBLdWJlcm5ldGVzIEFQSSB2ZXJzaW9uLCB0aGUgYGFwaVZlcnNpb25gIG9mIGEgcmVzb3VyY2U6IGB2MWBcbiAqIGZvciB0aGUgY29yZSBncm91cCwgYDxncm91cD4vPHZlcnNpb24+YCBmb3IgZXZlcnkgb3RoZXIgZ3JvdXAuIEF0IHJ1bnRpbWUgaXRcbiAqIGlzIHRoYXQgc3RyaW5nIHZlcmJhdGltLCBzbyBpdCBpcyB1c2FibGUgYXMgYSBgLmZvcigpYCBrZXkgd2hlcmV2ZXIgYSBjb250cmFjdFxuICogaXMga2V5ZWQgYnkgQVBJIHZlcnNpb247IGF0IHRoZSB0eXBlIGxldmVsIGl0IGlzIGEgZGlzdGluY3Qgc3BlY2lmaWVyLCBzbyBhXG4gKiBraW5kLCBhbiBpZCBvciBhIHBsYWluIHN0cmluZyBjYW5ub3QgYmUgcGFzc2VkIHdoZXJlIGFuIEFQSSB2ZXJzaW9uIGJlbG9uZ3MuXG4gKlxuICogQ3JlYXRlIG9uZSB3aXRoIHtAbGluayBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbn07IHRoZSB2ZXJzaW9ucyBMZW5zIGl0c2VsZlxuICogc2VydmVzIGFyZSBleHBvcnRlZCByZWFkeS1tYWRlLCBlLmcuIHtAbGluayBjb3JlVjF9IGFuZCB7QGxpbmsgYXBwc1YxfS5cbiAqL1xuZXhwb3J0IHR5cGUgS3ViZXJuZXRlc0FwaVZlcnNpb248UyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSBUeXBlZFNwZWNpZmllcjxTLCB7IGt1YmVybmV0ZXNBcGlWZXJzaW9uOiBTIH0+O1xuXG4vKipcbiAqIERlY2xhcmVzIGEgS3ViZXJuZXRlcyBBUEkgdmVyc2lvbi4gVGhlIGFyZ3VtZW50IGlzIHRoZSBgYXBpVmVyc2lvbmAgdmVyYmF0aW0sXG4gKiBhcyBpdCBhcHBlYXJzIGluIGV2ZXJ5IHJlc291cmNlIG9mIHRoYXQgdmVyc2lvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGV4cG9ydCBjb25zdCBiYWNrdXBzVjEgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcImJhY2t1cHMuZXhhbXBsZS5jb20vdjFcIik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uID0gPFMgZXh0ZW5kcyBzdHJpbmc+KGFwaVZlcnNpb246IFMpID0+XG4gIGdldFR5cGVkU3BlY2lmaWVyPHsga3ViZXJuZXRlc0FwaVZlcnNpb246IFMgfT4oKShhcGlWZXJzaW9uKTtcbiIsICIvKipcbiAqIEV2ZXJ5IEFQSSB2ZXJzaW9uIEBrdWJlcm5ldGVzL2NsaWVudC1ub2RlIHNlcnZlcywgYXMgYSB0eXBlZCBzcGVjaWZpZXIuXG4gKlxuICogR0VORVJBVEVEIGJ5IHBhY2thZ2VzL3RlY2huaWNhbC1mZWF0dXJlcy9fa3ViZS9rdWJlcm5ldGVzLWNvbnRyYWN0cy9nZW5lcmF0b3IuIERPIE5PVCBFRElULlxuICogUmVnZW5lcmF0ZSB3aXRoIGBucG0gcnVuIGdlbmVyYXRlIC0td29ya3NwYWNlIEBrOHNsZW5zL2t1YmVybmV0ZXMtY29udHJhY3RzYC5cbiAqXG4gKiBEZXJpdmVkIGZyb20gQGt1YmVybmV0ZXMvY2xpZW50LW5vZGUgMi4wLjAgKEFwYWNoZS0yLjApLCBpdHNlbGYgZ2VuZXJhdGVkIGZyb20gdGhlXG4gKiBLdWJlcm5ldGVzIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiwgcmVsZWFzZS0xLjM2IChBcGFjaGUtMi4wKS5cbiAqL1xuXG5pbXBvcnQgeyBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbiB9IGZyb20gXCIuLi9rdWJlcm5ldGVzLWFwaS12ZXJzaW9uXCI7XG5cbi8qKiBUaGUgYGFkbWlzc2lvbnJlZ2lzdHJhdGlvbi5rOHMuaW8vdjFgIEFQSSB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IGFkbWlzc2lvbnJlZ2lzdHJhdGlvblYxID0gZ2V0S3ViZXJuZXRlc0FwaVZlcnNpb24oXCJhZG1pc3Npb25yZWdpc3RyYXRpb24uazhzLmlvL3YxXCIpO1xuXG4vKiogVGhlIGBhZG1pc3Npb25yZWdpc3RyYXRpb24uazhzLmlvL3YxYWxwaGExYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBhZG1pc3Npb25yZWdpc3RyYXRpb25WMWFscGhhMSA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwiYWRtaXNzaW9ucmVnaXN0cmF0aW9uLms4cy5pby92MWFscGhhMVwiKTtcblxuLyoqIFRoZSBgYWRtaXNzaW9ucmVnaXN0cmF0aW9uLms4cy5pby92MWJldGExYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBhZG1pc3Npb25yZWdpc3RyYXRpb25WMWJldGExID0gZ2V0S3ViZXJuZXRlc0FwaVZlcnNpb24oXCJhZG1pc3Npb25yZWdpc3RyYXRpb24uazhzLmlvL3YxYmV0YTFcIik7XG5cbi8qKiBUaGUgYGFwaWV4dGVuc2lvbnMuazhzLmlvL3YxYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBhcGlleHRlbnNpb25zVjEgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcImFwaWV4dGVuc2lvbnMuazhzLmlvL3YxXCIpO1xuXG4vKiogVGhlIGBhcGlyZWdpc3RyYXRpb24uazhzLmlvL3YxYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBhcGlyZWdpc3RyYXRpb25WMSA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwiYXBpcmVnaXN0cmF0aW9uLms4cy5pby92MVwiKTtcblxuLyoqIFRoZSBgYXBwcy92MWAgQVBJIHZlcnNpb24uICovXG5leHBvcnQgY29uc3QgYXBwc1YxID0gZ2V0S3ViZXJuZXRlc0FwaVZlcnNpb24oXCJhcHBzL3YxXCIpO1xuXG4vKiogVGhlIGBhdXRoZW50aWNhdGlvbi5rOHMuaW8vdjFgIEFQSSB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IGF1dGhlbnRpY2F0aW9uVjEgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcImF1dGhlbnRpY2F0aW9uLms4cy5pby92MVwiKTtcblxuLyoqIFRoZSBgYXV0aG9yaXphdGlvbi5rOHMuaW8vdjFgIEFQSSB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IGF1dGhvcml6YXRpb25WMSA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwiYXV0aG9yaXphdGlvbi5rOHMuaW8vdjFcIik7XG5cbi8qKiBUaGUgYGF1dG9zY2FsaW5nL3YxYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBhdXRvc2NhbGluZ1YxID0gZ2V0S3ViZXJuZXRlc0FwaVZlcnNpb24oXCJhdXRvc2NhbGluZy92MVwiKTtcblxuLyoqIFRoZSBgYXV0b3NjYWxpbmcvdjJgIEFQSSB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IGF1dG9zY2FsaW5nVjIgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcImF1dG9zY2FsaW5nL3YyXCIpO1xuXG4vKiogVGhlIGBiYXRjaC92MWAgQVBJIHZlcnNpb24uICovXG5leHBvcnQgY29uc3QgYmF0Y2hWMSA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwiYmF0Y2gvdjFcIik7XG5cbi8qKiBUaGUgYGNlcnRpZmljYXRlcy5rOHMuaW8vdjFgIEFQSSB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IGNlcnRpZmljYXRlc1YxID0gZ2V0S3ViZXJuZXRlc0FwaVZlcnNpb24oXCJjZXJ0aWZpY2F0ZXMuazhzLmlvL3YxXCIpO1xuXG4vKiogVGhlIGBjZXJ0aWZpY2F0ZXMuazhzLmlvL3YxYWxwaGExYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBjZXJ0aWZpY2F0ZXNWMWFscGhhMSA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwiY2VydGlmaWNhdGVzLms4cy5pby92MWFscGhhMVwiKTtcblxuLyoqIFRoZSBgY2VydGlmaWNhdGVzLms4cy5pby92MWJldGExYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBjZXJ0aWZpY2F0ZXNWMWJldGExID0gZ2V0S3ViZXJuZXRlc0FwaVZlcnNpb24oXCJjZXJ0aWZpY2F0ZXMuazhzLmlvL3YxYmV0YTFcIik7XG5cbi8qKiBUaGUgYGNvb3JkaW5hdGlvbi5rOHMuaW8vdjFgIEFQSSB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IGNvb3JkaW5hdGlvblYxID0gZ2V0S3ViZXJuZXRlc0FwaVZlcnNpb24oXCJjb29yZGluYXRpb24uazhzLmlvL3YxXCIpO1xuXG4vKiogVGhlIGBjb29yZGluYXRpb24uazhzLmlvL3YxYWxwaGEyYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBjb29yZGluYXRpb25WMWFscGhhMiA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwiY29vcmRpbmF0aW9uLms4cy5pby92MWFscGhhMlwiKTtcblxuLyoqIFRoZSBgY29vcmRpbmF0aW9uLms4cy5pby92MWJldGExYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBjb29yZGluYXRpb25WMWJldGExID0gZ2V0S3ViZXJuZXRlc0FwaVZlcnNpb24oXCJjb29yZGluYXRpb24uazhzLmlvL3YxYmV0YTFcIik7XG5cbi8qKiBUaGUgYHYxYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBjb3JlVjEgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcInYxXCIpO1xuXG4vKiogVGhlIGBkaXNjb3ZlcnkuazhzLmlvL3YxYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBkaXNjb3ZlcnlWMSA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwiZGlzY292ZXJ5Lms4cy5pby92MVwiKTtcblxuLyoqIFRoZSBgZXZlbnRzLms4cy5pby92MWAgQVBJIHZlcnNpb24uICovXG5leHBvcnQgY29uc3QgZXZlbnRzVjEgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcImV2ZW50cy5rOHMuaW8vdjFcIik7XG5cbi8qKiBUaGUgYGZsb3djb250cm9sLmFwaXNlcnZlci5rOHMuaW8vdjFgIEFQSSB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IGZsb3djb250cm9sQXBpc2VydmVyVjEgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcImZsb3djb250cm9sLmFwaXNlcnZlci5rOHMuaW8vdjFcIik7XG5cbi8qKiBUaGUgYGludGVybmFsLmFwaXNlcnZlci5rOHMuaW8vdjFhbHBoYTFgIEFQSSB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IGludGVybmFsQXBpc2VydmVyVjFhbHBoYTEgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcImludGVybmFsLmFwaXNlcnZlci5rOHMuaW8vdjFhbHBoYTFcIik7XG5cbi8qKiBUaGUgYG5ldHdvcmtpbmcuazhzLmlvL3YxYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBuZXR3b3JraW5nVjEgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcIm5ldHdvcmtpbmcuazhzLmlvL3YxXCIpO1xuXG4vKiogVGhlIGBuZXR3b3JraW5nLms4cy5pby92MWJldGExYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBuZXR3b3JraW5nVjFiZXRhMSA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwibmV0d29ya2luZy5rOHMuaW8vdjFiZXRhMVwiKTtcblxuLyoqIFRoZSBgbm9kZS5rOHMuaW8vdjFgIEFQSSB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IG5vZGVWMSA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwibm9kZS5rOHMuaW8vdjFcIik7XG5cbi8qKiBUaGUgYHBvbGljeS92MWAgQVBJIHZlcnNpb24uICovXG5leHBvcnQgY29uc3QgcG9saWN5VjEgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcInBvbGljeS92MVwiKTtcblxuLyoqIFRoZSBgcmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MWAgQVBJIHZlcnNpb24uICovXG5leHBvcnQgY29uc3QgcmJhY0F1dGhvcml6YXRpb25WMSA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MVwiKTtcblxuLyoqIFRoZSBgcmVzb3VyY2UuazhzLmlvL3YxYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCByZXNvdXJjZVYxID0gZ2V0S3ViZXJuZXRlc0FwaVZlcnNpb24oXCJyZXNvdXJjZS5rOHMuaW8vdjFcIik7XG5cbi8qKiBUaGUgYHJlc291cmNlLms4cy5pby92MWFscGhhM2AgQVBJIHZlcnNpb24uICovXG5leHBvcnQgY29uc3QgcmVzb3VyY2VWMWFscGhhMyA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwicmVzb3VyY2UuazhzLmlvL3YxYWxwaGEzXCIpO1xuXG4vKiogVGhlIGByZXNvdXJjZS5rOHMuaW8vdjFiZXRhMWAgQVBJIHZlcnNpb24uICovXG5leHBvcnQgY29uc3QgcmVzb3VyY2VWMWJldGExID0gZ2V0S3ViZXJuZXRlc0FwaVZlcnNpb24oXCJyZXNvdXJjZS5rOHMuaW8vdjFiZXRhMVwiKTtcblxuLyoqIFRoZSBgcmVzb3VyY2UuazhzLmlvL3YxYmV0YTJgIEFQSSB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IHJlc291cmNlVjFiZXRhMiA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwicmVzb3VyY2UuazhzLmlvL3YxYmV0YTJcIik7XG5cbi8qKiBUaGUgYHNjaGVkdWxpbmcuazhzLmlvL3YxYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBzY2hlZHVsaW5nVjEgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcInNjaGVkdWxpbmcuazhzLmlvL3YxXCIpO1xuXG4vKiogVGhlIGBzY2hlZHVsaW5nLms4cy5pby92MWFscGhhMmAgQVBJIHZlcnNpb24uICovXG5leHBvcnQgY29uc3Qgc2NoZWR1bGluZ1YxYWxwaGEyID0gZ2V0S3ViZXJuZXRlc0FwaVZlcnNpb24oXCJzY2hlZHVsaW5nLms4cy5pby92MWFscGhhMlwiKTtcblxuLyoqIFRoZSBgc3RvcmFnZW1pZ3JhdGlvbi5rOHMuaW8vdjFiZXRhMWAgQVBJIHZlcnNpb24uICovXG5leHBvcnQgY29uc3Qgc3RvcmFnZW1pZ3JhdGlvblYxYmV0YTEgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcInN0b3JhZ2VtaWdyYXRpb24uazhzLmlvL3YxYmV0YTFcIik7XG5cbi8qKiBUaGUgYHN0b3JhZ2UuazhzLmlvL3YxYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBzdG9yYWdlVjEgPSBnZXRLdWJlcm5ldGVzQXBpVmVyc2lvbihcInN0b3JhZ2UuazhzLmlvL3YxXCIpO1xuXG4vKiogVGhlIGBzdG9yYWdlLms4cy5pby92MWJldGExYCBBUEkgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBzdG9yYWdlVjFiZXRhMSA9IGdldEt1YmVybmV0ZXNBcGlWZXJzaW9uKFwic3RvcmFnZS5rOHMuaW8vdjFiZXRhMVwiKTtcbiIsICJpbXBvcnQgeyBnZXRUeXBlZFNwZWNpZmllciwgdHlwZSBUeXBlZFNwZWNpZmllciwgdHlwZSBUeXBlZFNwZWNpZmllclR5cGUgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBLdWJlcm5ldGVzQXBpVmVyc2lvbiB9IGZyb20gXCIuL2t1YmVybmV0ZXMtYXBpLXZlcnNpb25cIjtcblxuLyoqXG4gKiBUaGUgc2hhcGVzIG9mIGEga2luZCdzIHJlc291cmNlcywgb25lIHBlciBBUEkgdmVyc2lvbiB0aGUga2luZCBpcyBzZXJ2ZWQgaW4sXG4gKiBrZXllZCBieSB0aGUgYGFwaVZlcnNpb25gIHZlcmJhdGltOiBgeyBcInYxXCI6IFBvZFYxIH1gLCBgeyBcImF1dG9zY2FsaW5nL3YxXCI6IEhwYVYxOyBcImF1dG9zY2FsaW5nL3YyXCI6IEhwYVYyIH1gLlxuICovXG5leHBvcnQgdHlwZSBLdWJlUmVzb3VyY2VTaGFwZXMgPSBSZWNvcmQ8c3RyaW5nLCB7fT47XG5cbi8qKlxuICogSWRlbnRpZmllcyBvbmUgS3ViZXJuZXRlcyByZXNvdXJjZSBraW5kLCBzdWNoIGFzIGBQb2RgIG9yIGEgY3VzdG9tIHJlc291cmNlJ3NcbiAqIGtpbmQuIEF0IHJ1bnRpbWUgYSBraW5kIGlzIHRoZSBLdWJlcm5ldGVzIGBraW5kYCBzdHJpbmcgdmVyYmF0aW0sIHNvIGl0IGlzXG4gKiB1c2FibGUgYXMgYSBgLmZvcigpYCBrZXkgd2hlcmV2ZXIgYSBjb250cmFjdCBpcyBrZXllZCBieSBraW5kOyBhdCB0aGUgdHlwZVxuICogbGV2ZWwgaXQgY2FycmllcyB0aGUgc2hhcGUgb2YgdGhlIGtpbmQncyByZXNvdXJjZXMgcGVyIEFQSSB2ZXJzaW9uLCBzbyBhXG4gKiBjb250cmFjdCBrZXllZCBieSBraW5kIGFuZCB0aGVuIEFQSSB2ZXJzaW9uIGtub3dzIHRoZSBleGFjdCByZXNvdXJjZSBpdFxuICogaGFuZGxlcy5cbiAqXG4gKiBDcmVhdGUgb25lIHdpdGgge0BsaW5rIGdldEt1YmVSZXNvdXJjZUtpbmR9LlxuICovXG5leHBvcnQgdHlwZSBLdWJlUmVzb3VyY2VLaW5kPFNoYXBlcyBleHRlbmRzIEt1YmVSZXNvdXJjZVNoYXBlcyA9IEt1YmVSZXNvdXJjZVNoYXBlcz4gPSBUeXBlZFNwZWNpZmllcjxcbiAgc3RyaW5nLFxuICB7IGt1YmVSZXNvdXJjZTogU2hhcGVzIH1cbj47XG5cbnR5cGUgSXNBbnk8VD4gPSAwIGV4dGVuZHMgMSAmIFQgPyB0cnVlIDogZmFsc2U7XG5cbi8qKiBUaGUgcGVyLUFQSS12ZXJzaW9uIHNoYXBlcyBhIHtAbGluayBLdWJlUmVzb3VyY2VLaW5kfSB3YXMgZGVjbGFyZWQgd2l0aDsgZXZlcnkgc2hhcGUgd2hlbiB0aGUga2luZCBpcyBlcmFzZWQgdG8gYGFueWAuICovXG5leHBvcnQgdHlwZSBLdWJlUmVzb3VyY2VTaGFwZXNPZjxUS2luZCBleHRlbmRzIEt1YmVSZXNvdXJjZUtpbmQ+ID0gSXNBbnk8VEtpbmQ+IGV4dGVuZHMgdHJ1ZVxuICA/IEt1YmVSZXNvdXJjZVNoYXBlc1xuICA6IFR5cGVkU3BlY2lmaWVyVHlwZTxcImt1YmVSZXNvdXJjZVwiLCBUS2luZD47XG5cbi8qKlxuICogQW4gQVBJIHZlcnNpb24gYSB7QGxpbmsgS3ViZVJlc291cmNlS2luZH0gaXMgZGVjbGFyZWQgZm9yOiBhXG4gKiB7QGxpbmsgS3ViZXJuZXRlc0FwaVZlcnNpb259IGFtb25nIHRoZSBrZXlzIG9mIHRoZSBraW5kJ3Mgc2hhcGVzLiBBbnl0aGluZ1xuICogZWxzZSBmYWlscyB0byBjb21waWxlIHdoZXJlIGEgdmVyc2lvbmVkIGNvbnRyYWN0IGFza3MgZm9yIG9uZS5cbiAqL1xuZXhwb3J0IHR5cGUgS3ViZVJlc291cmNlQXBpVmVyc2lvbjxUS2luZCBleHRlbmRzIEt1YmVSZXNvdXJjZUtpbmQ+ID0gS3ViZXJuZXRlc0FwaVZlcnNpb24gJlxuICBrZXlvZiBLdWJlUmVzb3VyY2VTaGFwZXNPZjxUS2luZD47XG5cbi8qKlxuICogVGhlIHJlc291cmNlIHNoYXBlIGEge0BsaW5rIEt1YmVSZXNvdXJjZUtpbmR9IHdhcyBkZWNsYXJlZCB3aXRoIGZvciBvbmUgQVBJXG4gKiB2ZXJzaW9uOyBldmVyeSBkZWNsYXJlZCB2ZXJzaW9uIGF0IG9uY2Ugd2hlbiB0aGUgdmVyc2lvbiBpcyBsZWZ0IG91dCwgYW5kXG4gKiBub3RoaW5nIGJleW9uZCB0aGUgY29tbW9uIGZpZWxkcyBmb3IgYSBraW5kIGRlY2xhcmVkIHdpdGhvdXQgc2hhcGVzLlxuICovXG5leHBvcnQgdHlwZSBLdWJlUmVzb3VyY2VUeXBlPFxuICBUS2luZCBleHRlbmRzIEt1YmVSZXNvdXJjZUtpbmQsXG4gIFRBcGlWZXJzaW9uIGV4dGVuZHMga2V5b2YgS3ViZVJlc291cmNlU2hhcGVzT2Y8VEtpbmQ+ID0ga2V5b2YgS3ViZVJlc291cmNlU2hhcGVzT2Y8VEtpbmQ+LFxuPiA9IFtTaGFwZUtleUZvcjxLdWJlUmVzb3VyY2VTaGFwZXNPZjxUS2luZD4sIFRBcGlWZXJzaW9uPl0gZXh0ZW5kcyBbbmV2ZXJdXG4gID8ge31cbiAgOiBLdWJlUmVzb3VyY2VTaGFwZXNPZjxUS2luZD5bU2hhcGVLZXlGb3I8S3ViZVJlc291cmNlU2hhcGVzT2Y8VEtpbmQ+LCBUQXBpVmVyc2lvbj5dO1xuXG4vKipcbiAqIFRoZSBrZXkgb2YgYFNoYXBlc2AgYW4gQVBJIHZlcnNpb24gc2VsZWN0cy4gQW4gQVBJIHZlcnNpb24gaXMgYSBicmFuZGVkIHN0cmluZyxcbiAqIGFuZCBpbmRleGluZyB3aXRoIGEgYnJhbmRlZCBzdHJpbmcgeWllbGRzIG5vdGhpbmcsIHNvIHRoZSBrZXkgaXMgZm91bmQgYnlcbiAqIG1hdGNoaW5nIHRoZSB2ZXJzaW9uIGFnYWluc3QgZWFjaCBrZXkgaW5zdGVhZC5cbiAqL1xudHlwZSBTaGFwZUtleUZvcjxTaGFwZXMsIFRBcGlWZXJzaW9uPiA9IHtcbiAgW0tleSBpbiBrZXlvZiBTaGFwZXNdOiBUQXBpVmVyc2lvbiBleHRlbmRzIEtleSA/IEtleSA6IG5ldmVyO1xufVtrZXlvZiBTaGFwZXNdO1xuXG4vKipcbiAqIFdoYXQgZXZlcnkgc2VydmVkIHJlc291cmNlIGNhcnJpZXMsIHdoYXRldmVyIGl0cyBraW5kOiB0aGUgaWRlbnRpdHkgTGVucyBrZXlzXG4gKiByZXNvdXJjZXMgYnkuIEludGVyc2VjdGVkIHdpdGggYSBraW5kJ3Mgc2hhcGUsIHNvIGEgc2hhcGUgdGhhdCBsZWF2ZXMgdGhlc2VcbiAqIG9wdGlvbmFsIChzY2hlbWEtZGVyaXZlZCBzaGFwZXMgZG8pIHN0aWxsIHByb21pc2VzIHRoZW0gb25jZSBzZXJ2ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS3ViZVJlc291cmNlQmFzZSB7XG4gIGtpbmQ6IHN0cmluZztcbiAgYXBpVmVyc2lvbjogc3RyaW5nO1xuXG4gIG1ldGFkYXRhOiB7XG4gICAgdWlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNlbGZMaW5rOiBzdHJpbmc7XG4gIH07XG59XG5cbi8qKlxuICogQSByZXNvdXJjZSBvZiBhIHtAbGluayBLdWJlUmVzb3VyY2VLaW5kfSBpbiBvbmUgQVBJIHZlcnNpb24sIGFzIExlbnMgc2VydmVzXG4gKiBpdDogdGhlIHNoYXBlIHRoZSBraW5kIHdhcyBkZWNsYXJlZCB3aXRoIGZvciB0aGF0IHZlcnNpb24sIHdpdGggdGhlIGZpZWxkc1xuICogZXZlcnkgc2VydmVkIHJlc291cmNlIGhhcyBndWFyYW50ZWVkLlxuICovXG5leHBvcnQgdHlwZSBLdWJlUmVzb3VyY2U8XG4gIFRLaW5kIGV4dGVuZHMgS3ViZVJlc291cmNlS2luZCA9IEt1YmVSZXNvdXJjZUtpbmQsXG4gIFRBcGlWZXJzaW9uIGV4dGVuZHMga2V5b2YgS3ViZVJlc291cmNlU2hhcGVzT2Y8VEtpbmQ+ID0ga2V5b2YgS3ViZVJlc291cmNlU2hhcGVzT2Y8VEtpbmQ+LFxuPiA9IEt1YmVSZXNvdXJjZVR5cGU8VEtpbmQsIFRBcGlWZXJzaW9uPiAmIEt1YmVSZXNvdXJjZUJhc2U7XG5cbi8qKlxuICogRGVjbGFyZXMgYSBLdWJlcm5ldGVzIHJlc291cmNlIGtpbmQuIFRoZSB0eXBlIHBhcmFtZXRlciBtYXBzIGVhY2ggQVBJIHZlcnNpb25cbiAqIHRoZSBraW5kIGlzIHNlcnZlZCBpbiB0byB0aGUgc2hhcGUgb2YgaXRzIHJlc291cmNlcyBpbiB0aGF0IHZlcnNpb247IHRoZVxuICogYXJndW1lbnQgaXMgdGhlIEt1YmVybmV0ZXMgYGtpbmRgIHZlcmJhdGltLCBhcyBpdCBhcHBlYXJzIGluIHRoZSBga2luZGAgZmllbGRcbiAqIG9mIGV2ZXJ5IHN1Y2ggcmVzb3VyY2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBleHBvcnQgY29uc3QgYmFja3VwS2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICogICBcImJhY2t1cHMuZXhhbXBsZS5jb20vdjFcIjoge1xuICogICAgIGtpbmQ6IFwiQmFja3VwXCI7XG4gKiAgICAgbWV0YWRhdGE6IHsgbmFtZTogc3RyaW5nOyBuYW1lc3BhY2U6IHN0cmluZyB9O1xuICogICAgIHNwZWM6IHsgc2NoZWR1bGU6IHN0cmluZzsgcmV0ZW50aW9uRGF5czogbnVtYmVyIH07XG4gKiAgICAgc3RhdHVzPzogeyBsYXN0UnVuPzogc3RyaW5nIH07XG4gKiAgIH07XG4gKiB9PihcIkJhY2t1cFwiKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgZ2V0S3ViZVJlc291cmNlS2luZCA9IDxTaGFwZXMgZXh0ZW5kcyBLdWJlUmVzb3VyY2VTaGFwZXMgPSBLdWJlUmVzb3VyY2VTaGFwZXM+KGtpbmQ6IHN0cmluZykgPT5cbiAgZ2V0VHlwZWRTcGVjaWZpZXI8eyBrdWJlUmVzb3VyY2U6IFNoYXBlcyB9PigpKGtpbmQpO1xuIiwgIi8qKlxuICogVGhlIGtpbmRzIExlbnMgaXRzZWxmIGtub3dzLCBkZWNsYXJlZCBmb3IgZXh0ZW5zaW9uczogZWFjaCByZXNvdXJjZSB0eXBlIGFzIHRoZSBBUElcbiAqIHNlcnZlcyBpdCwgd2l0aCB0aGUgZmllbGRzIGEgc2VydmVkIHJlc291cmNlIGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQsIGFuZCB0aGVcbiAqIHR5cGVkIGtpbmQgdG8gaGFuZCB0byBhbnkgY29udHJhY3Qga2V5ZWQgYnkga2luZC5cbiAqXG4gKiBHRU5FUkFURUQgYnkgcGFja2FnZXMvdGVjaG5pY2FsLWZlYXR1cmVzL19rdWJlL2t1YmVybmV0ZXMtY29udHJhY3RzL2dlbmVyYXRvci4gRE8gTk9UIEVESVQuXG4gKiBSZWdlbmVyYXRlIHdpdGggYG5wbSBydW4gZ2VuZXJhdGUgLS13b3Jrc3BhY2UgQGs4c2xlbnMva3ViZXJuZXRlcy1jb250cmFjdHNgLlxuICpcbiAqIERlcml2ZWQgZnJvbSBAa3ViZXJuZXRlcy9jbGllbnQtbm9kZSAyLjAuMCAoQXBhY2hlLTIuMCksIGl0c2VsZiBnZW5lcmF0ZWQgZnJvbSB0aGVcbiAqIEt1YmVybmV0ZXMgT3BlbkFQSSBzcGVjaWZpY2F0aW9uLCByZWxlYXNlLTEuMzYgKEFwYWNoZS0yLjApLlxuICovXG5cbmltcG9ydCB7IGdldEt1YmVSZXNvdXJjZUtpbmQgfSBmcm9tIFwiLi4va3ViZS1yZXNvdXJjZS1raW5kXCI7XG5cbmltcG9ydCB0eXBlIHtcbiAgVjFDbHVzdGVyUm9sZSxcbiAgVjFDbHVzdGVyUm9sZUJpbmRpbmcsXG4gIFYxQ29uZmlnTWFwLFxuICBWMUNyb25Kb2IsXG4gIFYxQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uLFxuICBWMURhZW1vblNldCxcbiAgVjFEZXBsb3ltZW50LFxuICBWMUVuZHBvaW50U2xpY2UsXG4gIFYxRW5kcG9pbnRzLFxuICBWMUhvcml6b250YWxQb2RBdXRvc2NhbGVyLFxuICBWMUluZ3Jlc3MsXG4gIFYxSW5ncmVzc0NsYXNzLFxuICBWMUpvYixcbiAgVjFMZWFzZSxcbiAgVjFMaW1pdFJhbmdlLFxuICBWMU11dGF0aW5nV2ViaG9va0NvbmZpZ3VyYXRpb24sXG4gIFYxTmFtZXNwYWNlLFxuICBWMU5ldHdvcmtQb2xpY3ksXG4gIFYxTm9kZSxcbiAgVjFPYmplY3RNZXRhLFxuICBWMVBlcnNpc3RlbnRWb2x1bWUsXG4gIFYxUGVyc2lzdGVudFZvbHVtZUNsYWltLFxuICBWMVBvZCxcbiAgVjFQb2REaXNydXB0aW9uQnVkZ2V0LFxuICBWMVByaW9yaXR5Q2xhc3MsXG4gIFYxUmVwbGljYVNldCxcbiAgVjFSZXBsaWNhdGlvbkNvbnRyb2xsZXIsXG4gIFYxUmVzb3VyY2VRdW90YSxcbiAgVjFSb2xlLFxuICBWMVJvbGVCaW5kaW5nLFxuICBWMVJ1bnRpbWVDbGFzcyxcbiAgVjFTZWNyZXQsXG4gIFYxU2VydmljZSxcbiAgVjFTZXJ2aWNlQWNjb3VudCxcbiAgVjFTdGF0ZWZ1bFNldCxcbiAgVjFTdG9yYWdlQ2xhc3MsXG4gIFYxVmFsaWRhdGluZ1dlYmhvb2tDb25maWd1cmF0aW9uLFxuICBWMkhvcml6b250YWxQb2RBdXRvc2NhbGVyLFxufSBmcm9tIFwiLi9rdWJlcm5ldGVzLXR5cGVzXCI7XG5cbi8qKlxuICogVGhlIG1ldGFkYXRhIG9mIGEgbmFtZXNwYWNlZCByZXNvdXJjZSBhcyB0aGUgQVBJIHNlcnZlcyBpdDogdGhlIHNjaGVtYSBsZWF2ZXNcbiAqIGV2ZXJ5IGZpZWxkIG9wdGlvbmFsIGJlY2F1c2UgdGhlIHNhbWUgdHlwZSBhbHNvIGRlc2NyaWJlcyB3aGF0IGEgY2xpZW50IHNlbmRzLFxuICogYnV0IGEgc2VydmVkIHJlc291cmNlIGFsd2F5cyBjYXJyaWVzIHRoZXNlLlxuICovXG5leHBvcnQgdHlwZSBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YSA9IFYxT2JqZWN0TWV0YSAmIHtcbiAgbmFtZTogc3RyaW5nO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgdWlkOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFRoZSBtZXRhZGF0YSBvZiBhIGNsdXN0ZXItc2NvcGVkIHJlc291cmNlIGFzIHRoZSBBUEkgc2VydmVzIGl0OiB0aGUgc2NoZW1hIGxlYXZlc1xuICogZXZlcnkgZmllbGQgb3B0aW9uYWwgYmVjYXVzZSB0aGUgc2FtZSB0eXBlIGFsc28gZGVzY3JpYmVzIHdoYXQgYSBjbGllbnQgc2VuZHMsXG4gKiBidXQgYSBzZXJ2ZWQgcmVzb3VyY2UgYWx3YXlzIGNhcnJpZXMgdGhlc2UuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZlZENsdXN0ZXJTY29wZWRPYmplY3RNZXRhID0gVjFPYmplY3RNZXRhICYge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVpZDogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBBIENsdXN0ZXJSb2xlIGFzIGByYmFjLmF1dGhvcml6YXRpb24uazhzLmlvL3YxYCBzZXJ2ZXMgaXQ6IHRoZSBLdWJlcm5ldGVzIEFQSSBzY2hlbWEgb2YgdGhlIGtpbmQsIHdpdGggdGhlXG4gKiBmaWVsZHMgYSBzZXJ2ZWQgQ2x1c3RlclJvbGUgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2x1c3RlclJvbGVWMSA9IE9taXQ8VjFDbHVzdGVyUm9sZSwgXCJraW5kXCIgfCBcImFwaVZlcnNpb25cIiB8IFwibWV0YWRhdGFcIj4gJiB7XG4gIGtpbmQ6IFwiQ2x1c3RlclJvbGVcIjtcbiAgYXBpVmVyc2lvbjogXCJyYmFjLmF1dGhvcml6YXRpb24uazhzLmlvL3YxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWRDbHVzdGVyU2NvcGVkT2JqZWN0TWV0YTtcbn07XG5cbi8qKlxuICogVGhlIENsdXN0ZXJSb2xlIGtpbmQsIGRlY2xhcmVkIGZvciBgcmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IGNsdXN0ZXJSb2xlS2luZCwgYXBpVmVyc2lvbjogcmJhY0F1dGhvcml6YXRpb25WMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNsdXN0ZXJSb2xlS2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICBcInJiYWMuYXV0aG9yaXphdGlvbi5rOHMuaW8vdjFcIjogQ2x1c3RlclJvbGVWMTtcbn0+KFwiQ2x1c3RlclJvbGVcIik7XG5cbi8qKlxuICogQSBDbHVzdGVyUm9sZUJpbmRpbmcgYXMgYHJiYWMuYXV0aG9yaXphdGlvbi5rOHMuaW8vdjFgIHNlcnZlcyBpdDogdGhlIEt1YmVybmV0ZXMgQVBJIHNjaGVtYSBvZiB0aGUga2luZCwgd2l0aCB0aGVcbiAqIGZpZWxkcyBhIHNlcnZlZCBDbHVzdGVyUm9sZUJpbmRpbmcgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2x1c3RlclJvbGVCaW5kaW5nVjEgPSBPbWl0PFYxQ2x1c3RlclJvbGVCaW5kaW5nLCBcImtpbmRcIiB8IFwiYXBpVmVyc2lvblwiIHwgXCJtZXRhZGF0YVwiPiAmIHtcbiAga2luZDogXCJDbHVzdGVyUm9sZUJpbmRpbmdcIjtcbiAgYXBpVmVyc2lvbjogXCJyYmFjLmF1dGhvcml6YXRpb24uazhzLmlvL3YxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWRDbHVzdGVyU2NvcGVkT2JqZWN0TWV0YTtcbn07XG5cbi8qKlxuICogVGhlIENsdXN0ZXJSb2xlQmluZGluZyBraW5kLCBkZWNsYXJlZCBmb3IgYHJiYWMuYXV0aG9yaXphdGlvbi5rOHMuaW8vdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBjbHVzdGVyUm9sZUJpbmRpbmdLaW5kLCBhcGlWZXJzaW9uOiByYmFjQXV0aG9yaXphdGlvblYxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3QgY2x1c3RlclJvbGVCaW5kaW5nS2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICBcInJiYWMuYXV0aG9yaXphdGlvbi5rOHMuaW8vdjFcIjogQ2x1c3RlclJvbGVCaW5kaW5nVjE7XG59PihcIkNsdXN0ZXJSb2xlQmluZGluZ1wiKTtcblxuLyoqXG4gKiBBIENvbmZpZ01hcCBhcyBgdjFgIHNlcnZlcyBpdDogdGhlIEt1YmVybmV0ZXMgQVBJIHNjaGVtYSBvZiB0aGUga2luZCwgd2l0aCB0aGVcbiAqIGZpZWxkcyBhIHNlcnZlZCBDb25maWdNYXAgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29uZmlnTWFwVjEgPSBPbWl0PFYxQ29uZmlnTWFwLCBcImtpbmRcIiB8IFwiYXBpVmVyc2lvblwiIHwgXCJtZXRhZGF0YVwiPiAmIHtcbiAga2luZDogXCJDb25maWdNYXBcIjtcbiAgYXBpVmVyc2lvbjogXCJ2MVwiO1xuICBtZXRhZGF0YTogU2VydmVkTmFtZXNwYWNlZE9iamVjdE1ldGE7XG59O1xuXG4vKipcbiAqIFRoZSBDb25maWdNYXAga2luZCwgZGVjbGFyZWQgZm9yIGB2MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IGNvbmZpZ01hcEtpbmQsIGFwaVZlcnNpb246IGNvcmVWMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbmZpZ01hcEtpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgdjE6IENvbmZpZ01hcFYxO1xufT4oXCJDb25maWdNYXBcIik7XG5cbi8qKlxuICogQSBDcm9uSm9iIGFzIGBiYXRjaC92MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIENyb25Kb2IgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ3JvbkpvYlYxID0gT21pdDxWMUNyb25Kb2IsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiQ3JvbkpvYlwiO1xuICBhcGlWZXJzaW9uOiBcImJhdGNoL3YxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YTtcbiAgc3BlYzogTm9uTnVsbGFibGU8VjFDcm9uSm9iW1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBDcm9uSm9iIGtpbmQsIGRlY2xhcmVkIGZvciBgYmF0Y2gvdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBjcm9uSm9iS2luZCwgYXBpVmVyc2lvbjogYmF0Y2hWMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyb25Kb2JLaW5kID0gZ2V0S3ViZVJlc291cmNlS2luZDx7XG4gIFwiYmF0Y2gvdjFcIjogQ3JvbkpvYlYxO1xufT4oXCJDcm9uSm9iXCIpO1xuXG4vKipcbiAqIEEgQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIGFzIGBhcGlleHRlbnNpb25zLms4cy5pby92MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIEN1c3RvbVJlc291cmNlRGVmaW5pdGlvbiBhbHdheXMgY2FycmllcyBtYWRlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBDdXN0b21SZXNvdXJjZURlZmluaXRpb25WMSA9IE9taXQ8XG4gIFYxQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uLFxuICBcImtpbmRcIiB8IFwiYXBpVmVyc2lvblwiIHwgXCJtZXRhZGF0YVwiIHwgXCJzcGVjXCJcbj4gJiB7XG4gIGtpbmQ6IFwiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uXCI7XG4gIGFwaVZlcnNpb246IFwiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZENsdXN0ZXJTY29wZWRPYmplY3RNZXRhO1xuICBzcGVjOiBOb25OdWxsYWJsZTxWMUN1c3RvbVJlc291cmNlRGVmaW5pdGlvbltcInNwZWNcIl0+O1xufTtcblxuLyoqXG4gKiBUaGUgQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIGtpbmQsIGRlY2xhcmVkIGZvciBgYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBjdXN0b21SZXNvdXJjZURlZmluaXRpb25LaW5kLCBhcGlWZXJzaW9uOiBhcGlleHRlbnNpb25zVjEsIC4uLiB9KWAuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21SZXNvdXJjZURlZmluaXRpb25LaW5kID0gZ2V0S3ViZVJlc291cmNlS2luZDx7XG4gIFwiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjFcIjogQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uVjE7XG59PihcIkN1c3RvbVJlc291cmNlRGVmaW5pdGlvblwiKTtcblxuLyoqXG4gKiBBIERhZW1vblNldCBhcyBgYXBwcy92MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIERhZW1vblNldCBhbHdheXMgY2FycmllcyBtYWRlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBEYWVtb25TZXRWMSA9IE9taXQ8VjFEYWVtb25TZXQsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiRGFlbW9uU2V0XCI7XG4gIGFwaVZlcnNpb246IFwiYXBwcy92MVwiO1xuICBtZXRhZGF0YTogU2VydmVkTmFtZXNwYWNlZE9iamVjdE1ldGE7XG4gIHNwZWM6IE5vbk51bGxhYmxlPFYxRGFlbW9uU2V0W1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBEYWVtb25TZXQga2luZCwgZGVjbGFyZWQgZm9yIGBhcHBzL3YxYC4gSGFuZCBpdCB0byBhbnkgY29udHJhY3Qga2V5ZWQgYnlcbiAqIGtpbmQsIGUuZy4gYGJ1aWxkRGV0YWlsc1BhbmVsU2VjdGlvbkJ1bmNoKHsga2luZDogZGFlbW9uU2V0S2luZCwgYXBpVmVyc2lvbjogYXBwc1YxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3QgZGFlbW9uU2V0S2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICBcImFwcHMvdjFcIjogRGFlbW9uU2V0VjE7XG59PihcIkRhZW1vblNldFwiKTtcblxuLyoqXG4gKiBBIERlcGxveW1lbnQgYXMgYGFwcHMvdjFgIHNlcnZlcyBpdDogdGhlIEt1YmVybmV0ZXMgQVBJIHNjaGVtYSBvZiB0aGUga2luZCwgd2l0aCB0aGVcbiAqIGZpZWxkcyBhIHNlcnZlZCBEZXBsb3ltZW50IGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERlcGxveW1lbnRWMSA9IE9taXQ8VjFEZXBsb3ltZW50LCBcImtpbmRcIiB8IFwiYXBpVmVyc2lvblwiIHwgXCJtZXRhZGF0YVwiIHwgXCJzcGVjXCI+ICYge1xuICBraW5kOiBcIkRlcGxveW1lbnRcIjtcbiAgYXBpVmVyc2lvbjogXCJhcHBzL3YxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YTtcbiAgc3BlYzogTm9uTnVsbGFibGU8VjFEZXBsb3ltZW50W1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBEZXBsb3ltZW50IGtpbmQsIGRlY2xhcmVkIGZvciBgYXBwcy92MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IGRlcGxveW1lbnRLaW5kLCBhcGlWZXJzaW9uOiBhcHBzVjEsIC4uLiB9KWAuXG4gKi9cbmV4cG9ydCBjb25zdCBkZXBsb3ltZW50S2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICBcImFwcHMvdjFcIjogRGVwbG95bWVudFYxO1xufT4oXCJEZXBsb3ltZW50XCIpO1xuXG4vKipcbiAqIEEgRW5kcG9pbnRzIGFzIGB2MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIEVuZHBvaW50cyBhbHdheXMgY2FycmllcyBtYWRlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBFbmRwb2ludHNWMSA9IE9taXQ8VjFFbmRwb2ludHMsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCI+ICYge1xuICBraW5kOiBcIkVuZHBvaW50c1wiO1xuICBhcGlWZXJzaW9uOiBcInYxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YTtcbn07XG5cbi8qKlxuICogVGhlIEVuZHBvaW50cyBraW5kLCBkZWNsYXJlZCBmb3IgYHYxYC4gSGFuZCBpdCB0byBhbnkgY29udHJhY3Qga2V5ZWQgYnlcbiAqIGtpbmQsIGUuZy4gYGJ1aWxkRGV0YWlsc1BhbmVsU2VjdGlvbkJ1bmNoKHsga2luZDogZW5kcG9pbnRzS2luZCwgYXBpVmVyc2lvbjogY29yZVYxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3QgZW5kcG9pbnRzS2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICB2MTogRW5kcG9pbnRzVjE7XG59PihcIkVuZHBvaW50c1wiKTtcblxuLyoqXG4gKiBBIEVuZHBvaW50U2xpY2UgYXMgYGRpc2NvdmVyeS5rOHMuaW8vdjFgIHNlcnZlcyBpdDogdGhlIEt1YmVybmV0ZXMgQVBJIHNjaGVtYSBvZiB0aGUga2luZCwgd2l0aCB0aGVcbiAqIGZpZWxkcyBhIHNlcnZlZCBFbmRwb2ludFNsaWNlIGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIEVuZHBvaW50U2xpY2VWMSA9IE9taXQ8VjFFbmRwb2ludFNsaWNlLCBcImtpbmRcIiB8IFwiYXBpVmVyc2lvblwiIHwgXCJtZXRhZGF0YVwiPiAmIHtcbiAga2luZDogXCJFbmRwb2ludFNsaWNlXCI7XG4gIGFwaVZlcnNpb246IFwiZGlzY292ZXJ5Lms4cy5pby92MVwiO1xuICBtZXRhZGF0YTogU2VydmVkTmFtZXNwYWNlZE9iamVjdE1ldGE7XG59O1xuXG4vKipcbiAqIFRoZSBFbmRwb2ludFNsaWNlIGtpbmQsIGRlY2xhcmVkIGZvciBgZGlzY292ZXJ5Lms4cy5pby92MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IGVuZHBvaW50U2xpY2VLaW5kLCBhcGlWZXJzaW9uOiBkaXNjb3ZlcnlWMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVuZHBvaW50U2xpY2VLaW5kID0gZ2V0S3ViZVJlc291cmNlS2luZDx7XG4gIFwiZGlzY292ZXJ5Lms4cy5pby92MVwiOiBFbmRwb2ludFNsaWNlVjE7XG59PihcIkVuZHBvaW50U2xpY2VcIik7XG5cbi8qKlxuICogQSBIb3Jpem9udGFsUG9kQXV0b3NjYWxlciBhcyBgYXV0b3NjYWxpbmcvdjFgIHNlcnZlcyBpdDogdGhlIEt1YmVybmV0ZXMgQVBJIHNjaGVtYSBvZiB0aGUga2luZCwgd2l0aCB0aGVcbiAqIGZpZWxkcyBhIHNlcnZlZCBIb3Jpem9udGFsUG9kQXV0b3NjYWxlciBhbHdheXMgY2FycmllcyBtYWRlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBIb3Jpem9udGFsUG9kQXV0b3NjYWxlclYxID0gT21pdDxWMUhvcml6b250YWxQb2RBdXRvc2NhbGVyLCBcImtpbmRcIiB8IFwiYXBpVmVyc2lvblwiIHwgXCJtZXRhZGF0YVwiIHwgXCJzcGVjXCI+ICYge1xuICBraW5kOiBcIkhvcml6b250YWxQb2RBdXRvc2NhbGVyXCI7XG4gIGFwaVZlcnNpb246IFwiYXV0b3NjYWxpbmcvdjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZE5hbWVzcGFjZWRPYmplY3RNZXRhO1xuICBzcGVjOiBOb25OdWxsYWJsZTxWMUhvcml6b250YWxQb2RBdXRvc2NhbGVyW1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIEEgSG9yaXpvbnRhbFBvZEF1dG9zY2FsZXIgYXMgYGF1dG9zY2FsaW5nL3YyYCBzZXJ2ZXMgaXQ6IHRoZSBLdWJlcm5ldGVzIEFQSSBzY2hlbWEgb2YgdGhlIGtpbmQsIHdpdGggdGhlXG4gKiBmaWVsZHMgYSBzZXJ2ZWQgSG9yaXpvbnRhbFBvZEF1dG9zY2FsZXIgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgSG9yaXpvbnRhbFBvZEF1dG9zY2FsZXJWMiA9IE9taXQ8VjJIb3Jpem9udGFsUG9kQXV0b3NjYWxlciwgXCJraW5kXCIgfCBcImFwaVZlcnNpb25cIiB8IFwibWV0YWRhdGFcIiB8IFwic3BlY1wiPiAmIHtcbiAga2luZDogXCJIb3Jpem9udGFsUG9kQXV0b3NjYWxlclwiO1xuICBhcGlWZXJzaW9uOiBcImF1dG9zY2FsaW5nL3YyXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YTtcbiAgc3BlYzogTm9uTnVsbGFibGU8VjJIb3Jpem9udGFsUG9kQXV0b3NjYWxlcltcInNwZWNcIl0+O1xufTtcblxuLyoqXG4gKiBUaGUgSG9yaXpvbnRhbFBvZEF1dG9zY2FsZXIga2luZCwgZGVjbGFyZWQgZm9yIGBhdXRvc2NhbGluZy92MWAsIGBhdXRvc2NhbGluZy92MmAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IGhvcml6b250YWxQb2RBdXRvc2NhbGVyS2luZCwgYXBpVmVyc2lvbjogYXV0b3NjYWxpbmdWMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGhvcml6b250YWxQb2RBdXRvc2NhbGVyS2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICBcImF1dG9zY2FsaW5nL3YxXCI6IEhvcml6b250YWxQb2RBdXRvc2NhbGVyVjE7XG4gIFwiYXV0b3NjYWxpbmcvdjJcIjogSG9yaXpvbnRhbFBvZEF1dG9zY2FsZXJWMjtcbn0+KFwiSG9yaXpvbnRhbFBvZEF1dG9zY2FsZXJcIik7XG5cbi8qKlxuICogQSBJbmdyZXNzIGFzIGBuZXR3b3JraW5nLms4cy5pby92MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIEluZ3Jlc3MgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgSW5ncmVzc1YxID0gT21pdDxWMUluZ3Jlc3MsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiSW5ncmVzc1wiO1xuICBhcGlWZXJzaW9uOiBcIm5ldHdvcmtpbmcuazhzLmlvL3YxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YTtcbiAgc3BlYzogTm9uTnVsbGFibGU8VjFJbmdyZXNzW1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBJbmdyZXNzIGtpbmQsIGRlY2xhcmVkIGZvciBgbmV0d29ya2luZy5rOHMuaW8vdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBpbmdyZXNzS2luZCwgYXBpVmVyc2lvbjogbmV0d29ya2luZ1YxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3QgaW5ncmVzc0tpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgXCJuZXR3b3JraW5nLms4cy5pby92MVwiOiBJbmdyZXNzVjE7XG59PihcIkluZ3Jlc3NcIik7XG5cbi8qKlxuICogQSBJbmdyZXNzQ2xhc3MgYXMgYG5ldHdvcmtpbmcuazhzLmlvL3YxYCBzZXJ2ZXMgaXQ6IHRoZSBLdWJlcm5ldGVzIEFQSSBzY2hlbWEgb2YgdGhlIGtpbmQsIHdpdGggdGhlXG4gKiBmaWVsZHMgYSBzZXJ2ZWQgSW5ncmVzc0NsYXNzIGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIEluZ3Jlc3NDbGFzc1YxID0gT21pdDxWMUluZ3Jlc3NDbGFzcywgXCJraW5kXCIgfCBcImFwaVZlcnNpb25cIiB8IFwibWV0YWRhdGFcIiB8IFwic3BlY1wiPiAmIHtcbiAga2luZDogXCJJbmdyZXNzQ2xhc3NcIjtcbiAgYXBpVmVyc2lvbjogXCJuZXR3b3JraW5nLms4cy5pby92MVwiO1xuICBtZXRhZGF0YTogU2VydmVkQ2x1c3RlclNjb3BlZE9iamVjdE1ldGE7XG4gIHNwZWM6IE5vbk51bGxhYmxlPFYxSW5ncmVzc0NsYXNzW1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBJbmdyZXNzQ2xhc3Mga2luZCwgZGVjbGFyZWQgZm9yIGBuZXR3b3JraW5nLms4cy5pby92MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IGluZ3Jlc3NDbGFzc0tpbmQsIGFwaVZlcnNpb246IG5ldHdvcmtpbmdWMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGluZ3Jlc3NDbGFzc0tpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgXCJuZXR3b3JraW5nLms4cy5pby92MVwiOiBJbmdyZXNzQ2xhc3NWMTtcbn0+KFwiSW5ncmVzc0NsYXNzXCIpO1xuXG4vKipcbiAqIEEgSm9iIGFzIGBiYXRjaC92MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIEpvYiBhbHdheXMgY2FycmllcyBtYWRlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBKb2JWMSA9IE9taXQ8VjFKb2IsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiSm9iXCI7XG4gIGFwaVZlcnNpb246IFwiYmF0Y2gvdjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZE5hbWVzcGFjZWRPYmplY3RNZXRhO1xuICBzcGVjOiBOb25OdWxsYWJsZTxWMUpvYltcInNwZWNcIl0+O1xufTtcblxuLyoqXG4gKiBUaGUgSm9iIGtpbmQsIGRlY2xhcmVkIGZvciBgYmF0Y2gvdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBqb2JLaW5kLCBhcGlWZXJzaW9uOiBiYXRjaFYxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3Qgam9iS2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICBcImJhdGNoL3YxXCI6IEpvYlYxO1xufT4oXCJKb2JcIik7XG5cbi8qKlxuICogQSBMZWFzZSBhcyBgY29vcmRpbmF0aW9uLms4cy5pby92MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIExlYXNlIGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIExlYXNlVjEgPSBPbWl0PFYxTGVhc2UsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiTGVhc2VcIjtcbiAgYXBpVmVyc2lvbjogXCJjb29yZGluYXRpb24uazhzLmlvL3YxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YTtcbiAgc3BlYzogTm9uTnVsbGFibGU8VjFMZWFzZVtcInNwZWNcIl0+O1xufTtcblxuLyoqXG4gKiBUaGUgTGVhc2Uga2luZCwgZGVjbGFyZWQgZm9yIGBjb29yZGluYXRpb24uazhzLmlvL3YxYC4gSGFuZCBpdCB0byBhbnkgY29udHJhY3Qga2V5ZWQgYnlcbiAqIGtpbmQsIGUuZy4gYGJ1aWxkRGV0YWlsc1BhbmVsU2VjdGlvbkJ1bmNoKHsga2luZDogbGVhc2VLaW5kLCBhcGlWZXJzaW9uOiBjb29yZGluYXRpb25WMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGxlYXNlS2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICBcImNvb3JkaW5hdGlvbi5rOHMuaW8vdjFcIjogTGVhc2VWMTtcbn0+KFwiTGVhc2VcIik7XG5cbi8qKlxuICogQSBMaW1pdFJhbmdlIGFzIGB2MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIExpbWl0UmFuZ2UgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgTGltaXRSYW5nZVYxID0gT21pdDxWMUxpbWl0UmFuZ2UsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiTGltaXRSYW5nZVwiO1xuICBhcGlWZXJzaW9uOiBcInYxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YTtcbiAgc3BlYzogTm9uTnVsbGFibGU8VjFMaW1pdFJhbmdlW1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBMaW1pdFJhbmdlIGtpbmQsIGRlY2xhcmVkIGZvciBgdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBsaW1pdFJhbmdlS2luZCwgYXBpVmVyc2lvbjogY29yZVYxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3QgbGltaXRSYW5nZUtpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgdjE6IExpbWl0UmFuZ2VWMTtcbn0+KFwiTGltaXRSYW5nZVwiKTtcblxuLyoqXG4gKiBBIE11dGF0aW5nV2ViaG9va0NvbmZpZ3VyYXRpb24gYXMgYGFkbWlzc2lvbnJlZ2lzdHJhdGlvbi5rOHMuaW8vdjFgIHNlcnZlcyBpdDogdGhlIEt1YmVybmV0ZXMgQVBJIHNjaGVtYSBvZiB0aGUga2luZCwgd2l0aCB0aGVcbiAqIGZpZWxkcyBhIHNlcnZlZCBNdXRhdGluZ1dlYmhvb2tDb25maWd1cmF0aW9uIGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE11dGF0aW5nV2ViaG9va0NvbmZpZ3VyYXRpb25WMSA9IE9taXQ8XG4gIFYxTXV0YXRpbmdXZWJob29rQ29uZmlndXJhdGlvbixcbiAgXCJraW5kXCIgfCBcImFwaVZlcnNpb25cIiB8IFwibWV0YWRhdGFcIlxuPiAmIHtcbiAga2luZDogXCJNdXRhdGluZ1dlYmhvb2tDb25maWd1cmF0aW9uXCI7XG4gIGFwaVZlcnNpb246IFwiYWRtaXNzaW9ucmVnaXN0cmF0aW9uLms4cy5pby92MVwiO1xuICBtZXRhZGF0YTogU2VydmVkQ2x1c3RlclNjb3BlZE9iamVjdE1ldGE7XG59O1xuXG4vKipcbiAqIFRoZSBNdXRhdGluZ1dlYmhvb2tDb25maWd1cmF0aW9uIGtpbmQsIGRlY2xhcmVkIGZvciBgYWRtaXNzaW9ucmVnaXN0cmF0aW9uLms4cy5pby92MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IG11dGF0aW5nV2ViaG9va0NvbmZpZ3VyYXRpb25LaW5kLCBhcGlWZXJzaW9uOiBhZG1pc3Npb25yZWdpc3RyYXRpb25WMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0aW5nV2ViaG9va0NvbmZpZ3VyYXRpb25LaW5kID0gZ2V0S3ViZVJlc291cmNlS2luZDx7XG4gIFwiYWRtaXNzaW9ucmVnaXN0cmF0aW9uLms4cy5pby92MVwiOiBNdXRhdGluZ1dlYmhvb2tDb25maWd1cmF0aW9uVjE7XG59PihcIk11dGF0aW5nV2ViaG9va0NvbmZpZ3VyYXRpb25cIik7XG5cbi8qKlxuICogQSBOYW1lc3BhY2UgYXMgYHYxYCBzZXJ2ZXMgaXQ6IHRoZSBLdWJlcm5ldGVzIEFQSSBzY2hlbWEgb2YgdGhlIGtpbmQsIHdpdGggdGhlXG4gKiBmaWVsZHMgYSBzZXJ2ZWQgTmFtZXNwYWNlIGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE5hbWVzcGFjZVYxID0gT21pdDxWMU5hbWVzcGFjZSwgXCJraW5kXCIgfCBcImFwaVZlcnNpb25cIiB8IFwibWV0YWRhdGFcIiB8IFwic3BlY1wiPiAmIHtcbiAga2luZDogXCJOYW1lc3BhY2VcIjtcbiAgYXBpVmVyc2lvbjogXCJ2MVwiO1xuICBtZXRhZGF0YTogU2VydmVkQ2x1c3RlclNjb3BlZE9iamVjdE1ldGE7XG4gIHNwZWM6IE5vbk51bGxhYmxlPFYxTmFtZXNwYWNlW1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBOYW1lc3BhY2Uga2luZCwgZGVjbGFyZWQgZm9yIGB2MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IG5hbWVzcGFjZUtpbmQsIGFwaVZlcnNpb246IGNvcmVWMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IG5hbWVzcGFjZUtpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgdjE6IE5hbWVzcGFjZVYxO1xufT4oXCJOYW1lc3BhY2VcIik7XG5cbi8qKlxuICogQSBOZXR3b3JrUG9saWN5IGFzIGBuZXR3b3JraW5nLms4cy5pby92MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIE5ldHdvcmtQb2xpY3kgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgTmV0d29ya1BvbGljeVYxID0gT21pdDxWMU5ldHdvcmtQb2xpY3ksIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiTmV0d29ya1BvbGljeVwiO1xuICBhcGlWZXJzaW9uOiBcIm5ldHdvcmtpbmcuazhzLmlvL3YxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YTtcbiAgc3BlYzogTm9uTnVsbGFibGU8VjFOZXR3b3JrUG9saWN5W1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBOZXR3b3JrUG9saWN5IGtpbmQsIGRlY2xhcmVkIGZvciBgbmV0d29ya2luZy5rOHMuaW8vdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBuZXR3b3JrUG9saWN5S2luZCwgYXBpVmVyc2lvbjogbmV0d29ya2luZ1YxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3QgbmV0d29ya1BvbGljeUtpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgXCJuZXR3b3JraW5nLms4cy5pby92MVwiOiBOZXR3b3JrUG9saWN5VjE7XG59PihcIk5ldHdvcmtQb2xpY3lcIik7XG5cbi8qKlxuICogQSBOb2RlIGFzIGB2MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIE5vZGUgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgTm9kZVYxID0gT21pdDxWMU5vZGUsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiTm9kZVwiO1xuICBhcGlWZXJzaW9uOiBcInYxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWRDbHVzdGVyU2NvcGVkT2JqZWN0TWV0YTtcbiAgc3BlYzogTm9uTnVsbGFibGU8VjFOb2RlW1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBOb2RlIGtpbmQsIGRlY2xhcmVkIGZvciBgdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBub2RlS2luZCwgYXBpVmVyc2lvbjogY29yZVYxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3Qgbm9kZUtpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgdjE6IE5vZGVWMTtcbn0+KFwiTm9kZVwiKTtcblxuLyoqXG4gKiBBIFBlcnNpc3RlbnRWb2x1bWUgYXMgYHYxYCBzZXJ2ZXMgaXQ6IHRoZSBLdWJlcm5ldGVzIEFQSSBzY2hlbWEgb2YgdGhlIGtpbmQsIHdpdGggdGhlXG4gKiBmaWVsZHMgYSBzZXJ2ZWQgUGVyc2lzdGVudFZvbHVtZSBhbHdheXMgY2FycmllcyBtYWRlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBQZXJzaXN0ZW50Vm9sdW1lVjEgPSBPbWl0PFYxUGVyc2lzdGVudFZvbHVtZSwgXCJraW5kXCIgfCBcImFwaVZlcnNpb25cIiB8IFwibWV0YWRhdGFcIiB8IFwic3BlY1wiPiAmIHtcbiAga2luZDogXCJQZXJzaXN0ZW50Vm9sdW1lXCI7XG4gIGFwaVZlcnNpb246IFwidjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZENsdXN0ZXJTY29wZWRPYmplY3RNZXRhO1xuICBzcGVjOiBOb25OdWxsYWJsZTxWMVBlcnNpc3RlbnRWb2x1bWVbXCJzcGVjXCJdPjtcbn07XG5cbi8qKlxuICogVGhlIFBlcnNpc3RlbnRWb2x1bWUga2luZCwgZGVjbGFyZWQgZm9yIGB2MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IHBlcnNpc3RlbnRWb2x1bWVLaW5kLCBhcGlWZXJzaW9uOiBjb3JlVjEsIC4uLiB9KWAuXG4gKi9cbmV4cG9ydCBjb25zdCBwZXJzaXN0ZW50Vm9sdW1lS2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICB2MTogUGVyc2lzdGVudFZvbHVtZVYxO1xufT4oXCJQZXJzaXN0ZW50Vm9sdW1lXCIpO1xuXG4vKipcbiAqIEEgUGVyc2lzdGVudFZvbHVtZUNsYWltIGFzIGB2MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSBhbHdheXMgY2FycmllcyBtYWRlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW1WMSA9IE9taXQ8VjFQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0sIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiUGVyc2lzdGVudFZvbHVtZUNsYWltXCI7XG4gIGFwaVZlcnNpb246IFwidjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZE5hbWVzcGFjZWRPYmplY3RNZXRhO1xuICBzcGVjOiBOb25OdWxsYWJsZTxWMVBlcnNpc3RlbnRWb2x1bWVDbGFpbVtcInNwZWNcIl0+O1xufTtcblxuLyoqXG4gKiBUaGUgUGVyc2lzdGVudFZvbHVtZUNsYWltIGtpbmQsIGRlY2xhcmVkIGZvciBgdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBwZXJzaXN0ZW50Vm9sdW1lQ2xhaW1LaW5kLCBhcGlWZXJzaW9uOiBjb3JlVjEsIC4uLiB9KWAuXG4gKi9cbmV4cG9ydCBjb25zdCBwZXJzaXN0ZW50Vm9sdW1lQ2xhaW1LaW5kID0gZ2V0S3ViZVJlc291cmNlS2luZDx7XG4gIHYxOiBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW1WMTtcbn0+KFwiUGVyc2lzdGVudFZvbHVtZUNsYWltXCIpO1xuXG4vKipcbiAqIEEgUG9kIGFzIGB2MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIFBvZCBhbHdheXMgY2FycmllcyBtYWRlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBQb2RWMSA9IE9taXQ8VjFQb2QsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiUG9kXCI7XG4gIGFwaVZlcnNpb246IFwidjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZE5hbWVzcGFjZWRPYmplY3RNZXRhO1xuICBzcGVjOiBOb25OdWxsYWJsZTxWMVBvZFtcInNwZWNcIl0+O1xufTtcblxuLyoqXG4gKiBUaGUgUG9kIGtpbmQsIGRlY2xhcmVkIGZvciBgdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBwb2RLaW5kLCBhcGlWZXJzaW9uOiBjb3JlVjEsIC4uLiB9KWAuXG4gKi9cbmV4cG9ydCBjb25zdCBwb2RLaW5kID0gZ2V0S3ViZVJlc291cmNlS2luZDx7XG4gIHYxOiBQb2RWMTtcbn0+KFwiUG9kXCIpO1xuXG4vKipcbiAqIEEgUG9kRGlzcnVwdGlvbkJ1ZGdldCBhcyBgcG9saWN5L3YxYCBzZXJ2ZXMgaXQ6IHRoZSBLdWJlcm5ldGVzIEFQSSBzY2hlbWEgb2YgdGhlIGtpbmQsIHdpdGggdGhlXG4gKiBmaWVsZHMgYSBzZXJ2ZWQgUG9kRGlzcnVwdGlvbkJ1ZGdldCBhbHdheXMgY2FycmllcyBtYWRlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBQb2REaXNydXB0aW9uQnVkZ2V0VjEgPSBPbWl0PFYxUG9kRGlzcnVwdGlvbkJ1ZGdldCwgXCJraW5kXCIgfCBcImFwaVZlcnNpb25cIiB8IFwibWV0YWRhdGFcIiB8IFwic3BlY1wiPiAmIHtcbiAga2luZDogXCJQb2REaXNydXB0aW9uQnVkZ2V0XCI7XG4gIGFwaVZlcnNpb246IFwicG9saWN5L3YxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YTtcbiAgc3BlYzogTm9uTnVsbGFibGU8VjFQb2REaXNydXB0aW9uQnVkZ2V0W1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBQb2REaXNydXB0aW9uQnVkZ2V0IGtpbmQsIGRlY2xhcmVkIGZvciBgcG9saWN5L3YxYC4gSGFuZCBpdCB0byBhbnkgY29udHJhY3Qga2V5ZWQgYnlcbiAqIGtpbmQsIGUuZy4gYGJ1aWxkRGV0YWlsc1BhbmVsU2VjdGlvbkJ1bmNoKHsga2luZDogcG9kRGlzcnVwdGlvbkJ1ZGdldEtpbmQsIGFwaVZlcnNpb246IHBvbGljeVYxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3QgcG9kRGlzcnVwdGlvbkJ1ZGdldEtpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgXCJwb2xpY3kvdjFcIjogUG9kRGlzcnVwdGlvbkJ1ZGdldFYxO1xufT4oXCJQb2REaXNydXB0aW9uQnVkZ2V0XCIpO1xuXG4vKipcbiAqIEEgUHJpb3JpdHlDbGFzcyBhcyBgc2NoZWR1bGluZy5rOHMuaW8vdjFgIHNlcnZlcyBpdDogdGhlIEt1YmVybmV0ZXMgQVBJIHNjaGVtYSBvZiB0aGUga2luZCwgd2l0aCB0aGVcbiAqIGZpZWxkcyBhIHNlcnZlZCBQcmlvcml0eUNsYXNzIGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFByaW9yaXR5Q2xhc3NWMSA9IE9taXQ8VjFQcmlvcml0eUNsYXNzLCBcImtpbmRcIiB8IFwiYXBpVmVyc2lvblwiIHwgXCJtZXRhZGF0YVwiPiAmIHtcbiAga2luZDogXCJQcmlvcml0eUNsYXNzXCI7XG4gIGFwaVZlcnNpb246IFwic2NoZWR1bGluZy5rOHMuaW8vdjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZENsdXN0ZXJTY29wZWRPYmplY3RNZXRhO1xufTtcblxuLyoqXG4gKiBUaGUgUHJpb3JpdHlDbGFzcyBraW5kLCBkZWNsYXJlZCBmb3IgYHNjaGVkdWxpbmcuazhzLmlvL3YxYC4gSGFuZCBpdCB0byBhbnkgY29udHJhY3Qga2V5ZWQgYnlcbiAqIGtpbmQsIGUuZy4gYGJ1aWxkRGV0YWlsc1BhbmVsU2VjdGlvbkJ1bmNoKHsga2luZDogcHJpb3JpdHlDbGFzc0tpbmQsIGFwaVZlcnNpb246IHNjaGVkdWxpbmdWMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHByaW9yaXR5Q2xhc3NLaW5kID0gZ2V0S3ViZVJlc291cmNlS2luZDx7XG4gIFwic2NoZWR1bGluZy5rOHMuaW8vdjFcIjogUHJpb3JpdHlDbGFzc1YxO1xufT4oXCJQcmlvcml0eUNsYXNzXCIpO1xuXG4vKipcbiAqIEEgUmVwbGljYVNldCBhcyBgYXBwcy92MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIFJlcGxpY2FTZXQgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVwbGljYVNldFYxID0gT21pdDxWMVJlcGxpY2FTZXQsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiUmVwbGljYVNldFwiO1xuICBhcGlWZXJzaW9uOiBcImFwcHMvdjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZE5hbWVzcGFjZWRPYmplY3RNZXRhO1xuICBzcGVjOiBOb25OdWxsYWJsZTxWMVJlcGxpY2FTZXRbXCJzcGVjXCJdPjtcbn07XG5cbi8qKlxuICogVGhlIFJlcGxpY2FTZXQga2luZCwgZGVjbGFyZWQgZm9yIGBhcHBzL3YxYC4gSGFuZCBpdCB0byBhbnkgY29udHJhY3Qga2V5ZWQgYnlcbiAqIGtpbmQsIGUuZy4gYGJ1aWxkRGV0YWlsc1BhbmVsU2VjdGlvbkJ1bmNoKHsga2luZDogcmVwbGljYVNldEtpbmQsIGFwaVZlcnNpb246IGFwcHNWMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGxpY2FTZXRLaW5kID0gZ2V0S3ViZVJlc291cmNlS2luZDx7XG4gIFwiYXBwcy92MVwiOiBSZXBsaWNhU2V0VjE7XG59PihcIlJlcGxpY2FTZXRcIik7XG5cbi8qKlxuICogQSBSZXBsaWNhdGlvbkNvbnRyb2xsZXIgYXMgYHYxYCBzZXJ2ZXMgaXQ6IHRoZSBLdWJlcm5ldGVzIEFQSSBzY2hlbWEgb2YgdGhlIGtpbmQsIHdpdGggdGhlXG4gKiBmaWVsZHMgYSBzZXJ2ZWQgUmVwbGljYXRpb25Db250cm9sbGVyIGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFJlcGxpY2F0aW9uQ29udHJvbGxlclYxID0gT21pdDxWMVJlcGxpY2F0aW9uQ29udHJvbGxlciwgXCJraW5kXCIgfCBcImFwaVZlcnNpb25cIiB8IFwibWV0YWRhdGFcIiB8IFwic3BlY1wiPiAmIHtcbiAga2luZDogXCJSZXBsaWNhdGlvbkNvbnRyb2xsZXJcIjtcbiAgYXBpVmVyc2lvbjogXCJ2MVwiO1xuICBtZXRhZGF0YTogU2VydmVkTmFtZXNwYWNlZE9iamVjdE1ldGE7XG4gIHNwZWM6IE5vbk51bGxhYmxlPFYxUmVwbGljYXRpb25Db250cm9sbGVyW1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBSZXBsaWNhdGlvbkNvbnRyb2xsZXIga2luZCwgZGVjbGFyZWQgZm9yIGB2MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IHJlcGxpY2F0aW9uQ29udHJvbGxlcktpbmQsIGFwaVZlcnNpb246IGNvcmVWMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGxpY2F0aW9uQ29udHJvbGxlcktpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgdjE6IFJlcGxpY2F0aW9uQ29udHJvbGxlclYxO1xufT4oXCJSZXBsaWNhdGlvbkNvbnRyb2xsZXJcIik7XG5cbi8qKlxuICogQSBSZXNvdXJjZVF1b3RhIGFzIGB2MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIFJlc291cmNlUXVvdGEgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VRdW90YVYxID0gT21pdDxWMVJlc291cmNlUXVvdGEsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiUmVzb3VyY2VRdW90YVwiO1xuICBhcGlWZXJzaW9uOiBcInYxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YTtcbiAgc3BlYzogTm9uTnVsbGFibGU8VjFSZXNvdXJjZVF1b3RhW1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBSZXNvdXJjZVF1b3RhIGtpbmQsIGRlY2xhcmVkIGZvciBgdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiByZXNvdXJjZVF1b3RhS2luZCwgYXBpVmVyc2lvbjogY29yZVYxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3QgcmVzb3VyY2VRdW90YUtpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgdjE6IFJlc291cmNlUXVvdGFWMTtcbn0+KFwiUmVzb3VyY2VRdW90YVwiKTtcblxuLyoqXG4gKiBBIFJvbGUgYXMgYHJiYWMuYXV0aG9yaXphdGlvbi5rOHMuaW8vdjFgIHNlcnZlcyBpdDogdGhlIEt1YmVybmV0ZXMgQVBJIHNjaGVtYSBvZiB0aGUga2luZCwgd2l0aCB0aGVcbiAqIGZpZWxkcyBhIHNlcnZlZCBSb2xlIGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFJvbGVWMSA9IE9taXQ8VjFSb2xlLCBcImtpbmRcIiB8IFwiYXBpVmVyc2lvblwiIHwgXCJtZXRhZGF0YVwiPiAmIHtcbiAga2luZDogXCJSb2xlXCI7XG4gIGFwaVZlcnNpb246IFwicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MVwiO1xuICBtZXRhZGF0YTogU2VydmVkTmFtZXNwYWNlZE9iamVjdE1ldGE7XG59O1xuXG4vKipcbiAqIFRoZSBSb2xlIGtpbmQsIGRlY2xhcmVkIGZvciBgcmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IHJvbGVLaW5kLCBhcGlWZXJzaW9uOiByYmFjQXV0aG9yaXphdGlvblYxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3Qgcm9sZUtpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgXCJyYmFjLmF1dGhvcml6YXRpb24uazhzLmlvL3YxXCI6IFJvbGVWMTtcbn0+KFwiUm9sZVwiKTtcblxuLyoqXG4gKiBBIFJvbGVCaW5kaW5nIGFzIGByYmFjLmF1dGhvcml6YXRpb24uazhzLmlvL3YxYCBzZXJ2ZXMgaXQ6IHRoZSBLdWJlcm5ldGVzIEFQSSBzY2hlbWEgb2YgdGhlIGtpbmQsIHdpdGggdGhlXG4gKiBmaWVsZHMgYSBzZXJ2ZWQgUm9sZUJpbmRpbmcgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgUm9sZUJpbmRpbmdWMSA9IE9taXQ8VjFSb2xlQmluZGluZywgXCJraW5kXCIgfCBcImFwaVZlcnNpb25cIiB8IFwibWV0YWRhdGFcIj4gJiB7XG4gIGtpbmQ6IFwiUm9sZUJpbmRpbmdcIjtcbiAgYXBpVmVyc2lvbjogXCJyYmFjLmF1dGhvcml6YXRpb24uazhzLmlvL3YxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YTtcbn07XG5cbi8qKlxuICogVGhlIFJvbGVCaW5kaW5nIGtpbmQsIGRlY2xhcmVkIGZvciBgcmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IHJvbGVCaW5kaW5nS2luZCwgYXBpVmVyc2lvbjogcmJhY0F1dGhvcml6YXRpb25WMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJvbGVCaW5kaW5nS2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICBcInJiYWMuYXV0aG9yaXphdGlvbi5rOHMuaW8vdjFcIjogUm9sZUJpbmRpbmdWMTtcbn0+KFwiUm9sZUJpbmRpbmdcIik7XG5cbi8qKlxuICogQSBSdW50aW1lQ2xhc3MgYXMgYG5vZGUuazhzLmlvL3YxYCBzZXJ2ZXMgaXQ6IHRoZSBLdWJlcm5ldGVzIEFQSSBzY2hlbWEgb2YgdGhlIGtpbmQsIHdpdGggdGhlXG4gKiBmaWVsZHMgYSBzZXJ2ZWQgUnVudGltZUNsYXNzIGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bnRpbWVDbGFzc1YxID0gT21pdDxWMVJ1bnRpbWVDbGFzcywgXCJraW5kXCIgfCBcImFwaVZlcnNpb25cIiB8IFwibWV0YWRhdGFcIj4gJiB7XG4gIGtpbmQ6IFwiUnVudGltZUNsYXNzXCI7XG4gIGFwaVZlcnNpb246IFwibm9kZS5rOHMuaW8vdjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZENsdXN0ZXJTY29wZWRPYmplY3RNZXRhO1xufTtcblxuLyoqXG4gKiBUaGUgUnVudGltZUNsYXNzIGtpbmQsIGRlY2xhcmVkIGZvciBgbm9kZS5rOHMuaW8vdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBydW50aW1lQ2xhc3NLaW5kLCBhcGlWZXJzaW9uOiBub2RlVjEsIC4uLiB9KWAuXG4gKi9cbmV4cG9ydCBjb25zdCBydW50aW1lQ2xhc3NLaW5kID0gZ2V0S3ViZVJlc291cmNlS2luZDx7XG4gIFwibm9kZS5rOHMuaW8vdjFcIjogUnVudGltZUNsYXNzVjE7XG59PihcIlJ1bnRpbWVDbGFzc1wiKTtcblxuLyoqXG4gKiBBIFNlY3JldCBhcyBgdjFgIHNlcnZlcyBpdDogdGhlIEt1YmVybmV0ZXMgQVBJIHNjaGVtYSBvZiB0aGUga2luZCwgd2l0aCB0aGVcbiAqIGZpZWxkcyBhIHNlcnZlZCBTZWNyZXQgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgU2VjcmV0VjEgPSBPbWl0PFYxU2VjcmV0LCBcImtpbmRcIiB8IFwiYXBpVmVyc2lvblwiIHwgXCJtZXRhZGF0YVwiPiAmIHtcbiAga2luZDogXCJTZWNyZXRcIjtcbiAgYXBpVmVyc2lvbjogXCJ2MVwiO1xuICBtZXRhZGF0YTogU2VydmVkTmFtZXNwYWNlZE9iamVjdE1ldGE7XG59O1xuXG4vKipcbiAqIFRoZSBTZWNyZXQga2luZCwgZGVjbGFyZWQgZm9yIGB2MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IHNlY3JldEtpbmQsIGFwaVZlcnNpb246IGNvcmVWMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY3JldEtpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgdjE6IFNlY3JldFYxO1xufT4oXCJTZWNyZXRcIik7XG5cbi8qKlxuICogQSBTZXJ2aWNlIGFzIGB2MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIFNlcnZpY2UgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgU2VydmljZVYxID0gT21pdDxWMVNlcnZpY2UsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCIgfCBcInNwZWNcIj4gJiB7XG4gIGtpbmQ6IFwiU2VydmljZVwiO1xuICBhcGlWZXJzaW9uOiBcInYxXCI7XG4gIG1ldGFkYXRhOiBTZXJ2ZWROYW1lc3BhY2VkT2JqZWN0TWV0YTtcbiAgc3BlYzogTm9uTnVsbGFibGU8VjFTZXJ2aWNlW1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBTZXJ2aWNlIGtpbmQsIGRlY2xhcmVkIGZvciBgdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBzZXJ2aWNlS2luZCwgYXBpVmVyc2lvbjogY29yZVYxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3Qgc2VydmljZUtpbmQgPSBnZXRLdWJlUmVzb3VyY2VLaW5kPHtcbiAgdjE6IFNlcnZpY2VWMTtcbn0+KFwiU2VydmljZVwiKTtcblxuLyoqXG4gKiBBIFNlcnZpY2VBY2NvdW50IGFzIGB2MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIFNlcnZpY2VBY2NvdW50IGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZpY2VBY2NvdW50VjEgPSBPbWl0PFYxU2VydmljZUFjY291bnQsIFwia2luZFwiIHwgXCJhcGlWZXJzaW9uXCIgfCBcIm1ldGFkYXRhXCI+ICYge1xuICBraW5kOiBcIlNlcnZpY2VBY2NvdW50XCI7XG4gIGFwaVZlcnNpb246IFwidjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZE5hbWVzcGFjZWRPYmplY3RNZXRhO1xufTtcblxuLyoqXG4gKiBUaGUgU2VydmljZUFjY291bnQga2luZCwgZGVjbGFyZWQgZm9yIGB2MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IHNlcnZpY2VBY2NvdW50S2luZCwgYXBpVmVyc2lvbjogY29yZVYxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3Qgc2VydmljZUFjY291bnRLaW5kID0gZ2V0S3ViZVJlc291cmNlS2luZDx7XG4gIHYxOiBTZXJ2aWNlQWNjb3VudFYxO1xufT4oXCJTZXJ2aWNlQWNjb3VudFwiKTtcblxuLyoqXG4gKiBBIFN0YXRlZnVsU2V0IGFzIGBhcHBzL3YxYCBzZXJ2ZXMgaXQ6IHRoZSBLdWJlcm5ldGVzIEFQSSBzY2hlbWEgb2YgdGhlIGtpbmQsIHdpdGggdGhlXG4gKiBmaWVsZHMgYSBzZXJ2ZWQgU3RhdGVmdWxTZXQgYWx3YXlzIGNhcnJpZXMgbWFkZSByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhdGVmdWxTZXRWMSA9IE9taXQ8VjFTdGF0ZWZ1bFNldCwgXCJraW5kXCIgfCBcImFwaVZlcnNpb25cIiB8IFwibWV0YWRhdGFcIiB8IFwic3BlY1wiPiAmIHtcbiAga2luZDogXCJTdGF0ZWZ1bFNldFwiO1xuICBhcGlWZXJzaW9uOiBcImFwcHMvdjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZE5hbWVzcGFjZWRPYmplY3RNZXRhO1xuICBzcGVjOiBOb25OdWxsYWJsZTxWMVN0YXRlZnVsU2V0W1wic3BlY1wiXT47XG59O1xuXG4vKipcbiAqIFRoZSBTdGF0ZWZ1bFNldCBraW5kLCBkZWNsYXJlZCBmb3IgYGFwcHMvdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBzdGF0ZWZ1bFNldEtpbmQsIGFwaVZlcnNpb246IGFwcHNWMSwgLi4uIH0pYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0YXRlZnVsU2V0S2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICBcImFwcHMvdjFcIjogU3RhdGVmdWxTZXRWMTtcbn0+KFwiU3RhdGVmdWxTZXRcIik7XG5cbi8qKlxuICogQSBTdG9yYWdlQ2xhc3MgYXMgYHN0b3JhZ2UuazhzLmlvL3YxYCBzZXJ2ZXMgaXQ6IHRoZSBLdWJlcm5ldGVzIEFQSSBzY2hlbWEgb2YgdGhlIGtpbmQsIHdpdGggdGhlXG4gKiBmaWVsZHMgYSBzZXJ2ZWQgU3RvcmFnZUNsYXNzIGFsd2F5cyBjYXJyaWVzIG1hZGUgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFN0b3JhZ2VDbGFzc1YxID0gT21pdDxWMVN0b3JhZ2VDbGFzcywgXCJraW5kXCIgfCBcImFwaVZlcnNpb25cIiB8IFwibWV0YWRhdGFcIj4gJiB7XG4gIGtpbmQ6IFwiU3RvcmFnZUNsYXNzXCI7XG4gIGFwaVZlcnNpb246IFwic3RvcmFnZS5rOHMuaW8vdjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZENsdXN0ZXJTY29wZWRPYmplY3RNZXRhO1xufTtcblxuLyoqXG4gKiBUaGUgU3RvcmFnZUNsYXNzIGtpbmQsIGRlY2xhcmVkIGZvciBgc3RvcmFnZS5rOHMuaW8vdjFgLiBIYW5kIGl0IHRvIGFueSBjb250cmFjdCBrZXllZCBieVxuICoga2luZCwgZS5nLiBgYnVpbGREZXRhaWxzUGFuZWxTZWN0aW9uQnVuY2goeyBraW5kOiBzdG9yYWdlQ2xhc3NLaW5kLCBhcGlWZXJzaW9uOiBzdG9yYWdlVjEsIC4uLiB9KWAuXG4gKi9cbmV4cG9ydCBjb25zdCBzdG9yYWdlQ2xhc3NLaW5kID0gZ2V0S3ViZVJlc291cmNlS2luZDx7XG4gIFwic3RvcmFnZS5rOHMuaW8vdjFcIjogU3RvcmFnZUNsYXNzVjE7XG59PihcIlN0b3JhZ2VDbGFzc1wiKTtcblxuLyoqXG4gKiBBIFZhbGlkYXRpbmdXZWJob29rQ29uZmlndXJhdGlvbiBhcyBgYWRtaXNzaW9ucmVnaXN0cmF0aW9uLms4cy5pby92MWAgc2VydmVzIGl0OiB0aGUgS3ViZXJuZXRlcyBBUEkgc2NoZW1hIG9mIHRoZSBraW5kLCB3aXRoIHRoZVxuICogZmllbGRzIGEgc2VydmVkIFZhbGlkYXRpbmdXZWJob29rQ29uZmlndXJhdGlvbiBhbHdheXMgY2FycmllcyBtYWRlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgdHlwZSBWYWxpZGF0aW5nV2ViaG9va0NvbmZpZ3VyYXRpb25WMSA9IE9taXQ8XG4gIFYxVmFsaWRhdGluZ1dlYmhvb2tDb25maWd1cmF0aW9uLFxuICBcImtpbmRcIiB8IFwiYXBpVmVyc2lvblwiIHwgXCJtZXRhZGF0YVwiXG4+ICYge1xuICBraW5kOiBcIlZhbGlkYXRpbmdXZWJob29rQ29uZmlndXJhdGlvblwiO1xuICBhcGlWZXJzaW9uOiBcImFkbWlzc2lvbnJlZ2lzdHJhdGlvbi5rOHMuaW8vdjFcIjtcbiAgbWV0YWRhdGE6IFNlcnZlZENsdXN0ZXJTY29wZWRPYmplY3RNZXRhO1xufTtcblxuLyoqXG4gKiBUaGUgVmFsaWRhdGluZ1dlYmhvb2tDb25maWd1cmF0aW9uIGtpbmQsIGRlY2xhcmVkIGZvciBgYWRtaXNzaW9ucmVnaXN0cmF0aW9uLms4cy5pby92MWAuIEhhbmQgaXQgdG8gYW55IGNvbnRyYWN0IGtleWVkIGJ5XG4gKiBraW5kLCBlLmcuIGBidWlsZERldGFpbHNQYW5lbFNlY3Rpb25CdW5jaCh7IGtpbmQ6IHZhbGlkYXRpbmdXZWJob29rQ29uZmlndXJhdGlvbktpbmQsIGFwaVZlcnNpb246IGFkbWlzc2lvbnJlZ2lzdHJhdGlvblYxLCAuLi4gfSlgLlxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGluZ1dlYmhvb2tDb25maWd1cmF0aW9uS2luZCA9IGdldEt1YmVSZXNvdXJjZUtpbmQ8e1xuICBcImFkbWlzc2lvbnJlZ2lzdHJhdGlvbi5rOHMuaW8vdjFcIjogVmFsaWRhdGluZ1dlYmhvb2tDb25maWd1cmF0aW9uVjE7XG59PihcIlZhbGlkYXRpbmdXZWJob29rQ29uZmlndXJhdGlvblwiKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQSx3QkFBdUQ7QUF1QmhELElBQU0sMEJBQTBCLENBQW1CLG1CQUN4RCxxQ0FBK0MsRUFBRSxVQUFVOzs7QUNYdEQsSUFBTSwwQkFBMEIsd0JBQXdCLGlDQUFpQztBQUd6RixJQUFNLGdDQUFnQyx3QkFBd0IsdUNBQXVDO0FBR3JHLElBQU0sK0JBQStCLHdCQUF3QixzQ0FBc0M7QUFHbkcsSUFBTSxrQkFBa0Isd0JBQXdCLHlCQUF5QjtBQUd6RSxJQUFNLG9CQUFvQix3QkFBd0IsMkJBQTJCO0FBRzdFLElBQU0sU0FBUyx3QkFBd0IsU0FBUztBQUdoRCxJQUFNLG1CQUFtQix3QkFBd0IsMEJBQTBCO0FBRzNFLElBQU0sa0JBQWtCLHdCQUF3Qix5QkFBeUI7QUFHekUsSUFBTSxnQkFBZ0Isd0JBQXdCLGdCQUFnQjtBQUc5RCxJQUFNLGdCQUFnQix3QkFBd0IsZ0JBQWdCO0FBRzlELElBQU0sVUFBVSx3QkFBd0IsVUFBVTtBQUdsRCxJQUFNLGlCQUFpQix3QkFBd0Isd0JBQXdCO0FBR3ZFLElBQU0sdUJBQXVCLHdCQUF3Qiw4QkFBOEI7QUFHbkYsSUFBTSxzQkFBc0Isd0JBQXdCLDZCQUE2QjtBQUdqRixJQUFNLGlCQUFpQix3QkFBd0Isd0JBQXdCO0FBR3ZFLElBQU0sdUJBQXVCLHdCQUF3Qiw4QkFBOEI7QUFHbkYsSUFBTSxzQkFBc0Isd0JBQXdCLDZCQUE2QjtBQUdqRixJQUFNLFNBQVMsd0JBQXdCLElBQUk7QUFHM0MsSUFBTSxjQUFjLHdCQUF3QixxQkFBcUI7QUFHakUsSUFBTSxXQUFXLHdCQUF3QixrQkFBa0I7QUFHM0QsSUFBTSx5QkFBeUIsd0JBQXdCLGlDQUFpQztBQUd4RixJQUFNLDRCQUE0Qix3QkFBd0Isb0NBQW9DO0FBRzlGLElBQU0sZUFBZSx3QkFBd0Isc0JBQXNCO0FBR25FLElBQU0sb0JBQW9CLHdCQUF3QiwyQkFBMkI7QUFHN0UsSUFBTSxTQUFTLHdCQUF3QixnQkFBZ0I7QUFHdkQsSUFBTSxXQUFXLHdCQUF3QixXQUFXO0FBR3BELElBQU0sc0JBQXNCLHdCQUF3Qiw4QkFBOEI7QUFHbEYsSUFBTSxhQUFhLHdCQUF3QixvQkFBb0I7QUFHL0QsSUFBTSxtQkFBbUIsd0JBQXdCLDBCQUEwQjtBQUczRSxJQUFNLGtCQUFrQix3QkFBd0IseUJBQXlCO0FBR3pFLElBQU0sa0JBQWtCLHdCQUF3Qix5QkFBeUI7QUFHekUsSUFBTSxlQUFlLHdCQUF3QixzQkFBc0I7QUFHbkUsSUFBTSxxQkFBcUIsd0JBQXdCLDRCQUE0QjtBQUcvRSxJQUFNLDBCQUEwQix3QkFBd0IsaUNBQWlDO0FBR3pGLElBQU0sWUFBWSx3QkFBd0IsbUJBQW1CO0FBRzdELElBQU0saUJBQWlCLHdCQUF3Qix3QkFBd0I7OztBQ3RIOUUsSUFBQUEscUJBQWdGO0FBd0d6RSxJQUFNLHNCQUFzQixDQUF5RCxhQUMxRixzQ0FBNEMsRUFBRSxJQUFJOzs7QUNmN0MsSUFBTSxrQkFBa0Isb0JBRTVCLGFBQWE7QUFnQlQsSUFBTSx5QkFBeUIsb0JBRW5DLG9CQUFvQjtBQWdCaEIsSUFBTSxnQkFBZ0Isb0JBRTFCLFdBQVc7QUFpQlAsSUFBTSxjQUFjLG9CQUV4QixTQUFTO0FBb0JMLElBQU0sK0JBQStCLG9CQUV6QywwQkFBMEI7QUFpQnRCLElBQU0sZ0JBQWdCLG9CQUUxQixXQUFXO0FBaUJQLElBQU0saUJBQWlCLG9CQUUzQixZQUFZO0FBZ0JSLElBQU0sZ0JBQWdCLG9CQUUxQixXQUFXO0FBZ0JQLElBQU0sb0JBQW9CLG9CQUU5QixlQUFlO0FBNEJYLElBQU0sOEJBQThCLG9CQUd4Qyx5QkFBeUI7QUFpQnJCLElBQU0sY0FBYyxvQkFFeEIsU0FBUztBQWlCTCxJQUFNLG1CQUFtQixvQkFFN0IsY0FBYztBQWlCVixJQUFNLFVBQVUsb0JBRXBCLEtBQUs7QUFpQkQsSUFBTSxZQUFZLG9CQUV0QixPQUFPO0FBaUJILElBQU0saUJBQWlCLG9CQUUzQixZQUFZO0FBbUJSLElBQU0sbUNBQW1DLG9CQUU3Qyw4QkFBOEI7QUFpQjFCLElBQU0sZ0JBQWdCLG9CQUUxQixXQUFXO0FBaUJQLElBQU0sb0JBQW9CLG9CQUU5QixlQUFlO0FBaUJYLElBQU0sV0FBVyxvQkFFckIsTUFBTTtBQWlCRixJQUFNLHVCQUF1QixvQkFFakMsa0JBQWtCO0FBaUJkLElBQU0sNEJBQTRCLG9CQUV0Qyx1QkFBdUI7QUFpQm5CLElBQU0sVUFBVSxvQkFFcEIsS0FBSztBQWlCRCxJQUFNLDBCQUEwQixvQkFFcEMscUJBQXFCO0FBZ0JqQixJQUFNLG9CQUFvQixvQkFFOUIsZUFBZTtBQWlCWCxJQUFNLGlCQUFpQixvQkFFM0IsWUFBWTtBQWlCUixJQUFNLDRCQUE0QixvQkFFdEMsdUJBQXVCO0FBaUJuQixJQUFNLG9CQUFvQixvQkFFOUIsZUFBZTtBQWdCWCxJQUFNLFdBQVcsb0JBRXJCLE1BQU07QUFnQkYsSUFBTSxrQkFBa0Isb0JBRTVCLGFBQWE7QUFnQlQsSUFBTSxtQkFBbUIsb0JBRTdCLGNBQWM7QUFnQlYsSUFBTSxhQUFhLG9CQUV2QixRQUFRO0FBaUJKLElBQU0sY0FBYyxvQkFFeEIsU0FBUztBQWdCTCxJQUFNLHFCQUFxQixvQkFFL0IsZ0JBQWdCO0FBaUJaLElBQU0sa0JBQWtCLG9CQUU1QixhQUFhO0FBZ0JULElBQU0sbUJBQW1CLG9CQUU3QixjQUFjO0FBbUJWLElBQU0scUNBQXFDLG9CQUUvQyxnQ0FBZ0M7IiwKICAibmFtZXMiOiBbImltcG9ydF9pbmplY3RhYmxlIl0KfQo=
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Every API version @kubernetes/client-node serves, as a typed specifier.
3
+ *
4
+ * GENERATED by packages/technical-features/_kube/kubernetes-contracts/generator. DO NOT EDIT.
5
+ * Regenerate with `npm run generate --workspace @k8slens/kubernetes-contracts`.
6
+ *
7
+ * Derived from @kubernetes/client-node 2.0.0 (Apache-2.0), itself generated from the
8
+ * Kubernetes OpenAPI specification, release-1.36 (Apache-2.0).
9
+ */
10
+ /** The `admissionregistration.k8s.io/v1` API version. */
11
+ export declare const admissionregistrationV1: import("@k8slens/injectable").TypedSpecifier<"admissionregistration.k8s.io/v1", {
12
+ kubernetesApiVersion: "admissionregistration.k8s.io/v1";
13
+ }>;
14
+ /** The `admissionregistration.k8s.io/v1alpha1` API version. */
15
+ export declare const admissionregistrationV1alpha1: import("@k8slens/injectable").TypedSpecifier<"admissionregistration.k8s.io/v1alpha1", {
16
+ kubernetesApiVersion: "admissionregistration.k8s.io/v1alpha1";
17
+ }>;
18
+ /** The `admissionregistration.k8s.io/v1beta1` API version. */
19
+ export declare const admissionregistrationV1beta1: import("@k8slens/injectable").TypedSpecifier<"admissionregistration.k8s.io/v1beta1", {
20
+ kubernetesApiVersion: "admissionregistration.k8s.io/v1beta1";
21
+ }>;
22
+ /** The `apiextensions.k8s.io/v1` API version. */
23
+ export declare const apiextensionsV1: import("@k8slens/injectable").TypedSpecifier<"apiextensions.k8s.io/v1", {
24
+ kubernetesApiVersion: "apiextensions.k8s.io/v1";
25
+ }>;
26
+ /** The `apiregistration.k8s.io/v1` API version. */
27
+ export declare const apiregistrationV1: import("@k8slens/injectable").TypedSpecifier<"apiregistration.k8s.io/v1", {
28
+ kubernetesApiVersion: "apiregistration.k8s.io/v1";
29
+ }>;
30
+ /** The `apps/v1` API version. */
31
+ export declare const appsV1: import("@k8slens/injectable").TypedSpecifier<"apps/v1", {
32
+ kubernetesApiVersion: "apps/v1";
33
+ }>;
34
+ /** The `authentication.k8s.io/v1` API version. */
35
+ export declare const authenticationV1: import("@k8slens/injectable").TypedSpecifier<"authentication.k8s.io/v1", {
36
+ kubernetesApiVersion: "authentication.k8s.io/v1";
37
+ }>;
38
+ /** The `authorization.k8s.io/v1` API version. */
39
+ export declare const authorizationV1: import("@k8slens/injectable").TypedSpecifier<"authorization.k8s.io/v1", {
40
+ kubernetesApiVersion: "authorization.k8s.io/v1";
41
+ }>;
42
+ /** The `autoscaling/v1` API version. */
43
+ export declare const autoscalingV1: import("@k8slens/injectable").TypedSpecifier<"autoscaling/v1", {
44
+ kubernetesApiVersion: "autoscaling/v1";
45
+ }>;
46
+ /** The `autoscaling/v2` API version. */
47
+ export declare const autoscalingV2: import("@k8slens/injectable").TypedSpecifier<"autoscaling/v2", {
48
+ kubernetesApiVersion: "autoscaling/v2";
49
+ }>;
50
+ /** The `batch/v1` API version. */
51
+ export declare const batchV1: import("@k8slens/injectable").TypedSpecifier<"batch/v1", {
52
+ kubernetesApiVersion: "batch/v1";
53
+ }>;
54
+ /** The `certificates.k8s.io/v1` API version. */
55
+ export declare const certificatesV1: import("@k8slens/injectable").TypedSpecifier<"certificates.k8s.io/v1", {
56
+ kubernetesApiVersion: "certificates.k8s.io/v1";
57
+ }>;
58
+ /** The `certificates.k8s.io/v1alpha1` API version. */
59
+ export declare const certificatesV1alpha1: import("@k8slens/injectable").TypedSpecifier<"certificates.k8s.io/v1alpha1", {
60
+ kubernetesApiVersion: "certificates.k8s.io/v1alpha1";
61
+ }>;
62
+ /** The `certificates.k8s.io/v1beta1` API version. */
63
+ export declare const certificatesV1beta1: import("@k8slens/injectable").TypedSpecifier<"certificates.k8s.io/v1beta1", {
64
+ kubernetesApiVersion: "certificates.k8s.io/v1beta1";
65
+ }>;
66
+ /** The `coordination.k8s.io/v1` API version. */
67
+ export declare const coordinationV1: import("@k8slens/injectable").TypedSpecifier<"coordination.k8s.io/v1", {
68
+ kubernetesApiVersion: "coordination.k8s.io/v1";
69
+ }>;
70
+ /** The `coordination.k8s.io/v1alpha2` API version. */
71
+ export declare const coordinationV1alpha2: import("@k8slens/injectable").TypedSpecifier<"coordination.k8s.io/v1alpha2", {
72
+ kubernetesApiVersion: "coordination.k8s.io/v1alpha2";
73
+ }>;
74
+ /** The `coordination.k8s.io/v1beta1` API version. */
75
+ export declare const coordinationV1beta1: import("@k8slens/injectable").TypedSpecifier<"coordination.k8s.io/v1beta1", {
76
+ kubernetesApiVersion: "coordination.k8s.io/v1beta1";
77
+ }>;
78
+ /** The `v1` API version. */
79
+ export declare const coreV1: import("@k8slens/injectable").TypedSpecifier<"v1", {
80
+ kubernetesApiVersion: "v1";
81
+ }>;
82
+ /** The `discovery.k8s.io/v1` API version. */
83
+ export declare const discoveryV1: import("@k8slens/injectable").TypedSpecifier<"discovery.k8s.io/v1", {
84
+ kubernetesApiVersion: "discovery.k8s.io/v1";
85
+ }>;
86
+ /** The `events.k8s.io/v1` API version. */
87
+ export declare const eventsV1: import("@k8slens/injectable").TypedSpecifier<"events.k8s.io/v1", {
88
+ kubernetesApiVersion: "events.k8s.io/v1";
89
+ }>;
90
+ /** The `flowcontrol.apiserver.k8s.io/v1` API version. */
91
+ export declare const flowcontrolApiserverV1: import("@k8slens/injectable").TypedSpecifier<"flowcontrol.apiserver.k8s.io/v1", {
92
+ kubernetesApiVersion: "flowcontrol.apiserver.k8s.io/v1";
93
+ }>;
94
+ /** The `internal.apiserver.k8s.io/v1alpha1` API version. */
95
+ export declare const internalApiserverV1alpha1: import("@k8slens/injectable").TypedSpecifier<"internal.apiserver.k8s.io/v1alpha1", {
96
+ kubernetesApiVersion: "internal.apiserver.k8s.io/v1alpha1";
97
+ }>;
98
+ /** The `networking.k8s.io/v1` API version. */
99
+ export declare const networkingV1: import("@k8slens/injectable").TypedSpecifier<"networking.k8s.io/v1", {
100
+ kubernetesApiVersion: "networking.k8s.io/v1";
101
+ }>;
102
+ /** The `networking.k8s.io/v1beta1` API version. */
103
+ export declare const networkingV1beta1: import("@k8slens/injectable").TypedSpecifier<"networking.k8s.io/v1beta1", {
104
+ kubernetesApiVersion: "networking.k8s.io/v1beta1";
105
+ }>;
106
+ /** The `node.k8s.io/v1` API version. */
107
+ export declare const nodeV1: import("@k8slens/injectable").TypedSpecifier<"node.k8s.io/v1", {
108
+ kubernetesApiVersion: "node.k8s.io/v1";
109
+ }>;
110
+ /** The `policy/v1` API version. */
111
+ export declare const policyV1: import("@k8slens/injectable").TypedSpecifier<"policy/v1", {
112
+ kubernetesApiVersion: "policy/v1";
113
+ }>;
114
+ /** The `rbac.authorization.k8s.io/v1` API version. */
115
+ export declare const rbacAuthorizationV1: import("@k8slens/injectable").TypedSpecifier<"rbac.authorization.k8s.io/v1", {
116
+ kubernetesApiVersion: "rbac.authorization.k8s.io/v1";
117
+ }>;
118
+ /** The `resource.k8s.io/v1` API version. */
119
+ export declare const resourceV1: import("@k8slens/injectable").TypedSpecifier<"resource.k8s.io/v1", {
120
+ kubernetesApiVersion: "resource.k8s.io/v1";
121
+ }>;
122
+ /** The `resource.k8s.io/v1alpha3` API version. */
123
+ export declare const resourceV1alpha3: import("@k8slens/injectable").TypedSpecifier<"resource.k8s.io/v1alpha3", {
124
+ kubernetesApiVersion: "resource.k8s.io/v1alpha3";
125
+ }>;
126
+ /** The `resource.k8s.io/v1beta1` API version. */
127
+ export declare const resourceV1beta1: import("@k8slens/injectable").TypedSpecifier<"resource.k8s.io/v1beta1", {
128
+ kubernetesApiVersion: "resource.k8s.io/v1beta1";
129
+ }>;
130
+ /** The `resource.k8s.io/v1beta2` API version. */
131
+ export declare const resourceV1beta2: import("@k8slens/injectable").TypedSpecifier<"resource.k8s.io/v1beta2", {
132
+ kubernetesApiVersion: "resource.k8s.io/v1beta2";
133
+ }>;
134
+ /** The `scheduling.k8s.io/v1` API version. */
135
+ export declare const schedulingV1: import("@k8slens/injectable").TypedSpecifier<"scheduling.k8s.io/v1", {
136
+ kubernetesApiVersion: "scheduling.k8s.io/v1";
137
+ }>;
138
+ /** The `scheduling.k8s.io/v1alpha2` API version. */
139
+ export declare const schedulingV1alpha2: import("@k8slens/injectable").TypedSpecifier<"scheduling.k8s.io/v1alpha2", {
140
+ kubernetesApiVersion: "scheduling.k8s.io/v1alpha2";
141
+ }>;
142
+ /** The `storagemigration.k8s.io/v1beta1` API version. */
143
+ export declare const storagemigrationV1beta1: import("@k8slens/injectable").TypedSpecifier<"storagemigration.k8s.io/v1beta1", {
144
+ kubernetesApiVersion: "storagemigration.k8s.io/v1beta1";
145
+ }>;
146
+ /** The `storage.k8s.io/v1` API version. */
147
+ export declare const storageV1: import("@k8slens/injectable").TypedSpecifier<"storage.k8s.io/v1", {
148
+ kubernetesApiVersion: "storage.k8s.io/v1";
149
+ }>;
150
+ /** The `storage.k8s.io/v1beta1` API version. */
151
+ export declare const storageV1beta1: import("@k8slens/injectable").TypedSpecifier<"storage.k8s.io/v1beta1", {
152
+ kubernetesApiVersion: "storage.k8s.io/v1beta1";
153
+ }>;
154
+ //# sourceMappingURL=api-versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-versions.d.ts","sourceRoot":"","sources":["../../../src/generated/api-versions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,yDAAyD;AACzD,eAAO,MAAM,uBAAuB;;EAA6D,CAAC;AAElG,+DAA+D;AAC/D,eAAO,MAAM,6BAA6B;;EAAmE,CAAC;AAE9G,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B;;EAAkE,CAAC;AAE5G,iDAAiD;AACjD,eAAO,MAAM,eAAe;;EAAqD,CAAC;AAElF,mDAAmD;AACnD,eAAO,MAAM,iBAAiB;;EAAuD,CAAC;AAEtF,iCAAiC;AACjC,eAAO,MAAM,MAAM;;EAAqC,CAAC;AAEzD,kDAAkD;AAClD,eAAO,MAAM,gBAAgB;;EAAsD,CAAC;AAEpF,iDAAiD;AACjD,eAAO,MAAM,eAAe;;EAAqD,CAAC;AAElF,wCAAwC;AACxC,eAAO,MAAM,aAAa;;EAA4C,CAAC;AAEvE,wCAAwC;AACxC,eAAO,MAAM,aAAa;;EAA4C,CAAC;AAEvE,kCAAkC;AAClC,eAAO,MAAM,OAAO;;EAAsC,CAAC;AAE3D,gDAAgD;AAChD,eAAO,MAAM,cAAc;;EAAoD,CAAC;AAEhF,sDAAsD;AACtD,eAAO,MAAM,oBAAoB;;EAA0D,CAAC;AAE5F,qDAAqD;AACrD,eAAO,MAAM,mBAAmB;;EAAyD,CAAC;AAE1F,gDAAgD;AAChD,eAAO,MAAM,cAAc;;EAAoD,CAAC;AAEhF,sDAAsD;AACtD,eAAO,MAAM,oBAAoB;;EAA0D,CAAC;AAE5F,qDAAqD;AACrD,eAAO,MAAM,mBAAmB;;EAAyD,CAAC;AAE1F,4BAA4B;AAC5B,eAAO,MAAM,MAAM;;EAAgC,CAAC;AAEpD,6CAA6C;AAC7C,eAAO,MAAM,WAAW;;EAAiD,CAAC;AAE1E,0CAA0C;AAC1C,eAAO,MAAM,QAAQ;;EAA8C,CAAC;AAEpE,yDAAyD;AACzD,eAAO,MAAM,sBAAsB;;EAA6D,CAAC;AAEjG,4DAA4D;AAC5D,eAAO,MAAM,yBAAyB;;EAAgE,CAAC;AAEvG,8CAA8C;AAC9C,eAAO,MAAM,YAAY;;EAAkD,CAAC;AAE5E,mDAAmD;AACnD,eAAO,MAAM,iBAAiB;;EAAuD,CAAC;AAEtF,wCAAwC;AACxC,eAAO,MAAM,MAAM;;EAA4C,CAAC;AAEhE,mCAAmC;AACnC,eAAO,MAAM,QAAQ;;EAAuC,CAAC;AAE7D,sDAAsD;AACtD,eAAO,MAAM,mBAAmB;;EAA0D,CAAC;AAE3F,4CAA4C;AAC5C,eAAO,MAAM,UAAU;;EAAgD,CAAC;AAExE,kDAAkD;AAClD,eAAO,MAAM,gBAAgB;;EAAsD,CAAC;AAEpF,iDAAiD;AACjD,eAAO,MAAM,eAAe;;EAAqD,CAAC;AAElF,iDAAiD;AACjD,eAAO,MAAM,eAAe;;EAAqD,CAAC;AAElF,8CAA8C;AAC9C,eAAO,MAAM,YAAY;;EAAkD,CAAC;AAE5E,oDAAoD;AACpD,eAAO,MAAM,kBAAkB;;EAAwD,CAAC;AAExF,yDAAyD;AACzD,eAAO,MAAM,uBAAuB;;EAA6D,CAAC;AAElG,2CAA2C;AAC3C,eAAO,MAAM,SAAS;;EAA+C,CAAC;AAEtE,gDAAgD;AAChD,eAAO,MAAM,cAAc;;EAAoD,CAAC"}