angular-odata 0.90.0 → 0.99.2

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 (223) hide show
  1. package/README.md +31 -25
  2. package/{esm2015/angular-odata.js → esm2020/angular-odata.mjs} +0 -0
  3. package/esm2020/lib/api.mjs +303 -0
  4. package/{esm2015/lib/cache/cache.js → esm2020/lib/cache/cache.mjs} +3 -3
  5. package/{esm2015/lib/cache/index.js → esm2020/lib/cache/index.mjs} +0 -0
  6. package/{esm2015/lib/cache/memory.js → esm2020/lib/cache/memory.mjs} +1 -1
  7. package/{esm2015/lib/cache/storage.js → esm2020/lib/cache/storage.mjs} +2 -2
  8. package/esm2020/lib/client.mjs +271 -0
  9. package/{esm2015/lib/constants.js → esm2020/lib/constants.mjs} +8 -3
  10. package/esm2020/lib/helper.mjs +268 -0
  11. package/esm2020/lib/index.mjs +19 -0
  12. package/esm2020/lib/models/collection.mjs +757 -0
  13. package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
  14. package/esm2020/lib/models/model.mjs +453 -0
  15. package/esm2020/lib/models/options.mjs +956 -0
  16. package/{esm2015/lib/module.js → esm2020/lib/module.mjs} +7 -7
  17. package/esm2020/lib/options.mjs +32 -0
  18. package/{esm2015/lib/resources/index.js → esm2020/lib/resources/index.mjs} +0 -0
  19. package/{esm2015/lib/resources/path/handlers.js → esm2020/lib/resources/path/handlers.mjs} +1 -1
  20. package/{esm2015/lib/resources/path/index.js → esm2020/lib/resources/path/index.mjs} +0 -0
  21. package/esm2020/lib/resources/path/segments.mjs +124 -0
  22. package/esm2020/lib/resources/query/builder.mjs +590 -0
  23. package/esm2020/lib/resources/query/expressions/base.mjs +20 -0
  24. package/esm2020/lib/resources/query/expressions/compute.mjs +38 -0
  25. package/esm2020/lib/resources/query/expressions/expand.mjs +57 -0
  26. package/esm2020/lib/resources/query/expressions/filter.mjs +154 -0
  27. package/esm2020/lib/resources/query/expressions/index.mjs +7 -0
  28. package/esm2020/lib/resources/query/expressions/orderby.mjs +54 -0
  29. package/esm2020/lib/resources/query/expressions/search.mjs +113 -0
  30. package/esm2020/lib/resources/query/expressions/select.mjs +32 -0
  31. package/esm2020/lib/resources/query/expressions/syntax.mjs +371 -0
  32. package/esm2020/lib/resources/query/handlers.mjs +188 -0
  33. package/{esm2015/lib/resources/query/index.js → esm2020/lib/resources/query/index.mjs} +0 -0
  34. package/esm2020/lib/resources/query/options.mjs +103 -0
  35. package/esm2020/lib/resources/request.mjs +167 -0
  36. package/esm2020/lib/resources/resource.mjs +318 -0
  37. package/esm2020/lib/resources/responses/annotations.mjs +119 -0
  38. package/{esm2015/lib/resources/responses/csdl/csdl-annotation.js → esm2020/lib/resources/responses/csdl/csdl-annotation.mjs} +0 -0
  39. package/{esm2015/lib/resources/responses/csdl/csdl-entity-container.js → esm2020/lib/resources/responses/csdl/csdl-entity-container.mjs} +0 -0
  40. package/{esm2015/lib/resources/responses/csdl/csdl-entity-set.js → esm2020/lib/resources/responses/csdl/csdl-entity-set.mjs} +0 -0
  41. package/{esm2015/lib/resources/responses/csdl/csdl-enum-type.js → esm2020/lib/resources/responses/csdl/csdl-enum-type.mjs} +0 -0
  42. package/{esm2015/lib/resources/responses/csdl/csdl-function-action.js → esm2020/lib/resources/responses/csdl/csdl-function-action.mjs} +0 -0
  43. package/{esm2015/lib/resources/responses/csdl/csdl-navigation-property-binding.js → esm2020/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs} +0 -0
  44. package/{esm2015/lib/resources/responses/csdl/csdl-reference.js → esm2020/lib/resources/responses/csdl/csdl-reference.mjs} +0 -0
  45. package/{esm2015/lib/resources/responses/csdl/csdl-schema.js → esm2020/lib/resources/responses/csdl/csdl-schema.mjs} +0 -0
  46. package/{esm2015/lib/resources/responses/csdl/csdl-singleton.js → esm2020/lib/resources/responses/csdl/csdl-singleton.mjs} +0 -0
  47. package/{esm2015/lib/resources/responses/csdl/csdl-structural-property.js → esm2020/lib/resources/responses/csdl/csdl-structural-property.mjs} +0 -0
  48. package/{esm2015/lib/resources/responses/csdl/csdl-structured-type.js → esm2020/lib/resources/responses/csdl/csdl-structured-type.mjs} +0 -0
  49. package/{esm2015/lib/resources/responses/csdl/csdl-type-definition.js → esm2020/lib/resources/responses/csdl/csdl-type-definition.mjs} +0 -0
  50. package/{esm2015/lib/resources/responses/index.js → esm2020/lib/resources/responses/index.mjs} +0 -0
  51. package/esm2020/lib/resources/responses/metadata.mjs +547 -0
  52. package/{esm2015/lib/resources/responses/options.js → esm2020/lib/resources/responses/options.mjs} +0 -0
  53. package/{esm2015/lib/resources/responses/response.js → esm2020/lib/resources/responses/response.mjs} +0 -0
  54. package/{esm2015/lib/resources/responses/types.js → esm2020/lib/resources/responses/types.mjs} +0 -0
  55. package/esm2020/lib/resources/types/action.mjs +104 -0
  56. package/esm2020/lib/resources/types/batch.mjs +314 -0
  57. package/esm2020/lib/resources/types/count.mjs +30 -0
  58. package/esm2020/lib/resources/types/entity-set.mjs +97 -0
  59. package/esm2020/lib/resources/types/entity.mjs +109 -0
  60. package/esm2020/lib/resources/types/function.mjs +140 -0
  61. package/{esm2015/lib/resources/types/index.js → esm2020/lib/resources/types/index.mjs} +0 -0
  62. package/esm2020/lib/resources/types/media.mjs +44 -0
  63. package/esm2020/lib/resources/types/metadata.mjs +33 -0
  64. package/esm2020/lib/resources/types/navigation-property.mjs +229 -0
  65. package/esm2020/lib/resources/types/options.mjs +2 -0
  66. package/esm2020/lib/resources/types/property.mjs +186 -0
  67. package/esm2020/lib/resources/types/reference.mjs +88 -0
  68. package/esm2020/lib/resources/types/singleton.mjs +129 -0
  69. package/esm2020/lib/resources/types/value.mjs +44 -0
  70. package/esm2020/lib/schema/annotation.mjs +37 -0
  71. package/esm2020/lib/schema/callable.mjs +62 -0
  72. package/esm2020/lib/schema/element.mjs +61 -0
  73. package/esm2020/lib/schema/entity-container.mjs +9 -0
  74. package/esm2020/lib/schema/entity-set.mjs +9 -0
  75. package/esm2020/lib/schema/enum-type.mjs +71 -0
  76. package/{esm2015/lib/schema/index.js → esm2020/lib/schema/index.mjs} +2 -1
  77. package/esm2020/lib/schema/parsers/callable.mjs +113 -0
  78. package/esm2020/lib/schema/parsers/edm.mjs +95 -0
  79. package/esm2020/lib/schema/parsers/enum-type.mjs +107 -0
  80. package/esm2020/lib/schema/parsers/index.mjs +5 -0
  81. package/esm2020/lib/schema/parsers/structured-type.mjs +412 -0
  82. package/esm2020/lib/schema/schema.mjs +61 -0
  83. package/esm2020/lib/schema/structured-type.mjs +207 -0
  84. package/esm2020/lib/services/base.mjs +29 -0
  85. package/esm2020/lib/services/entity-set.mjs +143 -0
  86. package/esm2020/lib/services/entity.mjs +12 -0
  87. package/{esm2015/lib/services/factory.js → esm2020/lib/services/factory.mjs} +3 -3
  88. package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
  89. package/{esm2015/lib/services/singleton.js → esm2020/lib/services/singleton.mjs} +1 -1
  90. package/{esm2015/lib/settings.js → esm2020/lib/settings.mjs} +1 -1
  91. package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
  92. package/esm2020/lib/types.mjs +37 -0
  93. package/{esm2015/lib/utils/arraybuffers.js → esm2020/lib/utils/arraybuffers.mjs} +0 -0
  94. package/{esm2015/lib/utils/dates.js → esm2020/lib/utils/dates.mjs} +0 -0
  95. package/{esm2015/lib/utils/durations.js → esm2020/lib/utils/durations.mjs} +0 -0
  96. package/{esm2015/lib/utils/enums.js → esm2020/lib/utils/enums.mjs} +0 -0
  97. package/{esm2015/lib/utils/http.js → esm2020/lib/utils/http.mjs} +0 -0
  98. package/{esm2015/lib/utils/index.js → esm2020/lib/utils/index.mjs} +0 -0
  99. package/{esm2015/lib/utils/objects.js → esm2020/lib/utils/objects.mjs} +13 -13
  100. package/esm2020/lib/utils/odata.mjs +22 -0
  101. package/esm2020/lib/utils/strings.mjs +20 -0
  102. package/{esm2015/lib/utils/types.js → esm2020/lib/utils/types.mjs} +0 -0
  103. package/{esm2015/lib/utils/urls.js → esm2020/lib/utils/urls.mjs} +0 -0
  104. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  105. package/fesm2015/{angular-odata.js → angular-odata.mjs} +3427 -2872
  106. package/fesm2015/angular-odata.mjs.map +1 -0
  107. package/fesm2020/angular-odata.mjs +10589 -0
  108. package/fesm2020/angular-odata.mjs.map +1 -0
  109. package/lib/api.d.ts +14 -14
  110. package/lib/cache/cache.d.ts +2 -2
  111. package/lib/cache/storage.d.ts +1 -1
  112. package/lib/client.d.ts +3 -3
  113. package/lib/constants.d.ts +5 -2
  114. package/lib/index.d.ts +0 -1
  115. package/lib/models/collection.d.ts +21 -21
  116. package/lib/models/model.d.ts +34 -22
  117. package/lib/models/options.d.ts +26 -29
  118. package/lib/module.d.ts +1 -1
  119. package/lib/options.d.ts +1 -0
  120. package/lib/resources/path/segments.d.ts +2 -2
  121. package/lib/resources/query/builder.d.ts +7 -3
  122. package/lib/resources/query/expressions/base.d.ts +19 -0
  123. package/lib/resources/query/expressions/compute.d.ts +26 -0
  124. package/lib/resources/query/expressions/expand.d.ts +40 -0
  125. package/lib/resources/query/expressions/filter.d.ts +58 -0
  126. package/lib/resources/query/expressions/index.d.ts +6 -0
  127. package/lib/resources/query/expressions/orderby.d.ts +37 -0
  128. package/lib/resources/query/expressions/search.d.ts +47 -0
  129. package/lib/resources/query/expressions/select.d.ts +21 -0
  130. package/lib/resources/query/{syntax.d.ts → expressions/syntax.d.ts} +74 -55
  131. package/lib/resources/query/handlers.d.ts +30 -19
  132. package/lib/resources/query/options.d.ts +3 -3
  133. package/lib/resources/request.d.ts +1 -1
  134. package/lib/resources/resource.d.ts +30 -12
  135. package/lib/resources/types/action.d.ts +12 -18
  136. package/lib/resources/types/batch.d.ts +10 -2
  137. package/lib/resources/types/count.d.ts +6 -4
  138. package/lib/resources/types/entity-set.d.ts +11 -14
  139. package/lib/resources/types/entity.d.ts +13 -15
  140. package/lib/resources/types/function.d.ts +11 -17
  141. package/lib/resources/types/media.d.ts +8 -6
  142. package/lib/resources/types/metadata.d.ts +3 -4
  143. package/lib/resources/types/navigation-property.d.ts +17 -22
  144. package/lib/resources/types/property.d.ts +13 -18
  145. package/lib/resources/types/reference.d.ts +41 -7
  146. package/lib/resources/types/singleton.d.ts +12 -15
  147. package/lib/resources/types/value.d.ts +9 -4
  148. package/lib/schema/annotation.d.ts +18 -0
  149. package/lib/schema/callable.d.ts +4 -20
  150. package/lib/schema/element.d.ts +45 -0
  151. package/lib/schema/entity-container.d.ts +2 -12
  152. package/lib/schema/entity-set.d.ts +2 -18
  153. package/lib/schema/enum-type.d.ts +3 -34
  154. package/lib/schema/index.d.ts +1 -0
  155. package/lib/{parsers → schema/parsers}/callable.d.ts +1 -1
  156. package/lib/{parsers → schema/parsers}/edm.d.ts +1 -1
  157. package/lib/{parsers → schema/parsers}/enum-type.d.ts +12 -11
  158. package/lib/{parsers → schema/parsers}/index.d.ts +0 -0
  159. package/lib/{parsers → schema/parsers}/structured-type.d.ts +12 -12
  160. package/lib/schema/schema.d.ts +3 -10
  161. package/lib/schema/structured-type.d.ts +12 -24
  162. package/lib/services/base.d.ts +2 -2
  163. package/lib/services/entity-set.d.ts +2 -2
  164. package/lib/services/entity.d.ts +1 -1
  165. package/lib/services/singleton.d.ts +2 -2
  166. package/lib/settings.d.ts +5 -5
  167. package/lib/types.d.ts +1 -0
  168. package/lib/utils/strings.d.ts +1 -0
  169. package/package.json +21 -8
  170. package/bundles/angular-odata.umd.js +0 -11694
  171. package/bundles/angular-odata.umd.js.map +0 -1
  172. package/esm2015/lib/api.js +0 -297
  173. package/esm2015/lib/client.js +0 -272
  174. package/esm2015/lib/helper.js +0 -271
  175. package/esm2015/lib/index.js +0 -21
  176. package/esm2015/lib/models/collection.js +0 -717
  177. package/esm2015/lib/models/model.js +0 -419
  178. package/esm2015/lib/models/options.js +0 -924
  179. package/esm2015/lib/options.js +0 -31
  180. package/esm2015/lib/parsers/callable.js +0 -107
  181. package/esm2015/lib/parsers/edm.js +0 -95
  182. package/esm2015/lib/parsers/enum-type.js +0 -102
  183. package/esm2015/lib/parsers/index.js +0 -5
  184. package/esm2015/lib/parsers/structured-type.js +0 -388
  185. package/esm2015/lib/resources/path/segments.js +0 -121
  186. package/esm2015/lib/resources/query/builder.js +0 -544
  187. package/esm2015/lib/resources/query/expressions.js +0 -194
  188. package/esm2015/lib/resources/query/handlers.js +0 -192
  189. package/esm2015/lib/resources/query/options.js +0 -103
  190. package/esm2015/lib/resources/query/syntax.js +0 -349
  191. package/esm2015/lib/resources/request.js +0 -168
  192. package/esm2015/lib/resources/resource.js +0 -243
  193. package/esm2015/lib/resources/responses/annotations.js +0 -121
  194. package/esm2015/lib/resources/responses/metadata.js +0 -548
  195. package/esm2015/lib/resources/types/action.js +0 -105
  196. package/esm2015/lib/resources/types/batch.js +0 -294
  197. package/esm2015/lib/resources/types/count.js +0 -33
  198. package/esm2015/lib/resources/types/entity-set.js +0 -101
  199. package/esm2015/lib/resources/types/entity.js +0 -137
  200. package/esm2015/lib/resources/types/function.js +0 -130
  201. package/esm2015/lib/resources/types/media.js +0 -47
  202. package/esm2015/lib/resources/types/metadata.js +0 -36
  203. package/esm2015/lib/resources/types/navigation-property.js +0 -205
  204. package/esm2015/lib/resources/types/options.js +0 -2
  205. package/esm2015/lib/resources/types/property.js +0 -151
  206. package/esm2015/lib/resources/types/reference.js +0 -73
  207. package/esm2015/lib/resources/types/singleton.js +0 -167
  208. package/esm2015/lib/resources/types/value.js +0 -35
  209. package/esm2015/lib/schema/annotation.js +0 -7
  210. package/esm2015/lib/schema/callable.js +0 -82
  211. package/esm2015/lib/schema/entity-container.js +0 -22
  212. package/esm2015/lib/schema/entity-set.js +0 -33
  213. package/esm2015/lib/schema/enum-type.js +0 -126
  214. package/esm2015/lib/schema/schema.js +0 -60
  215. package/esm2015/lib/schema/structured-type.js +0 -217
  216. package/esm2015/lib/services/base.js +0 -23
  217. package/esm2015/lib/services/entity-set.js +0 -146
  218. package/esm2015/lib/services/entity.js +0 -12
  219. package/esm2015/lib/types.js +0 -37
  220. package/esm2015/lib/utils/odata.js +0 -21
  221. package/esm2015/lib/utils/strings.js +0 -13
  222. package/fesm2015/angular-odata.js.map +0 -1
  223. package/lib/resources/query/expressions.d.ts +0 -50
