@cdktn/provider-azuread 15.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 (158) hide show
  1. package/.jsii +112042 -0
  2. package/LICENSE +355 -0
  3. package/README.md +94 -0
  4. package/lib/access-package/index.d.ts +151 -0
  5. package/lib/access-package/index.js +354 -0
  6. package/lib/access-package-assignment-policy/index.d.ts +1098 -0
  7. package/lib/access-package-assignment-policy/index.js +2711 -0
  8. package/lib/access-package-catalog/index.d.ts +152 -0
  9. package/lib/access-package-catalog/index.js +357 -0
  10. package/lib/access-package-catalog-role-assignment/index.d.ts +140 -0
  11. package/lib/access-package-catalog-role-assignment/index.js +333 -0
  12. package/lib/access-package-resource-catalog-association/index.d.ts +131 -0
  13. package/lib/access-package-resource-catalog-association/index.js +307 -0
  14. package/lib/access-package-resource-package-association/index.d.ts +132 -0
  15. package/lib/access-package-resource-package-association/index.js +310 -0
  16. package/lib/administrative-unit/index.d.ts +165 -0
  17. package/lib/administrative-unit/index.js +385 -0
  18. package/lib/administrative-unit-member/index.d.ts +123 -0
  19. package/lib/administrative-unit-member/index.js +295 -0
  20. package/lib/administrative-unit-role-member/index.d.ts +131 -0
  21. package/lib/administrative-unit-role-member/index.js +307 -0
  22. package/lib/app-role-assignment/index.d.ts +134 -0
  23. package/lib/app-role-assignment/index.js +319 -0
  24. package/lib/application/index.d.ts +1352 -0
  25. package/lib/application/index.js +3262 -0
  26. package/lib/application-api-access/index.d.ts +152 -0
  27. package/lib/application-api-access/index.js +357 -0
  28. package/lib/application-app-role/index.d.ts +171 -0
  29. package/lib/application-app-role/index.js +390 -0
  30. package/lib/application-certificate/index.d.ts +196 -0
  31. package/lib/application-certificate/index.js +441 -0
  32. package/lib/application-fallback-public-client/index.d.ts +122 -0
  33. package/lib/application-fallback-public-client/index.js +292 -0
  34. package/lib/application-federated-identity-credential/index.d.ts +172 -0
  35. package/lib/application-federated-identity-credential/index.js +394 -0
  36. package/lib/application-flexible-federated-identity-credential/index.d.ts +172 -0
  37. package/lib/application-flexible-federated-identity-credential/index.js +394 -0
  38. package/lib/application-from-template/index.d.ts +134 -0
  39. package/lib/application-from-template/index.js +334 -0
  40. package/lib/application-identifier-uri/index.d.ts +121 -0
  41. package/lib/application-identifier-uri/index.js +289 -0
  42. package/lib/application-known-clients/index.d.ts +130 -0
  43. package/lib/application-known-clients/index.js +315 -0
  44. package/lib/application-optional-claims/index.d.ts +381 -0
  45. package/lib/application-optional-claims/index.js +918 -0
  46. package/lib/application-owner/index.d.ts +121 -0
  47. package/lib/application-owner/index.js +289 -0
  48. package/lib/application-password/index.d.ts +185 -0
  49. package/lib/application-password/index.js +410 -0
  50. package/lib/application-permission-scope/index.d.ts +193 -0
  51. package/lib/application-permission-scope/index.js +432 -0
  52. package/lib/application-pre-authorized/index.d.ts +140 -0
  53. package/lib/application-pre-authorized/index.js +333 -0
  54. package/lib/application-redirect-uris/index.d.ts +140 -0
  55. package/lib/application-redirect-uris/index.js +333 -0
  56. package/lib/application-registration/index.d.ts +278 -0
  57. package/lib/application-registration/index.js +610 -0
  58. package/lib/authentication-strength-policy/index.d.ts +141 -0
  59. package/lib/authentication-strength-policy/index.js +336 -0
  60. package/lib/claims-mapping-policy/index.d.ts +130 -0
  61. package/lib/claims-mapping-policy/index.js +315 -0
  62. package/lib/conditional-access-policy/index.d.ts +959 -0
  63. package/lib/conditional-access-policy/index.js +2705 -0
  64. package/lib/custom-directory-role/index.d.ts +216 -0
  65. package/lib/custom-directory-role/index.js +505 -0
  66. package/lib/data-azuread-access-package/index.d.ts +118 -0
  67. package/lib/data-azuread-access-package/index.js +272 -0
  68. package/lib/data-azuread-access-package-catalog/index.d.ts +108 -0
  69. package/lib/data-azuread-access-package-catalog/index.js +258 -0
  70. package/lib/data-azuread-access-package-catalog-role/index.d.ts +107 -0
  71. package/lib/data-azuread-access-package-catalog-role/index.js +254 -0
  72. package/lib/data-azuread-administrative-unit/index.d.ts +135 -0
  73. package/lib/data-azuread-administrative-unit/index.js +336 -0
  74. package/lib/data-azuread-application/index.d.ts +654 -0
  75. package/lib/data-azuread-application/index.js +1606 -0
  76. package/lib/data-azuread-application-published-app-ids/index.d.ts +85 -0
  77. package/lib/data-azuread-application-published-app-ids/index.js +206 -0
  78. package/lib/data-azuread-application-template/index.d.ts +111 -0
  79. package/lib/data-azuread-application-template/index.js +270 -0
  80. package/lib/data-azuread-client-config/index.d.ts +86 -0
  81. package/lib/data-azuread-client-config/index.js +216 -0
  82. package/lib/data-azuread-directory-object/index.d.ts +94 -0
  83. package/lib/data-azuread-directory-object/index.js +223 -0
  84. package/lib/data-azuread-directory-role-templates/index.d.ts +120 -0
  85. package/lib/data-azuread-directory-role-templates/index.js +293 -0
  86. package/lib/data-azuread-directory-roles/index.d.ts +122 -0
  87. package/lib/data-azuread-directory-roles/index.js +301 -0
  88. package/lib/data-azuread-domains/index.d.ts +190 -0
  89. package/lib/data-azuread-domains/index.js +435 -0
  90. package/lib/data-azuread-group/index.d.ts +207 -0
  91. package/lib/data-azuread-group/index.js +506 -0
  92. package/lib/data-azuread-group-role-management-policy/index.d.ts +105 -0
  93. package/lib/data-azuread-group-role-management-policy/index.js +248 -0
  94. package/lib/data-azuread-groups/index.d.ts +160 -0
  95. package/lib/data-azuread-groups/index.js +348 -0
  96. package/lib/data-azuread-named-location/index.d.ts +163 -0
  97. package/lib/data-azuread-named-location/index.js +398 -0
  98. package/lib/data-azuread-service-principal/index.d.ts +325 -0
  99. package/lib/data-azuread-service-principal/index.js +817 -0
  100. package/lib/data-azuread-service-principals/index.d.ts +183 -0
  101. package/lib/data-azuread-service-principals/index.js +430 -0
  102. package/lib/data-azuread-user/index.d.ts +177 -0
  103. package/lib/data-azuread-user/index.js +465 -0
  104. package/lib/data-azuread-users/index.d.ts +204 -0
  105. package/lib/data-azuread-users/index.js +468 -0
  106. package/lib/directory-role/index.d.ts +125 -0
  107. package/lib/directory-role/index.js +306 -0
  108. package/lib/directory-role-assignment/index.d.ts +143 -0
  109. package/lib/directory-role-assignment/index.js +331 -0
  110. package/lib/directory-role-eligibility-schedule-request/index.d.ts +141 -0
  111. package/lib/directory-role-eligibility-schedule-request/index.js +325 -0
  112. package/lib/directory-role-member/index.d.ts +123 -0
  113. package/lib/directory-role-member/index.js +295 -0
  114. package/lib/group/index.d.ts +392 -0
  115. package/lib/group/index.js +872 -0
  116. package/lib/group-member/index.d.ts +121 -0
  117. package/lib/group-member/index.js +289 -0
  118. package/lib/group-role-management-policy/index.d.ts +1043 -0
  119. package/lib/group-role-management-policy/index.js +2775 -0
  120. package/lib/group-without-members/index.d.ts +381 -0
  121. package/lib/group-without-members/index.js +851 -0
  122. package/lib/index.d.ts +79 -0
  123. package/lib/index.js +85 -0
  124. package/lib/invitation/index.d.ts +203 -0
  125. package/lib/invitation/index.js +490 -0
  126. package/lib/lazy-index.d.ts +4 -0
  127. package/lib/lazy-index.js +82 -0
  128. package/lib/named-location/index.d.ts +212 -0
  129. package/lib/named-location/index.js +571 -0
  130. package/lib/privileged-access-group-assignment-schedule/index.d.ts +218 -0
  131. package/lib/privileged-access-group-assignment-schedule/index.js +484 -0
  132. package/lib/privileged-access-group-eligibility-schedule/index.d.ts +218 -0
  133. package/lib/privileged-access-group-eligibility-schedule/index.js +484 -0
  134. package/lib/provider/index.d.ts +289 -0
  135. package/lib/provider/index.js +549 -0
  136. package/lib/service-principal/index.d.ts +547 -0
  137. package/lib/service-principal/index.js +1305 -0
  138. package/lib/service-principal-certificate/index.d.ts +187 -0
  139. package/lib/service-principal-certificate/index.js +415 -0
  140. package/lib/service-principal-claims-mapping-policy-assignment/index.d.ts +121 -0
  141. package/lib/service-principal-claims-mapping-policy-assignment/index.js +289 -0
  142. package/lib/service-principal-delegated-permission-grant/index.d.ts +151 -0
  143. package/lib/service-principal-delegated-permission-grant/index.js +354 -0
  144. package/lib/service-principal-password/index.d.ts +176 -0
  145. package/lib/service-principal-password/index.js +384 -0
  146. package/lib/service-principal-token-signing-certificate/index.d.ts +137 -0
  147. package/lib/service-principal-token-signing-certificate/index.js +329 -0
  148. package/lib/synchronization-job/index.d.ts +177 -0
  149. package/lib/synchronization-job/index.js +424 -0
  150. package/lib/synchronization-job-provision-on-demand/index.d.ts +254 -0
  151. package/lib/synchronization-job-provision-on-demand/index.js +590 -0
  152. package/lib/synchronization-secret/index.d.ts +184 -0
  153. package/lib/synchronization-secret/index.js +449 -0
  154. package/lib/user/index.d.ts +517 -0
  155. package/lib/user/index.js +1084 -0
  156. package/lib/user-flow-attribute/index.d.ts +141 -0
  157. package/lib/user-flow-attribute/index.js +340 -0
  158. package/package.json +155 -0
