angular-odata 0.130.0 → 0.131.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 (159) hide show
  1. package/fesm2022/angular-odata.mjs +2298 -2162
  2. package/fesm2022/angular-odata.mjs.map +1 -1
  3. package/lib/api.d.ts +10 -11
  4. package/lib/cache/cache.d.ts +2 -2
  5. package/lib/cache/memory.d.ts +2 -2
  6. package/lib/cache/storage.d.ts +2 -2
  7. package/lib/loaders.d.ts +8 -8
  8. package/lib/metadata/csdl/csdl-annotation.d.ts +3 -3
  9. package/lib/metadata/csdl/csdl-entity-container.d.ts +2 -2
  10. package/lib/metadata/csdl/csdl-entity-set.d.ts +2 -2
  11. package/lib/metadata/csdl/csdl-enum-type.d.ts +3 -3
  12. package/lib/metadata/csdl/csdl-function-action.d.ts +4 -4
  13. package/lib/metadata/csdl/csdl-reference.d.ts +2 -2
  14. package/lib/metadata/csdl/csdl-schema.d.ts +2 -2
  15. package/lib/metadata/csdl/csdl-structural-property.d.ts +3 -3
  16. package/lib/metadata/csdl/csdl-structured-type.d.ts +3 -3
  17. package/lib/metadata/metadata.d.ts +2 -2
  18. package/lib/models/options.d.ts +2 -2
  19. package/lib/module.d.ts +3 -3
  20. package/lib/options.d.ts +3 -3
  21. package/lib/resources/query/expressions/apply.d.ts +1 -1
  22. package/lib/resources/query/expressions/compute.d.ts +1 -1
  23. package/lib/resources/query/expressions/count.d.ts +1 -1
  24. package/lib/resources/query/expressions/expand.d.ts +4 -3
  25. package/lib/resources/query/expressions/filter.d.ts +2 -1
  26. package/lib/resources/query/expressions/orderby.d.ts +2 -1
  27. package/lib/resources/query/expressions/search.d.ts +2 -1
  28. package/lib/resources/query/expressions/select.d.ts +2 -1
  29. package/lib/resources/query/handlers.d.ts +17 -5
  30. package/lib/resources/resource.d.ts +5 -5
  31. package/lib/resources/types/action.d.ts +2 -2
  32. package/lib/resources/types/entity-set.d.ts +2 -2
  33. package/lib/resources/types/navigation-property.d.ts +2 -2
  34. package/lib/resources/types/property.d.ts +2 -2
  35. package/lib/schema/annotation.d.ts +3 -3
  36. package/lib/schema/callable.d.ts +3 -3
  37. package/lib/schema/element.d.ts +3 -3
  38. package/lib/schema/entity-container.d.ts +2 -2
  39. package/lib/schema/entity-set.d.ts +2 -2
  40. package/lib/schema/enum-type.d.ts +2 -2
  41. package/lib/schema/parsers/callable.d.ts +4 -4
  42. package/lib/schema/parsers/enum-type.d.ts +3 -3
  43. package/lib/schema/parsers/structured-type.d.ts +4 -4
  44. package/lib/schema/schema.d.ts +3 -3
  45. package/lib/schema/singleton.d.ts +2 -2
  46. package/lib/schema/structured-type.d.ts +3 -3
  47. package/lib/services/entity.d.ts +1 -1
  48. package/lib/settings.d.ts +2 -2
  49. package/lib/types.d.ts +76 -74
  50. package/lib/utils/odata.d.ts +2 -2
  51. package/package.json +3 -5
  52. package/schematics/apigen/files/api-config/__fileName__.ts +4 -4
  53. package/esm2022/angular-odata.mjs +0 -5
  54. package/esm2022/lib/annotations.mjs +0 -146
  55. package/esm2022/lib/api.mjs +0 -439
  56. package/esm2022/lib/cache/cache.mjs +0 -177
  57. package/esm2022/lib/cache/index.mjs +0 -4
  58. package/esm2022/lib/cache/memory.mjs +0 -30
  59. package/esm2022/lib/cache/storage.mjs +0 -57
  60. package/esm2022/lib/client.mjs +0 -215
  61. package/esm2022/lib/constants.mjs +0 -95
  62. package/esm2022/lib/helper.mjs +0 -288
  63. package/esm2022/lib/index.mjs +0 -22
  64. package/esm2022/lib/loaders.mjs +0 -43
  65. package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -273
  66. package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -59
  67. package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -50
  68. package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -74
  69. package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -204
  70. package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -15
  71. package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -76
  72. package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -87
  73. package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -37
  74. package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -145
  75. package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -159
  76. package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -46
  77. package/esm2022/lib/metadata/index.mjs +0 -3
  78. package/esm2022/lib/metadata/metadata.mjs +0 -41
  79. package/esm2022/lib/metadata/parser.mjs +0 -564
  80. package/esm2022/lib/models/collection.mjs +0 -816
  81. package/esm2022/lib/models/index.mjs +0 -4
  82. package/esm2022/lib/models/model.mjs +0 -577
  83. package/esm2022/lib/models/options.mjs +0 -1227
  84. package/esm2022/lib/module.mjs +0 -55
  85. package/esm2022/lib/options.mjs +0 -91
  86. package/esm2022/lib/resources/index.mjs +0 -7
  87. package/esm2022/lib/resources/options.mjs +0 -66
  88. package/esm2022/lib/resources/path/handlers.mjs +0 -81
  89. package/esm2022/lib/resources/path/index.mjs +0 -3
  90. package/esm2022/lib/resources/path/segments.mjs +0 -149
  91. package/esm2022/lib/resources/query/builder.mjs +0 -645
  92. package/esm2022/lib/resources/query/expressions/apply.mjs +0 -238
  93. package/esm2022/lib/resources/query/expressions/base.mjs +0 -26
  94. package/esm2022/lib/resources/query/expressions/compute.mjs +0 -55
  95. package/esm2022/lib/resources/query/expressions/count.mjs +0 -118
  96. package/esm2022/lib/resources/query/expressions/expand.mjs +0 -154
  97. package/esm2022/lib/resources/query/expressions/filter.mjs +0 -180
  98. package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
  99. package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -81
  100. package/esm2022/lib/resources/query/expressions/search.mjs +0 -144
  101. package/esm2022/lib/resources/query/expressions/select.mjs +0 -49
  102. package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -770
  103. package/esm2022/lib/resources/query/handlers.mjs +0 -423
  104. package/esm2022/lib/resources/query/index.mjs +0 -5
  105. package/esm2022/lib/resources/query/options.mjs +0 -140
  106. package/esm2022/lib/resources/request.mjs +0 -210
  107. package/esm2022/lib/resources/resource.mjs +0 -316
  108. package/esm2022/lib/resources/response.mjs +0 -180
  109. package/esm2022/lib/resources/types/action.mjs +0 -118
  110. package/esm2022/lib/resources/types/batch.mjs +0 -428
  111. package/esm2022/lib/resources/types/count.mjs +0 -33
  112. package/esm2022/lib/resources/types/entity-set.mjs +0 -131
  113. package/esm2022/lib/resources/types/entity.mjs +0 -112
  114. package/esm2022/lib/resources/types/function.mjs +0 -149
  115. package/esm2022/lib/resources/types/index.mjs +0 -15
  116. package/esm2022/lib/resources/types/media.mjs +0 -44
  117. package/esm2022/lib/resources/types/metadata.mjs +0 -35
  118. package/esm2022/lib/resources/types/navigation-property.mjs +0 -246
  119. package/esm2022/lib/resources/types/options.mjs +0 -2
  120. package/esm2022/lib/resources/types/property.mjs +0 -187
  121. package/esm2022/lib/resources/types/reference.mjs +0 -87
  122. package/esm2022/lib/resources/types/singleton.mjs +0 -125
  123. package/esm2022/lib/resources/types/value.mjs +0 -48
  124. package/esm2022/lib/schema/annotation.mjs +0 -44
  125. package/esm2022/lib/schema/callable.mjs +0 -69
  126. package/esm2022/lib/schema/element.mjs +0 -70
  127. package/esm2022/lib/schema/entity-container.mjs +0 -13
  128. package/esm2022/lib/schema/entity-set.mjs +0 -11
  129. package/esm2022/lib/schema/enum-type.mjs +0 -69
  130. package/esm2022/lib/schema/index.mjs +0 -9
  131. package/esm2022/lib/schema/parsers/callable.mjs +0 -123
  132. package/esm2022/lib/schema/parsers/edm.mjs +0 -101
  133. package/esm2022/lib/schema/parsers/enum-type.mjs +0 -148
  134. package/esm2022/lib/schema/parsers/index.mjs +0 -5
  135. package/esm2022/lib/schema/parsers/structured-type.mjs +0 -548
  136. package/esm2022/lib/schema/schema.mjs +0 -52
  137. package/esm2022/lib/schema/singleton.mjs +0 -11
  138. package/esm2022/lib/schema/structured-type.mjs +0 -220
  139. package/esm2022/lib/services/base.mjs +0 -32
  140. package/esm2022/lib/services/entity-set.mjs +0 -161
  141. package/esm2022/lib/services/entity.mjs +0 -12
  142. package/esm2022/lib/services/factory.mjs +0 -39
  143. package/esm2022/lib/services/index.mjs +0 -5
  144. package/esm2022/lib/services/singleton.mjs +0 -55
  145. package/esm2022/lib/settings.mjs +0 -113
  146. package/esm2022/lib/types.mjs +0 -118
  147. package/esm2022/lib/utils/arraybuffers.mjs +0 -46
  148. package/esm2022/lib/utils/arrays.mjs +0 -10
  149. package/esm2022/lib/utils/dates.mjs +0 -18
  150. package/esm2022/lib/utils/durations.mjs +0 -40
  151. package/esm2022/lib/utils/enums.mjs +0 -61
  152. package/esm2022/lib/utils/http.mjs +0 -95
  153. package/esm2022/lib/utils/index.mjs +0 -10
  154. package/esm2022/lib/utils/objects.mjs +0 -204
  155. package/esm2022/lib/utils/odata.mjs +0 -22
  156. package/esm2022/lib/utils/strings.mjs +0 -20
  157. package/esm2022/lib/utils/types.mjs +0 -136
  158. package/esm2022/lib/utils/urls.mjs +0 -24
  159. package/esm2022/public-api.mjs +0 -5
@@ -1,577 +0,0 @@
1
- import { forkJoin, NEVER, throwError } from 'rxjs';
2
- import { finalize, map } from 'rxjs/operators';
3
- import { ODataEntityResource, ODataNavigationPropertyResource, } from '../resources';
4
- import { Objects, Strings, Types } from '../utils';
5
- import { ODataCollection } from './collection';
6
- import { INCLUDE_DEEP, ODataModelOptions, ODataModelEventType, ODataModelEventEmitter, } from './options';
7
- export class ODataModel {
8
- // Properties
9
- static options;
10
- static meta;
11
- // Parent
12
- _parent = null;
13
- _resource = null;
14
- _resources = [];
15
- _attributes = new Map();
16
- _annotations;
17
- _meta;
18
- // Events
19
- events$;
20
- static buildMetaOptions({ config, structuredType, }) {
21
- if (config === undefined) {
22
- const fields = structuredType
23
- .fields({ include_navigation: true, include_parents: true })
24
- .reduce((acc, field) => {
25
- let name = field.name;
26
- // Prevent collision with reserved keywords
27
- while (RESERVED_FIELD_NAMES.includes(name)) {
28
- name = name + '_';
29
- }
30
- return Object.assign(acc, {
31
- [name]: {
32
- field: field.name,
33
- default: field.default,
34
- required: !field.nullable,
35
- },
36
- });
37
- }, {});
38
- config = {
39
- fields: new Map(Object.entries(fields)),
40
- };
41
- }
42
- return new ODataModelOptions({ config, structuredType });
43
- }
44
- constructor(data = {}, { parent, resource, annots, reset = false, } = {}) {
45
- const Klass = this.constructor;
46
- if (Klass.meta === undefined)
47
- throw new Error(`Model: Can't create model without metadata`);
48
- this._meta = Klass.meta;
49
- this.events$ = new ODataModelEventEmitter({ model: this });
50
- this._meta.bind(this, { parent, resource, annots });
51
- // Client Id
52
- this[this._meta.cid] =
53
- data[this._meta.cid] ||
54
- Strings.uniqueId({
55
- prefix: `${Klass.meta.structuredType.name.toLowerCase()}-`,
56
- });
57
- if (!reset)
58
- data = Objects.merge(this.defaults(), data);
59
- this.assign(data, { reset });
60
- }
61
- //#region Resources
62
- resource() {
63
- return ODataModelOptions.resource(this);
64
- }
65
- pushResource(resource) {
66
- // Push current parent and resource
67
- this._resources.push({ parent: this._parent, resource: this._resource });
68
- // Replace parent and resource
69
- this._parent = null;
70
- this._resource = resource;
71
- }
72
- popResource() {
73
- // Pop parent and resource
74
- const pop = this._resources.pop();
75
- if (pop !== undefined) {
76
- const current = { parent: this._parent, resource: this._resource };
77
- this._parent = pop.parent;
78
- this._resource = pop.resource;
79
- return current;
80
- }
81
- return undefined;
82
- }
83
- navigationProperty(name) {
84
- const field = this._meta.findField(name);
85
- if (!field || !field.navigation)
86
- throw Error(`navigationProperty: Can't find navigation property ${name}`);
87
- const resource = this.resource();
88
- if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
89
- throw Error("navigationProperty: Can't get navigation without ODataEntityResource with key");
90
- return field.resourceFactory(resource);
91
- }
92
- property(name) {
93
- const field = this._meta.findField(name);
94
- if (!field || field.navigation)
95
- throw Error(`property: Can't find property ${name}`);
96
- const resource = this.resource();
97
- if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
98
- throw Error("property: Can't get property without ODataEntityResource with key");
99
- return field.resourceFactory(resource);
100
- }
101
- attach(resource) {
102
- this._meta.attach(this, resource);
103
- }
104
- //#endregion
105
- schema() {
106
- return this._meta.structuredType;
107
- }
108
- annots() {
109
- return this._annotations;
110
- }
111
- key({ field_mapping = false, resolve = true, } = {}) {
112
- return this._meta.resolveKey(this, { field_mapping, resolve });
113
- }
114
- isOpenModel() {
115
- return this._meta.isOpenType();
116
- }
117
- isParentOf(child) {
118
- return (child !== this &&
119
- ODataModelOptions.chain(child).some((p) => p[0] === this));
120
- }
121
- referential(attr, { field_mapping = false, resolve = true, } = {}) {
122
- return this._meta.resolveReferential(this, attr, {
123
- field_mapping,
124
- resolve,
125
- });
126
- }
127
- referenced(attr, { field_mapping = false, resolve = true, } = {}) {
128
- return this._meta.resolveReferenced(this, attr, {
129
- field_mapping,
130
- resolve,
131
- });
132
- }
133
- // Validation
134
- _errors;
135
- validate({ method, navigation = false, } = {}) {
136
- return this._meta.validate(this, { method, navigation });
137
- }
138
- isValid({ method, navigation = false, } = {}) {
139
- this._errors = this.validate({ method, navigation });
140
- if (this._errors !== undefined)
141
- this.events$.trigger(ODataModelEventType.Invalid, {
142
- value: this._errors,
143
- options: { method },
144
- });
145
- return this._errors === undefined;
146
- }
147
- defaults() {
148
- return this._meta.defaults() || {};
149
- }
150
- toEntity({ client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_id = false, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
151
- return this._meta.toEntity(this, {
152
- client_id,
153
- include_navigation,
154
- include_concurrency,
155
- include_computed,
156
- include_key,
157
- include_id,
158
- include_non_field,
159
- changes_only,
160
- field_mapping,
161
- chain,
162
- });
163
- }
164
- toJson() {
165
- return this.toEntity(INCLUDE_DEEP);
166
- }
167
- set(path, value, { type } = {}) {
168
- const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
169
- if (pathArray.length === 0)
170
- return undefined;
171
- if (pathArray.length > 1) {
172
- const model = this[pathArray[0]];
173
- return model.set(pathArray.slice(1), value, {});
174
- }
175
- if (pathArray.length === 1) {
176
- return this._meta.set(this, pathArray[0], value, { type });
177
- }
178
- }
179
- get(path) {
180
- const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
181
- if (pathArray.length === 0)
182
- return undefined;
183
- const value = this._meta.get(this, pathArray[0]);
184
- if (pathArray.length > 1 &&
185
- (value instanceof ODataModel || value instanceof ODataCollection)) {
186
- return value.get(pathArray.slice(1));
187
- }
188
- return value;
189
- }
190
- has(path) {
191
- const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
192
- if (pathArray.length === 0)
193
- return false;
194
- const value = this._meta.get(this, pathArray[0]);
195
- if (pathArray.length > 1 &&
196
- (value instanceof ODataModel || value instanceof ODataCollection)) {
197
- return value.has(pathArray.slice(1));
198
- }
199
- return value !== undefined;
200
- }
201
- reset({ path, silent = false, } = {}) {
202
- const pathArray = (path === undefined
203
- ? []
204
- : Types.isArray(path)
205
- ? path
206
- : path.match(/([^[.\]])+/g));
207
- const name = pathArray[0];
208
- const value = name !== undefined ? this[name] : undefined;
209
- if (ODataModelOptions.isModel(value) ||
210
- ODataModelOptions.isCollection(value)) {
211
- value.reset({ path: pathArray.slice(1), silent });
212
- }
213
- else {
214
- this._meta.reset(this, { name: pathArray[0], silent });
215
- }
216
- }
217
- clear({ silent = false } = {}) {
218
- this._attributes.clear();
219
- if (!silent) {
220
- this.events$.trigger(ODataModelEventType.Update);
221
- }
222
- }
223
- assign(entity, { add = true, merge = true, remove = true, reset = false, reparent = false, silent = false, } = {}) {
224
- return this._meta.assign(this, entity, {
225
- add,
226
- merge,
227
- remove,
228
- reset,
229
- silent,
230
- reparent,
231
- });
232
- }
233
- clone() {
234
- return new this.constructor(this.toEntity(INCLUDE_DEEP), {
235
- resource: this.resource(),
236
- annots: this.annots(),
237
- });
238
- }
239
- _request(obs$, mapCallback) {
240
- this.events$.trigger(ODataModelEventType.Request, {
241
- options: { observable: obs$ },
242
- });
243
- return obs$.pipe(map((response) => mapCallback(response)), finalize(() => this.events$.trigger(ODataModelEventType.Sync)));
244
- }
245
- fetch({ ...options } = {}) {
246
- const resource = this.resource();
247
- if (!resource)
248
- return throwError(() => new Error('fetch: Resource is null'));
249
- let obs$;
250
- if (resource instanceof ODataEntityResource) {
251
- obs$ = resource.fetch(options);
252
- }
253
- else if (resource instanceof ODataNavigationPropertyResource) {
254
- obs$ = resource.fetch({ responseType: 'entity', ...options });
255
- }
256
- else {
257
- obs$ = resource.fetch({
258
- responseType: 'entity',
259
- ...options,
260
- });
261
- }
262
- return this._request(obs$, ({ entity, annots }) => {
263
- this._annotations = annots;
264
- return this.assign(entity ?? {}, { reset: true });
265
- });
266
- }
267
- save({ method, navigation = false, validate = true, ...options } = {}) {
268
- const resource = this.resource();
269
- if (!resource)
270
- return throwError(() => new Error('save: Resource is null'));
271
- if (!(resource instanceof ODataEntityResource ||
272
- resource instanceof ODataNavigationPropertyResource))
273
- return throwError(() => new Error('save: Resource type ODataEntityResource/ODataNavigationPropertyResource needed'));
274
- // Resolve method and resource key
275
- if (method === undefined && this.schema().isCompoundKey())
276
- return throwError(() => new Error('save: Composite key require a specific method, use create/update/modify'));
277
- method = method || (!resource.hasKey() ? 'create' : 'update');
278
- if (resource instanceof ODataEntityResource &&
279
- (method === 'update' || method === 'modify') &&
280
- !resource.hasKey())
281
- return throwError(() => new Error('save: Update/Patch require entity key'));
282
- if (resource instanceof ODataNavigationPropertyResource ||
283
- method === 'create')
284
- resource.clearKey();
285
- if (validate && !this.isValid({ method, navigation })) {
286
- return throwError(() => new Error('save: Validation errors'));
287
- }
288
- const _entity = this.toEntity({
289
- changes_only: method === 'modify',
290
- field_mapping: true,
291
- include_concurrency: true,
292
- include_navigation: navigation,
293
- });
294
- const obs$ = method === 'create'
295
- ? resource.create(_entity, options)
296
- : method === 'modify'
297
- ? resource.modify(_entity, {
298
- etag: this.annots().etag,
299
- ...options,
300
- })
301
- : resource.update(_entity, {
302
- etag: this.annots().etag,
303
- ...options,
304
- });
305
- return this._request(obs$, ({ entity, annots }) => {
306
- this._annotations = annots;
307
- return this.assign(entity ?? _entity, {
308
- reset: true,
309
- });
310
- });
311
- }
312
- destroy({ ...options } = {}) {
313
- const resource = this.resource();
314
- if (!resource)
315
- return throwError(() => new Error('destroy: Resource is null'));
316
- if (!(resource instanceof ODataEntityResource ||
317
- resource instanceof ODataNavigationPropertyResource))
318
- return throwError(() => new Error('destroy: Resource type ODataEntityResource/ODataNavigationPropertyResource needed'));
319
- if (!resource.hasKey())
320
- return throwError(() => new Error("destroy: Can't destroy model without key"));
321
- const obs$ = resource.destroy({ etag: this.annots().etag, ...options });
322
- return this._request(obs$, (resp) => {
323
- this.events$.trigger(ODataModelEventType.Destroy);
324
- return resp;
325
- });
326
- }
327
- /**
328
- * Create an execution context for change the internal query of a resource
329
- * @param ctx Function to execute
330
- */
331
- query(ctx) {
332
- const resource = this.resource();
333
- return resource ? this._meta.query(this, resource, ctx) : this;
334
- }
335
- /**
336
- * Perform a check on the internal state of the model and return true if the model is changed.
337
- * @param include_navigation Check in navigation properties
338
- * @returns true if the model has changed, false otherwise
339
- */
340
- hasChanged({ include_navigation = false, } = {}) {
341
- return this._meta.hasChanged(this, { include_navigation });
342
- }
343
- encode(name, options) {
344
- const value = this[name];
345
- if (value === undefined)
346
- return undefined;
347
- const field = this._meta.findField(name);
348
- return field ? field.encode(value, options) : value;
349
- }
350
- isNew() {
351
- return !this._meta.hasKey(this);
352
- }
353
- withResource(resource, ctx) {
354
- return this._meta.withResource(this, resource, ctx);
355
- }
356
- /**
357
- * Create an execution context for a given function, where the model is bound to its entity endpoint
358
- * @param ctx Context function
359
- * @returns The result of the context
360
- */
361
- asEntity(ctx) {
362
- return this._meta.asEntity(this, ctx);
363
- }
364
- //#region Callables
365
- callFunction(name, params, responseType, options = {}) {
366
- const resource = this.resource();
367
- if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
368
- return throwError(() => new Error("callFunction: Can't call function without ODataEntityResource with key"));
369
- const func = resource.function(name).query((q) => q.restore(options));
370
- switch (responseType) {
371
- case 'property':
372
- return this._request(func.callProperty(params, options), (resp) => resp);
373
- case 'model':
374
- return this._request(func.callModel(params, options), (resp) => resp);
375
- case 'collection':
376
- return this._request(func.callCollection(params, options), (resp) => resp);
377
- case 'blob':
378
- return this._request(func.callBlob(params, options), (resp) => resp);
379
- case 'arraybuffer':
380
- return this._request(func.callArraybuffer(params, options), (resp) => resp);
381
- default:
382
- return this._request(func.call(params, { responseType, ...options }), (resp) => resp);
383
- }
384
- }
385
- callAction(name, params, responseType, { ...options } = {}) {
386
- const resource = this.resource();
387
- if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
388
- return throwError(() => new Error("callAction: Can't call action without ODataEntityResource with key"));
389
- const action = resource.action(name).query((q) => q.restore(options));
390
- switch (responseType) {
391
- case 'property':
392
- return this._request(action.callProperty(params, options), (resp) => resp);
393
- case 'model':
394
- return this._request(action.callModel(params, options), (resp) => resp);
395
- case 'collection':
396
- return this._request(action.callCollection(params, options), (resp) => resp);
397
- case 'blob':
398
- return this._request(action.callBlob(params, options), (resp) => resp);
399
- case 'arraybuffer':
400
- return this._request(action.callArraybuffer(params, options), (resp) => resp);
401
- default:
402
- return this._request(action.call(params, { responseType, ...options }), (resp) => resp);
403
- }
404
- }
405
- cast(type, ModelType) {
406
- //: ODataModel<S> {
407
- const resource = this.resource();
408
- if (!(resource instanceof ODataEntityResource))
409
- throw new Error(`cast: Can't cast to derived model without ODataEntityResource`);
410
- return resource
411
- .cast(type)
412
- .asModel(this.toEntity(INCLUDE_DEEP), {
413
- annots: this.annots(),
414
- ModelType,
415
- });
416
- }
417
- fetchNavigationProperty(name, responseType, options = {}) {
418
- const nav = this.navigationProperty(name);
419
- nav.query((q) => q.restore(options));
420
- switch (responseType) {
421
- case 'model':
422
- return nav.fetchModel(options);
423
- case 'collection':
424
- return nav.fetchCollection(options);
425
- }
426
- }
427
- fetchAttribute(name, options = {}) {
428
- const field = this._meta.findField(name);
429
- if (!field)
430
- throw Error(`fetchAttribute: Can't find attribute ${name}`);
431
- if (field.isStructuredType() && field.collection) {
432
- const collection = field.collectionFactory({ parent: this });
433
- collection.query((q) => q.restore(options));
434
- return this._request(collection.fetch(options), () => {
435
- this.assign({ [name]: collection });
436
- return collection;
437
- });
438
- }
439
- else if (field.isStructuredType()) {
440
- const model = field.modelFactory({ parent: this });
441
- model.query((q) => q.restore(options));
442
- return this._request(model.fetch(options), () => {
443
- this.assign({ [name]: model });
444
- return model;
445
- });
446
- }
447
- else {
448
- const prop = field.resourceFactory(this.resource());
449
- prop.query((q) => q.restore(options));
450
- return this._request(prop.fetchProperty(options), (resp) => {
451
- this.assign({ [name]: resp });
452
- return resp;
453
- });
454
- }
455
- }
456
- /*
457
- getAttribute<P>(
458
- name: keyof T,
459
- ): (P extends (infer U)[] ? ODataCollection<U, ODataModel<U> & ModelInterface<U>> :
460
- P extends ArrayBufferLike ? ArrayBuffer :
461
- P extends Date ? Date :
462
- P extends object ? ODataModel<P> & ModelInterface<P> : P ) | null;
463
- getAttribute<M extends ODataModel<keyof T>>(
464
- name: keyof T,
465
- ): M | null;
466
- getAttribute<C extends ODataCollection<keyof T, ODataModel<keyof T>>>(
467
- name: keyof T,
468
- ): C | null;
469
- getAttribute<P>(
470
- name: keyof T,
471
- ) {
472
- */
473
- getAttribute(name) {
474
- const field = this._meta.findField(name);
475
- if (!field)
476
- throw Error(`getAttribute: Can't find attribute ${name}`);
477
- let model = this[name];
478
- if (field.isStructuredType() && model === undefined) {
479
- if (field.collection) {
480
- model = field.collectionFactory({ parent: this });
481
- }
482
- else {
483
- const ref = field.navigation
484
- ? this.referenced(field)
485
- : undefined;
486
- model =
487
- ref === null
488
- ? null
489
- : field.modelFactory({ parent: this, value: ref });
490
- }
491
- this[name] = model;
492
- }
493
- return model;
494
- }
495
- setAttribute(name, model, options) {
496
- const reference = this.navigationProperty(name).reference();
497
- const etag = this.annots().etag;
498
- let obs$ = NEVER;
499
- if (model instanceof ODataModel) {
500
- obs$ = reference.set(model.asEntity((e) => e.resource()), { etag, ...options });
501
- }
502
- else if (model instanceof ODataCollection) {
503
- obs$ = forkJoin(model
504
- .models()
505
- .map((m) => reference.add(m.asEntity((e) => e.resource()), options)));
506
- }
507
- else if (model === null) {
508
- obs$ = reference.unset({ etag, ...options });
509
- }
510
- return this._request(obs$, (model) => this.assign({ [name]: model }));
511
- }
512
- setReference(name, model, options) {
513
- const reference = this.navigationProperty(name).reference();
514
- const etag = this.annots().etag;
515
- let obs$ = NEVER;
516
- if (model instanceof ODataModel) {
517
- obs$ = reference.set(model.asEntity((e) => e.resource()), { etag, ...options });
518
- }
519
- else if (model instanceof ODataCollection) {
520
- obs$ = forkJoin(model
521
- .models()
522
- .map((m) => reference.add(m.asEntity((e) => e.resource()), options)));
523
- }
524
- else if (model === null) {
525
- obs$ = reference.unset({ etag, ...options });
526
- }
527
- return this._request(obs$, (model) => this.assign({ [name]: model }));
528
- }
529
- //#region Model Identity
530
- get [Symbol.toStringTag]() {
531
- return 'Model';
532
- }
533
- equals(other) {
534
- if (this === other)
535
- return true;
536
- if (typeof this !== typeof other)
537
- return false;
538
- const meta = this._meta;
539
- const thisCid = this[meta.cid];
540
- const otherCid = other[meta.cid];
541
- if (thisCid !== undefined &&
542
- otherCid !== undefined &&
543
- Types.isEqual(thisCid, otherCid))
544
- return true;
545
- if (meta.isEntityType()) {
546
- const thisKey = this.key();
547
- const otherKey = other.key();
548
- if (thisKey !== undefined &&
549
- otherKey !== undefined &&
550
- Types.isEqual(thisKey, otherKey))
551
- return true;
552
- }
553
- else if (meta.isComplexType()) {
554
- const thisJson = this.toJson();
555
- const otherJson = other.toJson();
556
- if (Types.isEqual(thisJson, otherJson))
557
- return true;
558
- }
559
- return false;
560
- }
561
- //#endregion
562
- //#region Collection Tools
563
- collection() {
564
- return this._parent !== null &&
565
- ODataModelOptions.isCollection(this._parent[0])
566
- ? this._parent[0]
567
- : undefined;
568
- }
569
- next() {
570
- return this.collection()?.next(this);
571
- }
572
- prev() {
573
- return this.collection()?.prev(this);
574
- }
575
- }
576
- const RESERVED_FIELD_NAMES = Object.getOwnPropertyNames(ODataModel.prototype);
577
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvbW9kZWxzL21vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFHTCxtQkFBbUIsRUFFbkIsK0JBQStCLEdBUWhDLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFDTCxZQUFZLEVBR1osaUJBQWlCLEVBRWpCLG1CQUFtQixFQUNuQixzQkFBc0IsR0FHdkIsTUFBTSxXQUFXLENBQUM7QUFLbkIsTUFBTSxPQUFPLFVBQVU7SUFDckIsYUFBYTtJQUNiLE1BQU0sQ0FBQyxPQUFPLENBQWU7SUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBeUI7SUFDcEMsU0FBUztJQUNULE9BQU8sR0FLSSxJQUFJLENBQUM7SUFDaEIsU0FBUyxHQUE0QixJQUFJLENBQUM7SUFDMUMsVUFBVSxHQVFKLEVBQUUsQ0FBQztJQUNULFdBQVcsR0FBMEMsSUFBSSxHQUFHLEVBR3pELENBQUM7SUFDSixZQUFZLENBQTZCO0lBQ3pDLEtBQUssQ0FBeUI7SUFDOUIsU0FBUztJQUNULE9BQU8sQ0FBNEI7SUFFbkMsTUFBTSxDQUFDLGdCQUFnQixDQUFJLEVBQ3pCLE1BQU0sRUFDTixjQUFjLEdBSWY7UUFDQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6QixNQUFNLE1BQU0sR0FBRyxjQUFjO2lCQUMxQixNQUFNLENBQUMs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QkFFaEMsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztRQUN0RCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsWUFBWTtJQUVaLDBCQUEwQjtJQUMxQixVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUk7WUFDMUIsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUF1QztZQUN4RCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FFRjtBQUVELE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcmtKb2luLCBORVZFUiwgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmluYWxpemUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEVudGl0eUtleSxcbiAgT0RhdGFBY3Rpb25PcHRpb25zLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YUZ1bmN0aW9uT3B0aW9ucyxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFPcHRpb25zLFxuICBPRGF0YVByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhUXVlcnlBcmd1bWVudHMsXG4gIE9EYXRhUXVlcnlBcmd1bWVudHNPcHRpb25zLFxuICBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXIsXG4gIE9EYXRhUmVzb3VyY2UsXG4gIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UsXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBPRGF0YVN0cnVjdHVyZWRUeXBlIH0gZnJvbSAnLi4vc2NoZW1hJztcbmltcG9ydCB7IE9iamVjdHMsIFN0cmluZ3MsIFR5cGVzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgT0RhdGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIElOQ0xVREVfREVFUCxcbiAgTW9kZWxPcHRpb25zLFxuICBPRGF0YU1vZGVsRmllbGQsXG4gIE9EYXRhTW9kZWxPcHRpb25zLFxuICBPRGF0YU1vZGVsQXR0cmlidXRlLFxuICBPRGF0YU1vZGVsRXZlbnRUeXBlLFxuICBPRGF0YU1vZGVsRXZlbnRFbWl0dGVyLFxuICBNb2RlbEZpZWxkT3B0aW9ucyxcbiAgTW9kZWxJbnRlcmZhY2UsXG59IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBFZG1UeXBlLCBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyB9IGZyb20gJy4uL2Fubm90YXRpb25zJztcbmltcG9ydCB7IE9EYXRhRW50aXR5IH0gZnJvbSAnLi4vcmVzb3VyY2VzL3Jlc3BvbnNlJztcblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWw8VD4ge1xuICAvLyBQcm9wZXJ0aWVzXG4gIHN0YXRpYyBvcHRpb25zOiBNb2RlbE9wdGlvbnM7XG4gIHN0YXRpYyBtZXRhOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAvLyBQYXJlbnRcbiAgX3BhcmVudDpcbiAgICB8IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsLFxuICAgICAgXVxuICAgIHwgbnVsbCA9IG51bGw7XG4gIF9yZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxUPiB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2VzOiB7XG4gICAgcGFyZW50OlxuICAgICAgfCBbXG4gICAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGwsXG4gICAgICAgIF1cbiAgICAgIHwgbnVsbDtcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxUPiB8IG51bGw7XG4gIH1bXSA9IFtdO1xuICBfYXR0cmlidXRlczogTWFwPHN0cmluZywgT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+PiA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55PlxuICA+KCk7XG4gIF9hbm5vdGF0aW9ucyE6IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM8VD47XG4gIF9tZXRhOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAvLyBFdmVudHNcbiAgZXZlbnRzJDogT0RhdGFNb2RlbEV2ZW50RW1pdHRlcjxUPjtcblxuICBzdGF0aWMgYnVpbGRNZXRhT3B0aW9uczxUPih7XG4gICAgY29uZmlnLFxuICAgIHN0cnVjdHVyZWRUeXBlLFxuICB9OiB7XG4gICAgY29uZmlnPzogTW9kZWxPcHRpb25zO1xuICAgIHN0cnVjdHVyZWRUeXBlOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+O1xuICB9KSB7XG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBzdHJ1Y3R1cmVkVHlwZVxuICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLCBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBmaWVsZCkgPT4ge1xuICAgICAgICAgIGxldCBuYW1lID0gZmllbGQubmFtZTtcbiAgICAgICAgICAvLyBQcmV2ZW50IGNvbGxpc2lvbiB3aXRoIHJlc2VydmVkIGtleXdvcmRzXG4gICAgICAgICAgd2hpbGUgKFJFU0VSVkVEX0ZJRUxEX05BTUVTLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgICBuYW1lID0gbmFtZSArICdfJztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7XG4gICAgICAgICAgICBbbmFtZV06IHtcbiAgICAgICAgICAgICAgZmllbGQ6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgICAgIGRlZmF1bHQ6IGZpZWxkLmRlZmF1bHQsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiAhZmllbGQubnVsbGFibGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCB7fSk7XG4gICAgICBjb25maWcgPSB7XG4gICAgICAgIGZpZWxkczogbmV3IE1hcDxzdHJpbmcsIE1vZGVsRmllbGRPcHRpb25zPihPYmplY3QuZW50cmllcyhmaWVsZHMpKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBuZXcgT0RhdGFNb2RlbE9wdGlvbnM8VD4oeyBjb25maWcsIHN0cnVjdHVyZWRUeXBlIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZGF0YTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAge1xuICAgICAgcGFyZW50LFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBhbm5vdHMsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIHBhcmVudD86IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsLFxuICAgICAgXTtcbiAgICAgIHJlc291cmNlPzogT0RhdGFSZXNvdXJjZTxUPiB8IG51bGw7XG4gICAgICBhbm5vdHM/OiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+O1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgS2xhc3MgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgIGlmIChLbGFzcy5tZXRhID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsOiBDYW4ndCBjcmVhdGUgbW9kZWwgd2l0aG91dCBtZXRhZGF0YWApO1xuICAgIHRoaXMuX21ldGEgPSBLbGFzcy5tZXRhO1xuICAgIHRoaXMuZXZlbnRzJCA9IG5ldyBPRGF0YU1vZGVsRXZlbnRFbWl0dGVyPFQ+KHsgbW9kZWw6IHRoaXMgfSk7XG4gICAgdGhpcy5fbWV0YS5iaW5kKHRoaXMsIHsgcGFyZW50LCByZXNvdXJjZSwgYW5ub3RzIH0pO1xuXG4gICAgLy8gQ2xpZW50IElkXG4gICAgKDxhbnk+dGhpcylbdGhpcy5fbWV0YS5jaWRdID1cbiAgICAgICg8YW55PmRhdGEpW3RoaXMuX21ldGEuY2lkXSB8fFxuICAgICAgU3RyaW5ncy51bmlxdWVJZCh7XG4gICAgICAgIHByZWZpeDogYCR7S2xhc3MubWV0YS5zdHJ1Y3R1cmVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCl9LWAsXG4gICAgICB9KTtcblxuICAgIGlmICghcmVzZXQpXG4gICAgICBkYXRhID0gT2JqZWN0cy5tZXJnZShcbiAgICAgICAgdGhpcy5kZWZhdWx0cygpLFxuICAgICAgICBkYXRhIGFzIHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgICAgKSBhcyBQYXJ0aWFsPFQ+O1xuXG4gICAgdGhpcy5hc3NpZ24oZGF0YSwgeyByZXNldCB9KTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBSZXNvdXJjZXNcbiAgcmVzb3VyY2UoKTpcbiAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPlxuICAgIHwgbnVsbCB7XG4gICAgcmV0dXJuIE9EYXRhTW9kZWxPcHRpb25zLnJlc291cmNlPFQ+KHRoaXMpIGFzXG4gICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPlxuICAgICAgfCBudWxsO1xuICB9XG5cbiAgcHVzaFJlc291cmNlKFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICAgIHwgbnVsbCxcbiAgKSB7XG4gICAgLy8gUHVzaCBjdXJyZW50IHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICB0aGlzLl9yZXNvdXJjZXMucHVzaCh7IHBhcmVudDogdGhpcy5fcGFyZW50LCByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UgfSk7XG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgcG9wUmVzb3VyY2UoKSB7XG4gICAgLy8gUG9wIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICBjb25zdCBwb3AgPSB0aGlzLl9yZXNvdXJjZXMucG9wKCk7XG4gICAgaWYgKHBvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0geyBwYXJlbnQ6IHRoaXMuX3BhcmVudCwgcmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlIH07XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwb3AucGFyZW50O1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSBwb3AucmVzb3VyY2U7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5hdmlnYXRpb25Qcm9wZXJ0eTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICApOiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmluZEZpZWxkPE4+KG5hbWUpO1xuICAgIGlmICghZmllbGQgfHwgIWZpZWxkLm5hdmlnYXRpb24pXG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYG5hdmlnYXRpb25Qcm9wZXJ0eTogQ2FuJ3QgZmluZCBuYXZpZ2F0aW9uIHByb3BlcnR5ICR7bmFtZSBhcyBzdHJpbmd9YCxcbiAgICAgICk7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBcIm5hdmlnYXRpb25Qcm9wZXJ0eTogQ2FuJ3QgZ2V0IG5hdmlnYXRpb24gd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlIHdpdGgga2V5XCIsXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGZpZWxkLnJlc291cmNlRmFjdG9yeTxULCBOPihcbiAgICAgIHJlc291cmNlLFxuICAgICkgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxOPjtcbiAgfVxuXG4gIHByb3BlcnR5PE4+KG5hbWU6IHN0cmluZyk6IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxOPiB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpbmRGaWVsZDxOPihuYW1lKTtcbiAgICBpZiAoIWZpZWxkIHx8IGZpZWxkLm5hdmlnYXRpb24pXG4gICAgICB0aHJvdyBFcnJvcihgcHJvcGVydHk6IENhbid0IGZpbmQgcHJvcGVydHkgJHtuYW1lfWApO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB8fCAhcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJwcm9wZXJ0eTogQ2FuJ3QgZ2V0IHByb3BlcnR5IHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiLFxuICAgICAgKTtcblxuICAgIHJldHVybiBmaWVsZC5yZXNvdXJjZUZhY3Rvcnk8VCwgTj4ocmVzb3VyY2UpIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxOPjtcbiAgfVxuXG4gIGF0dGFjaChcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+LFxuICApIHtcbiAgICB0aGlzLl9tZXRhLmF0dGFjaCh0aGlzLCByZXNvdXJjZSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgc2NoZW1hKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnN0cnVjdHVyZWRUeXBlO1xuICB9XG5cbiAgYW5ub3RzKCkge1xuICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgfVxuXG4gIGtleSh7XG4gICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgIHJlc29sdmUgPSB0cnVlLFxuICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge30pOlxuICAgIHwgRW50aXR5S2V5PFQ+XG4gICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5yZXNvbHZlS2V5KHRoaXMsIHsgZmllbGRfbWFwcGluZywgcmVzb2x2ZSB9KTtcbiAgfVxuXG4gIGlzT3Blbk1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmlzT3BlblR5cGUoKTtcbiAgfVxuXG4gIGlzUGFyZW50T2YoXG4gICAgY2hpbGQ6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjaGlsZCAhPT0gdGhpcyAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuY2hhaW4oY2hpbGQpLnNvbWUoKHApID0+IHBbMF0gPT09IHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIHJlZmVyZW50aWFsKFxuICAgIGF0dHI6IE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55PiB8IE9EYXRhTW9kZWxGaWVsZDxhbnk+LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5yZXNvbHZlUmVmZXJlbnRpYWwodGhpcywgYXR0ciwge1xuICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgIHJlc29sdmUsXG4gICAgfSk7XG4gIH1cblxuICByZWZlcmVuY2VkKFxuICAgIGF0dHI6IE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55PiB8IE9EYXRhTW9kZWxGaWVsZDxhbnk+LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5yZXNvbHZlUmVmZXJlbmNlZCh0aGlzLCBhdHRyLCB7XG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgcmVzb2x2ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRpb25cbiAgX2Vycm9ycz86IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICB2YWxpZGF0ZSh7XG4gICAgbWV0aG9kLFxuICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgfToge1xuICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEudmFsaWRhdGUodGhpcywgeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gIH1cblxuICBpc1ZhbGlkKHtcbiAgICBtZXRob2QsXG4gICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICB9OiB7XG4gICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICB9ID0ge30pOiBib29sZWFuIHtcbiAgICB0aGlzLl9lcnJvcnMgPSB0aGlzLnZhbGlkYXRlKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pO1xuICAgIGlmICh0aGlzLl9lcnJvcnMgIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuSW52YWxpZCwge1xuICAgICAgICB2YWx1ZTogdGhpcy5fZXJyb3JzLFxuICAgICAgICBvcHRpb25zOiB7IG1ldGhvZCB9LFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX2Vycm9ycyA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuZGVmYXVsdHMoKSB8fCB7fTtcbiAgfVxuXG4gIHRvRW50aXR5KHtcbiAgICBjbGllbnRfaWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5ID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfa2V5ID0gdHJ1ZSxcbiAgICBpbmNsdWRlX2lkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICBjaGFuZ2VzX29ubHkgPSBmYWxzZSxcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgY2hhaW4gPSBbXSxcbiAgfToge1xuICAgIGNsaWVudF9pZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9pZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9ub25fZmllbGQ/OiBib29sZWFuO1xuICAgIGNoYW5nZXNfb25seT86IGJvb2xlYW47XG4gICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gICAgY2hhaW4/OiAoT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PilbXTtcbiAgfSA9IHt9KTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS50b0VudGl0eSh0aGlzLCB7XG4gICAgICBjbGllbnRfaWQsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCxcbiAgICAgIGluY2x1ZGVfa2V5LFxuICAgICAgaW5jbHVkZV9pZCxcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgICAgY2hhbmdlc19vbmx5LFxuICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgIGNoYWluLFxuICAgIH0pO1xuICB9XG5cbiAgdG9Kc29uKCkge1xuICAgIHJldHVybiB0aGlzLnRvRW50aXR5KElOQ0xVREVfREVFUCk7XG4gIH1cblxuICBzZXQoXG4gICAgcGF0aDoga2V5b2YgVCB8IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIHZhbHVlOiBhbnksXG4gICAgeyB0eXBlIH06IHsgdHlwZT86IEVkbVR5cGUgfCBzdHJpbmcgfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gKDxhbnk+dGhpcylbcGF0aEFycmF5WzBdXTtcbiAgICAgIHJldHVybiBtb2RlbC5zZXQocGF0aEFycmF5LnNsaWNlKDEpLCB2YWx1ZSwge30pO1xuICAgIH1cbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21ldGEuc2V0KHRoaXMsIHBhdGhBcnJheVswXSwgdmFsdWUsIHsgdHlwZSB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQocGF0aDoga2V5b2YgVCB8IHN0cmluZyB8IHN0cmluZ1tdKTogYW55IHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX21ldGEuZ2V0PGFueT4odGhpcywgcGF0aEFycmF5WzBdKTtcbiAgICBpZiAoXG4gICAgICBwYXRoQXJyYXkubGVuZ3RoID4gMSAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgT0RhdGFNb2RlbCB8fCB2YWx1ZSBpbnN0YW5jZW9mIE9EYXRhQ29sbGVjdGlvbilcbiAgICApIHtcbiAgICAgIHJldHVybiB2YWx1ZS5nZXQocGF0aEFycmF5LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaGFzKHBhdGg6IGtleW9mIFQgfCBzdHJpbmcgfCBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9tZXRhLmdldDxhbnk+KHRoaXMsIHBhdGhBcnJheVswXSk7XG4gICAgaWYgKFxuICAgICAgcGF0aEFycmF5Lmxlbmd0aCA+IDEgJiZcbiAgICAgICh2YWx1ZSBpbnN0YW5jZW9mIE9EYXRhTW9kZWwgfHwgdmFsdWUgaW5zdGFuY2VvZiBPRGF0YUNvbGxlY3Rpb24pXG4gICAgKSB7XG4gICAgICByZXR1cm4gdmFsdWUuaGFzKHBhdGhBcnJheS5zbGljZSgxKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmVzZXQoe1xuICAgIHBhdGgsXG4gICAgc2lsZW50ID0gZmFsc2UsXG4gIH06IHsgcGF0aD86IGtleW9mIFQgfCBzdHJpbmcgfCBzdHJpbmdbXTsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBjb25zdCBwYXRoQXJyYXk6IHN0cmluZ1tdID0gKFxuICAgICAgcGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gW11cbiAgICAgICAgOiBUeXBlcy5pc0FycmF5KHBhdGgpXG4gICAgICAgICAgPyBwYXRoXG4gICAgICAgICAgOiAocGF0aCBhcyBzdHJpbmcpLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgY29uc3QgbmFtZSA9IHBhdGhBcnJheVswXTtcbiAgICBjb25zdCB2YWx1ZSA9IG5hbWUgIT09IHVuZGVmaW5lZCA/ICg8YW55PnRoaXMpW25hbWVdIDogdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpIHx8XG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpXG4gICAgKSB7XG4gICAgICB2YWx1ZS5yZXNldCh7IHBhdGg6IHBhdGhBcnJheS5zbGljZSgxKSwgc2lsZW50IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tZXRhLnJlc2V0KHRoaXMsIHsgbmFtZTogcGF0aEFycmF5WzBdLCBzaWxlbnQgfSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoeyBzaWxlbnQgPSBmYWxzZSB9OiB7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgdGhpcy5fYXR0cmlidXRlcy5jbGVhcigpO1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlVwZGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgYXNzaWduKFxuICAgIGVudGl0eTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIGFkZCA9IHRydWUsXG4gICAgICBtZXJnZSA9IHRydWUsXG4gICAgICByZW1vdmUgPSB0cnVlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBhZGQ/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5hc3NpZ24odGhpcywgZW50aXR5LCB7XG4gICAgICBhZGQsXG4gICAgICBtZXJnZSxcbiAgICAgIHJlbW92ZSxcbiAgICAgIHJlc2V0LFxuICAgICAgc2lsZW50LFxuICAgICAgcmVwYXJlbnQsXG4gICAgfSkgYXMgdGhpcztcbiAgfVxuXG4gIGNsb25lPE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PigpIHtcbiAgICByZXR1cm4gbmV3ICg8dHlwZW9mIE9EYXRhTW9kZWw+dGhpcy5jb25zdHJ1Y3RvcikoXG4gICAgICB0aGlzLnRvRW50aXR5KElOQ0xVREVfREVFUCksXG4gICAgICB7XG4gICAgICAgIHJlc291cmNlOiB0aGlzLnJlc291cmNlKCkgYXMgT0RhdGFSZXNvdXJjZTxUPixcbiAgICAgICAgYW5ub3RzOiB0aGlzLmFubm90cygpLFxuICAgICAgfSxcbiAgICApIGFzIE07XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0PFQsIFI+KFxuICAgIG9icyQ6IE9ic2VydmFibGU8VD4sXG4gICAgbWFwQ2FsbGJhY2s6IChyZXNwb25zZTogVCkgPT4gUixcbiAgKTogT2JzZXJ2YWJsZTxSPiB7XG4gICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXF1ZXN0LCB7XG4gICAgICBvcHRpb25zOiB7IG9ic2VydmFibGU6IG9icyQgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzJC5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZSkgPT4gbWFwQ2FsbGJhY2socmVzcG9uc2UpKSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuU3luYykpLFxuICAgICk7XG4gIH1cblxuICBmZXRjaCh7XG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgb3B0aW9ucz86IE9EYXRhT3B0aW9ucztcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFyZXNvdXJjZSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignZmV0Y2g6IFJlc291cmNlIGlzIG51bGwnKSk7XG5cbiAgICBsZXQgb2JzJDogT2JzZXJ2YWJsZTxPRGF0YUVudGl0eTxUPj47XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkge1xuICAgICAgb2JzJCA9IHJlc291cmNlLmZldGNoKG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKSB7XG4gICAgICBvYnMkID0gcmVzb3VyY2UuZmV0Y2goeyByZXNwb25zZVR5cGU6ICdlbnRpdHknLCAuLi5vcHRpb25zIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYnMkID0gKHJlc291cmNlIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPikuZmV0Y2goe1xuICAgICAgICByZXNwb25zZVR5cGU6ICdlbnRpdHknLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsICh7IGVudGl0eSwgYW5ub3RzIH0pID0+IHtcbiAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgcmV0dXJuIHRoaXMuYXNzaWduKGVudGl0eSA/PyB7fSwgeyByZXNldDogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmUoe1xuICAgIG1ldGhvZCxcbiAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgdmFsaWRhdGUgPSB0cnVlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB2YWxpZGF0ZT86IGJvb2xlYW47XG4gICAgb3B0aW9ucz86IE9EYXRhT3B0aW9ucztcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFyZXNvdXJjZSkgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdzYXZlOiBSZXNvdXJjZSBpcyBudWxsJykpO1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2VcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnc2F2ZTogUmVzb3VyY2UgdHlwZSBPRGF0YUVudGl0eVJlc291cmNlL09EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgbmVlZGVkJyxcbiAgICAgICAgICApLFxuICAgICAgKTtcblxuICAgIC8vIFJlc29sdmUgbWV0aG9kIGFuZCByZXNvdXJjZSBrZXlcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY2hlbWEoKS5pc0NvbXBvdW5kS2V5KCkpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnc2F2ZTogQ29tcG9zaXRlIGtleSByZXF1aXJlIGEgc3BlY2lmaWMgbWV0aG9kLCB1c2UgY3JlYXRlL3VwZGF0ZS9tb2RpZnknLFxuICAgICAgICAgICksXG4gICAgICApO1xuICAgIG1ldGhvZCA9IG1ldGhvZCB8fCAoIXJlc291cmNlLmhhc0tleSgpID8gJ2NyZWF0ZScgOiAndXBkYXRlJyk7XG4gICAgaWYgKFxuICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlICYmXG4gICAgICAobWV0aG9kID09PSAndXBkYXRlJyB8fCBtZXRob2QgPT09ICdtb2RpZnknKSAmJlxuICAgICAgIXJlc291cmNlLmhhc0tleSgpXG4gICAgKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+IG5ldyBFcnJvcignc2F2ZTogVXBkYXRlL1BhdGNoIHJlcXVpcmUgZW50aXR5IGtleScpLFxuICAgICAgKTtcbiAgICBpZiAoXG4gICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgfHxcbiAgICAgIG1ldGhvZCA9PT0gJ2NyZWF0ZSdcbiAgICApXG4gICAgICByZXNvdXJjZS5jbGVhcktleSgpO1xuXG4gICAgaWYgKHZhbGlkYXRlICYmICF0aGlzLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignc2F2ZTogVmFsaWRhdGlvbiBlcnJvcnMnKSk7XG4gICAgfVxuICAgIGNvbnN0IF9lbnRpdHkgPSB0aGlzLnRvRW50aXR5KHtcbiAgICAgIGNoYW5nZXNfb25seTogbWV0aG9kID09PSAnbW9kaWZ5JyxcbiAgICAgIGZpZWxkX21hcHBpbmc6IHRydWUsXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5OiB0cnVlLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBuYXZpZ2F0aW9uLFxuICAgIH0pO1xuICAgIGNvbnN0IG9icyQgPVxuICAgICAgbWV0aG9kID09PSAnY3JlYXRlJ1xuICAgICAgICA/IHJlc291cmNlLmNyZWF0ZShfZW50aXR5IGFzIFQsIG9wdGlvbnMpXG4gICAgICAgIDogbWV0aG9kID09PSAnbW9kaWZ5J1xuICAgICAgICAgID8gcmVzb3VyY2UubW9kaWZ5KF9lbnRpdHkgYXMgVCwge1xuICAgICAgICAgICAgICBldGFnOiB0aGlzLmFubm90cygpLmV0YWcsXG4gICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogcmVzb3VyY2UudXBkYXRlKF9lbnRpdHkgYXMgVCwge1xuICAgICAgICAgICAgICBldGFnOiB0aGlzLmFubm90cygpLmV0YWcsXG4gICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCAoeyBlbnRpdHksIGFubm90cyB9KSA9PiB7XG4gICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90cztcbiAgICAgIHJldHVybiB0aGlzLmFzc2lnbihlbnRpdHkgPz8gKF9lbnRpdHkgYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pLCB7XG4gICAgICAgIHJlc2V0OiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBkZXN0cm95KHtcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIXJlc291cmNlKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdkZXN0cm95OiBSZXNvdXJjZSBpcyBudWxsJykpO1xuXG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlIHx8XG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZVxuICAgICAgKVxuICAgIClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICdkZXN0cm95OiBSZXNvdXJjZSB0eXBlIE9EYXRhRW50aXR5UmVzb3VyY2UvT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSBuZWVkZWQnLFxuICAgICAgICAgICksXG4gICAgICApO1xuICAgIGlmICghcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT4gbmV3IEVycm9yKFwiZGVzdHJveTogQ2FuJ3QgZGVzdHJveSBtb2RlbCB3aXRob3V0IGtleVwiKSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBvYnMkID0gcmVzb3VyY2UuZGVzdHJveSh7IGV0YWc6IHRoaXMuYW5ub3RzKCkuZXRhZywgLi4ub3B0aW9ucyB9KTtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCAocmVzcCkgPT4ge1xuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5EZXN0cm95KTtcbiAgICAgIHJldHVybiByZXNwO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBleGVjdXRpb24gY29udGV4dCBmb3IgY2hhbmdlIHRoZSBpbnRlcm5hbCBxdWVyeSBvZiBhIHJlc291cmNlXG4gICAqIEBwYXJhbSBjdHggRnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgcXVlcnkoXG4gICAgY3R4OiAocTogT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyPFQ+LCBzPzogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPikgPT4gdm9pZCxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgcmV0dXJuIHJlc291cmNlID8gKHRoaXMuX21ldGEucXVlcnkodGhpcywgcmVzb3VyY2UsIGN0eCkgYXMgdGhpcykgOiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBjaGVjayBvbiB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIG1vZGVsIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZWwgaXMgY2hhbmdlZC5cbiAgICogQHBhcmFtIGluY2x1ZGVfbmF2aWdhdGlvbiBDaGVjayBpbiBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgbW9kZWwgaGFzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaGFzQ2hhbmdlZCh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5oYXNDaGFuZ2VkKHRoaXMsIHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pO1xuICB9XG5cbiAgZW5jb2RlPEU+KG5hbWU6IGtleW9mIFQsIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSAoPGFueT50aGlzKVtuYW1lXTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmluZEZpZWxkPEU+KG5hbWUpO1xuICAgIHJldHVybiBmaWVsZCA/IGZpZWxkLmVuY29kZSh2YWx1ZSwgb3B0aW9ucykgOiB2YWx1ZTtcbiAgfVxuXG4gIGlzTmV3KCkge1xuICAgIHJldHVybiAhdGhpcy5fbWV0YS5oYXNLZXkodGhpcyk7XG4gIH1cblxuICB3aXRoUmVzb3VyY2U8Uj4ocmVzb3VyY2U6IGFueSwgY3R4OiAobW9kZWw6IHRoaXMpID0+IFIpOiBSIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS53aXRoUmVzb3VyY2UodGhpcywgcmVzb3VyY2UsIGN0eCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIGdpdmVuIGZ1bmN0aW9uLCB3aGVyZSB0aGUgbW9kZWwgaXMgYm91bmQgdG8gaXRzIGVudGl0eSBlbmRwb2ludFxuICAgKiBAcGFyYW0gY3R4IENvbnRleHQgZnVuY3Rpb25cbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgY29udGV4dFxuICAgKi9cbiAgYXNFbnRpdHk8Uj4oY3R4OiAobW9kZWw6IHRoaXMpID0+IFIpOiBSIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5hc0VudGl0eSh0aGlzLCBjdHgpO1xuICB9XG5cbiAgLy8jcmVnaW9uIENhbGxhYmxlc1xuICBjYWxsRnVuY3Rpb248UCwgUj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgcmVzcG9uc2VUeXBlOlxuICAgICAgfCAncHJvcGVydHknXG4gICAgICB8ICdtb2RlbCdcbiAgICAgIHwgJ2NvbGxlY3Rpb24nXG4gICAgICB8ICdub25lJ1xuICAgICAgfCAnYmxvYidcbiAgICAgIHwgJ2FycmF5YnVmZmVyJyxcbiAgICBvcHRpb25zOiBPRGF0YUZ1bmN0aW9uT3B0aW9uczxSPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFxuICAgIHwgUlxuICAgIHwgT0RhdGFNb2RlbDxSPlxuICAgIHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+XG4gICAgfCBudWxsXG4gICAgfCBCbG9iXG4gICAgfCBBcnJheUJ1ZmZlclxuICA+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiY2FsbEZ1bmN0aW9uOiBDYW4ndCBjYWxsIGZ1bmN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiLFxuICAgICAgICAgICksXG4gICAgICApO1xuXG4gICAgY29uc3QgZnVuYyA9IHJlc291cmNlLmZ1bmN0aW9uPFAsIFI+KG5hbWUpLnF1ZXJ5KChxKSA9PiBxLnJlc3RvcmUob3B0aW9ucykpO1xuICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGZ1bmMuY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KGZ1bmMuY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyksIChyZXNwKSA9PiByZXNwKTtcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBmdW5jLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgICBjYXNlICdibG9iJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoZnVuYy5jYWxsQmxvYihwYXJhbXMsIG9wdGlvbnMpLCAocmVzcCkgPT4gcmVzcCk7XG4gICAgICBjYXNlICdhcnJheWJ1ZmZlcic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGZ1bmMuY2FsbEFycmF5YnVmZmVyKHBhcmFtcywgb3B0aW9ucyksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBmdW5jLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjYWxsQWN0aW9uPFAsIFI+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHJlc3BvbnNlVHlwZT86XG4gICAgICB8ICdwcm9wZXJ0eSdcbiAgICAgIHwgJ21vZGVsJ1xuICAgICAgfCAnY29sbGVjdGlvbidcbiAgICAgIHwgJ25vbmUnXG4gICAgICB8ICdibG9iJ1xuICAgICAgfCAnYXJyYXlidWZmZXInLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhQWN0aW9uT3B0aW9uczxSPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFxuICAgIHwgUlxuICAgIHwgT0RhdGFNb2RlbDxSPlxuICAgIHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+XG4gICAgfCBudWxsXG4gICAgfCBCbG9iXG4gICAgfCBBcnJheUJ1ZmZlclxuICA+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiY2FsbEFjdGlvbjogQ2FuJ3QgY2FsbCBhY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlIHdpdGgga2V5XCIsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBhY3Rpb24gPSByZXNvdXJjZS5hY3Rpb248UCwgUj4obmFtZSkucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgYWN0aW9uLmNhbGxQcm9wZXJ0eShwYXJhbXMsIG9wdGlvbnMpLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChhY3Rpb24uY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyksIChyZXNwKSA9PiByZXNwKTtcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBhY3Rpb24uY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ2Jsb2InOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChhY3Rpb24uY2FsbEJsb2IocGFyYW1zLCBvcHRpb25zKSwgKHJlc3ApID0+IHJlc3ApO1xuICAgICAgY2FzZSAnYXJyYXlidWZmZXInOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBhY3Rpb24uY2FsbEFycmF5YnVmZmVyKHBhcmFtcywgb3B0aW9ucyksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBhY3Rpb24uY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlLCAuLi5vcHRpb25zIH0pLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyBDYXN0XG4gIGNhc3Q8Uz4oXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIE1vZGVsVHlwZT86IHR5cGVvZiBPRGF0YU1vZGVsLFxuICApOiBPRGF0YU1vZGVsPFQ+ICYgTW9kZWxJbnRlcmZhY2U8VD47XG4gIGNhc3Q8UywgTSBleHRlbmRzIE9EYXRhTW9kZWw8Uz4+KFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBNb2RlbFR5cGU/OiB0eXBlb2YgT0RhdGFNb2RlbCxcbiAgKTogTTtcbiAgY2FzdDxTPih0eXBlOiBzdHJpbmcsIE1vZGVsVHlwZT86IHR5cGVvZiBPRGF0YU1vZGVsKSB7XG4gICAgLy86IE9EYXRhTW9kZWw8Uz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYXN0OiBDYW4ndCBjYXN0IHRvIGRlcml2ZWQgbW9kZWwgd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlYCxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgIC5jYXN0PFM+KHR5cGUpXG4gICAgICAuYXNNb2RlbCh0aGlzLnRvRW50aXR5KElOQ0xVREVfREVFUCkgYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sIHtcbiAgICAgICAgYW5ub3RzOiB0aGlzLmFubm90cygpIGFzIGFueSxcbiAgICAgICAgTW9kZWxUeXBlLFxuICAgICAgfSk7XG4gIH1cblxuICBmZXRjaE5hdmlnYXRpb25Qcm9wZXJ0eTxTPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIHJlc3BvbnNlVHlwZTogJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyxcbiAgICBvcHRpb25zOiBPRGF0YVF1ZXJ5QXJndW1lbnRzT3B0aW9uczxTPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhTW9kZWw8Uz4gfCBPRGF0YUNvbGxlY3Rpb248UywgT0RhdGFNb2RlbDxTPj4gfCBudWxsPiB7XG4gICAgY29uc3QgbmF2ID0gdGhpcy5uYXZpZ2F0aW9uUHJvcGVydHk8Uz4oXG4gICAgICBuYW1lLFxuICAgICkgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxTPjtcbiAgICBuYXYucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIG5hdi5mZXRjaE1vZGVsKG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBuYXYuZmV0Y2hDb2xsZWN0aW9uKG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGZldGNoQXR0cmlidXRlPFA+KFxuICAgIG5hbWU6IGtleW9mIFQsXG4gICAgb3B0aW9uczogT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnM8UD4gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxQIHwgT0RhdGFNb2RlbDxQPiB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PiB8IG51bGw+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmluZEZpZWxkPFA+KG5hbWUpO1xuICAgIGlmICghZmllbGQpXG4gICAgICB0aHJvdyBFcnJvcihgZmV0Y2hBdHRyaWJ1dGU6IENhbid0IGZpbmQgYXR0cmlidXRlICR7bmFtZSBhcyBzdHJpbmd9YCk7XG5cbiAgICBpZiAoZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpICYmIGZpZWxkLmNvbGxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBmaWVsZC5jb2xsZWN0aW9uRmFjdG9yeTxQPih7IHBhcmVudDogdGhpcyB9KTtcbiAgICAgIGNvbGxlY3Rpb24ucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zIGFzIE9EYXRhUXVlcnlBcmd1bWVudHM8UD4pKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KGNvbGxlY3Rpb24uZmV0Y2gob3B0aW9ucyksICgpID0+IHtcbiAgICAgICAgdGhpcy5hc3NpZ24oeyBbbmFtZV06IGNvbGxlY3Rpb24gfSk7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKCkpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gZmllbGQubW9kZWxGYWN0b3J5PFA+KHsgcGFyZW50OiB0aGlzIH0pO1xuICAgICAgbW9kZWwucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zIGFzIE9EYXRhUXVlcnlBcmd1bWVudHM8UD4pKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG1vZGVsLmZldGNoKG9wdGlvbnMpLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuYXNzaWduKHsgW25hbWVdOiBtb2RlbCB9KTtcbiAgICAgICAgcmV0dXJuIG1vZGVsO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByb3AgPSBmaWVsZC5yZXNvdXJjZUZhY3Rvcnk8VCwgUD4oXG4gICAgICAgIHRoaXMucmVzb3VyY2UoKSEsXG4gICAgICApIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxQPjtcbiAgICAgIHByb3AucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zIGFzIE9EYXRhUXVlcnlBcmd1bWVudHM8UD4pKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHByb3AuZmV0Y2hQcm9wZXJ0eShvcHRpb25zKSwgKHJlc3ApID0+IHtcbiAgICAgICAgdGhpcy5hc3NpZ24oeyBbbmFtZV06IHJlc3AgfSk7XG4gICAgICAgIHJldHVybiByZXNwO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgZ2V0QXR0cmlidXRlPFA+KFxuICAgIG5hbWU6IGtleW9mIFQsXG4gICk6IChQIGV4dGVuZHMgKGluZmVyIFUpW10gPyBPRGF0YUNvbGxlY3Rpb248VSwgT0RhdGFNb2RlbDxVPiAmIE1vZGVsSW50ZXJmYWNlPFU+PiA6XG4gICAgICBQIGV4dGVuZHMgQXJyYXlCdWZmZXJMaWtlID8gQXJyYXlCdWZmZXIgOlxuICAgICAgUCBleHRlbmRzIERhdGUgPyBEYXRlIDpcbiAgICAgIFAgZXh0ZW5kcyBvYmplY3QgPyBPRGF0YU1vZGVsPFA+ICYgTW9kZWxJbnRlcmZhY2U8UD4gOiBQICkgfCBudWxsO1xuICBnZXRBdHRyaWJ1dGU8TSBleHRlbmRzIE9EYXRhTW9kZWw8a2V5b2YgVD4+KFxuICAgIG5hbWU6IGtleW9mIFQsXG4gICk6IE0gfCBudWxsO1xuICBnZXRBdHRyaWJ1dGU8QyBleHRlbmRzIE9EYXRhQ29sbGVjdGlvbjxrZXlvZiBULCBPRGF0YU1vZGVsPGtleW9mIFQ+Pj4oXG4gICAgbmFtZToga2V5b2YgVCxcbiAgKTogQyB8IG51bGw7XG4gIGdldEF0dHJpYnV0ZTxQPihcbiAgICBuYW1lOiBrZXlvZiBULFxuICApIHtcbiAgKi9cbiAgZ2V0QXR0cmlidXRlPFA+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICk6IFAgfCBPRGF0YU1vZGVsPFA+IHwgT0RhdGFDb2xsZWN0aW9uPFAsIE9EYXRhTW9kZWw8UD4+IHwgbnVsbCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpbmRGaWVsZDxQPihuYW1lKTtcbiAgICBpZiAoIWZpZWxkKVxuICAgICAgdGhyb3cgRXJyb3IoYGdldEF0dHJpYnV0ZTogQ2FuJ3QgZmluZCBhdHRyaWJ1dGUgJHtuYW1lIGFzIHN0cmluZ31gKTtcblxuICAgIGxldCBtb2RlbCA9ICh0aGlzIGFzIGFueSlbbmFtZV0gYXNcbiAgICAgIHwgUFxuICAgICAgfCBPRGF0YU1vZGVsPFA+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PlxuICAgICAgfCBudWxsO1xuICAgIGlmIChmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKCkgJiYgbW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpZWxkLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgbW9kZWwgPSBmaWVsZC5jb2xsZWN0aW9uRmFjdG9yeSh7IHBhcmVudDogdGhpcyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlZiA9IGZpZWxkLm5hdmlnYXRpb25cbiAgICAgICAgICA/ICh0aGlzLnJlZmVyZW5jZWQoZmllbGQpIGFzIFApXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1vZGVsID1cbiAgICAgICAgICByZWYgPT09IG51bGxcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiBmaWVsZC5tb2RlbEZhY3RvcnkoeyBwYXJlbnQ6IHRoaXMsIHZhbHVlOiByZWYgfSk7XG4gICAgICB9XG4gICAgICAodGhpcyBhcyBhbnkpW25hbWVdID0gbW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIHNldEF0dHJpYnV0ZTxOPihcbiAgICBuYW1lOiBrZXlvZiBULFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPE4+IHwgT0RhdGFDb2xsZWN0aW9uPE4sIE9EYXRhTW9kZWw8Tj4+IHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSAoXG4gICAgICB0aGlzLm5hdmlnYXRpb25Qcm9wZXJ0eTxOPihuYW1lKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+XG4gICAgKS5yZWZlcmVuY2UoKTtcblxuICAgIGNvbnN0IGV0YWcgPSB0aGlzLmFubm90cygpLmV0YWc7XG4gICAgbGV0IG9icyQgPSBORVZFUiBhcyBPYnNlcnZhYmxlPGFueT47XG4gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFNb2RlbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS5zZXQoXG4gICAgICAgIG1vZGVsLmFzRW50aXR5KChlKSA9PiBlLnJlc291cmNlKCkpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8Tj4sXG4gICAgICAgIHsgZXRhZywgLi4ub3B0aW9ucyB9LFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKSB7XG4gICAgICBvYnMkID0gZm9ya0pvaW4oXG4gICAgICAgIG1vZGVsXG4gICAgICAgICAgLm1vZGVscygpXG4gICAgICAgICAgLm1hcCgobSkgPT5cbiAgICAgICAgICAgIHJlZmVyZW5jZS5hZGQoXG4gICAgICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUucmVzb3VyY2UoKSkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxOPixcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gbnVsbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS51bnNldCh7IGV0YWcsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsIChtb2RlbCkgPT4gdGhpcy5hc3NpZ24oeyBbbmFtZV06IG1vZGVsIH0pKTtcbiAgfVxuXG4gIHNldFJlZmVyZW5jZTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPE4+IHwgT0RhdGFDb2xsZWN0aW9uPE4sIE9EYXRhTW9kZWw8Tj4+IHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSAoXG4gICAgICB0aGlzLm5hdmlnYXRpb25Qcm9wZXJ0eTxOPihuYW1lKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+XG4gICAgKS5yZWZlcmVuY2UoKTtcblxuICAgIGNvbnN0IGV0YWcgPSB0aGlzLmFubm90cygpLmV0YWc7XG4gICAgbGV0IG9icyQgPSBORVZFUiBhcyBPYnNlcnZhYmxlPGFueT47XG4gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFNb2RlbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS5zZXQoXG4gICAgICAgIG1vZGVsLmFzRW50aXR5KChlKSA9PiBlLnJlc291cmNlKCkpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8Tj4sXG4gICAgICAgIHsgZXRhZywgLi4ub3B0aW9ucyB9LFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKSB7XG4gICAgICBvYnMkID0gZm9ya0pvaW4oXG4gICAgICAgIG1vZGVsXG4gICAgICAgICAgLm1vZGVscygpXG4gICAgICAgICAgLm1hcCgobSkgPT5cbiAgICAgICAgICAgIHJlZmVyZW5jZS5hZGQoXG4gICAgICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUucmVzb3VyY2UoKSkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxOPixcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gbnVsbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS51bnNldCh7IGV0YWcsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsIChtb2RlbCkgPT4gdGhpcy5hc3NpZ24oeyBbbmFtZV06IG1vZGVsIH0pKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBNb2RlbCBJZGVudGl0eVxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdNb2RlbCc7XG4gIH1cbiAgZXF1YWxzKG90aGVyOiBPRGF0YU1vZGVsPFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMgPT09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIHRoaXMgIT09IHR5cGVvZiBvdGhlcikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9tZXRhO1xuICAgIGNvbnN0IHRoaXNDaWQgPSAoPGFueT50aGlzKVttZXRhLmNpZF07XG4gICAgY29uc3Qgb3RoZXJDaWQgPSAoPGFueT5vdGhlcilbbWV0YS5jaWRdO1xuICAgIGlmIChcbiAgICAgIHRoaXNDaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgb3RoZXJDaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgVHlwZXMuaXNFcXVhbCh0aGlzQ2lkLCBvdGhlckNpZClcbiAgICApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAobWV0YS5pc0VudGl0eVR5cGUoKSkge1xuICAgICAgY29uc3QgdGhpc0tleSA9IHRoaXMua2V5KCk7XG4gICAgICBjb25zdCBvdGhlcktleSA9IG90aGVyLmtleSgpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgb3RoZXJLZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBUeXBlcy5pc0VxdWFsKHRoaXNLZXksIG90aGVyS2V5KVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1ldGEuaXNDb21wbGV4VHlwZSgpKSB7XG4gICAgICBjb25zdCB0aGlzSnNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgICBjb25zdCBvdGhlckpzb24gPSBvdGhlci50b0pzb24oKTtcbiAgICAgIGlmIChUeXBlcy5pc0VxdWFsKHRoaXNKc29uLCBvdGhlckpzb24pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBDb2xsZWN0aW9uIFRvb2xzXG4gIGNvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHRoaXMuX3BhcmVudFswXSlcbiAgICAgID8gKHRoaXMuX3BhcmVudFswXSBhcyBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5leHQoKTogT0RhdGFNb2RlbDxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbigpPy5uZXh0KHRoaXMpO1xuICB9XG5cbiAgcHJldigpOiBPRGF0YU1vZGVsPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uKCk/LnByZXYodGhpcyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG5cbmNvbnN0IFJFU0VSVkVEX0ZJRUxEX05BTUVTID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT0RhdGFNb2RlbC5wcm90b3R5cGUpO1xuIl19