@@ -1,924 +0,0 @@
1
- import { __rest } from "tslib";
2
- import { Observable } from 'rxjs';
3
- import { finalize } from 'rxjs/operators';
4
- import { COMPUTED, DEFAULT_VERSION, OPTIMISTIC_CONCURRENCY, } from '../constants';
5
- import { ODataHelper } from '../helper';
6
- import { ODataParserOptions } from '../options';
7
- import { ODataEntitiesAnnotations, ODataEntityAnnotations, ODataEntityResource, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPathSegments, ODataPropertyResource, ODataQueryOptions, } from '../resources';
8
- import { Objects, Types } from '../utils';
9
- export const CID = '_cid';
10
- export class ODataModelEvent {
11
- constructor(name, { model, collection, previous, value, track, options, } = {}) {
12
- this.bubbling = true;
13
- this.name = name;
14
- this.model = model;
15
- this.collection = collection;
16
- this.previous = previous;
17
- this.value = value;
18
- this.options = options;
19
- this.chain = [
20
- [
21
- (this.collection || this.model),
22
- track || null,
23
- ],
24
- ];
25
- }
26
- stopPropagation() {
27
- this.bubbling = false;
28
- }
29
- push(model, track) {
30
- this.chain.splice(0, 0, [model, track]);
31
- }
32
- visited(model) {
33
- return (this.chain.some((c) => c[0] === model) &&
34
- this.chain[this.chain.length - 1][0] !== model);
35
- }
36
- get path() {
37
- return this.chain
38
- .map(([, track], index) => typeof track === 'number'
39
- ? `[${track}]`
40
- : typeof track === 'string'
41
- ? index === 0
42
- ? track
43
- : `.${track}`
44
- : '')
45
- .join('');
46
- }
47
- }
48
- export const BUBBLING = [
49
- 'change',
50
- 'reset',
51
- 'update',
52
- 'destroy',
53
- 'add',
54
- 'remove',
55
- ];
56
- export const INCLUDE_SHALLOW = {
57
- include_concurrency: true,
58
- include_computed: true,
59
- include_key: true,
60
- };
61
- export const INCLUDE_DEEP = Object.assign({ include_navigation: true, include_non_field: true }, INCLUDE_SHALLOW);
62
- export var ODataModelState;
63
- (function (ODataModelState) {
64
- ODataModelState[ODataModelState["Added"] = 0] = "Added";
65
- ODataModelState[ODataModelState["Removed"] = 1] = "Removed";
66
- ODataModelState[ODataModelState["Changed"] = 2] = "Changed";
67
- ODataModelState[ODataModelState["Unchanged"] = 3] = "Unchanged";
68
- })(ODataModelState || (ODataModelState = {}));
69
- export function Model({ cid = CID } = {}) {
70
- return (constructor) => {
71
- const Klass = constructor;
72
- if (!Klass.hasOwnProperty('options'))
73
- Klass.options = { fields: {} };
74
- Klass.options.cid = cid;
75
- return constructor;
76
- };
77
- }
78
- export function ModelField(_a = {}) {
79
- var { name } = _a, options = __rest(_a, ["name"]);
80
- return (target, key) => {
81
- const Klass = target.constructor;
82
- if (!Klass.hasOwnProperty('options'))
83
- Klass.options = { fields: {} };
84
- options.field = name || key;
85
- Klass.options.fields[key] = options;
86
- };
87
- }
88
- export class ODataModelField {
89
- constructor(options, _a) {
90
- var { name, field, parser } = _a, opts = __rest(_a, ["name", "field", "parser"]);
91
- this.options = options;
92
- this.name = name;
93
- this.field = field;
94
- this.parser = parser;
95
- this.default = opts.default || this.parser.default;
96
- this.required = Boolean(opts.required);
97
- this.concurrency = Boolean(opts.concurrency);
98
- this.maxLength = opts.maxLength;
99
- this.minLength = opts.minLength;
100
- this.min = opts.min;
101
- this.max = opts.max;
102
- this.pattern = opts.pattern;
103
- }
104
- get api() {
105
- return this.options.api;
106
- }
107
- get type() {
108
- return this.parser.type;
109
- }
110
- get navigation() {
111
- return Boolean(this.parser.navigation);
112
- }
113
- get collection() {
114
- return Boolean(this.parser.collection);
115
- }
116
- get computed() {
117
- var _a;
118
- return Boolean((_a = this.parser.findAnnotation((a) => a.term === COMPUTED)) === null || _a === void 0 ? void 0 : _a.bool);
119
- }
120
- configure({ findOptionsForType, concurrency, }) {
121
- this.meta = findOptionsForType(this.parser.type);
122
- if (concurrency)
123
- this.concurrency = concurrency;
124
- }
125
- isKey() {
126
- return this.parser.isKey();
127
- }
128
- hasReferentials() {
129
- return this.parser.hasReferentials();
130
- }
131
- get referentials() {
132
- return this.parser.referentials;
133
- }
134
- isStructuredType() {
135
- return this.parser.isStructuredType();
136
- }
137
- structured() {
138
- //TODO: Throw error if not found
139
- return this.api.findStructuredTypeForType(this.parser.type);
140
- }
141
- isEnumType() {
142
- return this.parser.isEnumType();
143
- }
144
- enum() {
145
- //TODO: Throw error if not found
146
- return this.api.findEnumTypeForType(this.parser.type);
147
- }
148
- validate(value, { method, navigation = false, } = {}) {
149
- var _a;
150
- /*
151
- if ('isValid' in value && typeof value.isValid === 'function') {
152
- return !value.isValid({ method, navigation }) ? value._errors : undefined;
153
- } else if ('models' in value && typeof value.models === 'function') {
154
- */
155
- if (ODataModelOptions.isModel(value)) {
156
- return !value.isValid({ method, navigation }) ? value._errors : undefined;
157
- }
158
- else if (ODataModelOptions.isCollection(value)) {
159
- return value
160
- .models()
161
- .some((m) => !m.isValid({ method, navigation }))
162
- ? value.models().map((m) => m._errors)
163
- : undefined;
164
- }
165
- else {
166
- let errors = ((_a = this.parser) === null || _a === void 0 ? void 0 : _a.validate(value, { method, navigation })) || [];
167
- if (this.required &&
168
- (value === null || (value === undefined && method !== 'modify')) // Is null or undefined without patch?
169
- ) {
170
- errors.push(`required`);
171
- }
172
- if (this.maxLength !== undefined &&
173
- typeof value === 'string' &&
174
- value.length > this.maxLength) {
175
- errors.push(`maxlength`);
176
- }
177
- if (this.minLength !== undefined &&
178
- typeof value === 'string' &&
179
- value.length < this.minLength) {
180
- errors.push(`minlength`);
181
- }
182
- if (this.min !== undefined &&
183
- typeof value === 'number' &&
184
- value < this.min) {
185
- errors.push(`min`);
186
- }
187
- if (this.max !== undefined &&
188
- typeof value === 'number' &&
189
- value > this.max) {
190
- errors.push(`max`);
191
- }
192
- if (this.pattern !== undefined &&
193
- typeof value === 'string' &&
194
- !this.pattern.test(value)) {
195
- errors.push(`pattern`);
196
- }
197
- return !Types.isEmpty(errors) ? errors : undefined;
198
- }
199
- }
200
- defaults() {
201
- return this.isStructuredType() && this.meta !== undefined
202
- ? this.meta.defaults()
203
- : this.default;
204
- }
205
- deserialize(value, options) {
206
- const parserOptions = options !== undefined
207
- ? new ODataParserOptions(options)
208
- : this.api.options;
209
- return this.parser.deserialize(value, parserOptions);
210
- }
211
- serialize(value, options) {
212
- const parserOptions = options !== undefined
213
- ? new ODataParserOptions(options)
214
- : this.api.options;
215
- return this.parser.serialize(value, parserOptions);
216
- }
217
- encode(value, options) {
218
- const parserOptions = options !== undefined
219
- ? new ODataParserOptions(options)
220
- : this.api.options;
221
- return this.parser.encode(value, parserOptions);
222
- }
223
- resourceFactory(base) {
224
- if (!(base instanceof ODataEntityResource ||
225
- base instanceof ODataNavigationPropertyResource ||
226
- base instanceof ODataPropertyResource))
227
- throw new Error("Can't build resource for non compatible base type");
228
- return this.navigation
229
- ? base.navigationProperty(this.parser.name)
230
- : base.property(this.parser.name);
231
- }
232
- annotationsFactory(base) {
233
- return this.parser.collection
234
- ? new ODataEntitiesAnnotations(base.helper, base.property(this.parser.name) || {})
235
- : new ODataEntityAnnotations(base.helper, base.property(this.parser.name) || {});
236
- }
237
- schemaFactory(base) {
238
- return this.api.findStructuredTypeForType(this.parser.type);
239
- }
240
- modelCollectionFactory({ parent, value, reset, }) {
241
- const schema = this.schemaFactory(parent.schema());
242
- const annots = this.annotationsFactory(parent.annots());
243
- const Model = schema === null || schema === void 0 ? void 0 : schema.model;
244
- const Collection = schema === null || schema === void 0 ? void 0 : schema.collection;
245
- if (Model === undefined || Collection === undefined)
246
- throw Error(`No model for ${this.name}`);
247
- return this.parser.collection
248
- ? new Collection((value || []), {
249
- annots: annots,
250
- parent: [parent, this],
251
- reset,
252
- })
253
- : new Model((value || {}), {
254
- annots: annots,
255
- parent: [parent, this],
256
- reset,
257
- });
258
- }
259
- }
260
- export class ODataModelOptions {
261
- constructor(options, schema) {
262
- this.children = [];
263
- this.name = schema.name;
264
- this.base = schema.base;
265
- this.open = schema.open;
266
- this.schema = schema;
267
- this.cid = options.cid || CID;
268
- const schemaFields = this.schema.fields({
269
- include_navigation: true,
270
- include_parents: true,
271
- });
272
- this._fields = Object.entries(options.fields).map(([name, options]) => {
273
- const { field } = options, opts = __rest(options, ["field"]);
274
- if (field === undefined || name === undefined)
275
- throw new Error('Model Properties need name and field');
276
- const parser = schemaFields.find((f) => f.name === field);
277
- if (parser === undefined)
278
- throw new Error(`No parser for ${field} with name = ${name}`);
279
- return new ODataModelField(this, Object.assign({ name, field, parser }, opts));
280
- });
281
- }
282
- get api() {
283
- return this.schema.api;
284
- }
285
- type() {
286
- return this.schema.type();
287
- }
288
- isTypeOf(type) {
289
- return this.schema.isTypeOf(type);
290
- }
291
- findChildOptions(predicate) {
292
- if (predicate(this))
293
- return this;
294
- let match;
295
- for (let ch of this.children) {
296
- match = ch.findChildOptions(predicate);
297
- if (match !== undefined)
298
- break;
299
- }
300
- return match;
301
- }
302
- configure({ findOptionsForType, }) {
303
- var _a;
304
- if (this.base) {
305
- const parent = findOptionsForType(this.base);
306
- parent.children.push(this);
307
- this.parent = parent;
308
- }
309
- this.entitySet = this.api.findEntitySetForEntityType(this.type());
310
- let concurrencyFields = [];
311
- if (this.entitySet !== undefined) {
312
- concurrencyFields =
313
- ((_a = this.entitySet.findAnnotation((a) => a.term === OPTIMISTIC_CONCURRENCY)) === null || _a === void 0 ? void 0 : _a.properties) || [];
314
- }
315
- this._fields.forEach((field) => {
316
- let concurrency = concurrencyFields.indexOf(field.field) !== -1;
317
- field.configure({
318
- findOptionsForType,
319
- concurrency,
320
- });
321
- });
322
- }
323
- fields({ include_navigation = false, include_parents = true, } = {}) {
324
- return [
325
- ...(include_parents && this.parent !== undefined
326
- ? this.parent.fields({ include_navigation, include_parents })
327
- : []),
328
- ...this._fields.filter((field) => include_navigation || !field.navigation),
329
- ];
330
- }
331
- field(name) {
332
- //TODO: Throw error if not found
333
- return this.fields({
334
- include_parents: true,
335
- include_navigation: true,
336
- }).find((modelField) => modelField.name === name || modelField.field === name);
337
- }
338
- attach(self, resource) {
339
- if (self._resource !== undefined &&
340
- resource.type() !== self._resource.type() &&
341
- !resource.isSubtypeOf(self._resource))
342
- throw new Error(`Can't reattach ${resource.type()} to ${self._resource.type()}`);
343
- const current = self._resource;
344
- if (current === undefined || !current.isEqualTo(resource)) {
345
- self._resource = resource;
346
- self.events$.emit(new ODataModelEvent('attach', {
347
- model: self,
348
- previous: current,
349
- value: resource,
350
- }));
351
- }
352
- }
353
- //# region Resource
354
- static chain(child) {
355
- const chain = [];
356
- let tuple = [child, null];
357
- while (tuple !== null) {
358
- const parent = tuple;
359
- if (chain.some((p) => p[0] === parent[0]))
360
- break;
361
- chain.splice(0, 0, parent);
362
- tuple = tuple[0]._parent;
363
- }
364
- return chain;
365
- }
366
- static resource(child) {
367
- var _a;
368
- let resource = undefined;
369
- for (let [model, field] of ODataModelOptions.chain(child)) {
370
- resource =
371
- resource ||
372
- model._resource ||
373
- (ODataModelOptions.isModel(model)
374
- ? model._meta.modelResourceFactory()
375
- : model._model.meta.collectionResourceFactory());
376
- if (resource === undefined)
377
- break;
378
- if (ODataModelOptions.isModel(model)) {
379
- let key = model.key({
380
- field_mapping: true,
381
- });
382
- if (key !== undefined)
383
- resource =
384
- resource instanceof ODataEntitySetResource
385
- ? resource.entity(key)
386
- : resource.key(key);
387
- }
388
- if (field === null) {
389
- const query = (_a = model._resource) === null || _a === void 0 ? void 0 : _a.cloneQuery().toQueryArguments();
390
- if (query !== undefined)
391
- resource.query((q) => q.apply(query));
392
- continue;
393
- }
394
- resource = field.resourceFactory(resource);
395
- }
396
- if (resource === undefined)
397
- throw new Error(`resource: Can't build resource for ${child}`);
398
- return resource;
399
- }
400
- collectionResourceFactory({ baseResource, } = {}) {
401
- if (this.entitySet !== undefined)
402
- return ODataEntitySetResource.factory(this.api, this.entitySet.name, this.type(), new ODataPathSegments(), (baseResource === null || baseResource === void 0 ? void 0 : baseResource.cloneQuery()) || new ODataQueryOptions());
403
- if (baseResource === undefined)
404
- throw new Error("collectionResourceFactory: Can't build resource");
405
- return baseResource.clone();
406
- }
407
- modelResourceFactory({ baseResource, } = {}) {
408
- const resource = this.collectionResourceFactory({ baseResource });
409
- if (resource instanceof ODataEntitySetResource)
410
- return resource.entity();
411
- return resource;
412
- }
413
- entityResource(self) {
414
- let resource = this.modelResourceFactory({
415
- baseResource: self._resource,
416
- fromSet: true,
417
- });
418
- const key = self.key({ field_mapping: true });
419
- if (key !== undefined)
420
- return resource.key(key);
421
- return resource;
422
- }
423
- //#endregion
424
- bind(self, { parent, resource, annots, } = {}) {
425
- // Parent
426
- if (parent !== undefined) {
427
- self._parent = parent;
428
- }
429
- else if (resource !== undefined) {
430
- // Resource
431
- this.attach(self, resource);
432
- }
433
- // Annotations
434
- self._annotations =
435
- annots || new ODataEntityAnnotations(ODataHelper[DEFAULT_VERSION]);
436
- const fields = this.fields({
437
- include_navigation: true,
438
- include_parents: true,
439
- });
440
- for (let field of fields) {
441
- Object.defineProperty(self, field.name, {
442
- configurable: true,
443
- get: () => this._get(self, field),
444
- set: (value) => this._set(self, field, value),
445
- });
446
- }
447
- }
448
- query(self, resource, func) {
449
- resource.query(func);
450
- this.attach(self, resource);
451
- return self;
452
- }
453
- resolveKey(value, { field_mapping = false, resolve = true, } = {}) {
454
- const keyTypes = this.schema.keys({ include_parents: true });
455
- const key = {};
456
- for (var kt of keyTypes) {
457
- let v = value;
458
- let options = this;
459
- let field;
460
- for (let name of kt.name.split('/')) {
461
- if (options === undefined)
462
- break;
463
- field = options
464
- .fields({ include_parents: true })
465
- .find((field) => field.field === name);
466
- if (field !== undefined) {
467
- v =
468
- Types.isPlainObject(v) || ODataModelOptions.isModel(v)
469
- ? v[field.name]
470
- : v;
471
- options = field.meta;
472
- }
473
- }
474
- if (field === undefined)
475
- return undefined;
476
- let name = field_mapping ? field.field : field.name;
477
- if (kt.alias !== undefined)
478
- name = kt.alias;
479
- key[name] = v;
480
- }
481
- if (Types.isEmpty(key))
482
- return undefined;
483
- return resolve ? Objects.resolveKey(key) : key;
484
- }
485
- resolveReferential(value, field, { field_mapping = false, resolve = true, } = {}) {
486
- const referential = {};
487
- for (var ref of field.referentials) {
488
- let from = this.fields({ include_parents: true }).find((p) => p.field === ref.referencedProperty);
489
- let to = field.options
490
- .fields({ include_parents: true })
491
- .find((field) => field.field === ref.property);
492
- if (from !== undefined && to !== undefined) {
493
- let name = field_mapping ? to.field : to.name;
494
- referential[name] = value && value[from.name];
495
- }
496
- }
497
- if (Types.isEmpty(referential))
498
- return undefined;
499
- return resolve
500
- ? Objects.resolveKey(referential, { single: false })
501
- : referential;
502
- }
503
- resolveReferenced(value, field, { field_mapping = false, resolve = true, } = {}) {
504
- const referenced = {};
505
- for (var ref of field.referentials) {
506
- let from = this.fields({ include_parents: true }).find((field) => field.field === ref.property);
507
- let to = field.meta
508
- .fields({ include_parents: true })
509
- .find((field) => field.field === ref.referencedProperty);
510
- if (from !== undefined && to !== undefined) {
511
- let name = field_mapping ? to.field : to.name;
512
- referenced[name] = value && value[from.name];
513
- }
514
- }
515
- if (Types.isEmpty(referenced))
516
- return undefined;
517
- return resolve
518
- ? Objects.resolveKey(referenced, { single: false })
519
- : referenced;
520
- }
521
- validate(self, { method, navigation = false, } = {}) {
522
- const errors = this.fields({
523
- include_parents: true,
524
- include_navigation: navigation,
525
- }).reduce((acc, field) => {
526
- let value = self[field.name];
527
- let errs = field.validate(value, { method });
528
- return errs !== undefined
529
- ? Object.assign(acc, { [field.name]: errs })
530
- : acc;
531
- }, {});
532
- return !Types.isEmpty(errors) ? errors : undefined;
533
- }
534
- defaults() {
535
- const defs = this.fields().reduce((acc, field) => {
536
- let value = field.defaults();
537
- return value !== undefined
538
- ? Object.assign(acc, { [field.name]: value })
539
- : acc;
540
- }, {});
541
- return !Types.isEmpty(defs) ? defs : undefined;
542
- }
543
- hasChanged(self, { include_navigation = false } = {}) {
544
- return (!Types.isEmpty(self._changes) ||
545
- Object.values(self._relations)
546
- .filter(({ field }) => !field.navigation || include_navigation)
547
- .some(({ field, state, model }) => (!include_navigation || field.navigation) &&
548
- (state === ODataModelState.Changed ||
549
- (model != undefined && model.hasChanged({ include_navigation })))));
550
- }
551
- asEntity(self, func) {
552
- const parent = self._parent;
553
- self._parent = null;
554
- const result = func(self);
555
- if (result instanceof Observable) {
556
- return result.pipe(finalize(() => (self._parent = parent)));
557
- }
558
- else {
559
- self._parent = parent;
560
- return result;
561
- }
562
- }
563
- toEntity(self, { client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
564
- let attrs = self.attributes({
565
- changes_only,
566
- field_mapping,
567
- include_concurrency,
568
- include_computed,
569
- include_non_field,
570
- });
571
- let relations = Object.entries(self._relations)
572
- .filter(
573
- // Chain
574
- ([, { model }]) => chain.every((c) => c !== model))
575
- .filter(
576
- // Changes only
577
- ([, { model, state }]) => !changes_only ||
578
- (changes_only &&
579
- (state === ODataModelState.Changed ||
580
- (model != undefined && model.hasChanged({ include_navigation })))))
581
- .filter(([, { field, model }]) =>
582
- // Navigation
583
- (include_navigation && field.navigation && model !== null) ||
584
- !field.navigation)
585
- .map(([k, { model, field, state }]) => {
586
- let changesOnly = changes_only &&
587
- state !== ODataModelState.Changed &&
588
- !!field.navigation;
589
- let includeKey = include_key && !!field.navigation;
590
- if (ODataModelOptions.isModel(model)) {
591
- return [
592
- k,
593
- model.toEntity({
594
- client_id,
595
- include_navigation,
596
- include_concurrency,
597
- include_non_field,
598
- field_mapping,
599
- changes_only: changesOnly,
600
- include_key: includeKey,
601
- chain: [self, ...chain],
602
- }),
603
- ];
604
- }
605
- else if (ODataModelOptions.isCollection(model)) {
606
- return [
607
- k,
608
- model.toEntities({
609
- client_id,
610
- include_navigation,
611
- include_concurrency,
612
- include_non_field,
613
- field_mapping,
614
- changes_only: changesOnly,
615
- include_key: includeKey,
616
- chain: [self, ...chain],
617
- }),
618
- ];
619
- }
620
- return [k, model];
621
- })
622
- .reduce((acc, [k, v]) => {
623
- var _a;
624
- const name = field_mapping
625
- ? ((_a = this.fields().find((field) => field.name === k)) === null || _a === void 0 ? void 0 : _a.field) || k
626
- : k;
627
- return Object.assign(acc, { [name]: v });
628
- }, {});
629
- // Create entity
630
- let entity = Object.assign(Object.assign({}, attrs), relations);
631
- // Add client_id
632
- if (client_id) {
633
- entity[this.cid] = self[this.cid];
634
- }
635
- // Add key
636
- if (include_key) {
637
- entity = Object.assign(Object.assign({}, entity), this.resolveKey(self, { field_mapping, resolve: false }));
638
- }
639
- // Add type
640
- if (self._parent !== null &&
641
- ((ODataModelOptions.isModel(self._parent[0]) &&
642
- self._parent[1].meta !== self._meta) ||
643
- (ODataModelOptions.isCollection(self._parent[0]) &&
644
- self._parent[0]._model
645
- .meta !== self._meta))) {
646
- this.api.options.helper.type(entity, this.schema.type());
647
- }
648
- return entity;
649
- }
650
- attributes(self, { changes_only = false, include_concurrency = false, include_computed = false, include_non_field = false, field_mapping = false, } = {}) {
651
- // Attributes by fields (attributes for the model type)
652
- const fieldAttrs = this.fields().reduce((acc, f) => {
653
- const isChanged = f.name in self._changes;
654
- const name = field_mapping ? f.field : f.name;
655
- const value = isChanged
656
- ? self._changes[f.name]
657
- : self._attributes[f.name];
658
- if (f.concurrency && include_concurrency) {
659
- return Object.assign(acc, { [name]: value });
660
- }
661
- else if (f.computed && include_computed) {
662
- return Object.assign(acc, { [name]: value });
663
- }
664
- else if (changes_only && isChanged) {
665
- return Object.assign(acc, { [name]: value });
666
- }
667
- else if (!changes_only && !f.concurrency && !f.computed) {
668
- return Object.assign(acc, { [name]: value });
669
- }
670
- else {
671
- return acc;
672
- }
673
- }, {});
674
- if (!include_non_field)
675
- return fieldAttrs;
676
- const names = Object.keys(fieldAttrs);
677
- // Attributes from object (attributes for object)
678
- const nonFieldAttrs = Object.entries(self)
679
- .filter(([k]) => names.indexOf(k) === -1 && !k.startsWith('_') && !k.endsWith('$'))
680
- .reduce((acc, [k, v]) => Object.assign(acc, { [k]: v }), {});
681
- return Object.assign(Object.assign({}, fieldAttrs), nonFieldAttrs);
682
- }
683
- reset(self, { name, silent = false } = {}) {
684
- if (!Types.isEmpty(name) && name in self._changes) {
685
- const value = self._attributes[name];
686
- const previous = self._changes[name];
687
- delete self._changes[name];
688
- if (!silent) {
689
- self.events$.emit(new ODataModelEvent('change', {
690
- model: self,
691
- track: name,
692
- value,
693
- previous,
694
- }));
695
- }
696
- }
697
- else if (Types.isEmpty(name)) {
698
- const entries = Object.entries(self._changes);
699
- self._changes = {};
700
- if (!silent) {
701
- entries.forEach((entry) => {
702
- self.events$.emit(new ODataModelEvent('change', {
703
- track: entry[0],
704
- model: self,
705
- value: self._attributes[entry[0]],
706
- previous: entry[1],
707
- }));
708
- });
709
- }
710
- }
711
- }
712
- assign(self, entity, { reset = false, silent = false, } = {}) {
713
- self._resetting = reset;
714
- self._silent = silent;
715
- const changes = [];
716
- // Apply entity
717
- const model = self;
718
- Object.entries(entity)
719
- .filter(([, value]) => value !== undefined) // Filter undefined
720
- .forEach(([key, value]) => {
721
- const field = this.fields({
722
- include_parents: true,
723
- include_navigation: true,
724
- }).find((field) => (self._resetting && field.field === key) || field.name === key);
725
- if (field !== undefined) {
726
- // Delegated to private setter
727
- if (this._set(self, field, value)) {
728
- changes.push(field.name);
729
- if (ODataModelOptions.isCollection(value) ||
730
- ODataModelOptions.isModel(value))
731
- // Set Parent
732
- value._parent = [self, field];
733
- }
734
- }
735
- else {
736
- // Basic assignment
737
- const current = model[key];
738
- model[key] = value;
739
- if (current !== value)
740
- changes.push(key);
741
- }
742
- });
743
- if (!self._silent && changes.length > 0) {
744
- self.events$.emit(new ODataModelEvent(self._resetting ? 'reset' : 'update', {
745
- model: self,
746
- options: { changes },
747
- }));
748
- }
749
- self._resetting = false;
750
- self._silent = false;
751
- }
752
- static isModel(obj) {
753
- return Types.rawType(obj) === 'Model';
754
- }
755
- static isCollection(obj) {
756
- return Types.rawType(obj) === 'Collection';
757
- }
758
- updateCollection(self, field, collection, value) {
759
- if (ODataModelOptions.isCollection(value) &&
760
- collection.equals(value)) {
761
- return false;
762
- }
763
- if (ODataModelOptions.isCollection(value)) {
764
- value = value.toEntities(INCLUDE_DEEP);
765
- }
766
- collection._annotations = field.annotationsFactory(self.annots());
767
- collection.assign(value, {
768
- reset: self._resetting,
769
- silent: self._silent,
770
- });
771
- return collection.hasChanged();
772
- }
773
- updateModel(self, field, model, value) {
774
- if (ODataModelOptions.isModel(value) &&
775
- model.equals(value)) {
776
- return false;
777
- }
778
- if (ODataModelOptions.isModel(value)) {
779
- value = value.toEntity(INCLUDE_DEEP);
780
- }
781
- model._annotations = field.annotationsFactory(self.annots());
782
- model.assign(value, {
783
- reset: self._resetting,
784
- silent: self._silent,
785
- });
786
- return model.hasChanged();
787
- }
788
- _get(self, field) {
789
- var _a;
790
- if (field.isStructuredType()) {
791
- return (_a = self._relations[field.name]) === null || _a === void 0 ? void 0 : _a.model;
792
- }
793
- else {
794
- return this.attributes(self, {
795
- include_concurrency: true,
796
- include_computed: true,
797
- })[field.name];
798
- }
799
- }
800
- _setStructured(self, field, value) {
801
- var _a;
802
- let changed = false;
803
- // Ensures that the relation exists
804
- if (!(field.name in self._relations)) {
805
- self._relations[field.name] = {
806
- state: ODataModelState.Unchanged,
807
- field: field,
808
- };
809
- }
810
- const relation = self._relations[field.name];
811
- const currentModel = relation.model;
812
- if (value === null) {
813
- relation.model = value;
814
- changed = currentModel !== value;
815
- this._unsubscribe(self, relation);
816
- }
817
- else if (ODataModelOptions.isCollection(currentModel)) {
818
- changed = this.updateCollection(self, field, currentModel, value);
819
- }
820
- else if (ODataModelOptions.isModel(currentModel)) {
821
- changed = this.updateModel(self, field, currentModel, value);
822
- }
823
- else {
824
- relation.model =
825
- ODataModelOptions.isCollection(value) ||
826
- ODataModelOptions.isModel(value)
827
- ? value
828
- : field.modelCollectionFactory({
829
- parent: self,
830
- value: value,
831
- reset: self._resetting,
832
- });
833
- changed = true;
834
- this._subscribe(self, relation);
835
- }
836
- if (!ODataModelOptions.isCollection(relation.model)) {
837
- var ref = (_a = field.meta) === null || _a === void 0 ? void 0 : _a.resolveReferential(relation.model, field);
838
- if (ref !== undefined) {
839
- Object.entries(ref).forEach(([k, v]) => this._setValue(self, k, v, false));
840
- }
841
- }
842
- relation.state =
843
- self._resetting || !changed
844
- ? ODataModelState.Unchanged
845
- : ODataModelState.Changed;
846
- if (!self._silent && changed) {
847
- self.events$.emit(new ODataModelEvent('change', {
848
- track: field.name,
849
- model: self,
850
- value: relation.model,
851
- previous: currentModel,
852
- }));
853
- }
854
- return changed;
855
- }
856
- _setValue(self, field, value, key) {
857
- let changed = false;
858
- const attrs = this.attributes(self, {
859
- include_concurrency: true,
860
- include_computed: true,
861
- });
862
- const currentValue = attrs[field];
863
- changed = !Types.isEqual(currentValue, value);
864
- if (self._resetting) {
865
- delete self._changes[field];
866
- self._attributes[field] = value;
867
- }
868
- else if (Types.isEqual(value, self._attributes[field])) {
869
- delete self._changes[field];
870
- }
871
- else if (changed) {
872
- self._changes[field] = value;
873
- }
874
- if (!self._silent && changed) {
875
- self.events$.emit(new ODataModelEvent('change', {
876
- track: field,
877
- model: self,
878
- value,
879
- previous: currentValue,
880
- options: { key },
881
- }));
882
- }
883
- return changed;
884
- }
885
- _set(self, field, value) {
886
- return field.isStructuredType()
887
- ? this._setStructured(self, field, value)
888
- : this._setValue(self, field.name, value, field.isKey());
889
- }
890
- _unsubscribe(self, relation) {
891
- if (relation.subscription) {
892
- relation.subscription.unsubscribe();
893
- delete relation.subscription;
894
- }
895
- }
896
- _subscribe(self, relation) {
897
- if (relation.subscription) {
898
- throw new Error('Subscription already exists');
899
- }
900
- if (relation.model == null) {
901
- throw new Error('Subscription model is null');
902
- }
903
- relation.subscription = relation.model.events$.subscribe((event) => {
904
- var _a;
905
- if (BUBBLING.indexOf(event.name) !== -1 &&
906
- event.bubbling &&
907
- !event.visited(self)) {
908
- if (event.model === relation.model) {
909
- if (event.name === 'change' &&
910
- relation.field.navigation &&
911
- ((_a = event.options) === null || _a === void 0 ? void 0 : _a.key)) {
912
- var ref = relation.model.referential(relation.field);
913
- if (ref !== undefined) {
914
- Object.entries(ref).forEach(([k, v]) => this._setValue(self, k, v, false));
915
- }
916
- }
917
- }
918
- event.push(self, relation.field.name);
919
- self.events$.emit(event);
920
- }
921
- });
922
- }
923
- }
924
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFDTCxRQUFRLEVBQ1IsZUFBZSxFQUNmLHNCQUFzQixHQUN2QixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVoRCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLCtCQUErQixFQUMvQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGlCQUFpQixHQUtsQixNQUFNLGNBQWMsQ0FBQztBQUd0QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUkxQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBc0IxQixNQUFNLE9BQU8sZUFBZTtJQVkxQixZQUNFLElBQXlCLEVBQ3pCLEVBQ0UsS0FBSyxFQUNMLFVBQVUsRUFDVixRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFDTCxPQUFPLE1BUUwsRUFBRTtRQTFCUixhQUFRLEdBQVksSUFBSSxDQUFDO1FBNEJ2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6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SyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDcEI7Z0JBQ0EsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxLQUFLLEVBQUU7b0JBQ2xDLElBQ0UsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO3dCQUN2QixRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVU7eUJBQ3pCLE1BQUEsS0FBSyxDQUFDLE9BQU8sMENBQUUsR0FBRyxDQUFBLEVBQ2xCO3dCQUNBLElBQUksR0FBRyxHQUFJLFFBQVEsQ0FBQyxLQUF5QixDQUFDLFdBQVcsQ0FDdkQsUUFBUSxDQUFDLEtBQUssQ0FDZixDQUFDO3dCQUNGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTs0QkFDckIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQ2xDLENBQUM7eUJBQ0g7cUJBQ0Y7aUJBQ0Y7Z0JBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBDT01QVVRFRCxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBPUFRJTUlTVElDX0NPTkNVUlJFTkNZLFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgT0RhdGFQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucyc7XG5pbXBvcnQgeyBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXIgfSBmcm9tICcuLi9wYXJzZXJzJztcbmltcG9ydCB7XG4gIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFQYXRoU2VnbWVudHMsXG4gIE9EYXRhUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFRdWVyeU9wdGlvbnMsXG4gIEVudGl0eUtleSxcbiAgT0RhdGFSZXNvdXJjZSxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbiAgT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyLFxufSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgT0RhdGFFbnRpdHlTZXQsIE9EYXRhU3RydWN0dXJlZFR5cGUgfSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE9iamVjdHMsIFR5cGVzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBPRGF0YU1vZGVsIH0gZnJvbSAnLi9tb2RlbCc7XG5cbmV4cG9ydCBjb25zdCBDSUQgPSAnX2NpZCc7XG5leHBvcnQgdHlwZSBPRGF0YU1vZGVsUmVzb3VyY2U8VD4gPVxuICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPjtcbmV4cG9ydCB0eXBlIE9EYXRhQ29sbGVjdGlvblJlc291cmNlPFQ+ID1cbiAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPjtcblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbEV2ZW50VHlwZSA9XG4gIHwgJ2NoYW5nZSdcbiAgfCAncmVzZXQnXG4gIHwgJ3VwZGF0ZSdcbiAgfCAnZGVzdHJveSdcbiAgfCAnYWRkJ1xuICB8ICdyZW1vdmUnXG4gIHwgJ2ludmFsaWQnXG4gIHwgJ3JlcXVlc3QnXG4gIHwgJ3N5bmMnXG4gIHwgJ2F0dGFjaCc7XG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbEV2ZW50PFQ+IHtcbiAgbmFtZTogT0RhdGFNb2RlbEV2ZW50VHlwZTtcbiAgYnViYmxpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBtb2RlbD86IE9EYXRhTW9kZWw8VD47XG4gIGNvbGxlY3Rpb24/OiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj47XG4gIGNoYWluOiBbXG4gICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIF1bXTtcbiAgdmFsdWU/OiBhbnk7XG4gIHByZXZpb3VzPzogYW55O1xuICBvcHRpb25zPzogYW55O1xuICBjb25zdHJ1Y3RvcihcbiAgICBuYW1lOiBPRGF0YU1vZGVsRXZlbnRUeXBlLFxuICAgIHtcbiAgICAgIG1vZGVsLFxuICAgICAgY29sbGVjdGlvbixcbiAgICAgIHByZXZpb3VzLFxuICAgICAgdmFsdWUsXG4gICAgICB0cmFjayxcbiAgICAgIG9wdGlvbnMsXG4gICAgfToge1xuICAgICAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICAgICAgY29sbGVjdGlvbj86IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PjtcbiAgICAgIHRyYWNrPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgcHJldmlvdXM/OiBhbnk7XG4gICAgICB2YWx1ZT86IGFueTtcbiAgICAgIG9wdGlvbnM/OiBhbnk7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gICAgdGhpcy5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuY2hhaW4gPSBbXG4gICAgICBbXG4gICAgICAgICh0aGlzLmNvbGxlY3Rpb24gfHwgdGhpcy5tb2RlbCkgYXNcbiAgICAgICAgICB8IE9EYXRhTW9kZWw8YW55PlxuICAgICAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgdHJhY2sgfHwgbnVsbCxcbiAgICAgIF0sXG4gICAgXTtcbiAgfVxuXG4gIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICB0aGlzLmJ1YmJsaW5nID0gZmFsc2U7XG4gIH1cblxuICBwdXNoKFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgIHRyYWNrOiBzdHJpbmcgfCBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5jaGFpbi5zcGxpY2UoMCwgMCwgW21vZGVsLCB0cmFja10pO1xuICB9XG5cbiAgdmlzaXRlZChtb2RlbDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+Pikge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNoYWluLnNvbWUoKGMpID0+IGNbMF0gPT09IG1vZGVsKSAmJlxuICAgICAgdGhpcy5jaGFpblt0aGlzLmNoYWluLmxlbmd0aCAtIDFdWzBdICE9PSBtb2RlbFxuICAgICk7XG4gIH1cblxuICBnZXQgcGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFpblxuICAgICAgLm1hcCgoWywgdHJhY2tdLCBpbmRleCkgPT5cbiAgICAgICAgdHlwZW9mIHRyYWNrID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gYFske3RyYWNrfV1gXG4gICAgICAgICAgOiB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyBpbmRleCA9PT0gMFxuICAgICAgICAgICAgPyB0cmFja1xuICAgICAgICAgICAgOiBgLiR7dHJhY2t9YFxuICAgICAgICAgIDogJydcbiAgICAgIClcbiAgICAgIC5qb2luKCcnKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgQlVCQkxJTkcgPSBbXG4gICdjaGFuZ2UnLFxuICAncmVzZXQnLFxuICAndXBkYXRlJyxcbiAgJ2Rlc3Ryb3knLFxuICAnYWRkJyxcbiAgJ3JlbW92ZScsXG5dO1xuXG5leHBvcnQgY29uc3QgSU5DTFVERV9TSEFMTE9XID0ge1xuICBpbmNsdWRlX2NvbmN1cnJlbmN5OiB0cnVlLFxuICBpbmNsdWRlX2NvbXB1dGVkOiB0cnVlLFxuICBpbmNsdWRlX2tleTogdHJ1ZSxcbn07XG5cbmV4cG9ydCBjb25zdCBJTkNMVURFX0RFRVAgPSB7XG4gIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgaW5jbHVkZV9ub25fZmllbGQ6IHRydWUsXG4gIC4uLklOQ0xVREVfU0hBTExPVyxcbn07XG5cbmV4cG9ydCBlbnVtIE9EYXRhTW9kZWxTdGF0ZSB7XG4gIEFkZGVkLFxuICBSZW1vdmVkLFxuICBDaGFuZ2VkLFxuICBVbmNoYW5nZWQsXG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsT3B0aW9ucyA9IHtcbiAgY2lkPzogc3RyaW5nO1xuICBmaWVsZHM6IHsgW25hbWU6IHN0cmluZ106IE1vZGVsRmllbGRPcHRpb25zIH07XG59O1xuXG5leHBvcnQgdHlwZSBNb2RlbEZpZWxkT3B0aW9ucyA9IHtcbiAgZmllbGQ/OiBzdHJpbmc7XG4gIGRlZmF1bHQ/OiBhbnk7XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgY29uY3VycmVuY3k/OiBib29sZWFuO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIG1pbkxlbmd0aD86IG51bWJlcjtcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIHBhdHRlcm4/OiBSZWdFeHA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gTW9kZWwoeyBjaWQgPSBDSUQgfTogeyBjaWQ/OiBzdHJpbmcgfSA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IHt9IH0+KGNvbnN0cnVjdG9yOiBUKSA9PiB7XG4gICAgY29uc3QgS2xhc3MgPSA8YW55PmNvbnN0cnVjdG9yO1xuICAgIGlmICghS2xhc3MuaGFzT3duUHJvcGVydHkoJ29wdGlvbnMnKSlcbiAgICAgIEtsYXNzLm9wdGlvbnMgPSB7IGZpZWxkczoge30gfSBhcyBNb2RlbE9wdGlvbnM7XG4gICAgS2xhc3Mub3B0aW9ucy5jaWQgPSBjaWQ7XG4gICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTW9kZWxGaWVsZCh7XG4gIG5hbWUsXG4gIC4uLm9wdGlvbnNcbn06IHsgbmFtZT86IHN0cmluZyB9ICYgTW9kZWxGaWVsZE9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBrZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IEtsYXNzID0gdGFyZ2V0LmNvbnN0cnVjdG9yO1xuICAgIGlmICghS2xhc3MuaGFzT3duUHJvcGVydHkoJ29wdGlvbnMnKSlcbiAgICAgIEtsYXNzLm9wdGlvbnMgPSB7IGZpZWxkczoge30gfSBhcyBNb2RlbE9wdGlvbnM7XG4gICAgb3B0aW9ucy5maWVsZCA9IG5hbWUgfHwga2V5O1xuICAgIEtsYXNzLm9wdGlvbnMuZmllbGRzW2tleV0gPSBvcHRpb25zO1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBPRGF0YU1vZGVsRmllbGRPcHRpb25zPEY+ID0gTW9kZWxGaWVsZE9wdGlvbnMgJiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZmllbGQ6IHN0cmluZztcbiAgcGFyc2VyOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8Rj47XG59O1xuXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbEZpZWxkPEY+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBmaWVsZDogc3RyaW5nO1xuICBwYXJzZXI6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxGPjtcbiAgb3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgbWV0YT86IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIGRlZmF1bHQ/OiBhbnk7XG4gIHJlcXVpcmVkOiBib29sZWFuO1xuICBjb25jdXJyZW5jeTogYm9vbGVhbjtcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICBtaW5MZW5ndGg/OiBudW1iZXI7XG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xuICBwYXR0ZXJuPzogUmVnRXhwO1xuICBjb25zdHJ1Y3RvcihcbiAgICBvcHRpb25zOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+LFxuICAgIHsgbmFtZSwgZmllbGQsIHBhcnNlciwgLi4ub3B0cyB9OiBPRGF0YU1vZGVsRmllbGRPcHRpb25zPEY+XG4gICkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmZpZWxkID0gZmllbGQ7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgdGhpcy5kZWZhdWx0ID0gb3B0cy5kZWZhdWx0IHx8IHRoaXMucGFyc2VyLmRlZmF1bHQ7XG4gICAgdGhpcy5yZXF1aXJlZCA9IEJvb2xlYW4ob3B0cy5yZXF1aXJlZCk7XG4gICAgdGhpcy5jb25jdXJyZW5jeSA9IEJvb2xlYW4ob3B0cy5jb25jdXJyZW5jeSk7XG4gICAgdGhpcy5tYXhMZW5ndGggPSBvcHRzLm1heExlbmd0aDtcbiAgICB0aGlzLm1pbkxlbmd0aCA9IG9wdHMubWluTGVuZ3RoO1xuICAgIHRoaXMubWluID0gb3B0cy5taW47XG4gICAgdGhpcy5tYXggPSBvcHRzLm1heDtcbiAgICB0aGlzLnBhdHRlcm4gPSBvcHRzLnBhdHRlcm47XG4gIH1cblxuICBnZXQgYXBpKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXBpO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnR5cGU7XG4gIH1cblxuICBnZXQgbmF2aWdhdGlvbigpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnBhcnNlci5uYXZpZ2F0aW9uKTtcbiAgfVxuXG4gIGdldCBjb2xsZWN0aW9uKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMucGFyc2VyLmNvbGxlY3Rpb24pO1xuICB9XG5cbiAgZ2V0IGNvbXB1dGVkKCkge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgdGhpcy5wYXJzZXIuZmluZEFubm90YXRpb24oKGEpID0+IGEudGVybSA9PT0gQ09NUFVURUQpPy5ib29sXG4gICAgKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlLFxuICAgIGNvbmN1cnJlbmN5LFxuICB9OiB7XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGNvbmN1cnJlbmN5OiBib29sZWFuO1xuICB9KSB7XG4gICAgdGhpcy5tZXRhID0gZmluZE9wdGlvbnNGb3JUeXBlKHRoaXMucGFyc2VyLnR5cGUpO1xuICAgIGlmIChjb25jdXJyZW5jeSkgdGhpcy5jb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5O1xuICB9XG5cbiAgaXNLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmlzS2V5KCk7XG4gIH1cblxuICBoYXNSZWZlcmVudGlhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmhhc1JlZmVyZW50aWFscygpO1xuICB9XG5cbiAgZ2V0IHJlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucmVmZXJlbnRpYWxzO1xuICB9XG5cbiAgaXNTdHJ1Y3R1cmVkVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaXNTdHJ1Y3R1cmVkVHlwZSgpO1xuICB9XG5cbiAgc3RydWN0dXJlZCgpIHtcbiAgICAvL1RPRE86IFRocm93IGVycm9yIGlmIG5vdCBmb3VuZFxuICAgIHJldHVybiB0aGlzLmFwaS5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPEY+KHRoaXMucGFyc2VyLnR5cGUpO1xuICB9XG5cbiAgaXNFbnVtVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaXNFbnVtVHlwZSgpO1xuICB9XG5cbiAgZW51bSgpIHtcbiAgICAvL1RPRE86IFRocm93IGVycm9yIGlmIG5vdCBmb3VuZFxuICAgIHJldHVybiB0aGlzLmFwaS5maW5kRW51bVR5cGVGb3JUeXBlPEY+KHRoaXMucGFyc2VyLnR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICkge1xuICAgIC8qXG4gICAgaWYgKCdpc1ZhbGlkJyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuICF2YWx1ZS5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pID8gdmFsdWUuX2Vycm9ycyA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKCdtb2RlbHMnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5tb2RlbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICovXG4gICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICByZXR1cm4gIXZhbHVlLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkgPyB2YWx1ZS5fZXJyb3JzIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIC5tb2RlbHMoKVxuICAgICAgICAuc29tZSgobTogT0RhdGFNb2RlbDxhbnk+KSA9PiAhbS5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pKVxuICAgICAgICA/IHZhbHVlLm1vZGVscygpLm1hcCgobTogT0RhdGFNb2RlbDxhbnk+KSA9PiBtLl9lcnJvcnMpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZXJyb3JzID0gdGhpcy5wYXJzZXI/LnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSB8fCBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5yZXF1aXJlZCAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWV0aG9kICE9PSAnbW9kaWZ5JykpIC8vIElzIG51bGwgb3IgdW5kZWZpbmVkIHdpdGhvdXQgcGF0Y2g/XG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYHJlcXVpcmVkYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBtYXhsZW5ndGhgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5taW5MZW5ndGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYG1pbmxlbmd0aGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1pbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPCB0aGlzLm1pblxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBtaW5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5tYXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgIHZhbHVlID4gdGhpcy5tYXhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnMucHVzaChgbWF4YCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGF0dGVybiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgIXRoaXMucGF0dGVybi50ZXN0KHZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBwYXR0ZXJuYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBkZWZhdWx0cygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSAmJiB0aGlzLm1ldGEgIT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzLm1ldGEuZGVmYXVsdHMoKVxuICAgICAgOiB0aGlzLmRlZmF1bHQ7XG4gIH1cblxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55LCBvcHRpb25zPzogT3B0aW9ucyk6IEYge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMuYXBpLm9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmRlc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSh2YWx1ZTogRiwgb3B0aW9ucz86IE9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMuYXBpLm9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnNlcmlhbGl6ZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gIH1cblxuICBlbmNvZGUodmFsdWU6IEYsIG9wdGlvbnM/OiBPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLmFwaS5vcHRpb25zO1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5lbmNvZGUodmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICB9XG5cbiAgcmVzb3VyY2VGYWN0b3J5PFQsIEY+KFxuICAgIGJhc2U6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPlxuICApOiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPEY+IHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPEY+IHtcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICBiYXNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICBiYXNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSB8fFxuICAgICAgICBiYXNlIGluc3RhbmNlb2YgT0RhdGFQcm9wZXJ0eVJlc291cmNlXG4gICAgICApXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgYnVpbGQgcmVzb3VyY2UgZm9yIG5vbiBjb21wYXRpYmxlIGJhc2UgdHlwZVwiKTtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uXG4gICAgICA/IChiYXNlIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4pLm5hdmlnYXRpb25Qcm9wZXJ0eTxGPih0aGlzLnBhcnNlci5uYW1lKVxuICAgICAgOiAoYmFzZSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KS5wcm9wZXJ0eTxGPih0aGlzLnBhcnNlci5uYW1lKTtcbiAgfVxuXG4gIGFubm90YXRpb25zRmFjdG9yeShcbiAgICBiYXNlOiBPRGF0YUVudGl0eUFubm90YXRpb25zXG4gICk6IE9EYXRhRW50aXR5QW5ub3RhdGlvbnMgfCBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5jb2xsZWN0aW9uXG4gICAgICA/IG5ldyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMoXG4gICAgICAgICAgYmFzZS5oZWxwZXIsXG4gICAgICAgICAgYmFzZS5wcm9wZXJ0eSh0aGlzLnBhcnNlci5uYW1lKSB8fCB7fVxuICAgICAgICApXG4gICAgICA6IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zKFxuICAgICAgICAgIGJhc2UuaGVscGVyLFxuICAgICAgICAgIGJhc2UucHJvcGVydHkodGhpcy5wYXJzZXIubmFtZSkgfHwge31cbiAgICAgICAgKTtcbiAgfVxuXG4gIHNjaGVtYUZhY3Rvcnk8VCwgRj4oXG4gICAgYmFzZTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPlxuICApOiBPRGF0YVN0cnVjdHVyZWRUeXBlPEY+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcGkuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcbiAgfVxuXG4gIG1vZGVsQ29sbGVjdGlvbkZhY3Rvcnk8VCwgRj4oe1xuICAgIHBhcmVudCxcbiAgICB2YWx1ZSxcbiAgICByZXNldCxcbiAgfToge1xuICAgIHBhcmVudDogT0RhdGFNb2RlbDxhbnk+O1xuICAgIHZhbHVlPzogRiB8IEZbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXTtcbiAgICByZXNldD86IGJvb2xlYW47XG4gIH0pOiBPRGF0YU1vZGVsPEY+IHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+IHtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLnNjaGVtYUZhY3Rvcnk8VCwgRj4ocGFyZW50LnNjaGVtYSgpKTtcbiAgICBjb25zdCBhbm5vdHMgPSB0aGlzLmFubm90YXRpb25zRmFjdG9yeShwYXJlbnQuYW5ub3RzKCkpO1xuXG4gICAgY29uc3QgTW9kZWwgPSBzY2hlbWE/Lm1vZGVsO1xuICAgIGNvbnN0IENvbGxlY3Rpb24gPSBzY2hlbWE/LmNvbGxlY3Rpb247XG4gICAgaWYgKE1vZGVsID09PSB1bmRlZmluZWQgfHwgQ29sbGVjdGlvbiA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgRXJyb3IoYE5vIG1vZGVsIGZvciAke3RoaXMubmFtZX1gKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuY29sbGVjdGlvblxuICAgICAgPyAobmV3IENvbGxlY3Rpb24oKHZhbHVlIHx8IFtdKSBhcyBGW10sIHtcbiAgICAgICAgICBhbm5vdHM6IGFubm90cyBhcyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMsXG4gICAgICAgICAgcGFyZW50OiBbcGFyZW50LCB0aGlzXSxcbiAgICAgICAgICByZXNldCxcbiAgICAgICAgfSkgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+KVxuICAgICAgOiAobmV3IE1vZGVsKCh2YWx1ZSB8fCB7fSkgYXMgRiwge1xuICAgICAgICAgIGFubm90czogYW5ub3RzIGFzIE9EYXRhRW50aXR5QW5ub3RhdGlvbnMsXG4gICAgICAgICAgcGFyZW50OiBbcGFyZW50LCB0aGlzXSxcbiAgICAgICAgICByZXNldCxcbiAgICAgICAgfSkgYXMgT0RhdGFNb2RlbDxGPik7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbFJlbGF0aW9uPFQ+ID0ge1xuICBzdGF0ZTogT0RhdGFNb2RlbFN0YXRlO1xuICBtb2RlbD86IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4gfCBudWxsO1xuICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPFQ+O1xuICBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG59O1xuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbEVudHJ5PFQsIE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PiA9IHtcbiAgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZTtcbiAgbW9kZWw6IE07XG4gIGtleT86IEVudGl0eUtleTxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG59O1xuXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbE9wdGlvbnM8VD4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNpZDogc3RyaW5nO1xuICBiYXNlPzogc3RyaW5nO1xuICBvcGVuPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZmllbGRzOiBPRGF0YU1vZGVsRmllbGQ8YW55PltdO1xuICBzY2hlbWE6IE9EYXRhU3RydWN0dXJlZFR5cGU8VD47XG4gIGVudGl0eVNldD86IE9EYXRhRW50aXR5U2V0O1xuICAvLyBIaWVyYXJjaHlcbiAgcGFyZW50PzogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgY2hpbGRyZW46IE9EYXRhTW9kZWxPcHRpb25zPGFueT5bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1vZGVsT3B0aW9ucywgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+KSB7XG4gICAgdGhpcy5uYW1lID0gc2NoZW1hLm5hbWU7XG4gICAgdGhpcy5iYXNlID0gc2NoZW1hLmJhc2U7XG4gICAgdGhpcy5vcGVuID0gc2NoZW1hLm9wZW47XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5jaWQgPSBvcHRpb25zLmNpZCB8fCBDSUQ7XG4gICAgY29uc3Qgc2NoZW1hRmllbGRzID0gdGhpcy5zY2hlbWEuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLl9maWVsZHMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zLmZpZWxkcykubWFwKChbbmFtZSwgb3B0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IHsgZmllbGQsIC4uLm9wdHMgfSA9IG9wdGlvbnM7XG4gICAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBuYW1lID09PSB1bmRlZmluZWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgUHJvcGVydGllcyBuZWVkIG5hbWUgYW5kIGZpZWxkJyk7XG4gICAgICBjb25zdCBwYXJzZXIgPSBzY2hlbWFGaWVsZHMuZmluZCgoZjogYW55KSA9PiBmLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmIChwYXJzZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwYXJzZXIgZm9yICR7ZmllbGR9IHdpdGggbmFtZSA9ICR7bmFtZX1gKTtcbiAgICAgIHJldHVybiBuZXcgT0RhdGFNb2RlbEZpZWxkPFQ+KHRoaXMsIHsgbmFtZSwgZmllbGQsIHBhcnNlciwgLi4ub3B0cyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBhcGkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLmFwaTtcbiAgfVxuXG4gIHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLnR5cGUoKTtcbiAgfVxuXG4gIGlzVHlwZU9mKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYS5pc1R5cGVPZih0eXBlKTtcbiAgfVxuXG4gIGZpbmRDaGlsZE9wdGlvbnMoXG4gICAgcHJlZGljYXRlOiAob3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PikgPT4gYm9vbGVhblxuICApOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocHJlZGljYXRlKHRoaXMpKSByZXR1cm4gdGhpcztcbiAgICBsZXQgbWF0Y2g6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgY2ggb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgbWF0Y2ggPSBjaC5maW5kQ2hpbGRPcHRpb25zKHByZWRpY2F0ZSk7XG4gICAgICBpZiAobWF0Y2ggIT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaDtcbiAgfVxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlLFxuICB9OiB7XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkO1xuICB9KSB7XG4gICAgaWYgKHRoaXMuYmFzZSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gZmluZE9wdGlvbnNGb3JUeXBlKHRoaXMuYmFzZSkgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIHRoaXMuZW50aXR5U2V0ID0gdGhpcy5hcGkuZmluZEVudGl0eVNldEZvckVudGl0eVR5cGUodGhpcy50eXBlKCkpO1xuICAgIGxldCBjb25jdXJyZW5jeUZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5lbnRpdHlTZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uY3VycmVuY3lGaWVsZHMgPVxuICAgICAgICB0aGlzLmVudGl0eVNldC5maW5kQW5ub3RhdGlvbigoYSkgPT4gYS50ZXJtID09PSBPUFRJTUlTVElDX0NPTkNVUlJFTkNZKVxuICAgICAgICAgID8ucHJvcGVydGllcyB8fCBbXTtcbiAgICB9XG4gICAgdGhpcy5fZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICBsZXQgY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeUZpZWxkcy5pbmRleE9mKGZpZWxkLmZpZWxkKSAhPT0gLTE7XG4gICAgICBmaWVsZC5jb25maWd1cmUoe1xuICAgICAgICBmaW5kT3B0aW9uc0ZvclR5cGUsXG4gICAgICAgIGNvbmN1cnJlbmN5LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmaWVsZHMoe1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVfcGFyZW50cyA9IHRydWUsXG4gIH06IHtcbiAgICBpbmNsdWRlX3BhcmVudHM/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9EYXRhTW9kZWxGaWVsZDxhbnk+W10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4oaW5jbHVkZV9wYXJlbnRzICYmIHRoaXMucGFyZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLnBhcmVudC5maWVsZHMoeyBpbmNsdWRlX25hdmlnYXRpb24sIGluY2x1ZGVfcGFyZW50cyB9KVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLnRoaXMuX2ZpZWxkcy5maWx0ZXIoXG4gICAgICAgIChmaWVsZCkgPT4gaW5jbHVkZV9uYXZpZ2F0aW9uIHx8ICFmaWVsZC5uYXZpZ2F0aW9uXG4gICAgICApLFxuICAgIF07XG4gIH1cblxuICBmaWVsZDxGPihuYW1lOiBrZXlvZiBUIHwgc3RyaW5nKSB7XG4gICAgLy9UT0RPOiBUaHJvdyBlcnJvciBpZiBub3QgZm91bmRcbiAgICByZXR1cm4gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgIH0pLmZpbmQoXG4gICAgICAobW9kZWxGaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+KSA9PlxuICAgICAgICBtb2RlbEZpZWxkLm5hbWUgPT09IG5hbWUgfHwgbW9kZWxGaWVsZC5maWVsZCA9PT0gbmFtZVxuICAgICk7XG4gIH1cblxuICBhdHRhY2goc2VsZjogT0RhdGFNb2RlbDxUPiwgcmVzb3VyY2U6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPikge1xuICAgIGlmIChcbiAgICAgIHNlbGYuX3Jlc291cmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlc291cmNlLnR5cGUoKSAhPT0gc2VsZi5fcmVzb3VyY2UudHlwZSgpICYmXG4gICAgICAhcmVzb3VyY2UuaXNTdWJ0eXBlT2Yoc2VsZi5fcmVzb3VyY2UpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2FuJ3QgcmVhdHRhY2ggJHtyZXNvdXJjZS50eXBlKCl9IHRvICR7c2VsZi5fcmVzb3VyY2UudHlwZSgpfWBcbiAgICAgICk7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gc2VsZi5fcmVzb3VyY2U7XG4gICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fCAhY3VycmVudC5pc0VxdWFsVG8ocmVzb3VyY2UpKSB7XG4gICAgICBzZWxmLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2F0dGFjaCcsIHtcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICBwcmV2aW91czogY3VycmVudCxcbiAgICAgICAgICB2YWx1ZTogcmVzb3VyY2UsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIyByZWdpb24gUmVzb3VyY2VcbiAgc3RhdGljIGNoYWluKFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+XG4gICk6IFtcbiAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICBdW10ge1xuICAgIGNvbnN0IGNoYWluID0gW10gYXMgYW55W107XG4gICAgbGV0IHR1cGxlOlxuICAgICAgfCBbXG4gICAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgICAgXVxuICAgICAgfCBudWxsID0gW2NoaWxkLCBudWxsXTtcbiAgICB3aGlsZSAodHVwbGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHR1cGxlIGFzIFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdO1xuICAgICAgaWYgKGNoYWluLnNvbWUoKHApID0+IHBbMF0gPT09IHBhcmVudFswXSkpIGJyZWFrO1xuICAgICAgY2hhaW4uc3BsaWNlKDAsIDAsIHBhcmVudCk7XG4gICAgICB0dXBsZSA9IHR1cGxlWzBdLl9wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBjaGFpbjtcbiAgfVxuXG4gIHN0YXRpYyByZXNvdXJjZTxUPihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PlxuICApOiBPRGF0YU1vZGVsUmVzb3VyY2U8VD4gfCBPRGF0YUNvbGxlY3Rpb25SZXNvdXJjZTxUPiB7XG4gICAgbGV0IHJlc291cmNlOlxuICAgICAgfCBPRGF0YU1vZGVsUmVzb3VyY2U8YW55PlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb25SZXNvdXJjZTxhbnk+XG4gICAgICB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBbbW9kZWwsIGZpZWxkXSBvZiBPRGF0YU1vZGVsT3B0aW9ucy5jaGFpbihjaGlsZCkpIHtcbiAgICAgIHJlc291cmNlID1cbiAgICAgICAgcmVzb3VyY2UgfHxcbiAgICAgICAgbW9kZWwuX3Jlc291cmNlIHx8XG4gICAgICAgIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG1vZGVsKVxuICAgICAgICAgID8gKG1vZGVsIGFzIE9EYXRhTW9kZWw8YW55PikuX21ldGEubW9kZWxSZXNvdXJjZUZhY3RvcnkoKVxuICAgICAgICAgIDogKFxuICAgICAgICAgICAgICBtb2RlbCBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+XG4gICAgICAgICAgICApLl9tb2RlbC5tZXRhLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoKSk7XG4gICAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChtb2RlbCkpIHtcbiAgICAgICAgbGV0IGtleSA9IChtb2RlbCBhcyBPRGF0YU1vZGVsPGFueT4pLmtleSh7XG4gICAgICAgICAgZmllbGRfbWFwcGluZzogdHJ1ZSxcbiAgICAgICAgfSkgYXMgRW50aXR5S2V5PGFueT47XG4gICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICByZXNvdXJjZSA9XG4gICAgICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2VcbiAgICAgICAgICAgICAgPyByZXNvdXJjZS5lbnRpdHkoa2V5KVxuICAgICAgICAgICAgICA6IHJlc291cmNlLmtleShrZXkpO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbW9kZWwuX3Jlc291cmNlPy5jbG9uZVF1ZXJ5KCkudG9RdWVyeUFyZ3VtZW50cygpO1xuICAgICAgICBpZiAocXVlcnkgIT09IHVuZGVmaW5lZCkgcmVzb3VyY2UucXVlcnkoKHEpID0+IHEuYXBwbHkocXVlcnkpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXNvdXJjZSA9IChmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PikucmVzb3VyY2VGYWN0b3J5PGFueSwgYW55PihcbiAgICAgICAgcmVzb3VyY2UgYXMgT0RhdGFNb2RlbFJlc291cmNlPGFueT5cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGByZXNvdXJjZTogQ2FuJ3QgYnVpbGQgcmVzb3VyY2UgZm9yICR7Y2hpbGR9YCk7XG4gICAgcmV0dXJuIHJlc291cmNlO1xuICB9XG5cbiAgY29sbGVjdGlvblJlc291cmNlRmFjdG9yeSh7XG4gICAgYmFzZVJlc291cmNlLFxuICB9OiB7IGJhc2VSZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD4gfSA9IHt9KTogT0RhdGFDb2xsZWN0aW9uUmVzb3VyY2U8VD4ge1xuICAgIGlmICh0aGlzLmVudGl0eVNldCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UuZmFjdG9yeTxUPihcbiAgICAgICAgdGhpcy5hcGksXG4gICAgICAgIHRoaXMuZW50aXR5U2V0Lm5hbWUsXG4gICAgICAgIHRoaXMudHlwZSgpLFxuICAgICAgICBuZXcgT0RhdGFQYXRoU2VnbWVudHMoKSxcbiAgICAgICAgYmFzZVJlc291cmNlPy5jbG9uZVF1ZXJ5KCkgfHwgbmV3IE9EYXRhUXVlcnlPcHRpb25zKClcbiAgICAgICk7XG4gICAgaWYgKGJhc2VSZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ2FuJ3QgYnVpbGQgcmVzb3VyY2VcIik7XG4gICAgcmV0dXJuIGJhc2VSZXNvdXJjZS5jbG9uZSgpIGFzIE9EYXRhQ29sbGVjdGlvblJlc291cmNlPFQ+O1xuICB9XG5cbiAgbW9kZWxSZXNvdXJjZUZhY3Rvcnkoe1xuICAgIGJhc2VSZXNvdXJjZSxcbiAgfToge1xuICAgIGZyb21TZXQ/OiBib29sZWFuO1xuICAgIGJhc2VSZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD47XG4gIH0gPSB7fSk6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoeyBiYXNlUmVzb3VyY2UgfSk7XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkgcmV0dXJuIHJlc291cmNlLmVudGl0eSgpO1xuICAgIHJldHVybiByZXNvdXJjZSBhcyBPRGF0YU1vZGVsUmVzb3VyY2U8VD47XG4gIH1cblxuICBlbnRpdHlSZXNvdXJjZShzZWxmOiBPRGF0YU1vZGVsPFQ+KTogT0RhdGFNb2RlbFJlc291cmNlPFQ+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLm1vZGVsUmVzb3VyY2VGYWN0b3J5KHtcbiAgICAgIGJhc2VSZXNvdXJjZTogc2VsZi5fcmVzb3VyY2UsXG4gICAgICBmcm9tU2V0OiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGtleSA9IHNlbGYua2V5KHsgZmllbGRfbWFwcGluZzogdHJ1ZSB9KSBhcyBFbnRpdHlLZXk8VD47XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcmVzb3VyY2Uua2V5KGtleSk7XG4gICAgcmV0dXJuIHJlc291cmNlIGFzIE9EYXRhTW9kZWxSZXNvdXJjZTxUPjtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBiaW5kKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAge1xuICAgICAgcGFyZW50LFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBhbm5vdHMsXG4gICAgfToge1xuICAgICAgcGFyZW50PzogW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF07XG4gICAgICByZXNvdXJjZT86IE9EYXRhTW9kZWxSZXNvdXJjZTxUPjtcbiAgICAgIGFubm90cz86IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIC8vIFBhcmVudFxuICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VsZi5fcGFyZW50ID0gcGFyZW50O1xuICAgIH0gZWxzZSBpZiAocmVzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVzb3VyY2VcbiAgICAgIHRoaXMuYXR0YWNoKHNlbGYsIHJlc291cmNlKTtcbiAgICB9XG5cbiAgICAvLyBBbm5vdGF0aW9uc1xuICAgIHNlbGYuX2Fubm90YXRpb25zID1cbiAgICAgIGFubm90cyB8fCBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyhPRGF0YUhlbHBlcltERUZBVUxUX1ZFUlNJT05dKTtcblxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KTtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCBmaWVsZC5uYW1lLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9nZXQoc2VsZiwgZmllbGQgYXMgT0RhdGFNb2RlbEZpZWxkPGFueT4pLFxuICAgICAgICBzZXQ6ICh2YWx1ZTogYW55KSA9PlxuICAgICAgICAgIHRoaXMuX3NldChzZWxmLCBmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PiwgdmFsdWUpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcXVlcnkoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICByZXNvdXJjZTogT0RhdGFNb2RlbFJlc291cmNlPFQ+LFxuICAgIGZ1bmM6IChxOiBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXI8VD4pID0+IHZvaWRcbiAgKSB7XG4gICAgcmVzb3VyY2UucXVlcnkoZnVuYyk7XG4gICAgdGhpcy5hdHRhY2goc2VsZiwgcmVzb3VyY2UpO1xuICAgIHJldHVybiBzZWxmO1xuICB9XG5cbiAgcmVzb2x2ZUtleShcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxUPiB8IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogRW50aXR5S2V5PFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleVR5cGVzID0gdGhpcy5zY2hlbWEua2V5cyh7IGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KTtcbiAgICBjb25zdCBrZXk6IGFueSA9IHt9O1xuICAgIGZvciAodmFyIGt0IG9mIGtleVR5cGVzKSB7XG4gICAgICBsZXQgdiA9IHZhbHVlIGFzIGFueTtcbiAgICAgIGxldCBvcHRpb25zID0gdGhpcyBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAgICAgbGV0IGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAobGV0IG5hbWUgb2Yga3QubmFtZS5zcGxpdCgnLycpKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgICBmaWVsZCA9IG9wdGlvbnNcbiAgICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgICAgLmZpbmQoKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQuZmllbGQgPT09IG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHYgPVxuICAgICAgICAgICAgVHlwZXMuaXNQbGFpbk9iamVjdCh2KSB8fCBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHYpXG4gICAgICAgICAgICAgID8gdltmaWVsZC5uYW1lXVxuICAgICAgICAgICAgICA6IHY7XG4gICAgICAgICAgb3B0aW9ucyA9IGZpZWxkLm1ldGEgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBsZXQgbmFtZSA9IGZpZWxkX21hcHBpbmcgPyBmaWVsZC5maWVsZCA6IGZpZWxkLm5hbWU7XG4gICAgICBpZiAoa3QuYWxpYXMgIT09IHVuZGVmaW5lZCkgbmFtZSA9IGt0LmFsaWFzO1xuICAgICAga2V5W25hbWVdID0gdjtcbiAgICB9XG4gICAgaWYgKFR5cGVzLmlzRW1wdHkoa2V5KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZSA/IE9iamVjdHMucmVzb2x2ZUtleShrZXkpIDoga2V5O1xuICB9XG5cbiAgcmVzb2x2ZVJlZmVyZW50aWFsKFxuICAgIHZhbHVlOiBPRGF0YU1vZGVsPFQ+IHwgVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCxcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWZlcmVudGlhbDogYW55ID0ge307XG4gICAgZm9yICh2YXIgcmVmIG9mIGZpZWxkLnJlZmVyZW50aWFscykge1xuICAgICAgbGV0IGZyb20gPSB0aGlzLmZpZWxkcyh7IGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KS5maW5kKFxuICAgICAgICAocDogYW55KSA9PiBwLmZpZWxkID09PSByZWYucmVmZXJlbmNlZFByb3BlcnR5XG4gICAgICApO1xuICAgICAgbGV0IHRvID0gZmllbGQub3B0aW9uc1xuICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgIC5maW5kKChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+IGZpZWxkLmZpZWxkID09PSByZWYucHJvcGVydHkpO1xuICAgICAgaWYgKGZyb20gIT09IHVuZGVmaW5lZCAmJiB0byAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmllbGRfbWFwcGluZyA/IHRvLmZpZWxkIDogdG8ubmFtZTtcbiAgICAgICAgcmVmZXJlbnRpYWxbbmFtZV0gPSB2YWx1ZSAmJiAodmFsdWUgYXMgYW55KVtmcm9tLm5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoVHlwZXMuaXNFbXB0eShyZWZlcmVudGlhbCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc29sdmVcbiAgICAgID8gT2JqZWN0cy5yZXNvbHZlS2V5KHJlZmVyZW50aWFsLCB7IHNpbmdsZTogZmFsc2UgfSlcbiAgICAgIDogcmVmZXJlbnRpYWw7XG4gIH1cblxuICByZXNvbHZlUmVmZXJlbmNlZChcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxUPiB8IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwsXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVmZXJlbmNlZDogYW55ID0ge307XG4gICAgZm9yICh2YXIgcmVmIG9mIGZpZWxkLnJlZmVyZW50aWFscykge1xuICAgICAgbGV0IGZyb20gPSB0aGlzLmZpZWxkcyh7IGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KS5maW5kKFxuICAgICAgICAoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5maWVsZCA9PT0gcmVmLnByb3BlcnR5XG4gICAgICApO1xuICAgICAgbGV0IHRvID0gKGZpZWxkLm1ldGEgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PilcbiAgICAgICAgLmZpZWxkcyh7IGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KVxuICAgICAgICAuZmluZChcbiAgICAgICAgICAoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PlxuICAgICAgICAgICAgZmllbGQuZmllbGQgPT09IHJlZi5yZWZlcmVuY2VkUHJvcGVydHlcbiAgICAgICAgKTtcbiAgICAgIGlmIChmcm9tICE9PSB1bmRlZmluZWQgJiYgdG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgbmFtZSA9IGZpZWxkX21hcHBpbmcgPyB0by5maWVsZCA6IHRvLm5hbWU7XG4gICAgICAgIHJlZmVyZW5jZWRbbmFtZV0gPSB2YWx1ZSAmJiAodmFsdWUgYXMgYW55KVtmcm9tLm5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoVHlwZXMuaXNFbXB0eShyZWZlcmVuY2VkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkocmVmZXJlbmNlZCwgeyBzaW5nbGU6IGZhbHNlIH0pXG4gICAgICA6IHJlZmVyZW5jZWQ7XG4gIH1cblxuICB2YWxpZGF0ZShcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nW10gfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBuYXZpZ2F0aW9uLFxuICAgIH0pLnJlZHVjZSgoYWNjLCBmaWVsZCkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gKHNlbGYgYXMgYW55KVtmaWVsZC5uYW1lXTtcbiAgICAgIGxldCBlcnJzID0gZmllbGQudmFsaWRhdGUodmFsdWUsIHsgbWV0aG9kIH0pO1xuICAgICAgcmV0dXJuIGVycnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IE9iamVjdC5hc3NpZ24oYWNjLCB7IFtmaWVsZC5uYW1lXTogZXJycyB9KVxuICAgICAgICA6IGFjYztcbiAgICB9LCB7fSk7XG4gICAgcmV0dXJuICFUeXBlcy5pc0VtcHR5KGVycm9ycykgPyBlcnJvcnMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWZhdWx0cygpOiBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRlZnMgPSB0aGlzLmZpZWxkcygpLnJlZHVjZSgoYWNjLCBmaWVsZCkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gZmllbGQuZGVmYXVsdHMoKTtcbiAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gT2JqZWN0LmFzc2lnbihhY2MsIHsgW2ZpZWxkLm5hbWVdOiB2YWx1ZSB9KVxuICAgICAgICA6IGFjYztcbiAgICB9LCB7fSk7XG4gICAgcmV0dXJuICFUeXBlcy5pc0VtcHR5KGRlZnMpID8gZGVmcyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGhhc0NoYW5nZWQoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7IGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge31cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICFUeXBlcy5pc0VtcHR5KHNlbGYuX2NoYW5nZXMpIHx8XG4gICAgICBPYmplY3QudmFsdWVzKHNlbGYuX3JlbGF0aW9ucylcbiAgICAgICAgLmZpbHRlcigoeyBmaWVsZCB9KSA9PiAhZmllbGQubmF2aWdhdGlvbiB8fCBpbmNsdWRlX25hdmlnYXRpb24pXG4gICAgICAgIC5zb21lKFxuICAgICAgICAgICh7IGZpZWxkLCBzdGF0ZSwgbW9kZWwgfSkgPT5cbiAgICAgICAgICAgICghaW5jbHVkZV9uYXZpZ2F0aW9uIHx8IGZpZWxkLm5hdmlnYXRpb24pICYmXG4gICAgICAgICAgICAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5DaGFuZ2VkIHx8XG4gICAgICAgICAgICAgIChtb2RlbCAhPSB1bmRlZmluZWQgJiYgbW9kZWwuaGFzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KSkpXG4gICAgICAgIClcbiAgICApO1xuICB9XG5cbiAgYXNFbnRpdHk8UiwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KHNlbGY6IE0sIGZ1bmM6IChtb2RlbDogTSkgPT4gUik6IFIge1xuICAgIGNvbnN0IHBhcmVudCA9IHNlbGYuX3BhcmVudDtcbiAgICBzZWxmLl9wYXJlbnQgPSBudWxsO1xuICAgIGNvbnN0IHJlc3VsdCA9IGZ1bmMoc2VsZik7XG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIHJldHVybiAocmVzdWx0IGFzIGFueSkucGlwZShmaW5hbGl6ZSgoKSA9PiAoc2VsZi5fcGFyZW50ID0gcGFyZW50KSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHRvRW50aXR5KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAge1xuICAgICAgY2xpZW50X2lkID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfa2V5ID0gdHJ1ZSxcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkID0gZmFsc2UsXG4gICAgICBjaGFuZ2VzX29ubHkgPSBmYWxzZSxcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIGNoYWluID0gW10sXG4gICAgfToge1xuICAgICAgY2xpZW50X2lkPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9rZXk/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9ub25fZmllbGQ/OiBib29sZWFuO1xuICAgICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgICAgY2hhaW4/OiAoT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PilbXTtcbiAgICB9ID0ge31cbiAgKTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBsZXQgYXR0cnMgPSBzZWxmLmF0dHJpYnV0ZXMoe1xuICAgICAgY2hhbmdlc19vbmx5LFxuICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgfSk7XG5cbiAgICBsZXQgcmVsYXRpb25zID0gT2JqZWN0LmVudHJpZXMoc2VsZi5fcmVsYXRpb25zKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgLy8gQ2hhaW5cbiAgICAgICAgKFssIHsgbW9kZWwgfV0pID0+IGNoYWluLmV2ZXJ5KChjKSA9PiBjICE9PSBtb2RlbClcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIC8vIENoYW5nZXMgb25seVxuICAgICAgICAoWywgeyBtb2RlbCwgc3RhdGUgfV0pID0+XG4gICAgICAgICAgIWNoYW5nZXNfb25seSB8fFxuICAgICAgICAgIChjaGFuZ2VzX29ubHkgJiZcbiAgICAgICAgICAgIChzdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLkNoYW5nZWQgfHxcbiAgICAgICAgICAgICAgKG1vZGVsICE9IHVuZGVmaW5lZCAmJiBtb2RlbC5oYXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pKSkpXG4gICAgICApXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoWywgeyBmaWVsZCwgbW9kZWwgfV0pID0+XG4gICAgICAgICAgLy8gTmF2aWdhdGlvblxuICAgICAgICAgIChpbmNsdWRlX25hdmlnYXRpb24gJiYgZmllbGQubmF2aWdhdGlvbiAmJiBtb2RlbCAhPT0gbnVsbCkgfHxcbiAgICAgICAgICAhZmllbGQubmF2aWdhdGlvblxuICAgICAgKVxuICAgICAgLm1hcCgoW2ssIHsgbW9kZWwsIGZpZWxkLCBzdGF0ZSB9XSkgPT4ge1xuICAgICAgICBsZXQgY2hhbmdlc09ubHkgPVxuICAgICAgICAgIGNoYW5nZXNfb25seSAmJlxuICAgICAgICAgIHN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuQ2hhbmdlZCAmJlxuICAgICAgICAgICEhZmllbGQubmF2aWdhdGlvbjtcbiAgICAgICAgbGV0IGluY2x1ZGVLZXkgPSBpbmNsdWRlX2tleSAmJiAhIWZpZWxkLm5hdmlnYXRpb247XG4gICAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG1vZGVsKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBrLFxuICAgICAgICAgICAgKG1vZGVsIGFzIE9EYXRhTW9kZWw8YW55PikudG9FbnRpdHkoe1xuICAgICAgICAgICAgICBjbGllbnRfaWQsXG4gICAgICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgICAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgICAgICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICAgICAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICAgICAgICAgIGNoYW5nZXNfb25seTogY2hhbmdlc09ubHksXG4gICAgICAgICAgICAgIGluY2x1ZGVfa2V5OiBpbmNsdWRlS2V5LFxuICAgICAgICAgICAgICBjaGFpbjogW3NlbGYsIC4uLmNoYWluXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKG1vZGVsKSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBrLFxuICAgICAgICAgICAgKG1vZGVsIGFzIE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pLnRvRW50aXRpZXMoe1xuICAgICAgICAgICAgICBjbGllbnRfaWQsXG4gICAgICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgICAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgICAgICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICAgICAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICAgICAgICAgIGNoYW5nZXNfb25seTogY2hhbmdlc09ubHksXG4gICAgICAgICAgICAgIGluY2x1ZGVfa2V5OiBpbmNsdWRlS2V5LFxuICAgICAgICAgICAgICBjaGFpbjogW3NlbGYsIC4uLmNoYWluXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrLCBtb2RlbF07XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgoYWNjLCBbaywgdl0pID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGZpZWxkX21hcHBpbmdcbiAgICAgICAgICA/IHRoaXMuZmllbGRzKCkuZmluZChcbiAgICAgICAgICAgICAgKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQubmFtZSA9PT0ga1xuICAgICAgICAgICAgKT8uZmllbGQgfHwga1xuICAgICAgICAgIDogaztcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdiB9KTtcbiAgICAgIH0sIHt9KTtcblxuICAgIC8vIENyZWF0ZSBlbnRpdHlcbiAgICBsZXQgZW50aXR5ID0geyAuLi5hdHRycywgLi4ucmVsYXRpb25zIH07XG5cbiAgICAvLyBBZGQgY2xpZW50X2lkXG4gICAgaWYgKGNsaWVudF9pZCkge1xuICAgICAgKDxhbnk+ZW50aXR5KVt0aGlzLmNpZF0gPSAoPGFueT5zZWxmKVt0aGlzLmNpZF07XG4gICAgfVxuXG4gICAgLy8gQWRkIGtleVxuICAgIGlmIChpbmNsdWRlX2tleSkge1xuICAgICAgZW50aXR5ID0ge1xuICAgICAgICAuLi5lbnRpdHksXG4gICAgICAgIC4uLih0aGlzLnJlc29sdmVLZXkoc2VsZiwgeyBmaWVsZF9tYXBwaW5nLCByZXNvbHZlOiBmYWxzZSB9KSBhcyB7fSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEFkZCB0eXBlXG4gICAgaWYgKFxuICAgICAgc2VsZi5fcGFyZW50ICE9PSBudWxsICYmXG4gICAgICAoKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoc2VsZi5fcGFyZW50WzBdKSAmJlxuICAgICAgICAoc2VsZi5fcGFyZW50WzFdIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+KS5tZXRhICE9PSBzZWxmLl9tZXRhKSB8fFxuICAgICAgICAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHNlbGYuX3BhcmVudFswXSkgJiZcbiAgICAgICAgICAoc2VsZi5fcGFyZW50WzBdIGFzIE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pLl9tb2RlbFxuICAgICAgICAgICAgLm1ldGEgIT09IHNlbGYuX21ldGEpKVxuICAgICkge1xuICAgICAgdGhpcy5hcGkub3B0aW9ucy5oZWxwZXIudHlwZShlbnRpdHksIHRoaXMuc2NoZW1hLnR5cGUoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eTtcbiAgfVxuXG4gIGF0dHJpYnV0ZXMoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBjaGFuZ2VzX29ubHkgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkID0gZmFsc2UsXG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIC8vIEF0dHJpYnV0ZXMgYnkgZmllbGRzIChhdHRyaWJ1dGVzIGZvciB0aGUgbW9kZWwgdHlwZSlcbiAgICBjb25zdCBmaWVsZEF0dHJzID0gdGhpcy5maWVsZHMoKS5yZWR1Y2UoKGFjYywgZikgPT4ge1xuICAgICAgY29uc3QgaXNDaGFuZ2VkID0gZi5uYW1lIGluIHNlbGYuX2NoYW5nZXM7XG4gICAgICBjb25zdCBuYW1lID0gZmllbGRfbWFwcGluZyA/IGYuZmllbGQgOiBmLm5hbWU7XG4gICAgICBjb25zdCB2YWx1ZSA9IGlzQ2hhbmdlZFxuICAgICAgICA/IHNlbGYuX2NoYW5nZXNbZi5uYW1lXVxuICAgICAgICA6IHNlbGYuX2F0dHJpYnV0ZXNbZi5uYW1lXTtcbiAgICAgIGlmIChmLmNvbmN1cnJlbmN5ICYmIGluY2x1ZGVfY29uY3VycmVuY3kpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKGYuY29tcHV0ZWQgJiYgaW5jbHVkZV9jb21wdXRlZCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlc19vbmx5ICYmIGlzQ2hhbmdlZCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoIWNoYW5nZXNfb25seSAmJiAhZi5jb25jdXJyZW5jeSAmJiAhZi5jb21wdXRlZCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG4gICAgfSwge30pO1xuICAgIGlmICghaW5jbHVkZV9ub25fZmllbGQpIHJldHVybiBmaWVsZEF0dHJzO1xuICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoZmllbGRBdHRycyk7XG4gICAgLy8gQXR0cmlidXRlcyBmcm9tIG9iamVjdCAoYXR0cmlidXRlcyBmb3Igb2JqZWN0KVxuICAgIGNvbnN0IG5vbkZpZWxkQXR0cnMgPSBPYmplY3QuZW50cmllcyhzZWxmKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFtrXSkgPT5cbiAgICAgICAgICBuYW1lcy5pbmRleE9mKGspID09PSAtMSAmJiAhay5zdGFydHNXaXRoKCdfJykgJiYgIWsuZW5kc1dpdGgoJyQnKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjLCBbaywgdl0pID0+IE9iamVjdC5hc3NpZ24oYWNjLCB7IFtrXTogdiB9KSwge30pO1xuICAgIHJldHVybiB7IC4uLmZpZWxkQXR0cnMsIC4uLm5vbkZpZWxkQXR0cnMgfTtcbiAgfVxuXG4gIHJlc2V0KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgeyBuYW1lLCBzaWxlbnQgPSBmYWxzZSB9OiB7IG5hbWU/OiBzdHJpbmc7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIGlmICghVHlwZXMuaXNFbXB0eShuYW1lKSAmJiAobmFtZSBhcyBzdHJpbmcpIGluIHNlbGYuX2NoYW5nZXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gc2VsZi5fYXR0cmlidXRlc1tuYW1lIGFzIHN0cmluZ107XG4gICAgICBjb25zdCBwcmV2aW91cyA9IHNlbGYuX2NoYW5nZXNbbmFtZSBhcyBzdHJpbmddO1xuICAgICAgZGVsZXRlIHNlbGYuX2NoYW5nZXNbbmFtZSBhcyBzdHJpbmddO1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnY2hhbmdlJywge1xuICAgICAgICAgICAgbW9kZWw6IHNlbGYsXG4gICAgICAgICAgICB0cmFjazogbmFtZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgcHJldmlvdXMsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFR5cGVzLmlzRW1wdHkobmFtZSkpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhzZWxmLl9jaGFuZ2VzKTtcbiAgICAgIHNlbGYuX2NoYW5nZXMgPSB7fTtcbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2NoYW5nZScsIHtcbiAgICAgICAgICAgICAgdHJhY2s6IGVudHJ5WzBdLFxuICAgICAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICAgICAgdmFsdWU6IHNlbGYuX2F0dHJpYnV0ZXNbZW50cnlbMF1dLFxuICAgICAgICAgICAgICBwcmV2aW91czogZW50cnlbMV0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzc2lnbihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGVudGl0eTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7IHJlc2V0PzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbiAgKSB7XG4gICAgc2VsZi5fcmVzZXR0aW5nID0gcmVzZXQ7XG4gICAgc2VsZi5fc2lsZW50ID0gc2lsZW50O1xuXG4gICAgY29uc3QgY2hhbmdlczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEFwcGx5IGVudGl0eVxuICAgIGNvbnN0IG1vZGVsID0gc2VsZiBhcyBhbnk7XG4gICAgT2JqZWN0LmVudHJpZXMoZW50aXR5KVxuICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSAvLyBGaWx0ZXIgdW5kZWZpbmVkXG4gICAgICAuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMoe1xuICAgICAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICAgIH0pLmZpbmQoXG4gICAgICAgICAgKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT5cbiAgICAgICAgICAgIChzZWxmLl9yZXNldHRpbmcgJiYgZmllbGQuZmllbGQgPT09IGtleSkgfHwgZmllbGQubmFtZSA9PT0ga2V5XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGZpZWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBEZWxlZ2F0ZWQgdG8gcHJpdmF0ZSBzZXR0ZXJcbiAgICAgICAgICBpZiAodGhpcy5fc2V0KHNlbGYsIGZpZWxkLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNoYW5nZXMucHVzaChmaWVsZC5uYW1lKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKSB8fFxuICAgICAgICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAvLyBTZXQgUGFyZW50XG4gICAgICAgICAgICAgIHZhbHVlLl9wYXJlbnQgPSBbc2VsZiwgZmllbGRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBCYXNpYyBhc3NpZ25tZW50XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IG1vZGVsW2tleV07XG4gICAgICAgICAgbW9kZWxba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSB2YWx1ZSkgY2hhbmdlcy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKCFzZWxmLl9zaWxlbnQgJiYgY2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChzZWxmLl9yZXNldHRpbmcgPyAncmVzZXQnIDogJ3VwZGF0ZScsIHtcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICBvcHRpb25zOiB7IGNoYW5nZXMgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHNlbGYuX3Jlc2V0dGluZyA9IGZhbHNlO1xuICAgIHNlbGYuX3NpbGVudCA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGlzTW9kZWwob2JqOiBhbnkpIHtcbiAgICByZXR1cm4gVHlwZXMucmF3VHlwZShvYmopID09PSAnTW9kZWwnO1xuICB9XG5cbiAgc3RhdGljIGlzQ29sbGVjdGlvbihvYmo6IGFueSkge1xuICAgIHJldHVybiBUeXBlcy5yYXdUeXBlKG9iaikgPT09ICdDb2xsZWN0aW9uJztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sbGVjdGlvbjxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4sXG4gICAgY29sbGVjdGlvbjogT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+LFxuICAgIHZhbHVlOiBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4gfCBUW10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICkge1xuICAgIGlmIChcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSkgJiZcbiAgICAgIGNvbGxlY3Rpb24uZXF1YWxzKHZhbHVlIGFzIE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PilcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gKHZhbHVlIGFzIE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pLnRvRW50aXRpZXMoXG4gICAgICAgIElOQ0xVREVfREVFUFxuICAgICAgKTtcbiAgICB9XG4gICAgY29sbGVjdGlvbi5fYW5ub3RhdGlvbnMgPSBmaWVsZC5hbm5vdGF0aW9uc0ZhY3RvcnkoXG4gICAgICBzZWxmLmFubm90cygpXG4gICAgKSBhcyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM7XG4gICAgY29sbGVjdGlvbi5hc3NpZ24odmFsdWUgYXMgVFtdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSwge1xuICAgICAgcmVzZXQ6IHNlbGYuX3Jlc2V0dGluZyxcbiAgICAgIHNpbGVudDogc2VsZi5fc2lsZW50LFxuICAgIH0pO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmhhc0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZU1vZGVsPEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPixcbiAgICBtb2RlbDogT0RhdGFNb2RlbDxGPixcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxGPiB8IEYgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICApIHtcbiAgICBpZiAoXG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSAmJlxuICAgICAgbW9kZWwuZXF1YWxzKHZhbHVlIGFzIE9EYXRhTW9kZWw8Rj4pXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSAodmFsdWUgYXMgT0RhdGFNb2RlbDxGPikudG9FbnRpdHkoSU5DTFVERV9ERUVQKTtcbiAgICB9XG4gICAgbW9kZWwuX2Fubm90YXRpb25zID0gZmllbGQuYW5ub3RhdGlvbnNGYWN0b3J5KFxuICAgICAgc2VsZi5hbm5vdHMoKVxuICAgICkgYXMgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucztcbiAgICBtb2RlbC5hc3NpZ24odmFsdWUgYXMgRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICByZXNldDogc2VsZi5fcmVzZXR0aW5nLFxuICAgICAgc2lsZW50OiBzZWxmLl9zaWxlbnQsXG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGVsLmhhc0NoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldDxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj5cbiAgKTogRiB8IE9EYXRhTW9kZWw8Rj4gfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpKSB7XG4gICAgICByZXR1cm4gc2VsZi5fcmVsYXRpb25zW2ZpZWxkLm5hbWVdPy5tb2RlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlcyhzZWxmLCB7XG4gICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k6IHRydWUsXG4gICAgICAgIGluY2x1ZGVfY29tcHV0ZWQ6IHRydWUsXG4gICAgICB9KVtmaWVsZC5uYW1lXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRTdHJ1Y3R1cmVkPEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPixcbiAgICB2YWx1ZTpcbiAgICAgIHwgRlxuICAgICAgfCBGW11cbiAgICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXVxuICAgICAgfCBPRGF0YU1vZGVsPEY+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PlxuICAgICAgfCBudWxsXG4gICk6IGJvb2xlYW4ge1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgLy8gRW5zdXJlcyB0aGF0IHRoZSByZWxhdGlvbiBleGlzdHNcbiAgICBpZiAoIShmaWVsZC5uYW1lIGluIHNlbGYuX3JlbGF0aW9ucykpIHtcbiAgICAgIHNlbGYuX3JlbGF0aW9uc1tmaWVsZC5uYW1lXSA9IHtcbiAgICAgICAgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQsXG4gICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb24gPSBzZWxmLl9yZWxhdGlvbnNbZmllbGQubmFtZV07XG4gICAgY29uc3QgY3VycmVudE1vZGVsID0gcmVsYXRpb24ubW9kZWw7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJlbGF0aW9uLm1vZGVsID0gdmFsdWUgYXMgbnVsbDtcbiAgICAgIGNoYW5nZWQgPSBjdXJyZW50TW9kZWwgIT09IHZhbHVlO1xuICAgICAgdGhpcy5fdW5zdWJzY3JpYmUoc2VsZiwgcmVsYXRpb24pO1xuICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKGN1cnJlbnRNb2RlbCkpIHtcbiAgICAgIGNoYW5nZWQgPSB0aGlzLnVwZGF0ZUNvbGxlY3Rpb248Rj4oXG4gICAgICAgIHNlbGYsXG4gICAgICAgIGZpZWxkLFxuICAgICAgICBjdXJyZW50TW9kZWwgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+LFxuICAgICAgICB2YWx1ZSBhc1xuICAgICAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICAgICAgfCBUW11cbiAgICAgICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGN1cnJlbnRNb2RlbCkpIHtcbiAgICAgIGNoYW5nZWQgPSB0aGlzLnVwZGF0ZU1vZGVsPEY+KFxuICAgICAgICBzZWxmLFxuICAgICAgICBmaWVsZCxcbiAgICAgICAgY3VycmVudE1vZGVsIGFzIE9EYXRhTW9kZWw8Rj4sXG4gICAgICAgIHZhbHVlIGFzIE9EYXRhTW9kZWw8Rj4gfCBGIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbGF0aW9uLm1vZGVsID1cbiAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKSB8fFxuICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKVxuICAgICAgICAgID8gKHZhbHVlIGFzIE9EYXRhTW9kZWw8Rj4gfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4pXG4gICAgICAgICAgOiBmaWVsZC5tb2RlbENvbGxlY3Rpb25GYWN0b3J5PFQsIEY+KHtcbiAgICAgICAgICAgICAgcGFyZW50OiBzZWxmLFxuICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgIHJlc2V0OiBzZWxmLl9yZXNldHRpbmcsXG4gICAgICAgICAgICB9KTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fc3Vic2NyaWJlKHNlbGYsIHJlbGF0aW9uKTtcbiAgICB9XG4gICAgaWYgKCFPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24ocmVsYXRpb24ubW9kZWwpKSB7XG4gICAgICB2YXIgcmVmID0gZmllbGQubWV0YT8ucmVzb2x2ZVJlZmVyZW50aWFsKHJlbGF0aW9uLm1vZGVsLCBmaWVsZCk7XG4gICAgICBpZiAocmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVmKS5mb3JFYWNoKChbaywgdl0pID0+XG4gICAgICAgICAgdGhpcy5fc2V0VmFsdWUoc2VsZiwgaywgdiwgZmFsc2UpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlbGF0aW9uLnN0YXRlID1cbiAgICAgIHNlbGYuX3Jlc2V0dGluZyB8fCAhY2hhbmdlZFxuICAgICAgICA/IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWRcbiAgICAgICAgOiBPRGF0YU1vZGVsU3RhdGUuQ2hhbmdlZDtcbiAgICBpZiAoIXNlbGYuX3NpbGVudCAmJiBjaGFuZ2VkKSB7XG4gICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnY2hhbmdlJywge1xuICAgICAgICAgIHRyYWNrOiBmaWVsZC5uYW1lLFxuICAgICAgICAgIG1vZGVsOiBzZWxmLFxuICAgICAgICAgIHZhbHVlOiByZWxhdGlvbi5tb2RlbCxcbiAgICAgICAgICBwcmV2aW91czogY3VycmVudE1vZGVsLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cblxuICBwcml2YXRlIF9zZXRWYWx1ZTxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBzdHJpbmcsXG4gICAgdmFsdWU6XG4gICAgICB8IEZcbiAgICAgIHwgRltdXG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgICAgIHwgT0RhdGFNb2RlbDxGPlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj5cbiAgICAgIHwgbnVsbCxcbiAgICBrZXk/OiBib29sZWFuXG4gICk6IGJvb2xlYW4ge1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgYXR0cnMgPSB0aGlzLmF0dHJpYnV0ZXMoc2VsZiwge1xuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeTogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQ6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gYXR0cnNbZmllbGRdO1xuICAgIGNoYW5nZWQgPSAhVHlwZXMuaXNFcXVhbChjdXJyZW50VmFsdWUsIHZhbHVlKTtcbiAgICBpZiAoc2VsZi5fcmVzZXR0aW5nKSB7XG4gICAgICBkZWxldGUgc2VsZi5fY2hhbmdlc1tmaWVsZF07XG4gICAgICBzZWxmLl9hdHRyaWJ1dGVzW2ZpZWxkXSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoVHlwZXMuaXNFcXVhbCh2YWx1ZSwgc2VsZi5fYXR0cmlidXRlc1tmaWVsZF0pKSB7XG4gICAgICBkZWxldGUgc2VsZi5fY2hhbmdlc1tmaWVsZF07XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VkKSB7XG4gICAgICBzZWxmLl9jaGFuZ2VzW2ZpZWxkXSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoIXNlbGYuX3NpbGVudCAmJiBjaGFuZ2VkKSB7XG4gICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnY2hhbmdlJywge1xuICAgICAgICAgIHRyYWNrOiBmaWVsZCxcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBwcmV2aW91czogY3VycmVudFZhbHVlLFxuICAgICAgICAgIG9wdGlvbnM6IHsga2V5IH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIHByaXZhdGUgX3NldDxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4sXG4gICAgdmFsdWU6XG4gICAgICB8IEZcbiAgICAgIHwgRltdXG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgICAgIHwgT0RhdGFNb2RlbDxGPlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj5cbiAgICAgIHwgbnVsbFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpXG4gICAgICA/IHRoaXMuX3NldFN0cnVjdHVyZWQoc2VsZiwgZmllbGQsIHZhbHVlKVxuICAgICAgOiB0aGlzLl9zZXRWYWx1ZShzZWxmLCBmaWVsZC5uYW1lLCB2YWx1ZSwgZmllbGQuaXNLZXkoKSk7XG4gIH1cblxuICBwcml2YXRlIF91bnN1YnNjcmliZTxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHJlbGF0aW9uOiBPRGF0YU1vZGVsUmVsYXRpb248Rj5cbiAgKSB7XG4gICAgaWYgKHJlbGF0aW9uLnN1YnNjcmlwdGlvbikge1xuICAgICAgcmVsYXRpb24uc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICBkZWxldGUgcmVsYXRpb24uc3Vic2NyaXB0aW9uO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9zdWJzY3JpYmU8Rj4oc2VsZjogT0RhdGFNb2RlbDxUPiwgcmVsYXRpb246IE9EYXRhTW9kZWxSZWxhdGlvbjxGPikge1xuICAgIGlmIChyZWxhdGlvbi5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3Vic2NyaXB0aW9uIGFscmVhZHkgZXhpc3RzJyk7XG4gICAgfVxuICAgIGlmIChyZWxhdGlvbi5tb2RlbCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1YnNjcmlwdGlvbiBtb2RlbCBpcyBudWxsJyk7XG4gICAgfVxuICAgIHJlbGF0aW9uLnN1YnNjcmlwdGlvbiA9IHJlbGF0aW9uLm1vZGVsLmV2ZW50cyQuc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50OiBPRGF0YU1vZGVsRXZlbnQ8YW55PikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgQlVCQkxJTkcuaW5kZXhPZihldmVudC5uYW1lKSAhPT0gLTEgJiZcbiAgICAgICAgICBldmVudC5idWJibGluZyAmJlxuICAgICAgICAgICFldmVudC52aXNpdGVkKHNlbGYpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChldmVudC5tb2RlbCA9PT0gcmVsYXRpb24ubW9kZWwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZXZlbnQubmFtZSA9PT0gJ2NoYW5nZScgJiZcbiAgICAgICAgICAgICAgcmVsYXRpb24uZmllbGQubmF2aWdhdGlvbiAmJlxuICAgICAgICAgICAgICBldmVudC5vcHRpb25zPy5rZXlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2YXIgcmVmID0gKHJlbGF0aW9uLm1vZGVsIGFzIE9EYXRhTW9kZWw8YW55PikucmVmZXJlbnRpYWwoXG4gICAgICAgICAgICAgICAgcmVsYXRpb24uZmllbGRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVmKS5mb3JFYWNoKChbaywgdl0pID0+XG4gICAgICAgICAgICAgICAgICB0aGlzLl9zZXRWYWx1ZShzZWxmLCBrLCB2LCBmYWxzZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXZlbnQucHVzaChzZWxmLCByZWxhdGlvbi5maWVsZC5uYW1lKTtcbiAgICAgICAgICBzZWxmLmV2ZW50cyQuZW1pdChldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iXX0=