@@ -0,0 +1,872 @@
1
+ "use strict";
2
+ var _a, _b, _c;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Group = exports.GroupTimeoutsOutputReference = exports.GroupDynamicMembershipOutputReference = void 0;
5
+ exports.groupDynamicMembershipToTerraform = groupDynamicMembershipToTerraform;
6
+ exports.groupDynamicMembershipToHclTerraform = groupDynamicMembershipToHclTerraform;
7
+ exports.groupTimeoutsToTerraform = groupTimeoutsToTerraform;
8
+ exports.groupTimeoutsToHclTerraform = groupTimeoutsToHclTerraform;
9
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
10
+ const cdktn = require("cdktn");
11
+ function groupDynamicMembershipToTerraform(struct) {
12
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
13
+ return struct;
14
+ }
15
+ if (cdktn.isComplexElement(struct)) {
16
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
17
+ }
18
+ return {
19
+ enabled: cdktn.booleanToTerraform(struct.enabled),
20
+ rule: cdktn.stringToTerraform(struct.rule),
21
+ };
22
+ }
23
+ function groupDynamicMembershipToHclTerraform(struct) {
24
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
25
+ return struct;
26
+ }
27
+ if (cdktn.isComplexElement(struct)) {
28
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
29
+ }
30
+ const attrs = {
31
+ enabled: {
32
+ value: cdktn.booleanToHclTerraform(struct.enabled),
33
+ isBlock: false,
34
+ type: "simple",
35
+ storageClassType: "boolean",
36
+ },
37
+ rule: {
38
+ value: cdktn.stringToHclTerraform(struct.rule),
39
+ isBlock: false,
40
+ type: "simple",
41
+ storageClassType: "string",
42
+ },
43
+ };
44
+ // remove undefined attributes
45
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
46
+ }
47
+ class GroupDynamicMembershipOutputReference extends cdktn.ComplexObject {
48
+ /**
49
+ * @param terraformResource The parent resource
50
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
51
+ */
52
+ constructor(terraformResource, terraformAttribute) {
53
+ super(terraformResource, terraformAttribute, false, 0);
54
+ this.isEmptyObject = false;
55
+ }
56
+ get internalValue() {
57
+ let hasAnyValues = this.isEmptyObject;
58
+ const internalValueResult = {};
59
+ if (this._enabled !== undefined) {
60
+ hasAnyValues = true;
61
+ internalValueResult.enabled = this._enabled;
62
+ }
63
+ if (this._rule !== undefined) {
64
+ hasAnyValues = true;
65
+ internalValueResult.rule = this._rule;
66
+ }
67
+ return hasAnyValues ? internalValueResult : undefined;
68
+ }
69
+ set internalValue(value) {
70
+ if (value === undefined) {
71
+ this.isEmptyObject = false;
72
+ this._enabled = undefined;
73
+ this._rule = undefined;
74
+ }
75
+ else {
76
+ this.isEmptyObject = Object.keys(value).length === 0;
77
+ this._enabled = value.enabled;
78
+ this._rule = value.rule;
79
+ }
80
+ }
81
+ get enabled() {
82
+ return this.getBooleanAttribute('enabled');
83
+ }
84
+ set enabled(value) {
85
+ this._enabled = value;
86
+ }
87
+ // Temporarily expose input value. Use with caution.
88
+ get enabledInput() {
89
+ return this._enabled;
90
+ }
91
+ get rule() {
92
+ return this.getStringAttribute('rule');
93
+ }
94
+ set rule(value) {
95
+ this._rule = value;
96
+ }
97
+ // Temporarily expose input value. Use with caution.
98
+ get ruleInput() {
99
+ return this._rule;
100
+ }
101
+ }
102
+ exports.GroupDynamicMembershipOutputReference = GroupDynamicMembershipOutputReference;
103
+ _a = JSII_RTTI_SYMBOL_1;
104
+ GroupDynamicMembershipOutputReference[_a] = { fqn: "@cdktn/provider-azuread.group.GroupDynamicMembershipOutputReference", version: "15.0.0" };
105
+ function groupTimeoutsToTerraform(struct) {
106
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
107
+ return struct;
108
+ }
109
+ if (cdktn.isComplexElement(struct)) {
110
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
111
+ }
112
+ return {
113
+ create: cdktn.stringToTerraform(struct.create),
114
+ delete: cdktn.stringToTerraform(struct.delete),
115
+ read: cdktn.stringToTerraform(struct.read),
116
+ update: cdktn.stringToTerraform(struct.update),
117
+ };
118
+ }
119
+ function groupTimeoutsToHclTerraform(struct) {
120
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
121
+ return struct;
122
+ }
123
+ if (cdktn.isComplexElement(struct)) {
124
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
125
+ }
126
+ const attrs = {
127
+ create: {
128
+ value: cdktn.stringToHclTerraform(struct.create),
129
+ isBlock: false,
130
+ type: "simple",
131
+ storageClassType: "string",
132
+ },
133
+ delete: {
134
+ value: cdktn.stringToHclTerraform(struct.delete),
135
+ isBlock: false,
136
+ type: "simple",
137
+ storageClassType: "string",
138
+ },
139
+ read: {
140
+ value: cdktn.stringToHclTerraform(struct.read),
141
+ isBlock: false,
142
+ type: "simple",
143
+ storageClassType: "string",
144
+ },
145
+ update: {
146
+ value: cdktn.stringToHclTerraform(struct.update),
147
+ isBlock: false,
148
+ type: "simple",
149
+ storageClassType: "string",
150
+ },
151
+ };
152
+ // remove undefined attributes
153
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
154
+ }
155
+ class GroupTimeoutsOutputReference extends cdktn.ComplexObject {
156
+ /**
157
+ * @param terraformResource The parent resource
158
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
159
+ */
160
+ constructor(terraformResource, terraformAttribute) {
161
+ super(terraformResource, terraformAttribute, false);
162
+ this.isEmptyObject = false;
163
+ }
164
+ get internalValue() {
165
+ if (this.resolvableValue) {
166
+ return this.resolvableValue;
167
+ }
168
+ let hasAnyValues = this.isEmptyObject;
169
+ const internalValueResult = {};
170
+ if (this._create !== undefined) {
171
+ hasAnyValues = true;
172
+ internalValueResult.create = this._create;
173
+ }
174
+ if (this._delete !== undefined) {
175
+ hasAnyValues = true;
176
+ internalValueResult.delete = this._delete;
177
+ }
178
+ if (this._read !== undefined) {
179
+ hasAnyValues = true;
180
+ internalValueResult.read = this._read;
181
+ }
182
+ if (this._update !== undefined) {
183
+ hasAnyValues = true;
184
+ internalValueResult.update = this._update;
185
+ }
186
+ return hasAnyValues ? internalValueResult : undefined;
187
+ }
188
+ set internalValue(value) {
189
+ if (value === undefined) {
190
+ this.isEmptyObject = false;
191
+ this.resolvableValue = undefined;
192
+ this._create = undefined;
193
+ this._delete = undefined;
194
+ this._read = undefined;
195
+ this._update = undefined;
196
+ }
197
+ else if (cdktn.Tokenization.isResolvable(value)) {
198
+ this.isEmptyObject = false;
199
+ this.resolvableValue = value;
200
+ }
201
+ else {
202
+ this.isEmptyObject = Object.keys(value).length === 0;
203
+ this.resolvableValue = undefined;
204
+ this._create = value.create;
205
+ this._delete = value.delete;
206
+ this._read = value.read;
207
+ this._update = value.update;
208
+ }
209
+ }
210
+ get create() {
211
+ return this.getStringAttribute('create');
212
+ }
213
+ set create(value) {
214
+ this._create = value;
215
+ }
216
+ resetCreate() {
217
+ this._create = undefined;
218
+ }
219
+ // Temporarily expose input value. Use with caution.
220
+ get createInput() {
221
+ return this._create;
222
+ }
223
+ get delete() {
224
+ return this.getStringAttribute('delete');
225
+ }
226
+ set delete(value) {
227
+ this._delete = value;
228
+ }
229
+ resetDelete() {
230
+ this._delete = undefined;
231
+ }
232
+ // Temporarily expose input value. Use with caution.
233
+ get deleteInput() {
234
+ return this._delete;
235
+ }
236
+ get read() {
237
+ return this.getStringAttribute('read');
238
+ }
239
+ set read(value) {
240
+ this._read = value;
241
+ }
242
+ resetRead() {
243
+ this._read = undefined;
244
+ }
245
+ // Temporarily expose input value. Use with caution.
246
+ get readInput() {
247
+ return this._read;
248
+ }
249
+ get update() {
250
+ return this.getStringAttribute('update');
251
+ }
252
+ set update(value) {
253
+ this._update = value;
254
+ }
255
+ resetUpdate() {
256
+ this._update = undefined;
257
+ }
258
+ // Temporarily expose input value. Use with caution.
259
+ get updateInput() {
260
+ return this._update;
261
+ }
262
+ }
263
+ exports.GroupTimeoutsOutputReference = GroupTimeoutsOutputReference;
264
+ _b = JSII_RTTI_SYMBOL_1;
265
+ GroupTimeoutsOutputReference[_b] = { fqn: "@cdktn/provider-azuread.group.GroupTimeoutsOutputReference", version: "15.0.0" };
266
+ /**
267
+ * Represents a {@link https://registry.terraform.io/providers/hashicorp/azuread/3.7.0/docs/resources/group azuread_group}
268
+ */
269
+ class Group extends cdktn.TerraformResource {
270
+ // ==============
271
+ // STATIC Methods
272
+ // ==============
273
+ /**
274
+ * Generates CDKTN code for importing a Group resource upon running "cdktn plan <stack-name>"
275
+ * @param scope The scope in which to define this construct
276
+ * @param importToId The construct id used in the generated config for the Group to import
277
+ * @param importFromId The id of the existing Group that should be imported. Refer to the {@link https://registry.terraform.io/providers/hashicorp/azuread/3.7.0/docs/resources/group#import import section} in the documentation of this resource for the id to use
278
+ * @param provider? Optional instance of the provider where the Group to import is found
279
+ */
280
+ static generateConfigForImport(scope, importToId, importFromId, provider) {
281
+ return new cdktn.ImportableResource(scope, importToId, { terraformResourceType: "azuread_group", importId: importFromId, provider });
282
+ }
283
+ // ===========
284
+ // INITIALIZER
285
+ // ===========
286
+ /**
287
+ * Create a new {@link https://registry.terraform.io/providers/hashicorp/azuread/3.7.0/docs/resources/group azuread_group} Resource
288
+ *
289
+ * @param scope The scope in which to define this construct
290
+ * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
291
+ * @param options GroupConfig
292
+ */
293
+ constructor(scope, id, config) {
294
+ super(scope, id, {
295
+ terraformResourceType: 'azuread_group',
296
+ terraformGeneratorMetadata: {
297
+ providerName: 'azuread',
298
+ providerVersion: '3.7.0',
299
+ providerVersionConstraint: '~> 3.0'
300
+ },
301
+ provider: config.provider,
302
+ dependsOn: config.dependsOn,
303
+ count: config.count,
304
+ lifecycle: config.lifecycle,
305
+ provisioners: config.provisioners,
306
+ connection: config.connection,
307
+ forEach: config.forEach
308
+ });
309
+ // dynamic_membership - computed: false, optional: true, required: false
310
+ this._dynamicMembership = new GroupDynamicMembershipOutputReference(this, "dynamic_membership");
311
+ // timeouts - computed: false, optional: true, required: false
312
+ this._timeouts = new GroupTimeoutsOutputReference(this, "timeouts");
313
+ this._administrativeUnitIds = config.administrativeUnitIds;
314
+ this._assignableToRole = config.assignableToRole;
315
+ this._autoSubscribeNewMembers = config.autoSubscribeNewMembers;
316
+ this._behaviors = config.behaviors;
317
+ this._description = config.description;
318
+ this._displayName = config.displayName;
319
+ this._externalSendersAllowed = config.externalSendersAllowed;
320
+ this._hideFromAddressLists = config.hideFromAddressLists;
321
+ this._hideFromOutlookClients = config.hideFromOutlookClients;
322
+ this._id = config.id;
323
+ this._mailEnabled = config.mailEnabled;
324
+ this._mailNickname = config.mailNickname;
325
+ this._members = config.members;
326
+ this._onpremisesGroupType = config.onpremisesGroupType;
327
+ this._owners = config.owners;
328
+ this._preventDuplicateNames = config.preventDuplicateNames;
329
+ this._provisioningOptions = config.provisioningOptions;
330
+ this._securityEnabled = config.securityEnabled;
331
+ this._theme = config.theme;
332
+ this._types = config.types;
333
+ this._visibility = config.visibility;
334
+ this._writebackEnabled = config.writebackEnabled;
335
+ this._dynamicMembership.internalValue = config.dynamicMembership;
336
+ this._timeouts.internalValue = config.timeouts;
337
+ }
338
+ get administrativeUnitIds() {
339
+ return cdktn.Fn.tolist(this.getListAttribute('administrative_unit_ids'));
340
+ }
341
+ set administrativeUnitIds(value) {
342
+ this._administrativeUnitIds = value;
343
+ }
344
+ resetAdministrativeUnitIds() {
345
+ this._administrativeUnitIds = undefined;
346
+ }
347
+ // Temporarily expose input value. Use with caution.
348
+ get administrativeUnitIdsInput() {
349
+ return this._administrativeUnitIds;
350
+ }
351
+ get assignableToRole() {
352
+ return this.getBooleanAttribute('assignable_to_role');
353
+ }
354
+ set assignableToRole(value) {
355
+ this._assignableToRole = value;
356
+ }
357
+ resetAssignableToRole() {
358
+ this._assignableToRole = undefined;
359
+ }
360
+ // Temporarily expose input value. Use with caution.
361
+ get assignableToRoleInput() {
362
+ return this._assignableToRole;
363
+ }
364
+ get autoSubscribeNewMembers() {
365
+ return this.getBooleanAttribute('auto_subscribe_new_members');
366
+ }
367
+ set autoSubscribeNewMembers(value) {
368
+ this._autoSubscribeNewMembers = value;
369
+ }
370
+ resetAutoSubscribeNewMembers() {
371
+ this._autoSubscribeNewMembers = undefined;
372
+ }
373
+ // Temporarily expose input value. Use with caution.
374
+ get autoSubscribeNewMembersInput() {
375
+ return this._autoSubscribeNewMembers;
376
+ }
377
+ get behaviors() {
378
+ return cdktn.Fn.tolist(this.getListAttribute('behaviors'));
379
+ }
380
+ set behaviors(value) {
381
+ this._behaviors = value;
382
+ }
383
+ resetBehaviors() {
384
+ this._behaviors = undefined;
385
+ }
386
+ // Temporarily expose input value. Use with caution.
387
+ get behaviorsInput() {
388
+ return this._behaviors;
389
+ }
390
+ get description() {
391
+ return this.getStringAttribute('description');
392
+ }
393
+ set description(value) {
394
+ this._description = value;
395
+ }
396
+ resetDescription() {
397
+ this._description = undefined;
398
+ }
399
+ // Temporarily expose input value. Use with caution.
400
+ get descriptionInput() {
401
+ return this._description;
402
+ }
403
+ get displayName() {
404
+ return this.getStringAttribute('display_name');
405
+ }
406
+ set displayName(value) {
407
+ this._displayName = value;
408
+ }
409
+ // Temporarily expose input value. Use with caution.
410
+ get displayNameInput() {
411
+ return this._displayName;
412
+ }
413
+ get externalSendersAllowed() {
414
+ return this.getBooleanAttribute('external_senders_allowed');
415
+ }
416
+ set externalSendersAllowed(value) {
417
+ this._externalSendersAllowed = value;
418
+ }
419
+ resetExternalSendersAllowed() {
420
+ this._externalSendersAllowed = undefined;
421
+ }
422
+ // Temporarily expose input value. Use with caution.
423
+ get externalSendersAllowedInput() {
424
+ return this._externalSendersAllowed;
425
+ }
426
+ get hideFromAddressLists() {
427
+ return this.getBooleanAttribute('hide_from_address_lists');
428
+ }
429
+ set hideFromAddressLists(value) {
430
+ this._hideFromAddressLists = value;
431
+ }
432
+ resetHideFromAddressLists() {
433
+ this._hideFromAddressLists = undefined;
434
+ }
435
+ // Temporarily expose input value. Use with caution.
436
+ get hideFromAddressListsInput() {
437
+ return this._hideFromAddressLists;
438
+ }
439
+ get hideFromOutlookClients() {
440
+ return this.getBooleanAttribute('hide_from_outlook_clients');
441
+ }
442
+ set hideFromOutlookClients(value) {
443
+ this._hideFromOutlookClients = value;
444
+ }
445
+ resetHideFromOutlookClients() {
446
+ this._hideFromOutlookClients = undefined;
447
+ }
448
+ // Temporarily expose input value. Use with caution.
449
+ get hideFromOutlookClientsInput() {
450
+ return this._hideFromOutlookClients;
451
+ }
452
+ get id() {
453
+ return this.getStringAttribute('id');
454
+ }
455
+ set id(value) {
456
+ this._id = value;
457
+ }
458
+ resetId() {
459
+ this._id = undefined;
460
+ }
461
+ // Temporarily expose input value. Use with caution.
462
+ get idInput() {
463
+ return this._id;
464
+ }
465
+ // mail - computed: true, optional: false, required: false
466
+ get mail() {
467
+ return this.getStringAttribute('mail');
468
+ }
469
+ get mailEnabled() {
470
+ return this.getBooleanAttribute('mail_enabled');
471
+ }
472
+ set mailEnabled(value) {
473
+ this._mailEnabled = value;
474
+ }
475
+ resetMailEnabled() {
476
+ this._mailEnabled = undefined;
477
+ }
478
+ // Temporarily expose input value. Use with caution.
479
+ get mailEnabledInput() {
480
+ return this._mailEnabled;
481
+ }
482
+ get mailNickname() {
483
+ return this.getStringAttribute('mail_nickname');
484
+ }
485
+ set mailNickname(value) {
486
+ this._mailNickname = value;
487
+ }
488
+ resetMailNickname() {
489
+ this._mailNickname = undefined;
490
+ }
491
+ // Temporarily expose input value. Use with caution.
492
+ get mailNicknameInput() {
493
+ return this._mailNickname;
494
+ }
495
+ get members() {
496
+ return cdktn.Fn.tolist(this.getListAttribute('members'));
497
+ }
498
+ set members(value) {
499
+ this._members = value;
500
+ }
501
+ resetMembers() {
502
+ this._members = undefined;
503
+ }
504
+ // Temporarily expose input value. Use with caution.
505
+ get membersInput() {
506
+ return this._members;
507
+ }
508
+ // object_id - computed: true, optional: false, required: false
509
+ get objectId() {
510
+ return this.getStringAttribute('object_id');
511
+ }
512
+ // onpremises_domain_name - computed: true, optional: false, required: false
513
+ get onpremisesDomainName() {
514
+ return this.getStringAttribute('onpremises_domain_name');
515
+ }
516
+ get onpremisesGroupType() {
517
+ return this.getStringAttribute('onpremises_group_type');
518
+ }
519
+ set onpremisesGroupType(value) {
520
+ this._onpremisesGroupType = value;
521
+ }
522
+ resetOnpremisesGroupType() {
523
+ this._onpremisesGroupType = undefined;
524
+ }
525
+ // Temporarily expose input value. Use with caution.
526
+ get onpremisesGroupTypeInput() {
527
+ return this._onpremisesGroupType;
528
+ }
529
+ // onpremises_netbios_name - computed: true, optional: false, required: false
530
+ get onpremisesNetbiosName() {
531
+ return this.getStringAttribute('onpremises_netbios_name');
532
+ }
533
+ // onpremises_sam_account_name - computed: true, optional: false, required: false
534
+ get onpremisesSamAccountName() {
535
+ return this.getStringAttribute('onpremises_sam_account_name');
536
+ }
537
+ // onpremises_security_identifier - computed: true, optional: false, required: false
538
+ get onpremisesSecurityIdentifier() {
539
+ return this.getStringAttribute('onpremises_security_identifier');
540
+ }
541
+ // onpremises_sync_enabled - computed: true, optional: false, required: false
542
+ get onpremisesSyncEnabled() {
543
+ return this.getBooleanAttribute('onpremises_sync_enabled');
544
+ }
545
+ get owners() {
546
+ return cdktn.Fn.tolist(this.getListAttribute('owners'));
547
+ }
548
+ set owners(value) {
549
+ this._owners = value;
550
+ }
551
+ resetOwners() {
552
+ this._owners = undefined;
553
+ }
554
+ // Temporarily expose input value. Use with caution.
555
+ get ownersInput() {
556
+ return this._owners;
557
+ }
558
+ // preferred_language - computed: true, optional: false, required: false
559
+ get preferredLanguage() {
560
+ return this.getStringAttribute('preferred_language');
561
+ }
562
+ get preventDuplicateNames() {
563
+ return this.getBooleanAttribute('prevent_duplicate_names');
564
+ }
565
+ set preventDuplicateNames(value) {
566
+ this._preventDuplicateNames = value;
567
+ }
568
+ resetPreventDuplicateNames() {
569
+ this._preventDuplicateNames = undefined;
570
+ }
571
+ // Temporarily expose input value. Use with caution.
572
+ get preventDuplicateNamesInput() {
573
+ return this._preventDuplicateNames;
574
+ }
575
+ get provisioningOptions() {
576
+ return cdktn.Fn.tolist(this.getListAttribute('provisioning_options'));
577
+ }
578
+ set provisioningOptions(value) {
579
+ this._provisioningOptions = value;
580
+ }
581
+ resetProvisioningOptions() {
582
+ this._provisioningOptions = undefined;
583
+ }
584
+ // Temporarily expose input value. Use with caution.
585
+ get provisioningOptionsInput() {
586
+ return this._provisioningOptions;
587
+ }
588
+ // proxy_addresses - computed: true, optional: false, required: false
589
+ get proxyAddresses() {
590
+ return this.getListAttribute('proxy_addresses');
591
+ }
592
+ get securityEnabled() {
593
+ return this.getBooleanAttribute('security_enabled');
594
+ }
595
+ set securityEnabled(value) {
596
+ this._securityEnabled = value;
597
+ }
598
+ resetSecurityEnabled() {
599
+ this._securityEnabled = undefined;
600
+ }
601
+ // Temporarily expose input value. Use with caution.
602
+ get securityEnabledInput() {
603
+ return this._securityEnabled;
604
+ }
605
+ get theme() {
606
+ return this.getStringAttribute('theme');
607
+ }
608
+ set theme(value) {
609
+ this._theme = value;
610
+ }
611
+ resetTheme() {
612
+ this._theme = undefined;
613
+ }
614
+ // Temporarily expose input value. Use with caution.
615
+ get themeInput() {
616
+ return this._theme;
617
+ }
618
+ get types() {
619
+ return cdktn.Fn.tolist(this.getListAttribute('types'));
620
+ }
621
+ set types(value) {
622
+ this._types = value;
623
+ }
624
+ resetTypes() {
625
+ this._types = undefined;
626
+ }
627
+ // Temporarily expose input value. Use with caution.
628
+ get typesInput() {
629
+ return this._types;
630
+ }
631
+ get visibility() {
632
+ return this.getStringAttribute('visibility');
633
+ }
634
+ set visibility(value) {
635
+ this._visibility = value;
636
+ }
637
+ resetVisibility() {
638
+ this._visibility = undefined;
639
+ }
640
+ // Temporarily expose input value. Use with caution.
641
+ get visibilityInput() {
642
+ return this._visibility;
643
+ }
644
+ get writebackEnabled() {
645
+ return this.getBooleanAttribute('writeback_enabled');
646
+ }
647
+ set writebackEnabled(value) {
648
+ this._writebackEnabled = value;
649
+ }
650
+ resetWritebackEnabled() {
651
+ this._writebackEnabled = undefined;
652
+ }
653
+ // Temporarily expose input value. Use with caution.
654
+ get writebackEnabledInput() {
655
+ return this._writebackEnabled;
656
+ }
657
+ get dynamicMembership() {
658
+ return this._dynamicMembership;
659
+ }
660
+ putDynamicMembership(value) {
661
+ this._dynamicMembership.internalValue = value;
662
+ }
663
+ resetDynamicMembership() {
664
+ this._dynamicMembership.internalValue = undefined;
665
+ }
666
+ // Temporarily expose input value. Use with caution.
667
+ get dynamicMembershipInput() {
668
+ return this._dynamicMembership.internalValue;
669
+ }
670
+ get timeouts() {
671
+ return this._timeouts;
672
+ }
673
+ putTimeouts(value) {
674
+ this._timeouts.internalValue = value;
675
+ }
676
+ resetTimeouts() {
677
+ this._timeouts.internalValue = undefined;
678
+ }
679
+ // Temporarily expose input value. Use with caution.
680
+ get timeoutsInput() {
681
+ return this._timeouts.internalValue;
682
+ }
683
+ // =========
684
+ // SYNTHESIS
685
+ // =========
686
+ synthesizeAttributes() {
687
+ return {
688
+ administrative_unit_ids: cdktn.listMapper(cdktn.stringToTerraform, false)(this._administrativeUnitIds),
689
+ assignable_to_role: cdktn.booleanToTerraform(this._assignableToRole),
690
+ auto_subscribe_new_members: cdktn.booleanToTerraform(this._autoSubscribeNewMembers),
691
+ behaviors: cdktn.listMapper(cdktn.stringToTerraform, false)(this._behaviors),
692
+ description: cdktn.stringToTerraform(this._description),
693
+ display_name: cdktn.stringToTerraform(this._displayName),
694
+ external_senders_allowed: cdktn.booleanToTerraform(this._externalSendersAllowed),
695
+ hide_from_address_lists: cdktn.booleanToTerraform(this._hideFromAddressLists),
696
+ hide_from_outlook_clients: cdktn.booleanToTerraform(this._hideFromOutlookClients),
697
+ id: cdktn.stringToTerraform(this._id),
698
+ mail_enabled: cdktn.booleanToTerraform(this._mailEnabled),
699
+ mail_nickname: cdktn.stringToTerraform(this._mailNickname),
700
+ members: cdktn.listMapper(cdktn.stringToTerraform, false)(this._members),
701
+ onpremises_group_type: cdktn.stringToTerraform(this._onpremisesGroupType),
702
+ owners: cdktn.listMapper(cdktn.stringToTerraform, false)(this._owners),
703
+ prevent_duplicate_names: cdktn.booleanToTerraform(this._preventDuplicateNames),
704
+ provisioning_options: cdktn.listMapper(cdktn.stringToTerraform, false)(this._provisioningOptions),
705
+ security_enabled: cdktn.booleanToTerraform(this._securityEnabled),
706
+ theme: cdktn.stringToTerraform(this._theme),
707
+ types: cdktn.listMapper(cdktn.stringToTerraform, false)(this._types),
708
+ visibility: cdktn.stringToTerraform(this._visibility),
709
+ writeback_enabled: cdktn.booleanToTerraform(this._writebackEnabled),
710
+ dynamic_membership: groupDynamicMembershipToTerraform(this._dynamicMembership.internalValue),
711
+ timeouts: groupTimeoutsToTerraform(this._timeouts.internalValue),
712
+ };
713
+ }
714
+ synthesizeHclAttributes() {
715
+ const attrs = {
716
+ administrative_unit_ids: {
717
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(this._administrativeUnitIds),
718
+ isBlock: false,
719
+ type: "set",
720
+ storageClassType: "stringList",
721
+ },
722
+ assignable_to_role: {
723
+ value: cdktn.booleanToHclTerraform(this._assignableToRole),
724
+ isBlock: false,
725
+ type: "simple",
726
+ storageClassType: "boolean",
727
+ },
728
+ auto_subscribe_new_members: {
729
+ value: cdktn.booleanToHclTerraform(this._autoSubscribeNewMembers),
730
+ isBlock: false,
731
+ type: "simple",
732
+ storageClassType: "boolean",
733
+ },
734
+ behaviors: {
735
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(this._behaviors),
736
+ isBlock: false,
737
+ type: "set",
738
+ storageClassType: "stringList",
739
+ },
740
+ description: {
741
+ value: cdktn.stringToHclTerraform(this._description),
742
+ isBlock: false,
743
+ type: "simple",
744
+ storageClassType: "string",
745
+ },
746
+ display_name: {
747
+ value: cdktn.stringToHclTerraform(this._displayName),
748
+ isBlock: false,
749
+ type: "simple",
750
+ storageClassType: "string",
751
+ },
752
+ external_senders_allowed: {
753
+ value: cdktn.booleanToHclTerraform(this._externalSendersAllowed),
754
+ isBlock: false,
755
+ type: "simple",
756
+ storageClassType: "boolean",
757
+ },
758
+ hide_from_address_lists: {
759
+ value: cdktn.booleanToHclTerraform(this._hideFromAddressLists),
760
+ isBlock: false,
761
+ type: "simple",
762
+ storageClassType: "boolean",
763
+ },
764
+ hide_from_outlook_clients: {
765
+ value: cdktn.booleanToHclTerraform(this._hideFromOutlookClients),
766
+ isBlock: false,
767
+ type: "simple",
768
+ storageClassType: "boolean",
769
+ },
770
+ id: {
771
+ value: cdktn.stringToHclTerraform(this._id),
772
+ isBlock: false,
773
+ type: "simple",
774
+ storageClassType: "string",
775
+ },
776
+ mail_enabled: {
777
+ value: cdktn.booleanToHclTerraform(this._mailEnabled),
778
+ isBlock: false,
779
+ type: "simple",
780
+ storageClassType: "boolean",
781
+ },
782
+ mail_nickname: {
783
+ value: cdktn.stringToHclTerraform(this._mailNickname),
784
+ isBlock: false,
785
+ type: "simple",
786
+ storageClassType: "string",
787
+ },
788
+ members: {
789
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(this._members),
790
+ isBlock: false,
791
+ type: "set",
792
+ storageClassType: "stringList",
793
+ },
794
+ onpremises_group_type: {
795
+ value: cdktn.stringToHclTerraform(this._onpremisesGroupType),
796
+ isBlock: false,
797
+ type: "simple",
798
+ storageClassType: "string",
799
+ },
800
+ owners: {
801
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(this._owners),
802
+ isBlock: false,
803
+ type: "set",
804
+ storageClassType: "stringList",
805
+ },
806
+ prevent_duplicate_names: {
807
+ value: cdktn.booleanToHclTerraform(this._preventDuplicateNames),
808
+ isBlock: false,
809
+ type: "simple",
810
+ storageClassType: "boolean",
811
+ },
812
+ provisioning_options: {
813
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(this._provisioningOptions),
814
+ isBlock: false,
815
+ type: "set",
816
+ storageClassType: "stringList",
817
+ },
818
+ security_enabled: {
819
+ value: cdktn.booleanToHclTerraform(this._securityEnabled),
820
+ isBlock: false,
821
+ type: "simple",
822
+ storageClassType: "boolean",
823
+ },
824
+ theme: {
825
+ value: cdktn.stringToHclTerraform(this._theme),
826
+ isBlock: false,
827
+ type: "simple",
828
+ storageClassType: "string",
829
+ },
830
+ types: {
831
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(this._types),
832
+ isBlock: false,
833
+ type: "set",
834
+ storageClassType: "stringList",
835
+ },
836
+ visibility: {
837
+ value: cdktn.stringToHclTerraform(this._visibility),
838
+ isBlock: false,
839
+ type: "simple",
840
+ storageClassType: "string",
841
+ },
842
+ writeback_enabled: {
843
+ value: cdktn.booleanToHclTerraform(this._writebackEnabled),
844
+ isBlock: false,
845
+ type: "simple",
846
+ storageClassType: "boolean",
847
+ },
848
+ dynamic_membership: {
849
+ value: groupDynamicMembershipToHclTerraform(this._dynamicMembership.internalValue),
850
+ isBlock: true,
851
+ type: "list",
852
+ storageClassType: "GroupDynamicMembershipList",
853
+ },
854
+ timeouts: {
855
+ value: groupTimeoutsToHclTerraform(this._timeouts.internalValue),
856
+ isBlock: true,
857
+ type: "struct",
858
+ storageClassType: "GroupTimeouts",
859
+ },
860
+ };
861
+ // remove undefined attributes
862
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
863
+ }
864
+ }
865
+ exports.Group = Group;
866
+ _c = JSII_RTTI_SYMBOL_1;
867
+ Group[_c] = { fqn: "@cdktn/provider-azuread.group.Group", version: "15.0.0" };
868
+ // =================
869
+ // STATIC PROPERTIES
870
+ // =================
871
+ Group.tfResourceType = "azuread_group";
872
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ3JvdXAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQTZLQSw4RUFTQztBQUdELG9GQXNCQztBQXFGRCw0REFXQztBQUdELGtFQWtDQzs7QUEzVUQsK0JBQStCO0FBb0svQixTQUFnQixpQ0FBaUMsQ0FBQyxNQUF1RTtJQUN2SCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2xELElBQUksRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLElBQUksQ0FBQztLQUM1QyxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLG9DQUFvQyxDQUFDLE1BQXVFO0lBQzFILElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHO1FBQ1osT0FBTyxFQUFFO1lBQ1AsS0FB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YixJQUFJLEVBQUUsUUFBUTtnQkFDZCxnQkFBZ0IsRUFBRSxlQUFlO2FBQ2xDO1NBQ0YsQ0FBQztRQUVGLDhCQUE4QjtRQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBRSxDQUFDLENBQUE7SUFDNUgsQ0FBQzs7QUEvcUJILHNCQWdyQkM7OztBQTlxQkMsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDRyxvQkFBYyxHQUFHLGVBQWUsQUFBbEIsQ0FBbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAyMSwgMjAyNlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG4vLyBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvZ3JvdXBcbi8vIGdlbmVyYXRlZCBmcm9tIHRlcnJhZm9ybSByZXNvdXJjZSBzY2hlbWFcblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBjZGt0biBmcm9tICdjZGt0bic7XG5cbi8vIENvbmZpZ3VyYXRpb25cblxuZXhwb3J0IGludGVyZmFjZSBHcm91cENvbmZpZyBleHRlbmRzIGNka3RuLlRlcnJhZm9ybU1ldGFBcmd1bWVudHMge1xuICAvKipcbiAgKiBUaGUgYWRtaW5pc3RyYXRpdmUgdW5pdCBJRHMgaW4gd2hpY2ggdGhlIGdyb3VwIHNob3VsZCBiZS4gSWYgZW1wdHksIHRoZSBncm91cCB3aWxsIGJlIGNyZWF0ZWQgYXQgdGhlIHRlbmFudCBsZXZlbC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2dyb3VwI2FkbWluaXN0cmF0aXZlX3VuaXRfaWRzIEdyb3VwI2FkbWluaXN0cmF0aXZlX3VuaXRfaWRzfVxuICAqL1xuICByZWFkb25seSBhZG1pbmlzdHJhdGl2ZVVuaXRJZHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBncm91cCBjYW4gYmUgYXNzaWduZWQgdG8gYW4gQXp1cmUgQWN0aXZlIERpcmVjdG9yeSByb2xlLiBUaGlzIHByb3BlcnR5IGNhbiBvbmx5IGJlIGB0cnVlYCBmb3Igc2VjdXJpdHktZW5hYmxlZCBncm91cHMuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCNhc3NpZ25hYmxlX3RvX3JvbGUgR3JvdXAjYXNzaWduYWJsZV90b19yb2xlfVxuICAqL1xuICByZWFkb25seSBhc3NpZ25hYmxlVG9Sb2xlPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBJbmRpY2F0ZXMgd2hldGhlciBuZXcgbWVtYmVycyBhZGRlZCB0byB0aGUgZ3JvdXAgd2lsbCBiZSBhdXRvLXN1YnNjcmliZWQgdG8gcmVjZWl2ZSBlbWFpbCBub3RpZmljYXRpb25zLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvZ3JvdXAjYXV0b19zdWJzY3JpYmVfbmV3X21lbWJlcnMgR3JvdXAjYXV0b19zdWJzY3JpYmVfbmV3X21lbWJlcnN9XG4gICovXG4gIHJlYWRvbmx5IGF1dG9TdWJzY3JpYmVOZXdNZW1iZXJzPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGUgZ3JvdXAgYmVoYXZpb3VycyBmb3IgYSBNaWNyb3NvZnQgMzY1IGdyb3VwXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCNiZWhhdmlvcnMgR3JvdXAjYmVoYXZpb3JzfVxuICAqL1xuICByZWFkb25seSBiZWhhdmlvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogVGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgZ3JvdXBcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2dyb3VwI2Rlc2NyaXB0aW9uIEdyb3VwI2Rlc2NyaXB0aW9ufVxuICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICogVGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhlIGdyb3VwXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCNkaXNwbGF5X25hbWUgR3JvdXAjZGlzcGxheV9uYW1lfVxuICAqL1xuICByZWFkb25seSBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICAvKipcbiAgKiBJbmRpY2F0ZXMgd2hldGhlciBwZW9wbGUgZXh0ZXJuYWwgdG8gdGhlIG9yZ2FuaXphdGlvbiBjYW4gc2VuZCBtZXNzYWdlcyB0byB0aGUgZ3JvdXAuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCNleHRlcm5hbF9zZW5kZXJzX2FsbG93ZWQgR3JvdXAjZXh0ZXJuYWxfc2VuZGVyc19hbGxvd2VkfVxuICAqL1xuICByZWFkb25seSBleHRlcm5hbFNlbmRlcnNBbGxvd2VkPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZ3JvdXAgaXMgZGlzcGxheWVkIGluIGNlcnRhaW4gcGFydHMgb2YgdGhlIE91dGxvb2sgdXNlciBpbnRlcmZhY2U6IGluIHRoZSBBZGRyZXNzIEJvb2ssIGluIGFkZHJlc3MgbGlzdHMgZm9yIHNlbGVjdGluZyBtZXNzYWdlIHJlY2lwaWVudHMsIGFuZCBpbiB0aGUgQnJvd3NlIEdyb3VwcyBkaWFsb2cgZm9yIHNlYXJjaGluZyBncm91cHMuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCNoaWRlX2Zyb21fYWRkcmVzc19saXN0cyBHcm91cCNoaWRlX2Zyb21fYWRkcmVzc19saXN0c31cbiAgKi9cbiAgcmVhZG9ubHkgaGlkZUZyb21BZGRyZXNzTGlzdHM/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBncm91cCBpcyBkaXNwbGF5ZWQgaW4gT3V0bG9vayBjbGllbnRzLCBzdWNoIGFzIE91dGxvb2sgZm9yIFdpbmRvd3MgYW5kIE91dGxvb2sgb24gdGhlIHdlYi5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2dyb3VwI2hpZGVfZnJvbV9vdXRsb29rX2NsaWVudHMgR3JvdXAjaGlkZV9mcm9tX291dGxvb2tfY2xpZW50c31cbiAgKi9cbiAgcmVhZG9ubHkgaGlkZUZyb21PdXRsb29rQ2xpZW50cz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvZ3JvdXAjaWQgR3JvdXAjaWR9XG4gICpcbiAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCB0aGUgaWQgZmllbGQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgcmVzb3VyY2VzIGluIFRlcnJhZm9ybSBwcm92aWRlcnMgdXNpbmcgYSBUZXJyYWZvcm0gcHJvdmlkZXIgU0RLIHZlcnNpb24gYmVsb3cgMi5cbiAgKiBJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyBzZXR0aW5nIHRoaXMgdmFsdWUgaXQgbWlnaHQgbm90IGJlIHNldHRhYmxlLiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgdGhlIHByb3ZpZGVyIGRvY3VtZW50YXRpb24gdG8gZW5zdXJlIGl0IHNob3VsZCBiZSBzZXR0YWJsZS5cbiAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFdoZXRoZXIgdGhlIGdyb3VwIGlzIGEgbWFpbCBlbmFibGVkLCB3aXRoIGEgc2hhcmVkIGdyb3VwIG1haWxib3guIEF0IGxlYXN0IG9uZSBvZiBgbWFpbF9lbmFibGVkYCBvciBgc2VjdXJpdHlfZW5hYmxlZGAgbXVzdCBiZSBzcGVjaWZpZWQuIEEgZ3JvdXAgY2FuIGJlIG1haWwgZW5hYmxlZCBfYW5kXyBzZWN1cml0eSBlbmFibGVkXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCNtYWlsX2VuYWJsZWQgR3JvdXAjbWFpbF9lbmFibGVkfVxuICAqL1xuICByZWFkb25seSBtYWlsRW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogVGhlIG1haWwgYWxpYXMgZm9yIHRoZSBncm91cCwgdW5pcXVlIGluIHRoZSBvcmdhbmlzYXRpb25cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2dyb3VwI21haWxfbmlja25hbWUgR3JvdXAjbWFpbF9uaWNrbmFtZX1cbiAgKi9cbiAgcmVhZG9ubHkgbWFpbE5pY2tuYW1lPzogc3RyaW5nO1xuICAvKipcbiAgKiBBIHNldCBvZiBtZW1iZXJzIHdobyBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGlzIGdyb3VwLiBTdXBwb3J0ZWQgb2JqZWN0IHR5cGVzIGFyZSBVc2VycywgR3JvdXBzIG9yIFNlcnZpY2UgUHJpbmNpcGFsc1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvZ3JvdXAjbWVtYmVycyBHcm91cCNtZW1iZXJzfVxuICAqL1xuICByZWFkb25seSBtZW1iZXJzPzogc3RyaW5nW107XG4gIC8qKlxuICAqIEluZGljYXRlcyB0aGUgdGFyZ2V0IG9uLXByZW1pc2UgZ3JvdXAgdHlwZSB0aGUgZ3JvdXAgd2lsbCBiZSB3cml0dGVuIGJhY2sgYXNcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2dyb3VwI29ucHJlbWlzZXNfZ3JvdXBfdHlwZSBHcm91cCNvbnByZW1pc2VzX2dyb3VwX3R5cGV9XG4gICovXG4gIHJlYWRvbmx5IG9ucHJlbWlzZXNHcm91cFR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIEEgc2V0IG9mIG93bmVycyB3aG8gb3duIHRoaXMgZ3JvdXAuIFN1cHBvcnRlZCBvYmplY3QgdHlwZXMgYXJlIFVzZXJzIG9yIFNlcnZpY2UgUHJpbmNpcGFsc1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvZ3JvdXAjb3duZXJzIEdyb3VwI293bmVyc31cbiAgKi9cbiAgcmVhZG9ubHkgb3duZXJzPzogc3RyaW5nW107XG4gIC8qKlxuICAqIElmIGB0cnVlYCwgd2lsbCByZXR1cm4gYW4gZXJyb3IgaWYgYW4gZXhpc3RpbmcgZ3JvdXAgaXMgZm91bmQgd2l0aCB0aGUgc2FtZSBuYW1lXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCNwcmV2ZW50X2R1cGxpY2F0ZV9uYW1lcyBHcm91cCNwcmV2ZW50X2R1cGxpY2F0ZV9uYW1lc31cbiAgKi9cbiAgcmVhZG9ubHkgcHJldmVudER1cGxpY2F0ZU5hbWVzPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGUgZ3JvdXAgcHJvdmlzaW9uaW5nIG9wdGlvbnMgZm9yIGEgTWljcm9zb2Z0IDM2NSBncm91cFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvZ3JvdXAjcHJvdmlzaW9uaW5nX29wdGlvbnMgR3JvdXAjcHJvdmlzaW9uaW5nX29wdGlvbnN9XG4gICovXG4gIHJlYWRvbmx5IHByb3Zpc2lvbmluZ09wdGlvbnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogV2hldGhlciB0aGUgZ3JvdXAgaXMgYSBzZWN1cml0eSBncm91cCBmb3IgY29udHJvbGxpbmcgYWNjZXNzIHRvIGluLWFwcCByZXNvdXJjZXMuIEF0IGxlYXN0IG9uZSBvZiBgc2VjdXJpdHlfZW5hYmxlZGAgb3IgYG1haWxfZW5hYmxlZGAgbXVzdCBiZSBzcGVjaWZpZWQuIEEgZ3JvdXAgY2FuIGJlIHNlY3VyaXR5IGVuYWJsZWQgX2FuZF8gbWFpbCBlbmFibGVkXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCNzZWN1cml0eV9lbmFibGVkIEdyb3VwI3NlY3VyaXR5X2VuYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5RW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogVGhlIGNvbG91ciB0aGVtZSBmb3IgYSBNaWNyb3NvZnQgMzY1IGdyb3VwXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCN0aGVtZSBHcm91cCN0aGVtZX1cbiAgKi9cbiAgcmVhZG9ubHkgdGhlbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIEEgc2V0IG9mIGdyb3VwIHR5cGVzIHRvIGNvbmZpZ3VyZSBmb3IgdGhlIGdyb3VwLiBgVW5pZmllZGAgc3BlY2lmaWVzIGEgTWljcm9zb2Z0IDM2NSBncm91cC4gUmVxdWlyZWQgd2hlbiBgbWFpbF9lbmFibGVkYCBpcyB0cnVlXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCN0eXBlcyBHcm91cCN0eXBlc31cbiAgKi9cbiAgcmVhZG9ubHkgdHlwZXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogU3BlY2lmaWVzIHRoZSBncm91cCBqb2luIHBvbGljeSBhbmQgZ3JvdXAgY29udGVudCB2aXNpYmlsaXR5XG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCN2aXNpYmlsaXR5IEdyb3VwI3Zpc2liaWxpdHl9XG4gICovXG4gIHJlYWRvbmx5IHZpc2liaWxpdHk/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFdoZXRoZXIgdGhpcyBncm91cCBzaG91bGQgYmUgc3luY2VkIGZyb20gQXp1cmUgQUQgdG8gdGhlIG9uLXByZW1pc2VzIGRpcmVjdG9yeSB3aGVuIEF6dXJlIEFEIENvbm5lY3QgaXMgdXNlZFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvZ3JvdXAjd3JpdGViYWNrX2VuYWJsZWQgR3JvdXAjd3JpdGViYWNrX2VuYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IHdyaXRlYmFja0VuYWJsZWQ/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIGR5bmFtaWNfbWVtYmVyc2hpcCBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvZ3JvdXAjZHluYW1pY19tZW1iZXJzaGlwIEdyb3VwI2R5bmFtaWNfbWVtYmVyc2hpcH1cbiAgKi9cbiAgcmVhZG9ubHkgZHluYW1pY01lbWJlcnNoaXA/OiBHcm91cER5bmFtaWNNZW1iZXJzaGlwO1xuICAvKipcbiAgKiB0aW1lb3V0cyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvZ3JvdXAjdGltZW91dHMgR3JvdXAjdGltZW91dHN9XG4gICovXG4gIHJlYWRvbmx5IHRpbWVvdXRzPzogR3JvdXBUaW1lb3V0cztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBEeW5hbWljTWVtYmVyc2hpcCB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2dyb3VwI2VuYWJsZWQgR3JvdXAjZW5hYmxlZH1cbiAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZDogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBSdWxlIHRvIGRldGVybWluZSBtZW1iZXJzIGZvciBhIGR5bmFtaWMgZ3JvdXAuIFJlcXVpcmVkIHdoZW4gYGdyb3VwX3R5cGVzYCBjb250YWlucyAnRHluYW1pY01lbWJlcnNoaXAnXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCNydWxlIEdyb3VwI3J1bGV9XG4gICovXG4gIHJlYWRvbmx5IHJ1bGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwRHluYW1pY01lbWJlcnNoaXBUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBHcm91cER5bmFtaWNNZW1iZXJzaGlwT3V0cHV0UmVmZXJlbmNlIHwgR3JvdXBEeW5hbWljTWVtYmVyc2hpcCk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5lbmFibGVkKSxcbiAgICBydWxlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnJ1bGUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwRHluYW1pY01lbWJlcnNoaXBUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBHcm91cER5bmFtaWNNZW1iZXJzaGlwT3V0cHV0UmVmZXJlbmNlIHwgR3JvdXBEeW5hbWljTWVtYmVyc2hpcCk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZW5hYmxlZDoge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmVuYWJsZWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBydWxlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5ydWxlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIEdyb3VwRHluYW1pY01lbWJlcnNoaXBPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IEdyb3VwRHluYW1pY01lbWJlcnNoaXAgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZW5hYmxlZCA9IHRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9ydWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnJ1bGUgPSB0aGlzLl9ydWxlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogR3JvdXBEeW5hbWljTWVtYmVyc2hpcCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9ydWxlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9lbmFibGVkID0gdmFsdWUuZW5hYmxlZDtcbiAgICAgIHRoaXMuX3J1bGUgPSB2YWx1ZS5ydWxlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVuYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgZW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdlbmFibGVkJyk7XG4gIH1cbiAgcHVibGljIHNldCBlbmFibGVkKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9lbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIC8vIHJ1bGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfcnVsZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcnVsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3J1bGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJ1bGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3J1bGUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcnVsZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9ydWxlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwVGltZW91dHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCNjcmVhdGUgR3JvdXAjY3JlYXRlfVxuICAqL1xuICByZWFkb25seSBjcmVhdGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2dyb3VwI2RlbGV0ZSBHcm91cCNkZWxldGV9XG4gICovXG4gIHJlYWRvbmx5IGRlbGV0ZT86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvZ3JvdXAjcmVhZCBHcm91cCNyZWFkfVxuICAqL1xuICByZWFkb25seSByZWFkPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9ncm91cCN1cGRhdGUgR3JvdXAjdXBkYXRlfVxuICAqL1xuICByZWFkb25seSB1cGRhdGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFRpbWVvdXRzVG9UZXJyYWZvcm0oc3RydWN0PzogR3JvdXBUaW1lb3V0cyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5jcmVhdGUpLFxuICAgIGRlbGV0ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5kZWxldGUpLFxuICAgIHJlYWQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucmVhZCksXG4gICAgdXBkYXRlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnVwZGF0ZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBUaW1lb3V0c1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IEdyb3VwVGltZW91dHMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgY3JlYXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jcmVhdGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGRlbGV0ZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGVsZXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICByZWFkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5yZWFkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB1cGRhdGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnVwZGF0ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBHcm91cFRpbWVvdXRzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc29sdmFibGVWYWx1ZT86IGNka3RuLklSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBHcm91cFRpbWVvdXRzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jcmVhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY3JlYXRlID0gdGhpcy5fY3JlYXRlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRlbGV0ZSA9IHRoaXMuX2RlbGV0ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlYWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucmVhZCA9IHRoaXMuX3JlYWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl91cGRhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudXBkYXRlID0gdGhpcy5fdXBkYXRlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogR3JvdXBUaW1lb3V0cyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jcmVhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kZWxldGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9yZWFkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdXBkYXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NyZWF0ZSA9IHZhbHVlLmNyZWF0ZTtcbiAgICAgIHRoaXMuX2RlbGV0ZSA9IHZhbHVlLmRlbGV0ZTtcbiAgICAgIHRoaXMuX3JlYWQgPSB2YWx1ZS5yZWFkO1xuICAgICAgdGhpcy5fdXBkYXRlID0gdmFsdWUudXBkYXRlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNyZWF0ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jcmVhdGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGNyZWF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2NyZWF0ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgY3JlYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jcmVhdGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDcmVhdGUoKSB7XG4gICAgdGhpcy5fY3JlYXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjcmVhdGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlO1xuICB9XG5cbiAgLy8gZGVsZXRlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2RlbGV0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGVsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGVsZXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCBkZWxldGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RlbGV0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERlbGV0ZSgpIHtcbiAgICB0aGlzLl9kZWxldGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRlbGV0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kZWxldGU7XG4gIH1cblxuICAvLyByZWFkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3JlYWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHJlYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdyZWFkJyk7XG4gIH1cbiAgcHVibGljIHNldCByZWFkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yZWFkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UmVhZCgpIHtcbiAgICB0aGlzLl9yZWFkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByZWFkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWQ7XG4gIH1cblxuICAvLyB1cGRhdGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdXBkYXRlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB1cGRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd1cGRhdGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHVwZGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdXBkYXRlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VXBkYXRlKCkge1xuICAgIHRoaXMuX3VwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdXBkYXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZTtcbiAgfVxufVxuXG4vKipcbiogUmVwcmVzZW50cyBhIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvZ3JvdXAgYXp1cmVhZF9ncm91cH1cbiovXG5leHBvcnQgY2xhc3MgR3JvdXAgZXh0ZW5kcyBjZGt0bi5UZXJyYWZvcm1SZXNvdXJjZSB7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT1cbiAgLy8gU1RBVElDIFBST1BFUlRJRVNcbiAgLy8gPT09PT09PT09PT09PT09PT1cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZlJlc291cmNlVHlwZSA9IFwiYXp1cmVhZF9ncm91cFwiO1xuXG4gIC8vID09PT09PT09PT09PT09XG4gIC8vIFNUQVRJQyBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09XG4gIC8qKlxuICAqIEdlbmVyYXRlcyBDREtUTiBjb2RlIGZvciBpbXBvcnRpbmcgYSBHcm91cCByZXNvdXJjZSB1cG9uIHJ1bm5pbmcgXCJjZGt0biBwbGFuIDxzdGFjay1uYW1lPlwiXG4gICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgKiBAcGFyYW0gaW1wb3J0VG9JZCBUaGUgY29uc3RydWN0IGlkIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBjb25maWcgZm9yIHRoZSBHcm91cCB0byBpbXBvcnRcbiAgKiBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgR3JvdXAgdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQuIFJlZmVyIHRvIHRoZSB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2dyb3VwI2ltcG9ydCBpbXBvcnQgc2VjdGlvbn0gaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhpcyByZXNvdXJjZSBmb3IgdGhlIGlkIHRvIHVzZVxuICAqIEBwYXJhbSBwcm92aWRlcj8gT3B0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVyIHdoZXJlIHRoZSBHcm91cCB0byBpbXBvcnQgaXMgZm91bmRcbiAgKi9cbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUNvbmZpZ0ZvckltcG9ydChzY29wZTogQ29uc3RydWN0LCBpbXBvcnRUb0lkOiBzdHJpbmcsIGltcG9ydEZyb21JZDogc3RyaW5nLCBwcm92aWRlcj86IGNka3RuLlRlcnJhZm9ybVByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2RrdG4uSW1wb3J0YWJsZVJlc291cmNlKHNjb3BlLCBpbXBvcnRUb0lkLCB7IHRlcnJhZm9ybVJlc291cmNlVHlwZTogXCJhenVyZWFkX2dyb3VwXCIsIGltcG9ydElkOiBpbXBvcnRGcm9tSWQsIHByb3ZpZGVyIH0pO1xuICAgICAgfVxuXG4gIC8vID09PT09PT09PT09XG4gIC8vIElOSVRJQUxJWkVSXG4gIC8vID09PT09PT09PT09XG5cbiAgLyoqXG4gICogQ3JlYXRlIGEgbmV3IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvZ3JvdXAgYXp1cmVhZF9ncm91cH0gUmVzb3VyY2VcbiAgKlxuICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICogQHBhcmFtIGlkIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSBhbW9uZ3N0IHNpYmxpbmdzIGluIHRoZSBzYW1lIHNjb3BlXG4gICogQHBhcmFtIG9wdGlvbnMgR3JvdXBDb25maWdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbmZpZzogR3JvdXBDb25maWcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHRlcnJhZm9ybVJlc291cmNlVHlwZTogJ2F6dXJlYWRfZ3JvdXAnLFxuICAgICAgdGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXJOYW1lOiAnYXp1cmVhZCcsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbjogJzMuNy4wJyxcbiAgICAgICAgcHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludDogJ34+IDMuMCdcbiAgICAgIH0sXG4gICAgICBwcm92aWRlcjogY29uZmlnLnByb3ZpZGVyLFxuICAgICAgZGVwZW5kc09uOiBjb25maWcuZGVwZW5kc09uLFxuICAgICAgY291bnQ6IGNvbmZpZy5jb3VudCxcbiAgICAgIGxpZmVjeWNsZTogY29uZmlnLmxpZmVjeWNsZSxcbiAgICAgIHByb3Zpc2lvbmVyczogY29uZmlnLnByb3Zpc2lvbmVycyxcbiAgICAgIGNvbm5lY3Rpb246IGNvbmZpZy5jb25uZWN0aW9uLFxuICAgICAgZm9yRWFjaDogY29uZmlnLmZvckVhY2hcbiAgICB9KTtcbiAgICB0aGlzLl9hZG1pbmlzdHJhdGl2ZVVuaXRJZHMgPSBjb25maWcuYWRtaW5pc3RyYXRpdmVVbml0SWRzO1xuICAgIHRoaXMuX2Fzc2lnbmFibGVUb1JvbGUgPSBjb25maWcuYXNzaWduYWJsZVRvUm9sZTtcbiAgICB0aGlzLl9hdXRvU3Vic2NyaWJlTmV3TWVtYmVycyA9IGNvbmZpZy5hdXRvU3Vic2NyaWJlTmV3TWVtYmVycztcbiAgICB0aGlzLl9iZWhhdmlvcnMgPSBjb25maWcuYmVoYXZpb3JzO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gY29uZmlnLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2Rpc3BsYXlOYW1lID0gY29uZmlnLmRpc3BsYXlOYW1lO1xuICAgIHRoaXMuX2V4dGVybmFsU2VuZGVyc0FsbG93ZWQgPSBjb25maWcuZXh0ZXJuYWxTZW5kZXJzQWxsb3dlZDtcbiAgICB0aGlzLl9oaWRlRnJvbUFkZHJlc3NMaXN0cyA9IGNvbmZpZy5oaWRlRnJvbUFkZHJlc3NMaXN0cztcbiAgICB0aGlzLl9oaWRlRnJvbU91dGxvb2tDbGllbnRzID0gY29uZmlnLmhpZGVGcm9tT3V0bG9va0NsaWVudHM7XG4gICAgdGhpcy5faWQgPSBjb25maWcuaWQ7XG4gICAgdGhpcy5fbWFpbEVuYWJsZWQgPSBjb25maWcubWFpbEVuYWJsZWQ7XG4gICAgdGhpcy5fbWFpbE5pY2tuYW1lID0gY29uZmlnLm1haWxOaWNrbmFtZTtcbiAgICB0aGlzLl9tZW1iZXJzID0gY29uZmlnLm1lbWJlcnM7XG4gICAgdGhpcy5fb25wcmVtaXNlc0dyb3VwVHlwZSA9IGNvbmZpZy5vbnByZW1pc2VzR3JvdXBUeXBlO1xuICAgIHRoaXMuX293bmVycyA9IGNvbmZpZy5vd25lcnM7XG4gICAgdGhpcy5fcHJldmVudER1cGxpY2F0ZU5hbWVzID0gY29uZmlnLnByZXZlbnREdXBsaWNhdGVOYW1lcztcbiAgICB0aGlzLl9wcm92aXNpb25pbmdPcHRpb25zID0gY29uZmlnLnByb3Zpc2lvbmluZ09wdGlvbnM7XG4gICAgdGhpcy5fc2VjdXJpdHlFbmFibGVkID0gY29uZmlnLnNlY3VyaXR5RW5hYmxlZDtcbiAgICB0aGlzLl90aGVtZSA9IGNvbmZpZy50aGVtZTtcbiAgICB0aGlzLl90eXBlcyA9IGNvbmZpZy50eXBlcztcbiAgICB0aGlzLl92aXNpYmlsaXR5ID0gY29uZmlnLnZpc2liaWxpdHk7XG4gICAgdGhpcy5fd3JpdGViYWNrRW5hYmxlZCA9IGNvbmZpZy53cml0ZWJhY2tFbmFibGVkO1xuICAgIHRoaXMuX2R5bmFtaWNNZW1iZXJzaGlwLmludGVybmFsVmFsdWUgPSBjb25maWcuZHluYW1pY01lbWJlcnNoaXA7XG4gICAgdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy50aW1lb3V0cztcbiAgfVxuXG4gIC8vID09PT09PT09PT1cbiAgLy8gQVRUUklCVVRFU1xuICAvLyA9PT09PT09PT09XG5cbiAgLy8gYWRtaW5pc3RyYXRpdmVfdW5pdF9pZHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYWRtaW5pc3RyYXRpdmVVbml0SWRzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGFkbWluaXN0cmF0aXZlVW5pdElkcygpIHtcbiAgICByZXR1cm4gY2RrdG4uRm4udG9saXN0KHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnYWRtaW5pc3RyYXRpdmVfdW5pdF9pZHMnKSk7XG4gIH1cbiAgcHVibGljIHNldCBhZG1pbmlzdHJhdGl2ZVVuaXRJZHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fYWRtaW5pc3RyYXRpdmVVbml0SWRzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QWRtaW5pc3RyYXRpdmVVbml0SWRzKCkge1xuICAgIHRoaXMuX2FkbWluaXN0cmF0aXZlVW5pdElkcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYWRtaW5pc3RyYXRpdmVVbml0SWRzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkbWluaXN0cmF0aXZlVW5pdElkcztcbiAgfVxuXG4gIC8vIGFzc2lnbmFibGVfdG9fcm9sZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hc3NpZ25hYmxlVG9Sb2xlPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBhc3NpZ25hYmxlVG9Sb2xlKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2Fzc2lnbmFibGVfdG9fcm9sZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXNzaWduYWJsZVRvUm9sZSh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fYXNzaWduYWJsZVRvUm9sZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEFzc2lnbmFibGVUb1JvbGUoKSB7XG4gICAgdGhpcy5fYXNzaWduYWJsZVRvUm9sZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXNzaWduYWJsZVRvUm9sZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hc3NpZ25hYmxlVG9Sb2xlO1xuICB9XG5cbiAgLy8gYXV0b19zdWJzY3JpYmVfbmV3X21lbWJlcnMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hdXRvU3Vic2NyaWJlTmV3TWVtYmVycz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgYXV0b1N1YnNjcmliZU5ld01lbWJlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnYXV0b19zdWJzY3JpYmVfbmV3X21lbWJlcnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGF1dG9TdWJzY3JpYmVOZXdNZW1iZXJzKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9hdXRvU3Vic2NyaWJlTmV3TWVtYmVycyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF1dG9TdWJzY3JpYmVOZXdNZW1iZXJzKCkge1xuICAgIHRoaXMuX2F1dG9TdWJzY3JpYmVOZXdNZW1iZXJzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhdXRvU3Vic2NyaWJlTmV3TWVtYmVyc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hdXRvU3Vic2NyaWJlTmV3TWVtYmVycztcbiAgfVxuXG4gIC8vIGJlaGF2aW9ycyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9iZWhhdmlvcnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgYmVoYXZpb3JzKCkge1xuICAgIHJldHVybiBjZGt0bi5Gbi50b2xpc3QodGhpcy5nZXRMaXN0QXR0cmlidXRlKCdiZWhhdmlvcnMnKSk7XG4gIH1cbiAgcHVibGljIHNldCBiZWhhdmlvcnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fYmVoYXZpb3JzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QmVoYXZpb3JzKCkge1xuICAgIHRoaXMuX2JlaGF2aW9ycyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYmVoYXZpb3JzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JlaGF2aW9ycztcbiAgfVxuXG4gIC8vIGRlc2NyaXB0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Rlc2NyaXB0aW9uPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2Rlc2NyaXB0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBkZXNjcmlwdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXREZXNjcmlwdGlvbigpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XG4gIH1cblxuICAvLyBkaXNwbGF5X25hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZGlzcGxheU5hbWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGRpc3BsYXlOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGlzcGxheV9uYW1lJyk7XG4gIH1cbiAgcHVibGljIHNldCBkaXNwbGF5TmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGlzcGxheU5hbWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGlzcGxheU5hbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheU5hbWU7XG4gIH1cblxuICAvLyBleHRlcm5hbF9zZW5kZXJzX2FsbG93ZWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9leHRlcm5hbFNlbmRlcnNBbGxvd2VkPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBleHRlcm5hbFNlbmRlcnNBbGxvd2VkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2V4dGVybmFsX3NlbmRlcnNfYWxsb3dlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXh0ZXJuYWxTZW5kZXJzQWxsb3dlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZXh0ZXJuYWxTZW5kZXJzQWxsb3dlZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4dGVybmFsU2VuZGVyc0FsbG93ZWQoKSB7XG4gICAgdGhpcy5fZXh0ZXJuYWxTZW5kZXJzQWxsb3dlZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZXh0ZXJuYWxTZW5kZXJzQWxsb3dlZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9leHRlcm5hbFNlbmRlcnNBbGxvd2VkO1xuICB9XG5cbiAgLy8gaGlkZV9mcm9tX2FkZHJlc3NfbGlzdHMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9oaWRlRnJvbUFkZHJlc3NMaXN0cz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgaGlkZUZyb21BZGRyZXNzTGlzdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnaGlkZV9mcm9tX2FkZHJlc3NfbGlzdHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhpZGVGcm9tQWRkcmVzc0xpc3RzKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9oaWRlRnJvbUFkZHJlc3NMaXN0cyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEhpZGVGcm9tQWRkcmVzc0xpc3RzKCkge1xuICAgIHRoaXMuX2hpZGVGcm9tQWRkcmVzc0xpc3RzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBoaWRlRnJvbUFkZHJlc3NMaXN0c0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9oaWRlRnJvbUFkZHJlc3NMaXN0cztcbiAgfVxuXG4gIC8vIGhpZGVfZnJvbV9vdXRsb29rX2NsaWVudHMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9oaWRlRnJvbU91dGxvb2tDbGllbnRzPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBoaWRlRnJvbU91dGxvb2tDbGllbnRzKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2hpZGVfZnJvbV9vdXRsb29rX2NsaWVudHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhpZGVGcm9tT3V0bG9va0NsaWVudHModmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2hpZGVGcm9tT3V0bG9va0NsaWVudHMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRIaWRlRnJvbU91dGxvb2tDbGllbnRzKCkge1xuICAgIHRoaXMuX2hpZGVGcm9tT3V0bG9va0NsaWVudHMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGhpZGVGcm9tT3V0bG9va0NsaWVudHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faGlkZUZyb21PdXRsb29rQ2xpZW50cztcbiAgfVxuXG4gIC8vIGlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldElkKCkge1xuICAgIHRoaXMuX2lkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8vIG1haWwgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBtYWlsKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbWFpbCcpO1xuICB9XG5cbiAgLy8gbWFpbF9lbmFibGVkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21haWxFbmFibGVkPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBtYWlsRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdtYWlsX2VuYWJsZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1haWxFbmFibGVkKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9tYWlsRW5hYmxlZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1haWxFbmFibGVkKCkge1xuICAgIHRoaXMuX21haWxFbmFibGVkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtYWlsRW5hYmxlZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYWlsRW5hYmxlZDtcbiAgfVxuXG4gIC8vIG1haWxfbmlja25hbWUgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tYWlsTmlja25hbWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG1haWxOaWNrbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ21haWxfbmlja25hbWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1haWxOaWNrbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbWFpbE5pY2tuYW1lID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWFpbE5pY2tuYW1lKCkge1xuICAgIHRoaXMuX21haWxOaWNrbmFtZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWFpbE5pY2tuYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21haWxOaWNrbmFtZTtcbiAgfVxuXG4gIC8vIG1lbWJlcnMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tZW1iZXJzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IG1lbWJlcnMoKSB7XG4gICAgcmV0dXJuIGNka3RuLkZuLnRvbGlzdCh0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ21lbWJlcnMnKSk7XG4gIH1cbiAgcHVibGljIHNldCBtZW1iZXJzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX21lbWJlcnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNZW1iZXJzKCkge1xuICAgIHRoaXMuX21lbWJlcnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1lbWJlcnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVtYmVycztcbiAgfVxuXG4gIC8vIG9iamVjdF9pZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IG9iamVjdElkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnb2JqZWN0X2lkJyk7XG4gIH1cblxuICAvLyBvbnByZW1pc2VzX2RvbWFpbl9uYW1lIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgb25wcmVtaXNlc0RvbWFpbk5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdvbnByZW1pc2VzX2RvbWFpbl9uYW1lJyk7XG4gIH1cblxuICAvLyBvbnByZW1pc2VzX2dyb3VwX3R5cGUgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9vbnByZW1pc2VzR3JvdXBUeXBlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBvbnByZW1pc2VzR3JvdXBUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnb25wcmVtaXNlc19ncm91cF90eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCBvbnByZW1pc2VzR3JvdXBUeXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9vbnByZW1pc2VzR3JvdXBUeXBlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0T25wcmVtaXNlc0dyb3VwVHlwZSgpIHtcbiAgICB0aGlzLl9vbnByZW1pc2VzR3JvdXBUeXBlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBvbnByZW1pc2VzR3JvdXBUeXBlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29ucHJlbWlzZXNHcm91cFR5cGU7XG4gIH1cblxuICAvLyBvbnByZW1pc2VzX25ldGJpb3NfbmFtZSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IG9ucHJlbWlzZXNOZXRiaW9zTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ29ucHJlbWlzZXNfbmV0Ymlvc19uYW1lJyk7XG4gIH1cblxuICAvLyBvbnByZW1pc2VzX3NhbV9hY2NvdW50X25hbWUgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBvbnByZW1pc2VzU2FtQWNjb3VudE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdvbnByZW1pc2VzX3NhbV9hY2NvdW50X25hbWUnKTtcbiAgfVxuXG4gIC8vIG9ucHJlbWlzZXNfc2VjdXJpdHlfaWRlbnRpZmllciAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IG9ucHJlbWlzZXNTZWN1cml0eUlkZW50aWZpZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdvbnByZW1pc2VzX3NlY3VyaXR5X2lkZW50aWZpZXInKTtcbiAgfVxuXG4gIC8vIG9ucHJlbWlzZXNfc3luY19lbmFibGVkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgb25wcmVtaXNlc1N5bmNFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ29ucHJlbWlzZXNfc3luY19lbmFibGVkJyk7XG4gIH1cblxuICAvLyBvd25lcnMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9vd25lcnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgb3duZXJzKCkge1xuICAgIHJldHVybiBjZGt0bi5Gbi50b2xpc3QodGhpcy5nZXRMaXN0QXR0cmlidXRlKCdvd25lcnMnKSk7XG4gIH1cbiAgcHVibGljIHNldCBvd25lcnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fb3duZXJzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0T3duZXJzKCkge1xuICAgIHRoaXMuX293bmVycyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgb3duZXJzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX293bmVycztcbiAgfVxuXG4gIC8vIHByZWZlcnJlZF9sYW5ndWFnZSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IHByZWZlcnJlZExhbmd1YWdlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncHJlZmVycmVkX2xhbmd1YWdlJyk7XG4gIH1cblxuICAvLyBwcmV2ZW50X2R1cGxpY2F0ZV9uYW1lcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wcmV2ZW50RHVwbGljYXRlTmFtZXM/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IHByZXZlbnREdXBsaWNhdGVOYW1lcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdwcmV2ZW50X2R1cGxpY2F0ZV9uYW1lcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHJldmVudER1cGxpY2F0ZU5hbWVzKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9wcmV2ZW50RHVwbGljYXRlTmFtZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQcmV2ZW50RHVwbGljYXRlTmFtZXMoKSB7XG4gICAgdGhpcy5fcHJldmVudER1cGxpY2F0ZU5hbWVzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwcmV2ZW50RHVwbGljYXRlTmFtZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJldmVudER1cGxpY2F0ZU5hbWVzO1xuICB9XG5cbiAgLy8gcHJvdmlzaW9uaW5nX29wdGlvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcHJvdmlzaW9uaW5nT3B0aW9ucz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBwcm92aXNpb25pbmdPcHRpb25zKCkge1xuICAgIHJldHVybiBjZGt0bi5Gbi50b2xpc3QodGhpcy5nZXRMaXN0QXR0cmlidXRlKCdwcm92aXNpb25pbmdfb3B0aW9ucycpKTtcbiAgfVxuICBwdWJsaWMgc2V0IHByb3Zpc2lvbmluZ09wdGlvbnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcHJvdmlzaW9uaW5nT3B0aW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFByb3Zpc2lvbmluZ09wdGlvbnMoKSB7XG4gICAgdGhpcy5fcHJvdmlzaW9uaW5nT3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcHJvdmlzaW9uaW5nT3B0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wcm92aXNpb25pbmdPcHRpb25zO1xuICB9XG5cbiAgLy8gcHJveHlfYWRkcmVzc2VzIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgcHJveHlBZGRyZXNzZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgncHJveHlfYWRkcmVzc2VzJyk7XG4gIH1cblxuICAvLyBzZWN1cml0eV9lbmFibGVkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NlY3VyaXR5RW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgc2VjdXJpdHlFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ3NlY3VyaXR5X2VuYWJsZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNlY3VyaXR5RW5hYmxlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fc2VjdXJpdHlFbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U2VjdXJpdHlFbmFibGVkKCkge1xuICAgIHRoaXMuX3NlY3VyaXR5RW5hYmxlZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2VjdXJpdHlFbmFibGVkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlY3VyaXR5RW5hYmxlZDtcbiAgfVxuXG4gIC8vIHRoZW1lIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RoZW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB0aGVtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RoZW1lJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aGVtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhlbWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaGVtZSgpIHtcbiAgICB0aGlzLl90aGVtZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhlbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhlbWU7XG4gIH1cblxuICAvLyB0eXBlcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90eXBlcz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCB0eXBlcygpIHtcbiAgICByZXR1cm4gY2RrdG4uRm4udG9saXN0KHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgndHlwZXMnKSk7XG4gIH1cbiAgcHVibGljIHNldCB0eXBlcyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl90eXBlcyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFR5cGVzKCkge1xuICAgIHRoaXMuX3R5cGVzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0eXBlc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90eXBlcztcbiAgfVxuXG4gIC8vIHZpc2liaWxpdHkgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF92aXNpYmlsaXR5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB2aXNpYmlsaXR5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndmlzaWJpbGl0eScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJpbGl0eSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdmlzaWJpbGl0eSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFZpc2liaWxpdHkoKSB7XG4gICAgdGhpcy5fdmlzaWJpbGl0eSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdmlzaWJpbGl0eUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmlsaXR5O1xuICB9XG5cbiAgLy8gd3JpdGViYWNrX2VuYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfd3JpdGViYWNrRW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgd3JpdGViYWNrRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCd3cml0ZWJhY2tfZW5hYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgd3JpdGViYWNrRW5hYmxlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fd3JpdGViYWNrRW5hYmxlZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFdyaXRlYmFja0VuYWJsZWQoKSB7XG4gICAgdGhpcy5fd3JpdGViYWNrRW5hYmxlZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgd3JpdGViYWNrRW5hYmxlZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0ZWJhY2tFbmFibGVkO1xuICB9XG5cbiAgLy8gZHluYW1pY19tZW1iZXJzaGlwIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2R5bmFtaWNNZW1iZXJzaGlwID0gbmV3IEdyb3VwRHluYW1pY01lbWJlcnNoaXBPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJkeW5hbWljX21lbWJlcnNoaXBcIik7XG4gIHB1YmxpYyBnZXQgZHluYW1pY01lbWJlcnNoaXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2R5bmFtaWNNZW1iZXJzaGlwO1xuICB9XG4gIHB1YmxpYyBwdXREeW5hbWljTWVtYmVyc2hpcCh2YWx1ZTogR3JvdXBEeW5hbWljTWVtYmVyc2hpcCkge1xuICAgIHRoaXMuX2R5bmFtaWNNZW1iZXJzaGlwLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXREeW5hbWljTWVtYmVyc2hpcCgpIHtcbiAgICB0aGlzLl9keW5hbWljTWVtYmVyc2hpcC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkeW5hbWljTWVtYmVyc2hpcElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9keW5hbWljTWVtYmVyc2hpcC5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gdGltZW91dHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGltZW91dHMgPSBuZXcgR3JvdXBUaW1lb3V0c091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInRpbWVvdXRzXCIpO1xuICBwdWJsaWMgZ2V0IHRpbWVvdXRzKCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lb3V0cztcbiAgfVxuICBwdWJsaWMgcHV0VGltZW91dHModmFsdWU6IEdyb3VwVGltZW91dHMpIHtcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGltZW91dHMoKSB7XG4gICAgdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGltZW91dHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vID09PT09PT09PVxuICAvLyBTWU5USEVTSVNcbiAgLy8gPT09PT09PT09XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWRtaW5pc3RyYXRpdmVfdW5pdF9pZHM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKSh0aGlzLl9hZG1pbmlzdHJhdGl2ZVVuaXRJZHMpLFxuICAgICAgYXNzaWduYWJsZV90b19yb2xlOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0odGhpcy5fYXNzaWduYWJsZVRvUm9sZSksXG4gICAgICBhdXRvX3N1YnNjcmliZV9uZXdfbWVtYmVyczogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHRoaXMuX2F1dG9TdWJzY3JpYmVOZXdNZW1iZXJzKSxcbiAgICAgIGJlaGF2aW9yczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHRoaXMuX2JlaGF2aW9ycyksXG4gICAgICBkZXNjcmlwdGlvbjogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fZGVzY3JpcHRpb24pLFxuICAgICAgZGlzcGxheV9uYW1lOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9kaXNwbGF5TmFtZSksXG4gICAgICBleHRlcm5hbF9zZW5kZXJzX2FsbG93ZWQ6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybSh0aGlzLl9leHRlcm5hbFNlbmRlcnNBbGxvd2VkKSxcbiAgICAgIGhpZGVfZnJvbV9hZGRyZXNzX2xpc3RzOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0odGhpcy5faGlkZUZyb21BZGRyZXNzTGlzdHMpLFxuICAgICAgaGlkZV9mcm9tX291dGxvb2tfY2xpZW50czogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHRoaXMuX2hpZGVGcm9tT3V0bG9va0NsaWVudHMpLFxuICAgICAgaWQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2lkKSxcbiAgICAgIG1haWxfZW5hYmxlZDogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHRoaXMuX21haWxFbmFibGVkKSxcbiAgICAgIG1haWxfbmlja25hbWU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX21haWxOaWNrbmFtZSksXG4gICAgICBtZW1iZXJzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkodGhpcy5fbWVtYmVycyksXG4gICAgICBvbnByZW1pc2VzX2dyb3VwX3R5cGU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX29ucHJlbWlzZXNHcm91cFR5cGUpLFxuICAgICAgb3duZXJzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkodGhpcy5fb3duZXJzKSxcbiAgICAgIHByZXZlbnRfZHVwbGljYXRlX25hbWVzOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0odGhpcy5fcHJldmVudER1cGxpY2F0ZU5hbWVzKSxcbiAgICAgIHByb3Zpc2lvbmluZ19vcHRpb25zOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkodGhpcy5fcHJvdmlzaW9uaW5nT3B0aW9ucyksXG4gICAgICBzZWN1cml0eV9lbmFibGVkOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0odGhpcy5fc2VjdXJpdHlFbmFibGVkKSxcbiAgICAgIHRoZW1lOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl90aGVtZSksXG4gICAgICB0eXBlczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHRoaXMuX3R5cGVzKSxcbiAgICAgIHZpc2liaWxpdHk6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX3Zpc2liaWxpdHkpLFxuICAgICAgd3JpdGViYWNrX2VuYWJsZWQ6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybSh0aGlzLl93cml0ZWJhY2tFbmFibGVkKSxcbiAgICAgIGR5bmFtaWNfbWVtYmVyc2hpcDogZ3JvdXBEeW5hbWljTWVtYmVyc2hpcFRvVGVycmFmb3JtKHRoaXMuX2R5bmFtaWNNZW1iZXJzaGlwLmludGVybmFsVmFsdWUpLFxuICAgICAgdGltZW91dHM6IGdyb3VwVGltZW91dHNUb1RlcnJhZm9ybSh0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgIGFkbWluaXN0cmF0aXZlX3VuaXRfaWRzOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkodGhpcy5fYWRtaW5pc3RyYXRpdmVVbml0SWRzKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGFzc2lnbmFibGVfdG9fcm9sZToge1xuICAgICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHRoaXMuX2Fzc2lnbmFibGVUb1JvbGUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgICAgYXV0b19zdWJzY3JpYmVfbmV3X21lbWJlcnM6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9hdXRvU3Vic2NyaWJlTmV3TWVtYmVycyksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICAgIH0sXG4gICAgICBiZWhhdmlvcnM6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKSh0aGlzLl9iZWhhdmlvcnMpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2Rlc2NyaXB0aW9uKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgZGlzcGxheV9uYW1lOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9kaXNwbGF5TmFtZSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGV4dGVybmFsX3NlbmRlcnNfYWxsb3dlZDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHRoaXMuX2V4dGVybmFsU2VuZGVyc0FsbG93ZWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgICAgaGlkZV9mcm9tX2FkZHJlc3NfbGlzdHM6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9oaWRlRnJvbUFkZHJlc3NMaXN0cyksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICAgIH0sXG4gICAgICBoaWRlX2Zyb21fb3V0bG9va19jbGllbnRzOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0odGhpcy5faGlkZUZyb21PdXRsb29rQ2xpZW50cyksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICAgIH0sXG4gICAgICBpZDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBtYWlsX2VuYWJsZWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9tYWlsRW5hYmxlZCksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICAgIH0sXG4gICAgICBtYWlsX25pY2tuYW1lOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9tYWlsTmlja25hbWUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBtZW1iZXJzOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkodGhpcy5fbWVtYmVycyksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICAgIH0sXG4gICAgICBvbnByZW1pc2VzX2dyb3VwX3R5cGU6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX29ucHJlbWlzZXNHcm91cFR5cGUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBvd25lcnM6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKSh0aGlzLl9vd25lcnMpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgICB9LFxuICAgICAgcHJldmVudF9kdXBsaWNhdGVfbmFtZXM6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9wcmV2ZW50RHVwbGljYXRlTmFtZXMpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgICAgcHJvdmlzaW9uaW5nX29wdGlvbnM6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKSh0aGlzLl9wcm92aXNpb25pbmdPcHRpb25zKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIHNlY3VyaXR5X2VuYWJsZWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9zZWN1cml0eUVuYWJsZWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgICB9LFxuICAgICAgdGhlbWU6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3RoZW1lKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgdHlwZXM6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKSh0aGlzLl90eXBlcyksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICAgIH0sXG4gICAgICB2aXNpYmlsaXR5OiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl92aXNpYmlsaXR5KSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgd3JpdGViYWNrX2VuYWJsZWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl93cml0ZWJhY2tFbmFibGVkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIGR5bmFtaWNfbWVtYmVyc2hpcDoge1xuICAgICAgICB2YWx1ZTogZ3JvdXBEeW5hbWljTWVtYmVyc2hpcFRvSGNsVGVycmFmb3JtKHRoaXMuX2R5bmFtaWNNZW1iZXJzaGlwLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJHcm91cER5bmFtaWNNZW1iZXJzaGlwTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIHRpbWVvdXRzOiB7XG4gICAgICAgIHZhbHVlOiBncm91cFRpbWVvdXRzVG9IY2xUZXJyYWZvcm0odGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwic3RydWN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiR3JvdXBUaW1lb3V0c1wiLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQgKSlcbiAgfVxufVxuIl19