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,316 +0,0 @@
1
- import { DEFAULT_VERSION, PARAM_SEPARATOR, QUERY_SEPARATOR, VALUE_SEPARATOR, } from '../constants';
2
- import { ODataHelper } from '../helper';
3
- import { ODataStructuredType } from '../schema';
4
- import { PathSegment, } from '../types';
5
- import { Objects, Strings, Types } from '../utils';
6
- import { ODataPathSegments, ODataPathSegmentsHandler } from './path';
7
- import { isQueryCustomType, ODataQueryOptions, ODataQueryOptionsHandler, } from './query';
8
- export class ODataResource {
9
- // VARIABLES
10
- api;
11
- pathSegments;
12
- queryOptions;
13
- constructor(api, { segments, query, } = {}) {
14
- this.api = api;
15
- this.pathSegments = segments ?? new ODataPathSegments();
16
- this.queryOptions = query ?? new ODataQueryOptions();
17
- }
18
- /**
19
- * @returns string The outgoing type of the resource
20
- */
21
- outgoingType() {
22
- return this.pathSegments.last()?.outgoingType();
23
- }
24
- /**
25
- * @returns string The incoming type of the resource
26
- */
27
- incomingType() {
28
- return this.pathSegments.last()?.incomingType();
29
- }
30
- /**
31
- * @returns string The binding type of the resource
32
- */
33
- bindingType() {
34
- return this.pathSegments.last()?.bindingType();
35
- }
36
- /**
37
- * @returns string All covered types of the resource
38
- */
39
- types() {
40
- return this.pathSegments.types();
41
- }
42
- callable() {
43
- const type = this.outgoingType() ?? this.incomingType();
44
- return type !== undefined ? this.api.callable(type) : undefined;
45
- }
46
- enumType() {
47
- const type = this.outgoingType() ?? this.incomingType();
48
- return type !== undefined ? this.api.enumType(type) : undefined;
49
- }
50
- structuredType() {
51
- const type = this.outgoingType() ?? this.incomingType();
52
- return type !== undefined ? this.api.structuredType(type) : undefined;
53
- }
54
- /**
55
- * @returns boolean The resource has key ?
56
- */
57
- hasKey() {
58
- return Boolean(this.pathSegments.last({ key: true })?.hasKey());
59
- }
60
- hasEntityKey() {
61
- return Boolean(this.pathSegments.get(PathSegment.entitySet)?.hasKey());
62
- }
63
- clearKey() {
64
- return this.pathSegments.last({ key: true })?.clearKey();
65
- }
66
- asModel(entity, { reset, annots, ModelType, } = {}) {
67
- reset ??= annots !== undefined;
68
- let resource = this;
69
- const type = annots?.type ?? this.incomingType();
70
- if (type === undefined)
71
- throw Error(`No type for model`);
72
- if (ModelType === undefined)
73
- ModelType = this.api.modelForType(type);
74
- let entitySet = annots?.entitySet;
75
- if (entitySet !== undefined) {
76
- resource = this.api.entitySet(entitySet).entity(entity);
77
- resource.query((q) => q.restore(this.queryOptions.toQueryArguments()));
78
- }
79
- return new ModelType(entity, { resource, annots, reset });
80
- }
81
- asCollection(entities, { reset, annots, CollectionType, } = {}) {
82
- reset ??= annots !== undefined;
83
- let resource = this;
84
- const type = annots?.type ?? this.incomingType();
85
- if (type === undefined)
86
- throw Error(`No type for collection`);
87
- if (CollectionType === undefined)
88
- CollectionType = this.api.collectionForType(type);
89
- let entitySet = annots?.entitySet;
90
- if (entitySet !== undefined) {
91
- resource = this.api.entitySet(entitySet);
92
- resource.query((q) => q.restore(this.queryOptions.toQueryArguments()));
93
- }
94
- return new CollectionType(entities, { resource, annots, reset });
95
- }
96
- //#endregion
97
- isTypeOf(other) {
98
- const thisStructured = this.structuredType();
99
- const otherStructured = other.structuredType();
100
- return (thisStructured !== undefined &&
101
- otherStructured !== undefined &&
102
- thisStructured.isTypeOf(otherStructured));
103
- }
104
- isSubtypeOf(other) {
105
- const thisStructured = this.structuredType();
106
- const otherStructured = other.structuredType();
107
- return (thisStructured !== undefined &&
108
- otherStructured !== undefined &&
109
- thisStructured.isSubtypeOf(otherStructured));
110
- }
111
- isSupertypeOf(other) {
112
- const thisStructured = this.structuredType();
113
- const otherStructured = other.structuredType();
114
- return (thisStructured !== undefined &&
115
- otherStructured !== undefined &&
116
- thisStructured.isSupertypeOf(otherStructured));
117
- }
118
- isEqualTo(other, test) {
119
- const [selfPath, selfParams] = this.pathAndParams();
120
- const [otherPath, otherParams] = other.pathAndParams();
121
- return test === 'path'
122
- ? otherPath === selfPath
123
- : test === 'params'
124
- ? Types.isEqual(selfParams, otherParams)
125
- : otherPath === selfPath && Types.isEqual(selfParams, otherParams);
126
- }
127
- pathAndParams({ escape, ...options } = {
128
- escape: false,
129
- }) {
130
- const type = this.outgoingType();
131
- const parser = type !== undefined ? this.api.parserForType(type) : undefined;
132
- const [spath, sparams] = this.pathSegments.pathAndParams({
133
- escape,
134
- parser,
135
- options,
136
- });
137
- const [, qparams] = this.queryOptions.pathAndParams({
138
- escape,
139
- parser,
140
- options,
141
- });
142
- return [spath, { ...sparams, ...qparams }];
143
- }
144
- endpointUrl({ escape = false, params = true, ...options } = {}) {
145
- let [path, qparams] = this.pathAndParams({ escape, ...options });
146
- if (params && !Types.isEmpty(qparams)) {
147
- path = `${path}${QUERY_SEPARATOR}${Object.entries(qparams)
148
- .map((e) => `${e[0]}${VALUE_SEPARATOR}${e[1]}`)
149
- .join(PARAM_SEPARATOR)}`;
150
- }
151
- return `${this.api.serviceRootUrl}${path}`;
152
- }
153
- toString({ escape, ...options } = {
154
- escape: false,
155
- }) {
156
- let [path, params] = this.pathAndParams({ escape, ...options });
157
- let queryString = Object.entries(params)
158
- .map((e) => `${e[0]}${VALUE_SEPARATOR}${e[1]}`)
159
- .join(PARAM_SEPARATOR);
160
- return queryString ? `${path}${QUERY_SEPARATOR}${queryString}` : path;
161
- }
162
- clone() {
163
- const Ctor = this.constructor;
164
- return new Ctor(this.api, {
165
- segments: this.cloneSegments(),
166
- query: this.cloneQuery(),
167
- });
168
- }
169
- __parser(value, options, resourceType, bindingType) {
170
- const dataType = options !== undefined && Types.isPlainObject(value)
171
- ? ODataHelper[options.version ?? DEFAULT_VERSION].type(value)
172
- : undefined;
173
- if (dataType !== undefined) {
174
- // Parser from data type
175
- return this.api.parserForType(dataType);
176
- }
177
- else if (resourceType !== undefined) {
178
- // Parser from resource type
179
- return this.api.parserForType(resourceType, bindingType);
180
- }
181
- return undefined;
182
- }
183
- deserialize(value, options) {
184
- const resourceType = this.incomingType();
185
- const bindingType = this.bindingType();
186
- const _d = (value, options) => {
187
- const parser = this.__parser(value, options, resourceType, bindingType);
188
- return parser !== undefined ? parser.deserialize(value, options) : value;
189
- };
190
- return Array.isArray(value)
191
- ? value.map((v) => _d(v, options))
192
- : _d(value, options);
193
- }
194
- serialize(value, options) {
195
- const resourceType = this.outgoingType();
196
- const bindingType = this.bindingType();
197
- const _s = (value, options) => {
198
- const parser = this.__parser(value, options, resourceType, bindingType);
199
- return parser !== undefined ? parser.serialize(value, options) : value;
200
- };
201
- return Array.isArray(value)
202
- ? value.map((v) => _s(v, options))
203
- : _s(value, options);
204
- }
205
- encode(value, options) {
206
- const resourceType = this.outgoingType();
207
- const bindingType = this.bindingType();
208
- const _e = (value, options) => {
209
- const parser = this.__parser(value, options, resourceType, bindingType);
210
- return parser !== undefined ? parser.encode(value, options) : value;
211
- };
212
- return Array.isArray(value)
213
- ? value.map((v) => _e(v, options))
214
- : _e(value, options);
215
- }
216
- toJson() {
217
- return {
218
- segments: this.pathSegments.toJson(),
219
- options: this.queryOptions.toJson(),
220
- };
221
- }
222
- cloneSegments() {
223
- return this.pathSegments.clone();
224
- }
225
- //#region Query Options
226
- clearQuery() {
227
- this.queryOptions.clear();
228
- return this;
229
- }
230
- cloneQuery() {
231
- return this.queryOptions.clone();
232
- }
233
- /**
234
- * Handle the path segments of the resource
235
- * Create an object handler for mutate the path segments of the resource
236
- * @param f Function context for handle the segments
237
- * @returns ODataActionResource
238
- */
239
- segment(f) {
240
- const type = this.outgoingType();
241
- f(new ODataPathSegmentsHandler(this.pathSegments), type !== undefined ? this.api.structuredType(type) : undefined);
242
- return this;
243
- }
244
- /**
245
- * Handle the query options of the resource
246
- * Create an object handler for mutate the query options of the resource
247
- * @param f Function context for handle the query options
248
- */
249
- query(f) {
250
- const type = this.outgoingType();
251
- f(new ODataQueryOptionsHandler(this.queryOptions), type !== undefined ? this.api.structuredType(type) : undefined);
252
- return this;
253
- }
254
- transform(opts, { type, fields, } = {}) {
255
- if (type === undefined) {
256
- type = Strings.uniqueId({ prefix: 'Transformation', suffix: 'Type' });
257
- }
258
- // Resolve Structured Type
259
- let structuredType = this.api.findStructuredType(type);
260
- if (structuredType === undefined) {
261
- // Resolve Schema
262
- let schema = this.api.findSchema(type);
263
- if (schema === undefined) {
264
- const namespace = type.substring(0, type.lastIndexOf('.')) ?? this.api.name;
265
- schema = this.api.createSchema({ namespace });
266
- }
267
- const name = type.substring(type.lastIndexOf('.'));
268
- structuredType = schema.createStructuredType({ name, fields });
269
- }
270
- // Segments
271
- const segments = this.cloneSegments();
272
- segments.last()?.incomingType(structuredType.type());
273
- // Query
274
- const query = this.cloneQuery();
275
- const handler = new ODataQueryOptionsHandler(query);
276
- handler.apply(opts);
277
- const Ctor = this.constructor;
278
- return new Ctor(this.api, {
279
- segments,
280
- query,
281
- });
282
- }
283
- static resolveKey(value, schema) {
284
- if (isQueryCustomType(value)) {
285
- return value;
286
- }
287
- else if (Types.isPlainObject(value)) {
288
- return schema instanceof ODataStructuredType
289
- ? schema.resolveKey(value)
290
- : Objects.resolveKey(value);
291
- }
292
- return value;
293
- }
294
- resolveKey(value) {
295
- const type = this.outgoingType();
296
- const structured = type !== undefined ? this.api.structuredType(type) : undefined;
297
- return ODataResource.resolveKey(value, structured);
298
- }
299
- //#endregion
300
- get(options = {}) {
301
- return this.api.request('GET', this, options);
302
- }
303
- post(body, options = {}) {
304
- return this.api.request('POST', this, { body, ...options });
305
- }
306
- put(body, options = {}) {
307
- return this.api.request('PUT', this, { body, ...options });
308
- }
309
- patch(body, options = {}) {
310
- return this.api.request('PATCH', this, { body, ...options });
311
- }
312
- delete(options = {}) {
313
- return this.api.request('DELETE', this, options);
314
- }
315
- }
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3Jlc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFDTCxlQUFlLEVBQ2YsZUFBZSxFQUNmLGVBQWUsRUFDZixlQUFlLEdBQ2hCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hELE9BQU8sRUFJTCxXQUFXLEdBRVosTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQix3QkFBd0IsR0FDekIsTUFBTSxTQUFTLENBQUM7QUFvQmpCLE1BQU0sT0FBTyxhQUFhO0lBQ3hCLFlBQVk7SUFDTCxHQUFHLENBQVc7SUFDWCxZQUFZLENBQW9CO0lBQ2hDLFlBQVksQ0FBdUI7SUFDN0MsWUFDRSxHQUFhLEVBQ2IsRUFDRSxRQUFRLEVBQ1IsS0FBSyxNQUlILEVBQUU7UUFFTixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxJQUFJLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZ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LEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRVMsS0FBSyxDQUNiLElBQVMsRUFDVCxVQVlJLEVBQUU7UUFFTixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFJLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFUyxNQUFNLENBQ2QsVUFZSSxFQUFFO1FBRU4sT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBSSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9EYXRhQXBpIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7XG4gIERFRkFVTFRfVkVSU0lPTixcbiAgUEFSQU1fU0VQQVJBVE9SLFxuICBRVUVSWV9TRVBBUkFUT1IsXG4gIFZBTFVFX1NFUEFSQVRPUixcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhSGVscGVyIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7IE1vZGVsSW50ZXJmYWNlLCBPRGF0YUNvbGxlY3Rpb24sIE9EYXRhTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgT0RhdGFTdHJ1Y3R1cmVkVHlwZSB9IGZyb20gJy4uL3NjaGVtYSc7XG5pbXBvcnQge1xuICBQYXJzZXJPcHRpb25zLFxuICBQYXJzZXIsXG4gIFF1ZXJ5T3B0aW9uLFxuICBQYXRoU2VnbWVudCxcbiAgU3RydWN0dXJlZFR5cGVGaWVsZENvbmZpZyxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgT2JqZWN0cywgU3RyaW5ncywgVHlwZXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBPRGF0YVBhdGhTZWdtZW50cywgT0RhdGFQYXRoU2VnbWVudHNIYW5kbGVyIH0gZnJvbSAnLi9wYXRoJztcbmltcG9ydCB7XG4gIGlzUXVlcnlDdXN0b21UeXBlLFxuICBPRGF0YVF1ZXJ5T3B0aW9ucyxcbiAgT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyLFxufSBmcm9tICcuL3F1ZXJ5JztcbmltcG9ydCB7XG4gIEFwcGx5RXhwcmVzc2lvbixcbiAgQXBwbHlFeHByZXNzaW9uQnVpbGRlcixcbiAgUXVlcnlDdXN0b21UeXBlLFxufSBmcm9tICcuL3F1ZXJ5JztcbmltcG9ydCB7IE9EYXRhT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zLFxuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxufSBmcm9tICcuLi9hbm5vdGF0aW9ucyc7XG5cbmV4cG9ydCB0eXBlIEVudGl0eUtleTxUPiA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF0/OiBUW1BdO1xuICAgIH1cbiAgfCBRdWVyeUN1c3RvbVR5cGVcbiAgfCBzdHJpbmdcbiAgfCBudW1iZXI7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVJlc291cmNlPFQ+IHtcbiAgLy8gVkFSSUFCTEVTXG4gIHB1YmxpYyBhcGk6IE9EYXRhQXBpO1xuICBwcm90ZWN0ZWQgcGF0aFNlZ21lbnRzOiBPRGF0YVBhdGhTZWdtZW50cztcbiAgcHJvdGVjdGVkIHF1ZXJ5T3B0aW9uczogT0RhdGFRdWVyeU9wdGlvbnM8VD47XG4gIGNvbnN0cnVjdG9yKFxuICAgIGFwaTogT0RhdGFBcGksXG4gICAge1xuICAgICAgc2VnbWVudHMsXG4gICAgICBxdWVyeSxcbiAgICB9OiB7XG4gICAgICBzZWdtZW50cz86IE9EYXRhUGF0aFNlZ21lbnRzO1xuICAgICAgcXVlcnk/OiBPRGF0YVF1ZXJ5T3B0aW9uczxUPjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIHRoaXMuYXBpID0gYXBpO1xuICAgIHRoaXMucGF0aFNlZ21lbnRzID0gc2VnbWVudHMgPz8gbmV3IE9EYXRhUGF0aFNlZ21lbnRzKCk7XG4gICAgdGhpcy5xdWVyeU9wdGlvbnMgPSBxdWVyeSA/PyBuZXcgT0RhdGFRdWVyeU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBzdHJpbmcgVGhlIG91dGdvaW5nIHR5cGUgb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICBvdXRnb2luZ1R5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aFNlZ21lbnRzLmxhc3QoKT8ub3V0Z29pbmdUeXBlKCk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgc3RyaW5nIFRoZSBpbmNvbWluZyB0eXBlIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgaW5jb21pbmdUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhdGhTZWdtZW50cy5sYXN0KCk/LmluY29taW5nVHlwZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHN0cmluZyBUaGUgYmluZGluZyB0eXBlIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgYmluZGluZ1R5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aFNlZ21lbnRzLmxhc3QoKT8uYmluZGluZ1R5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBzdHJpbmcgQWxsIGNvdmVyZWQgdHlwZXMgb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICB0eXBlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aFNlZ21lbnRzLnR5cGVzKCk7XG4gIH1cblxuICBjYWxsYWJsZSgpIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5vdXRnb2luZ1R5cGUoKSA/PyB0aGlzLmluY29taW5nVHlwZSgpO1xuICAgIHJldHVybiB0eXBlICE9PSB1bmRlZmluZWQgPyB0aGlzLmFwaS5jYWxsYWJsZTxUPih0eXBlKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGVudW1UeXBlKCkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLm91dGdvaW5nVHlwZSgpID8/IHRoaXMuaW5jb21pbmdUeXBlKCk7XG4gICAgcmV0dXJuIHR5cGUgIT09IHVuZGVmaW5lZCA/IHRoaXMuYXBpLmVudW1UeXBlPFQ+KHR5cGUpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgc3RydWN0dXJlZFR5cGUoKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMub3V0Z29pbmdUeXBlKCkgPz8gdGhpcy5pbmNvbWluZ1R5cGUoKTtcbiAgICByZXR1cm4gdHlwZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5hcGkuc3RydWN0dXJlZFR5cGU8VD4odHlwZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYm9vbGVhbiBUaGUgcmVzb3VyY2UgaGFzIGtleSA/XG4gICAqL1xuICBoYXNLZXkoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5wYXRoU2VnbWVudHMubGFzdCh7IGtleTogdHJ1ZSB9KT8uaGFzS2V5KCkpO1xuICB9XG5cbiAgaGFzRW50aXR5S2V5KCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMucGF0aFNlZ21lbnRzLmdldChQYXRoU2VnbWVudC5lbnRpdHlTZXQpPy5oYXNLZXkoKSk7XG4gIH1cblxuICBjbGVhcktleSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXRoU2VnbWVudHMubGFzdCh7IGtleTogdHJ1ZSB9KT8uY2xlYXJLZXkoKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBNb2RlbHNcbiAgYXNNb2RlbChcbiAgICBlbnRpdHk/OiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICk6IE9EYXRhTW9kZWw8VD4gJiBNb2RlbEludGVyZmFjZTxUPjtcbiAgYXNNb2RlbChcbiAgICBlbnRpdHk6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7XG4gICAgICByZXNldCxcbiAgICAgIGFubm90cyxcbiAgICAgIE1vZGVsVHlwZSxcbiAgICB9OiB7XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICBhbm5vdHM/OiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+O1xuICAgICAgTW9kZWxUeXBlPzogdHlwZW9mIE9EYXRhTW9kZWw7XG4gICAgfSxcbiAgKTogT0RhdGFNb2RlbDxUPiAmIE1vZGVsSW50ZXJmYWNlPFQ+O1xuICBhc01vZGVsPE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PihcbiAgICBlbnRpdHk/OiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICk6IE07XG4gIGFzTW9kZWw8TSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KFxuICAgIGVudGl0eTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIHJlc2V0LFxuICAgICAgYW5ub3RzLFxuICAgICAgTW9kZWxUeXBlLFxuICAgIH06IHtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIGFubm90cz86IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM8VD47XG4gICAgICBNb2RlbFR5cGU/OiB0eXBlb2YgT0RhdGFNb2RlbDtcbiAgICB9LFxuICApOiBNO1xuICBhc01vZGVsKFxuICAgIGVudGl0eT86IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7XG4gICAgICByZXNldCxcbiAgICAgIGFubm90cyxcbiAgICAgIE1vZGVsVHlwZSxcbiAgICB9OiB7XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICBhbm5vdHM/OiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+O1xuICAgICAgTW9kZWxUeXBlPzogdHlwZW9mIE9EYXRhTW9kZWw7XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICByZXNldCA/Pz0gYW5ub3RzICE9PSB1bmRlZmluZWQ7XG4gICAgbGV0IHJlc291cmNlOiBPRGF0YVJlc291cmNlPFQ+ID0gdGhpcyBhcyBPRGF0YVJlc291cmNlPFQ+O1xuICAgIGNvbnN0IHR5cGUgPSBhbm5vdHM/LnR5cGUgPz8gdGhpcy5pbmNvbWluZ1R5cGUoKTtcbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBFcnJvcihgTm8gdHlwZSBmb3IgbW9kZWxgKTtcbiAgICBpZiAoTW9kZWxUeXBlID09PSB1bmRlZmluZWQpIE1vZGVsVHlwZSA9IHRoaXMuYXBpLm1vZGVsRm9yVHlwZSh0eXBlKTtcbiAgICBsZXQgZW50aXR5U2V0ID0gYW5ub3RzPy5lbnRpdHlTZXQ7XG4gICAgaWYgKGVudGl0eVNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXNvdXJjZSA9IHRoaXMuYXBpLmVudGl0eVNldDxUPihlbnRpdHlTZXQpLmVudGl0eShlbnRpdHkgYXMgUGFydGlhbDxUPik7XG4gICAgICByZXNvdXJjZS5xdWVyeSgocSkgPT4gcS5yZXN0b3JlKHRoaXMucXVlcnlPcHRpb25zLnRvUXVlcnlBcmd1bWVudHMoKSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsVHlwZShlbnRpdHksIHsgcmVzb3VyY2UsIGFubm90cywgcmVzZXQgfSk7XG4gIH1cblxuICBhc0NvbGxlY3Rpb24oXG4gICAgZW50aXRpZXM/OiBQYXJ0aWFsPFQ+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdLFxuICApOiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPiAmIE1vZGVsSW50ZXJmYWNlPFQ+PjtcbiAgYXNDb2xsZWN0aW9uKFxuICAgIGVudGl0aWVzOiBQYXJ0aWFsPFQ+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdLFxuICAgIHtcbiAgICAgIHJlc2V0LFxuICAgICAgYW5ub3RzLFxuICAgICAgQ29sbGVjdGlvblR5cGUsXG4gICAgfToge1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPFQ+O1xuICAgICAgQ29sbGVjdGlvblR5cGU/OiB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uO1xuICAgIH0sXG4gICk6IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+ICYgTW9kZWxJbnRlcmZhY2U8VD4+O1xuICBhc0NvbGxlY3Rpb248TSBleHRlbmRzIE9EYXRhTW9kZWw8VD4sIEMgZXh0ZW5kcyBPRGF0YUNvbGxlY3Rpb248VCwgTT4+KFxuICAgIGVudGl0aWVzPzogUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSxcbiAgKTogQztcbiAgYXNDb2xsZWN0aW9uPE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+LCBDIGV4dGVuZHMgT0RhdGFDb2xsZWN0aW9uPFQsIE0+PihcbiAgICBlbnRpdGllczogUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSxcbiAgICB7XG4gICAgICByZXNldCxcbiAgICAgIGFubm90cyxcbiAgICAgIENvbGxlY3Rpb25UeXBlLFxuICAgIH06IHtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIGFubm90cz86IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxUPjtcbiAgICAgIENvbGxlY3Rpb25UeXBlPzogdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjtcbiAgICB9LFxuICApOiBDO1xuICBhc0NvbGxlY3Rpb24oXG4gICAgZW50aXRpZXM/OiBQYXJ0aWFsPFQ+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdLFxuICAgIHtcbiAgICAgIHJlc2V0LFxuICAgICAgYW5ub3RzLFxuICAgICAgQ29sbGVjdGlvblR5cGUsXG4gICAgfToge1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPFQ+O1xuICAgICAgQ29sbGVjdGlvblR5cGU/OiB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgcmVzZXQgPz89IGFubm90cyAhPT0gdW5kZWZpbmVkO1xuICAgIGxldCByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxUPiA9IHRoaXMgYXMgT0RhdGFSZXNvdXJjZTxUPjtcbiAgICBjb25zdCB0eXBlID0gYW5ub3RzPy50eXBlID8/IHRoaXMuaW5jb21pbmdUeXBlKCk7XG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkgdGhyb3cgRXJyb3IoYE5vIHR5cGUgZm9yIGNvbGxlY3Rpb25gKTtcbiAgICBpZiAoQ29sbGVjdGlvblR5cGUgPT09IHVuZGVmaW5lZClcbiAgICAgIENvbGxlY3Rpb25UeXBlID0gdGhpcy5hcGkuY29sbGVjdGlvbkZvclR5cGUodHlwZSk7XG4gICAgbGV0IGVudGl0eVNldCA9IGFubm90cz8uZW50aXR5U2V0O1xuICAgIGlmIChlbnRpdHlTZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzb3VyY2UgPSB0aGlzLmFwaS5lbnRpdHlTZXQ8VD4oZW50aXR5U2V0KTtcbiAgICAgIHJlc291cmNlLnF1ZXJ5KChxKSA9PiBxLnJlc3RvcmUodGhpcy5xdWVyeU9wdGlvbnMudG9RdWVyeUFyZ3VtZW50cygpKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvblR5cGUoZW50aXRpZXMsIHsgcmVzb3VyY2UsIGFubm90cywgcmVzZXQgfSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgaXNUeXBlT2Yob3RoZXI6IE9EYXRhUmVzb3VyY2U8YW55Pikge1xuICAgIGNvbnN0IHRoaXNTdHJ1Y3R1cmVkID0gdGhpcy5zdHJ1Y3R1cmVkVHlwZSgpO1xuICAgIGNvbnN0IG90aGVyU3RydWN0dXJlZCA9IG90aGVyLnN0cnVjdHVyZWRUeXBlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXNTdHJ1Y3R1cmVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG90aGVyU3RydWN0dXJlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzU3RydWN0dXJlZC5pc1R5cGVPZihvdGhlclN0cnVjdHVyZWQpXG4gICAgKTtcbiAgfVxuXG4gIGlzU3VidHlwZU9mKG90aGVyOiBPRGF0YVJlc291cmNlPGFueT4pIHtcbiAgICBjb25zdCB0aGlzU3RydWN0dXJlZCA9IHRoaXMuc3RydWN0dXJlZFR5cGUoKTtcbiAgICBjb25zdCBvdGhlclN0cnVjdHVyZWQgPSBvdGhlci5zdHJ1Y3R1cmVkVHlwZSgpO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzU3RydWN0dXJlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBvdGhlclN0cnVjdHVyZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpc1N0cnVjdHVyZWQuaXNTdWJ0eXBlT2Yob3RoZXJTdHJ1Y3R1cmVkKVxuICAgICk7XG4gIH1cblxuICBpc1N1cGVydHlwZU9mKG90aGVyOiBPRGF0YVJlc291cmNlPGFueT4pIHtcbiAgICBjb25zdCB0aGlzU3RydWN0dXJlZCA9IHRoaXMuc3RydWN0dXJlZFR5cGUoKTtcbiAgICBjb25zdCBvdGhlclN0cnVjdHVyZWQgPSBvdGhlci5zdHJ1Y3R1cmVkVHlwZSgpO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzU3RydWN0dXJlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBvdGhlclN0cnVjdHVyZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpc1N0cnVjdHVyZWQuaXNTdXBlcnR5cGVPZihvdGhlclN0cnVjdHVyZWQpXG4gICAgKTtcbiAgfVxuXG4gIGlzRXF1YWxUbyhvdGhlcjogT0RhdGFSZXNvdXJjZTxhbnk+LCB0ZXN0PzogJ3BhdGgnIHwgJ3BhcmFtcycpIHtcbiAgICBjb25zdCBbc2VsZlBhdGgsIHNlbGZQYXJhbXNdID0gdGhpcy5wYXRoQW5kUGFyYW1zKCk7XG4gICAgY29uc3QgW290aGVyUGF0aCwgb3RoZXJQYXJhbXNdID0gb3RoZXIucGF0aEFuZFBhcmFtcygpO1xuICAgIHJldHVybiB0ZXN0ID09PSAncGF0aCdcbiAgICAgID8gb3RoZXJQYXRoID09PSBzZWxmUGF0aFxuICAgICAgOiB0ZXN0ID09PSAncGFyYW1zJ1xuICAgICAgICA/IFR5cGVzLmlzRXF1YWwoc2VsZlBhcmFtcywgb3RoZXJQYXJhbXMpXG4gICAgICAgIDogb3RoZXJQYXRoID09PSBzZWxmUGF0aCAmJiBUeXBlcy5pc0VxdWFsKHNlbGZQYXJhbXMsIG90aGVyUGFyYW1zKTtcbiAgfVxuXG4gIHBhdGhBbmRQYXJhbXMoXG4gICAgeyBlc2NhcGUsIC4uLm9wdGlvbnMgfTogUGFyc2VyT3B0aW9ucyAmIHsgZXNjYXBlPzogYm9vbGVhbiB9ID0ge1xuICAgICAgZXNjYXBlOiBmYWxzZSxcbiAgICB9LFxuICApOiBbc3RyaW5nLCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfV0ge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLm91dGdvaW5nVHlwZSgpO1xuICAgIGNvbnN0IHBhcnNlciA9XG4gICAgICB0eXBlICE9PSB1bmRlZmluZWQgPyB0aGlzLmFwaS5wYXJzZXJGb3JUeXBlPFQ+KHR5cGUpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IFtzcGF0aCwgc3BhcmFtc10gPSB0aGlzLnBhdGhTZWdtZW50cy5wYXRoQW5kUGFyYW1zKHtcbiAgICAgIGVzY2FwZSxcbiAgICAgIHBhcnNlcixcbiAgICAgIG9wdGlvbnMsXG4gICAgfSk7XG4gICAgY29uc3QgWywgcXBhcmFtc10gPSB0aGlzLnF1ZXJ5T3B0aW9ucy5wYXRoQW5kUGFyYW1zKHtcbiAgICAgIGVzY2FwZSxcbiAgICAgIHBhcnNlcixcbiAgICAgIG9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gW3NwYXRoLCB7IC4uLnNwYXJhbXMsIC4uLnFwYXJhbXMgfV07XG4gIH1cblxuICBlbmRwb2ludFVybCh7XG4gICAgZXNjYXBlID0gZmFsc2UsXG4gICAgcGFyYW1zID0gdHJ1ZSxcbiAgICAuLi5vcHRpb25zXG4gIH06IFBhcnNlck9wdGlvbnMgJiB7IGVzY2FwZT86IGJvb2xlYW47IHBhcmFtcz86IGJvb2xlYW4gfSA9IHt9KTogc3RyaW5nIHtcbiAgICBsZXQgW3BhdGgsIHFwYXJhbXNdID0gdGhpcy5wYXRoQW5kUGFyYW1zKHsgZXNjYXBlLCAuLi5vcHRpb25zIH0pO1xuICAgIGlmIChwYXJhbXMgJiYgIVR5cGVzLmlzRW1wdHkocXBhcmFtcykpIHtcbiAgICAgIHBhdGggPSBgJHtwYXRofSR7UVVFUllfU0VQQVJBVE9SfSR7T2JqZWN0LmVudHJpZXMocXBhcmFtcylcbiAgICAgICAgLm1hcCgoZSkgPT4gYCR7ZVswXX0ke1ZBTFVFX1NFUEFSQVRPUn0ke2VbMV19YClcbiAgICAgICAgLmpvaW4oUEFSQU1fU0VQQVJBVE9SKX1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5hcGkuc2VydmljZVJvb3RVcmx9JHtwYXRofWA7XG4gIH1cblxuICB0b1N0cmluZyhcbiAgICB7IGVzY2FwZSwgLi4ub3B0aW9ucyB9OiBQYXJzZXJPcHRpb25zICYgeyBlc2NhcGU/OiBib29sZWFuIH0gPSB7XG4gICAgICBlc2NhcGU6IGZhbHNlLFxuICAgIH0sXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IFtwYXRoLCBwYXJhbXNdID0gdGhpcy5wYXRoQW5kUGFyYW1zKHsgZXNjYXBlLCAuLi5vcHRpb25zIH0pO1xuICAgIGxldCBxdWVyeVN0cmluZyA9IE9iamVjdC5lbnRyaWVzKHBhcmFtcylcbiAgICAgIC5tYXAoKGUpID0+IGAke2VbMF19JHtWQUxVRV9TRVBBUkFUT1J9JHtlWzFdfWApXG4gICAgICAuam9pbihQQVJBTV9TRVBBUkFUT1IpO1xuICAgIHJldHVybiBxdWVyeVN0cmluZyA/IGAke3BhdGh9JHtRVUVSWV9TRVBBUkFUT1J9JHtxdWVyeVN0cmluZ31gIDogcGF0aDtcbiAgfVxuXG4gIGNsb25lKCk6IE9EYXRhUmVzb3VyY2U8VD4ge1xuICAgIGNvbnN0IEN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPRGF0YVJlc291cmNlO1xuICAgIHJldHVybiBuZXcgQ3Rvcih0aGlzLmFwaSwge1xuICAgICAgc2VnbWVudHM6IHRoaXMuY2xvbmVTZWdtZW50cygpLFxuICAgICAgcXVlcnk6IHRoaXMuY2xvbmVRdWVyeTxUPigpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3BhcnNlcihcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zLFxuICAgIHJlc291cmNlVHlwZT86IHN0cmluZyxcbiAgICBiaW5kaW5nVHlwZT86IHN0cmluZyxcbiAgKTogUGFyc2VyPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgVHlwZXMuaXNQbGFpbk9iamVjdCh2YWx1ZSlcbiAgICAgICAgPyBPRGF0YUhlbHBlcltvcHRpb25zLnZlcnNpb24gPz8gREVGQVVMVF9WRVJTSU9OXS50eXBlKHZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoZGF0YVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUGFyc2VyIGZyb20gZGF0YSB0eXBlXG4gICAgICByZXR1cm4gdGhpcy5hcGkucGFyc2VyRm9yVHlwZTxUPihkYXRhVHlwZSk7XG4gICAgfSBlbHNlIGlmIChyZXNvdXJjZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUGFyc2VyIGZyb20gcmVzb3VyY2UgdHlwZVxuICAgICAgcmV0dXJuIHRoaXMuYXBpLnBhcnNlckZvclR5cGU8VD4ocmVzb3VyY2VUeXBlLCBiaW5kaW5nVHlwZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55LCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gdGhpcy5pbmNvbWluZ1R5cGUoKTtcbiAgICBjb25zdCBiaW5kaW5nVHlwZSA9IHRoaXMuYmluZGluZ1R5cGUoKTtcbiAgICBjb25zdCBfZCA9ICh2YWx1ZTogYW55LCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgcGFyc2VyID0gdGhpcy5fX3BhcnNlcih2YWx1ZSwgb3B0aW9ucywgcmVzb3VyY2VUeXBlLCBiaW5kaW5nVHlwZSk7XG4gICAgICByZXR1cm4gcGFyc2VyICE9PSB1bmRlZmluZWQgPyBwYXJzZXIuZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG4gICAgfTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWUubWFwKCh2KSA9PiBfZCh2LCBvcHRpb25zKSlcbiAgICAgIDogX2QodmFsdWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgc2VyaWFsaXplKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSB0aGlzLm91dGdvaW5nVHlwZSgpO1xuICAgIGNvbnN0IGJpbmRpbmdUeXBlID0gdGhpcy5iaW5kaW5nVHlwZSgpO1xuICAgIGNvbnN0IF9zID0gKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBwYXJzZXIgPSB0aGlzLl9fcGFyc2VyKHZhbHVlLCBvcHRpb25zLCByZXNvdXJjZVR5cGUsIGJpbmRpbmdUeXBlKTtcbiAgICAgIHJldHVybiBwYXJzZXIgIT09IHVuZGVmaW5lZCA/IHBhcnNlci5zZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG4gICAgfTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWUubWFwKCh2KSA9PiBfcyh2LCBvcHRpb25zKSlcbiAgICAgIDogX3ModmFsdWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgZW5jb2RlKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSB0aGlzLm91dGdvaW5nVHlwZSgpO1xuICAgIGNvbnN0IGJpbmRpbmdUeXBlID0gdGhpcy5iaW5kaW5nVHlwZSgpO1xuICAgIGNvbnN0IF9lID0gKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBwYXJzZXIgPSB0aGlzLl9fcGFyc2VyKHZhbHVlLCBvcHRpb25zLCByZXNvdXJjZVR5cGUsIGJpbmRpbmdUeXBlKTtcbiAgICAgIHJldHVybiBwYXJzZXIgIT09IHVuZGVmaW5lZCA/IHBhcnNlci5lbmNvZGUodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG4gICAgfTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWUubWFwKCh2KSA9PiBfZSh2LCBvcHRpb25zKSlcbiAgICAgIDogX2UodmFsdWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgdG9Kc29uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZWdtZW50czogdGhpcy5wYXRoU2VnbWVudHMudG9Kc29uKCksXG4gICAgICBvcHRpb25zOiB0aGlzLnF1ZXJ5T3B0aW9ucy50b0pzb24oKSxcbiAgICB9O1xuICB9XG5cbiAgY2xvbmVTZWdtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXRoU2VnbWVudHMuY2xvbmUoKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBRdWVyeSBPcHRpb25zXG4gIGNsZWFyUXVlcnkoKSB7XG4gICAgdGhpcy5xdWVyeU9wdGlvbnMuY2xlYXIoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNsb25lUXVlcnk8UD4oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlPcHRpb25zLmNsb25lPFA+KCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRoZSBwYXRoIHNlZ21lbnRzIG9mIHRoZSByZXNvdXJjZVxuICAgKiBDcmVhdGUgYW4gb2JqZWN0IGhhbmRsZXIgZm9yIG11dGF0ZSB0aGUgcGF0aCBzZWdtZW50cyBvZiB0aGUgcmVzb3VyY2VcbiAgICogQHBhcmFtIGYgRnVuY3Rpb24gY29udGV4dCBmb3IgaGFuZGxlIHRoZSBzZWdtZW50c1xuICAgKiBAcmV0dXJucyBPRGF0YUFjdGlvblJlc291cmNlXG4gICAqL1xuICBzZWdtZW50KFxuICAgIGY6IChxOiBPRGF0YVBhdGhTZWdtZW50c0hhbmRsZXI8VD4sIHM/OiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+KSA9PiB2b2lkLFxuICApIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5vdXRnb2luZ1R5cGUoKTtcbiAgICBmKFxuICAgICAgbmV3IE9EYXRhUGF0aFNlZ21lbnRzSGFuZGxlcjxUPih0aGlzLnBhdGhTZWdtZW50cyksXG4gICAgICB0eXBlICE9PSB1bmRlZmluZWQgPyB0aGlzLmFwaS5zdHJ1Y3R1cmVkVHlwZTxUPih0eXBlKSA6IHVuZGVmaW5lZCxcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgcXVlcnkgb3B0aW9ucyBvZiB0aGUgcmVzb3VyY2VcbiAgICogQ3JlYXRlIGFuIG9iamVjdCBoYW5kbGVyIGZvciBtdXRhdGUgdGhlIHF1ZXJ5IG9wdGlvbnMgb2YgdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSBmIEZ1bmN0aW9uIGNvbnRleHQgZm9yIGhhbmRsZSB0aGUgcXVlcnkgb3B0aW9uc1xuICAgKi9cbiAgcXVlcnkoXG4gICAgZjogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPiwgcz86IE9EYXRhU3RydWN0dXJlZFR5cGU8VD4pID0+IHZvaWQsXG4gICkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLm91dGdvaW5nVHlwZSgpO1xuICAgIGYoXG4gICAgICBuZXcgT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyPFQ+KHRoaXMucXVlcnlPcHRpb25zKSxcbiAgICAgIHR5cGUgIT09IHVuZGVmaW5lZCA/IHRoaXMuYXBpLnN0cnVjdHVyZWRUeXBlPFQ+KHR5cGUpIDogdW5kZWZpbmVkLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0cmFuc2Zvcm08Uj4oXG4gICAgb3B0czogKFxuICAgICAgYnVpbGRlcjogQXBwbHlFeHByZXNzaW9uQnVpbGRlcjxUPixcbiAgICAgIGN1cnJlbnQ/OiBBcHBseUV4cHJlc3Npb248VD4sXG4gICAgKSA9PiBBcHBseUV4cHJlc3Npb248VD4sXG4gICAge1xuICAgICAgdHlwZSxcbiAgICAgIGZpZWxkcyxcbiAgICB9OiB7XG4gICAgICB0eXBlPzogc3RyaW5nO1xuICAgICAgZmllbGRzPzogeyBbbmFtZTogc3RyaW5nXTogU3RydWN0dXJlZFR5cGVGaWVsZENvbmZpZyB9O1xuICAgIH0gPSB7fSxcbiAgKTogT0RhdGFSZXNvdXJjZTxSPiB7XG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdHlwZSA9IFN0cmluZ3MudW5pcXVlSWQoeyBwcmVmaXg6ICdUcmFuc2Zvcm1hdGlvbicsIHN1ZmZpeDogJ1R5cGUnIH0pO1xuICAgIH1cblxuICAgIC8vIFJlc29sdmUgU3RydWN0dXJlZCBUeXBlXG4gICAgbGV0IHN0cnVjdHVyZWRUeXBlID0gdGhpcy5hcGkuZmluZFN0cnVjdHVyZWRUeXBlPFI+KHR5cGUpO1xuICAgIGlmIChzdHJ1Y3R1cmVkVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSZXNvbHZlIFNjaGVtYVxuICAgICAgbGV0IHNjaGVtYSA9IHRoaXMuYXBpLmZpbmRTY2hlbWEodHlwZSk7XG4gICAgICBpZiAoc2NoZW1hID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID1cbiAgICAgICAgICB0eXBlLnN1YnN0cmluZygwLCB0eXBlLmxhc3RJbmRleE9mKCcuJykpID8/IHRoaXMuYXBpLm5hbWUhO1xuICAgICAgICBzY2hlbWEgPSB0aGlzLmFwaS5jcmVhdGVTY2hlbWEoeyBuYW1lc3BhY2UgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBuYW1lID0gdHlwZS5zdWJzdHJpbmcodHlwZS5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgIHN0cnVjdHVyZWRUeXBlID0gc2NoZW1hLmNyZWF0ZVN0cnVjdHVyZWRUeXBlKHsgbmFtZSwgZmllbGRzIH0pO1xuICAgIH1cblxuICAgIC8vIFNlZ21lbnRzXG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLmNsb25lU2VnbWVudHMoKTtcbiAgICBzZWdtZW50cy5sYXN0KCk/LmluY29taW5nVHlwZShzdHJ1Y3R1cmVkVHlwZS50eXBlKCkpO1xuXG4gICAgLy8gUXVlcnlcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuY2xvbmVRdWVyeTxhbnk+KCk7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXI8VD4ocXVlcnkpO1xuICAgIGhhbmRsZXIuYXBwbHkob3B0cyk7XG5cbiAgICBjb25zdCBDdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT0RhdGFSZXNvdXJjZTtcbiAgICByZXR1cm4gbmV3IEN0b3IodGhpcy5hcGksIHtcbiAgICAgIHNlZ21lbnRzLFxuICAgICAgcXVlcnksXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgcmVzb2x2ZUtleTxUPihcbiAgICB2YWx1ZTogYW55LFxuICAgIHNjaGVtYT86IE9EYXRhU3RydWN0dXJlZFR5cGU8VD4sXG4gICk6IEVudGl0eUtleTxUPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGlzUXVlcnlDdXN0b21UeXBlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoVHlwZXMuaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBzY2hlbWEgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlXG4gICAgICAgID8gc2NoZW1hLnJlc29sdmVLZXkodmFsdWUpXG4gICAgICAgIDogT2JqZWN0cy5yZXNvbHZlS2V5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlIGFzIEVudGl0eUtleTxUPiB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlS2V5KHZhbHVlOiBhbnkpOiBFbnRpdHlLZXk8VD4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLm91dGdvaW5nVHlwZSgpO1xuICAgIGNvbnN0IHN0cnVjdHVyZWQgPVxuICAgICAgdHlwZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5hcGkuc3RydWN0dXJlZFR5cGU8VD4odHlwZSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9EYXRhUmVzb3VyY2UucmVzb2x2ZUtleTxUPih2YWx1ZSwgc3RydWN0dXJlZCk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgcHJvdGVjdGVkIGdldChcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBldGFnPzogc3RyaW5nO1xuICAgICAgcmVzcG9uc2VUeXBlPzpcbiAgICAgICAgfCAnYXJyYXlidWZmZXInXG4gICAgICAgIHwgJ2Jsb2InXG4gICAgICAgIHwgJ2pzb24nXG4gICAgICAgIHwgJ3RleHQnXG4gICAgICAgIHwgJ3ZhbHVlJ1xuICAgICAgICB8ICdwcm9wZXJ0eSdcbiAgICAgICAgfCAnZW50aXR5J1xuICAgICAgICB8ICdlbnRpdGllcyc7XG4gICAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICAgICAgYm9keVF1ZXJ5T3B0aW9ucz86IFF1ZXJ5T3B0aW9uW107XG4gICAgfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmFwaS5yZXF1ZXN0PFQ+KCdHRVQnLCB0aGlzLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0KFxuICAgIGJvZHk6IGFueSxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICByZXNwb25zZVR5cGU/OlxuICAgICAgICB8ICdhcnJheWJ1ZmZlcidcbiAgICAgICAgfCAnYmxvYidcbiAgICAgICAgfCAnanNvbidcbiAgICAgICAgfCAndGV4dCdcbiAgICAgICAgfCAndmFsdWUnXG4gICAgICAgIHwgJ3Byb3BlcnR5J1xuICAgICAgICB8ICdlbnRpdHknXG4gICAgICAgIHwgJ2VudGl0aWVzJztcbiAgICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmFwaS5yZXF1ZXN0PFQ+KCdQT1NUJywgdGhpcywgeyBib2R5LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHB1dChcbiAgICBib2R5OiBhbnksXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgZXRhZz86IHN0cmluZztcbiAgICAgIHJlc3BvbnNlVHlwZT86XG4gICAgICAgIHwgJ2FycmF5YnVmZmVyJ1xuICAgICAgICB8ICdibG9iJ1xuICAgICAgICB8ICdqc29uJ1xuICAgICAgICB8ICd0ZXh0J1xuICAgICAgICB8ICd2YWx1ZSdcbiAgICAgICAgfCAncHJvcGVydHknXG4gICAgICAgIHwgJ2VudGl0eSdcbiAgICAgICAgfCAnZW50aXRpZXMnO1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYXBpLnJlcXVlc3Q8VD4oJ1BVVCcsIHRoaXMsIHsgYm9keSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXRjaChcbiAgICBib2R5OiBhbnksXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgZXRhZz86IHN0cmluZztcbiAgICAgIHJlc3BvbnNlVHlwZT86XG4gICAgICAgIHwgJ2FycmF5YnVmZmVyJ1xuICAgICAgICB8ICdibG9iJ1xuICAgICAgICB8ICdqc29uJ1xuICAgICAgICB8ICd0ZXh0J1xuICAgICAgICB8ICd2YWx1ZSdcbiAgICAgICAgfCAncHJvcGVydHknXG4gICAgICAgIHwgJ2VudGl0eSdcbiAgICAgICAgfCAnZW50aXRpZXMnO1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYXBpLnJlcXVlc3Q8VD4oJ1BBVENIJywgdGhpcywgeyBib2R5LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlbGV0ZShcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBldGFnPzogc3RyaW5nO1xuICAgICAgcmVzcG9uc2VUeXBlPzpcbiAgICAgICAgfCAnYXJyYXlidWZmZXInXG4gICAgICAgIHwgJ2Jsb2InXG4gICAgICAgIHwgJ2pzb24nXG4gICAgICAgIHwgJ3RleHQnXG4gICAgICAgIHwgJ3ZhbHVlJ1xuICAgICAgICB8ICdwcm9wZXJ0eSdcbiAgICAgICAgfCAnZW50aXR5J1xuICAgICAgICB8ICdlbnRpdGllcyc7XG4gICAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5hcGkucmVxdWVzdDxUPignREVMRVRFJywgdGhpcywgb3B0aW9ucyk7XG4gIH1cbn1cbiJdfQ==
@@ -1,180 +0,0 @@
1
- import { HttpHeaders, HttpResponse } from '@angular/common/http';
2
- import { ODataEntityAnnotations, ODataEntitiesAnnotations, ODataPropertyAnnotations, } from '../annotations';
3
- import { Types } from '../utils/types';
4
- import { APPLICATION_JSON, ODATA_VERSION_HEADERS, CONTENT_TYPE, CACHE_CONTROL, LOCATION_HEADER, ETAG_HEADERS, ODATA_ENTITYID_HEADERS, PREFERENCE_APPLIED, } from '../constants';
5
- import { Http } from '../utils/http';
6
- import { ODataResponseOptions } from './options';
7
- /**
8
- * OData Response
9
- */
10
- export class ODataResponse extends HttpResponse {
11
- api;
12
- resource;
13
- constructor(init) {
14
- super(init);
15
- this.api = init.api;
16
- this.resource = init.resource;
17
- }
18
- static fromHttpResponse(req, res) {
19
- return new ODataResponse({
20
- api: req.api,
21
- resource: req.resource,
22
- body: res.body,
23
- headers: res.headers,
24
- status: res.status,
25
- statusText: res.statusText,
26
- url: res.url || undefined,
27
- });
28
- }
29
- static fromJson(req, json) {
30
- return new ODataResponse({
31
- api: req.api,
32
- resource: req.resource,
33
- body: json.body,
34
- headers: new HttpHeaders(json.headers),
35
- status: json.status,
36
- statusText: json.statusText,
37
- url: json.url || undefined,
38
- });
39
- }
40
- toJson() {
41
- return {
42
- body: this.body,
43
- headers: this.headers
44
- .keys()
45
- .map((name) => ({ [name]: this.headers.getAll(name) || [] }))
46
- .reduce((acc, header) => Object.assign(acc, header), {}),
47
- status: this.status,
48
- statusText: this.statusText,
49
- url: this.url,
50
- };
51
- }
52
- _options;
53
- get options() {
54
- if (this._options === undefined) {
55
- this._options = new ODataResponseOptions(this.api.options.parserOptions);
56
- const contentType = this.headers.get(CONTENT_TYPE);
57
- if (contentType && contentType.includes(APPLICATION_JSON)) {
58
- const features = contentType
59
- .split(',')
60
- .find((p) => p.startsWith(APPLICATION_JSON));
61
- this._options.setFeatures(features);
62
- }
63
- const headerKey = Http.resolveHeaderKey(this.headers, ODATA_VERSION_HEADERS);
64
- if (headerKey) {
65
- const version = (this.headers.get(headerKey) || '').replace(/\;/g, '');
66
- this._options.setVersion(version);
67
- }
68
- const preferenceApplied = this.headers.get(PREFERENCE_APPLIED);
69
- if (preferenceApplied) {
70
- this._options.setPreferenceApplied(preferenceApplied);
71
- }
72
- const location = this.headers.get(LOCATION_HEADER);
73
- if (location) {
74
- this._options.setLocation(location);
75
- }
76
- const cacheControl = this.headers.get(CACHE_CONTROL);
77
- if (cacheControl) {
78
- this._options.setCache(cacheControl);
79
- }
80
- }
81
- return this._options;
82
- }
83
- _payload;
84
- get payload() {
85
- if (this._payload === undefined) {
86
- this._payload =
87
- this.body && this.options.version === '2.0'
88
- ? this.body['d']
89
- : this.body;
90
- }
91
- return this._payload;
92
- }
93
- _context;
94
- get context() {
95
- if (this._context === undefined) {
96
- this._context = this.options.helper.context(Types.isPlainObject(this.payload) ? this.payload : {});
97
- }
98
- return this._context;
99
- }
100
- _annotations;
101
- get annotations() {
102
- if (this._annotations === undefined) {
103
- const options = this.options;
104
- this._annotations = options.helper.annotations(this.payload || {});
105
- let key = Http.resolveHeaderKey(this.headers, ETAG_HEADERS);
106
- if (key) {
107
- const etag = this.headers.get(key);
108
- if (etag)
109
- this._annotations.set(options.helper.ODATA_ETAG, etag);
110
- }
111
- key = Http.resolveHeaderKey(this.headers, ODATA_ENTITYID_HEADERS);
112
- if (key) {
113
- const entityId = this.headers.get(key);
114
- if (entityId)
115
- this._annotations.set(options.helper.ODATA_ID, entityId);
116
- }
117
- }
118
- return this._annotations;
119
- }
120
- /**
121
- * Handle the response body as an entity
122
- * @returns
123
- */
124
- entity() {
125
- const options = this.options;
126
- const payload = this.payload;
127
- const annots = new ODataEntityAnnotations(options.helper, this.annotations, this.context);
128
- const data = payload ? annots.data(payload) : null;
129
- let entity = (data !== null && Types.isPlainObject(data)
130
- ? options.helper.attributes(data, this.api.options.stripMetadata)
131
- : data);
132
- if (entity !== null)
133
- entity = this.resource.deserialize(entity, options);
134
- return { entity, annots };
135
- }
136
- /**
137
- * Handle the response body as entities
138
- * @returns
139
- */
140
- entities() {
141
- const options = this.options;
142
- const payload = this.payload;
143
- const annots = new ODataEntitiesAnnotations(options.helper, this.annotations, this.context);
144
- let entities = payload ? annots.data(payload) : null;
145
- if (entities !== null)
146
- entities = this.resource.deserialize(entities, options);
147
- return { entities, annots };
148
- }
149
- /**
150
- * Handle the response body as a property
151
- * @returns
152
- */
153
- property() {
154
- const options = this.options;
155
- const payload = this.payload;
156
- const annots = new ODataPropertyAnnotations(options.helper, this.annotations, this.context);
157
- const data = payload ? annots.data(payload) : null;
158
- let property = (data !== null && Types.isPlainObject(data)
159
- ? options.helper.attributes(data, this.api.options.stripMetadata)
160
- : data);
161
- if (property !== null)
162
- property = this.resource.deserialize(property, options);
163
- return { property, annots };
164
- }
165
- /**
166
- * Handle the response body as a value
167
- * @returns
168
- */
169
- value() {
170
- const options = this.options;
171
- const payload = this.payload;
172
- let value = (payload !== null && Types.isPlainObject(payload)
173
- ? options.helper.attributes(payload, this.api.options.stripMetadata)
174
- : payload);
175
- if (value !== null)
176
- value = this.resource.deserialize(value, options);
177
- return value;
178
- }
179
- }
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3Jlc3BvbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakUsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix3QkFBd0IsRUFDeEIsd0JBQXdCLEdBQ3pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFlBQVksRUFDWixhQUFhLEVBQ2IsZUFBZSxFQUNmLFlBQVksRUFDWixzQkFBc0IsRUFDdEIsa0JBQWtCLEdBQ25CLE1BQU0sY0FBYyxDQUFDO0FBR3RCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBaUJqRDs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFpQixTQUFRLFlBQWU7SUFDMUMsR0FBRyxDQUFXO0lBQ2QsUUFBUSxDQUFtQjtJQUVwQyxZQUFZLElBUVg7UUFDQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUksR0FBb0IsRUFBRSxHQUFvQjtRQUNuRSxPQUFPLElBQUksYUFBYSxDQUFJO1lBQzFCLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztZQUNaLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtZQUN0QixJQUFJLEVBQUUs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QUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksS0FBSyxHQUFHLENBQ1YsT0FBTyxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUM5QyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUNwRSxDQUFDLENBQUMsT0FBTyxDQUNBLENBQUM7UUFFZCxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQU0sQ0FBQztRQUMzRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1xuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMsXG4gIE9EYXRhUHJvcGVydHlBbm5vdGF0aW9ucyxcbn0gZnJvbSAnLi4vYW5ub3RhdGlvbnMnO1xuaW1wb3J0IHsgVHlwZXMgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XG5pbXBvcnQgeyBPRGF0YVJlc291cmNlIH0gZnJvbSAnLi9yZXNvdXJjZSc7XG5pbXBvcnQge1xuICBBUFBMSUNBVElPTl9KU09OLFxuICBPREFUQV9WRVJTSU9OX0hFQURFUlMsXG4gIENPTlRFTlRfVFlQRSxcbiAgQ0FDSEVfQ09OVFJPTCxcbiAgTE9DQVRJT05fSEVBREVSLFxuICBFVEFHX0hFQURFUlMsXG4gIE9EQVRBX0VOVElUWUlEX0hFQURFUlMsXG4gIFBSRUZFUkVOQ0VfQVBQTElFRCxcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhQXBpIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IE9EYXRhUmVxdWVzdCB9IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgeyBIdHRwIH0gZnJvbSAnLi4vdXRpbHMvaHR0cCc7XG5pbXBvcnQgeyBPRGF0YUNvbnRleHQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgT0RhdGFSZXNwb25zZU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuXG5leHBvcnQgdHlwZSBPRGF0YUVudGl0eTxUPiA9IHtcbiAgZW50aXR5OiBUIHwgbnVsbDtcbiAgYW5ub3RzOiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+O1xufTtcblxuZXhwb3J0IHR5cGUgT0RhdGFFbnRpdGllczxUPiA9IHtcbiAgZW50aXRpZXM6IFRbXSB8IG51bGw7XG4gIGFubm90czogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPFQ+O1xufTtcblxuZXhwb3J0IHR5cGUgT0RhdGFQcm9wZXJ0eTxUPiA9IHtcbiAgcHJvcGVydHk6IFQgfCBudWxsO1xuICBhbm5vdHM6IE9EYXRhUHJvcGVydHlBbm5vdGF0aW9uczxUPjtcbn07XG5cbi8qKlxuICogT0RhdGEgUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNsYXNzIE9EYXRhUmVzcG9uc2U8VD4gZXh0ZW5kcyBIdHRwUmVzcG9uc2U8VD4ge1xuICByZWFkb25seSBhcGk6IE9EYXRhQXBpO1xuICByZWFkb25seSByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxUPjtcblxuICBjb25zdHJ1Y3Rvcihpbml0OiB7XG4gICAgYXBpOiBPRGF0YUFwaTtcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxUPjtcbiAgICBib2R5OiBUIHwgbnVsbDtcbiAgICBoZWFkZXJzOiBIdHRwSGVhZGVycztcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICBzdGF0dXNUZXh0OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICB9KSB7XG4gICAgc3VwZXIoaW5pdCk7XG4gICAgdGhpcy5hcGkgPSBpbml0LmFwaTtcbiAgICB0aGlzLnJlc291cmNlID0gaW5pdC5yZXNvdXJjZTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSHR0cFJlc3BvbnNlPFQ+KHJlcTogT0RhdGFSZXF1ZXN0PFQ+LCByZXM6IEh0dHBSZXNwb25zZTxUPikge1xuICAgIHJldHVybiBuZXcgT0RhdGFSZXNwb25zZTxUPih7XG4gICAgICBhcGk6IHJlcS5hcGksXG4gICAgICByZXNvdXJjZTogcmVxLnJlc291cmNlLFxuICAgICAgYm9keTogcmVzLmJvZHksXG4gICAgICBoZWFkZXJzOiByZXMuaGVhZGVycyxcbiAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHJlcy5zdGF0dXNUZXh0LFxuICAgICAgdXJsOiByZXMudXJsIHx8IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSnNvbjxUPihcbiAgICByZXE6IE9EYXRhUmVxdWVzdDxUPixcbiAgICBqc29uOiB7XG4gICAgICBib2R5OiBUIHwgbnVsbDtcbiAgICAgIGhlYWRlcnM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH07XG4gICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgIHN0YXR1c1RleHQ6IHN0cmluZztcbiAgICAgIHVybDogc3RyaW5nIHwgbnVsbDtcbiAgICB9LFxuICApIHtcbiAgICByZXR1cm4gbmV3IE9EYXRhUmVzcG9uc2U8VD4oe1xuICAgICAgYXBpOiByZXEuYXBpLFxuICAgICAgcmVzb3VyY2U6IHJlcS5yZXNvdXJjZSxcbiAgICAgIGJvZHk6IGpzb24uYm9keSxcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyhqc29uLmhlYWRlcnMpLFxuICAgICAgc3RhdHVzOiBqc29uLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IGpzb24uc3RhdHVzVGV4dCxcbiAgICAgIHVybDoganNvbi51cmwgfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgdG9Kc29uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBib2R5OiB0aGlzLmJvZHksXG4gICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnNcbiAgICAgICAgLmtleXMoKVxuICAgICAgICAubWFwKChuYW1lKSA9PiAoeyBbbmFtZV06IHRoaXMuaGVhZGVycy5nZXRBbGwobmFtZSkgfHwgW10gfSkpXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgaGVhZGVyKSA9PiBPYmplY3QuYXNzaWduKGFjYywgaGVhZGVyKSwge30pLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHRoaXMuc3RhdHVzVGV4dCxcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX29wdGlvbnM/OiBPRGF0YVJlc3BvbnNlT3B0aW9ucztcbiAgZ2V0IG9wdGlvbnMoKTogT0RhdGFSZXNwb25zZU9wdGlvbnMge1xuICAgIGlmICh0aGlzLl9vcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX29wdGlvbnMgPSBuZXcgT0RhdGFSZXNwb25zZU9wdGlvbnModGhpcy5hcGkub3B0aW9ucy5wYXJzZXJPcHRpb25zKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5oZWFkZXJzLmdldChDT05URU5UX1RZUEUpO1xuICAgICAgaWYgKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluY2x1ZGVzKEFQUExJQ0FUSU9OX0pTT04pKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gY29udGVudFR5cGVcbiAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgIC5maW5kKChwKSA9PiBwLnN0YXJ0c1dpdGgoQVBQTElDQVRJT05fSlNPTikpIGFzIHN0cmluZztcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5zZXRGZWF0dXJlcyhmZWF0dXJlcyk7XG4gICAgICB9XG4gICAgICBjb25zdCBoZWFkZXJLZXkgPSBIdHRwLnJlc29sdmVIZWFkZXJLZXkoXG4gICAgICAgIHRoaXMuaGVhZGVycyxcbiAgICAgICAgT0RBVEFfVkVSU0lPTl9IRUFERVJTLFxuICAgICAgKTtcbiAgICAgIGlmIChoZWFkZXJLZXkpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9ICh0aGlzLmhlYWRlcnMuZ2V0KGhlYWRlcktleSkgfHwgJycpLnJlcGxhY2UoXG4gICAgICAgICAgL1xcOy9nLFxuICAgICAgICAgICcnLFxuICAgICAgICApIGFzICcyLjAnIHwgJzMuMCcgfCAnNC4wJztcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5zZXRWZXJzaW9uKHZlcnNpb24pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmVmZXJlbmNlQXBwbGllZCA9IHRoaXMuaGVhZGVycy5nZXQoUFJFRkVSRU5DRV9BUFBMSUVEKTtcbiAgICAgIGlmIChwcmVmZXJlbmNlQXBwbGllZCkge1xuICAgICAgICB0aGlzLl9vcHRpb25zLnNldFByZWZlcmVuY2VBcHBsaWVkKHByZWZlcmVuY2VBcHBsaWVkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmhlYWRlcnMuZ2V0KExPQ0FUSU9OX0hFQURFUik7XG4gICAgICBpZiAobG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5zZXRMb2NhdGlvbihsb2NhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhY2hlQ29udHJvbCA9IHRoaXMuaGVhZGVycy5nZXQoQ0FDSEVfQ09OVFJPTCk7XG4gICAgICBpZiAoY2FjaGVDb250cm9sKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMuc2V0Q2FjaGUoY2FjaGVDb250cm9sKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIF9wYXlsb2FkPzogYW55O1xuICBnZXQgcGF5bG9hZCgpIHtcbiAgICBpZiAodGhpcy5fcGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wYXlsb2FkID1cbiAgICAgICAgdGhpcy5ib2R5ICYmIHRoaXMub3B0aW9ucy52ZXJzaW9uID09PSAnMi4wJ1xuICAgICAgICAgID8gKDxhbnk+dGhpcy5ib2R5KVsnZCddXG4gICAgICAgICAgOiB0aGlzLmJvZHk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wYXlsb2FkO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29udGV4dD86IGFueTtcbiAgZ2V0IGNvbnRleHQoKTogT0RhdGFDb250ZXh0IHtcbiAgICBpZiAodGhpcy5fY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gdGhpcy5vcHRpb25zLmhlbHBlci5jb250ZXh0KFxuICAgICAgICBUeXBlcy5pc1BsYWluT2JqZWN0KHRoaXMucGF5bG9hZCkgPyB0aGlzLnBheWxvYWQgOiB7fSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBfYW5ub3RhdGlvbnM/OiBNYXA8c3RyaW5nLCBhbnk+O1xuICBnZXQgYW5ub3RhdGlvbnMoKTogTWFwPHN0cmluZywgYW55PiB7XG4gICAgaWYgKHRoaXMuX2Fubm90YXRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IG9wdGlvbnMuaGVscGVyLmFubm90YXRpb25zKHRoaXMucGF5bG9hZCB8fCB7fSk7XG4gICAgICBsZXQga2V5ID0gSHR0cC5yZXNvbHZlSGVhZGVyS2V5KHRoaXMuaGVhZGVycywgRVRBR19IRUFERVJTKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgZXRhZyA9IHRoaXMuaGVhZGVycy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGV0YWcpIHRoaXMuX2Fubm90YXRpb25zLnNldChvcHRpb25zLmhlbHBlci5PREFUQV9FVEFHLCBldGFnKTtcbiAgICAgIH1cbiAgICAgIGtleSA9IEh0dHAucmVzb2x2ZUhlYWRlcktleSh0aGlzLmhlYWRlcnMsIE9EQVRBX0VOVElUWUlEX0hFQURFUlMpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IHRoaXMuaGVhZGVycy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGVudGl0eUlkKSB0aGlzLl9hbm5vdGF0aW9ucy5zZXQob3B0aW9ucy5oZWxwZXIuT0RBVEFfSUQsIGVudGl0eUlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgcmVzcG9uc2UgYm9keSBhcyBhbiBlbnRpdHlcbiAgICogQHJldHVybnNcbiAgICovXG4gIGVudGl0eSgpOiBPRGF0YUVudGl0eTxUPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5wYXlsb2FkO1xuICAgIGNvbnN0IGFubm90cyA9IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+KFxuICAgICAgb3B0aW9ucy5oZWxwZXIsXG4gICAgICB0aGlzLmFubm90YXRpb25zLFxuICAgICAgdGhpcy5jb250ZXh0LFxuICAgICk7XG4gICAgY29uc3QgZGF0YSA9IHBheWxvYWQgPyBhbm5vdHMuZGF0YShwYXlsb2FkKSA6IG51bGw7XG4gICAgbGV0IGVudGl0eSA9IChcbiAgICAgIGRhdGEgIT09IG51bGwgJiYgVHlwZXMuaXNQbGFpbk9iamVjdChkYXRhKVxuICAgICAgICA/IG9wdGlvbnMuaGVscGVyLmF0dHJpYnV0ZXMoZGF0YSwgdGhpcy5hcGkub3B0aW9ucy5zdHJpcE1ldGFkYXRhKVxuICAgICAgICA6IGRhdGFcbiAgICApIGFzIFQgfCBudWxsO1xuXG4gICAgaWYgKGVudGl0eSAhPT0gbnVsbClcbiAgICAgIGVudGl0eSA9IHRoaXMucmVzb3VyY2UuZGVzZXJpYWxpemUoZW50aXR5LCBvcHRpb25zKSBhcyBUO1xuICAgIHJldHVybiB7IGVudGl0eSwgYW5ub3RzIH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRoZSByZXNwb25zZSBib2R5IGFzIGVudGl0aWVzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBlbnRpdGllcygpOiBPRGF0YUVudGl0aWVzPFQ+IHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnBheWxvYWQ7XG4gICAgY29uc3QgYW5ub3RzID0gbmV3IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxUPihcbiAgICAgIG9wdGlvbnMuaGVscGVyLFxuICAgICAgdGhpcy5hbm5vdGF0aW9ucyxcbiAgICAgIHRoaXMuY29udGV4dCxcbiAgICApO1xuICAgIGxldCBlbnRpdGllcyA9IHBheWxvYWQgPyBhbm5vdHMuZGF0YShwYXlsb2FkKSA6IG51bGw7XG4gICAgaWYgKGVudGl0aWVzICE9PSBudWxsKVxuICAgICAgZW50aXRpZXMgPSB0aGlzLnJlc291cmNlLmRlc2VyaWFsaXplKGVudGl0aWVzLCBvcHRpb25zKSBhcyBUW107XG4gICAgcmV0dXJuIHsgZW50aXRpZXMsIGFubm90cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgcmVzcG9uc2UgYm9keSBhcyBhIHByb3BlcnR5XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcm9wZXJ0eSgpOiBPRGF0YVByb3BlcnR5PFQ+IHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnBheWxvYWQ7XG4gICAgY29uc3QgYW5ub3RzID0gbmV3IE9EYXRhUHJvcGVydHlBbm5vdGF0aW9uczxUPihcbiAgICAgIG9wdGlvbnMuaGVscGVyLFxuICAgICAgdGhpcy5hbm5vdGF0aW9ucyxcbiAgICAgIHRoaXMuY29udGV4dCxcbiAgICApO1xuICAgIGNvbnN0IGRhdGEgPSBwYXlsb2FkID8gKGFubm90cy5kYXRhKHBheWxvYWQpIGFzIFQpIDogbnVsbDtcbiAgICBsZXQgcHJvcGVydHkgPSAoXG4gICAgICBkYXRhICE9PSBudWxsICYmIFR5cGVzLmlzUGxhaW5PYmplY3QoZGF0YSlcbiAgICAgICAgPyBvcHRpb25zLmhlbHBlci5hdHRyaWJ1dGVzKFxuICAgICAgICAgICAgZGF0YSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICAgICAgICAgIHRoaXMuYXBpLm9wdGlvbnMuc3RyaXBNZXRhZGF0YSxcbiAgICAgICAgICApXG4gICAgICAgIDogZGF0YVxuICAgICkgYXMgVCB8IG51bGw7XG5cbiAgICBpZiAocHJvcGVydHkgIT09IG51bGwpXG4gICAgICBwcm9wZXJ0eSA9IHRoaXMucmVzb3VyY2UuZGVzZXJpYWxpemUocHJvcGVydHksIG9wdGlvbnMpIGFzIFQ7XG4gICAgcmV0dXJuIHsgcHJvcGVydHksIGFubm90cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgcmVzcG9uc2UgYm9keSBhcyBhIHZhbHVlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB2YWx1ZSgpOiBUIHwgbnVsbCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5wYXlsb2FkO1xuICAgIGxldCB2YWx1ZSA9IChcbiAgICAgIHBheWxvYWQgIT09IG51bGwgJiYgVHlwZXMuaXNQbGFpbk9iamVjdChwYXlsb2FkKVxuICAgICAgICA/IG9wdGlvbnMuaGVscGVyLmF0dHJpYnV0ZXMocGF5bG9hZCwgdGhpcy5hcGkub3B0aW9ucy5zdHJpcE1ldGFkYXRhKVxuICAgICAgICA6IHBheWxvYWRcbiAgICApIGFzIFQgfCBudWxsO1xuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB2YWx1ZSA9IHRoaXMucmVzb3VyY2UuZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpIGFzIFQ7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXX0=