@kaspernj/api-maker 1.0.2153 → 1.0.2155

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.
@@ -1,228 +1,342 @@
1
1
  /* eslint-disable sort-imports */
2
- import { useCallback, useEffect, useRef } from "react";
2
+ import { ShapeHook, useShapeHook } from "set-state-compare";
3
+ import { useEffect } from "react";
3
4
  import Devise from "./devise.js";
4
5
  import * as inflection from "inflection";
5
6
  import ModelEvents from "./model-events.js";
6
7
  import useQueryParams from "on-location-changed/build/use-query-params.js";
7
- import useShape from "./use-shape.js";
8
8
  import useUpdatedEvent from "./use-updated-event.js";
9
9
  /**
10
10
  * @typedef {object} useModelArgs
11
11
  * @property {(arg: object) => Function} [callback]
12
12
  * @property {(arg: object) => object} [args]
13
- * @property {() => number|string} [loadByQueryParam]
13
+ * @property {(args: {queryParams: Record<string, any> | undefined}) => number|string} [loadByQueryParam]
14
14
  * @property {any[]} [cacheArgs]
15
15
  * @property {{params: object}} [match]
16
16
  * @property {(ctx: { model: import("./base-model.js").default }) => void} [onDestroyed]
17
17
  * @property {import("./collection.js").default} [query]
18
18
  */
19
- /**
20
- * @param {Function|object} modelClassArg
21
- * @param {object | ((args: {modelClass: typeof import("./base-model.js").default}) => useModelArgs)} [argsArg]
22
- */
23
- /** useModel. */
24
- // eslint-disable-next-line complexity
25
- const useModel = (modelClassArg, argsArg = {}) => {
26
- const queryParams = useQueryParams();
27
- const loadModelGenerationRef = useRef(0);
28
- let args, modelClass;
29
- if (typeof argsArg == "function") {
30
- args = argsArg({ modelClass });
31
- }
32
- else {
33
- args = argsArg;
34
- }
35
- const s = useShape(args);
36
- s.useStates({
37
- model: undefined,
38
- notFound: undefined
39
- });
40
- if ("active" in s.props && !s.props.active) {
41
- s.meta.active = false;
42
- }
43
- else {
44
- s.meta.active = true;
45
- }
46
- if (typeof modelClassArg == "object") {
47
- modelClass = modelClassArg.callback({ queryParams });
48
- }
49
- else {
50
- modelClass = modelClassArg;
51
- }
52
- const paramsVariableName = `${modelClass.modelName().paramKey()}_id`;
53
- let modelId;
54
- if (args.loadByQueryParam) {
55
- modelId = args.loadByQueryParam({ queryParams });
56
- }
57
- else if (!args.query) {
58
- if (!args.match)
19
+ /** Hook state container for useModel. */
20
+ class UseModelShapeHook extends ShapeHook {
21
+ updatedConnectionFallbackTimeoutId = undefined;
22
+ /** Constructor. */
23
+ constructor(props) {
24
+ super(props);
25
+ this.initialLoadTriggered = false;
26
+ this.loadModelGeneration = 0;
27
+ this.newIfNoIdDefaultsResult = null;
28
+ this.queryParams = undefined;
29
+ this.updatedConnectionReady = false;
30
+ }
31
+ /** @returns {boolean} */
32
+ active() {
33
+ return !("active" in this.args()) || Boolean(this.args().active);
34
+ }
35
+ /** @returns {useModelArgs & Record<string, any>} */
36
+ args() {
37
+ if (typeof this.p.argsArg == "function") {
38
+ return this.p.argsArg({ modelClass: this.modelClass() });
39
+ }
40
+ return this.p.argsArg || {};
41
+ }
42
+ /** @returns {typeof import("./base-model.js").default} */
43
+ modelClass() {
44
+ if (typeof this.p.modelClassArg == "object") {
45
+ return this.p.modelClassArg.callback({ queryParams: this.queryParams });
46
+ }
47
+ return this.p.modelClassArg;
48
+ }
49
+ /** @returns {string} */
50
+ paramsVariableName() {
51
+ return `${this.modelClass().modelName()
52
+ .paramKey()}_id`;
53
+ }
54
+ /** @returns {number | string | undefined} */
55
+ modelId() {
56
+ if (this.args().loadByQueryParam) {
57
+ return this.args().loadByQueryParam({ queryParams: this.queryParams });
58
+ }
59
+ else if (this.args().query) {
60
+ return undefined;
61
+ }
62
+ else if (!this.args().match) {
59
63
  throw new Error("Both 'loadByQueryParam' and 'match' wasn't given");
60
- modelId = args.match.params[paramsVariableName] || args.match.params.id;
64
+ }
65
+ return this.args().match.params[this.paramsVariableName()] || this.args().match.params.id;
66
+ }
67
+ /** @returns {string} */
68
+ modelVariableName() {
69
+ return inflection.camelize(this.modelClass().modelClassData().name, true);
70
+ }
71
+ /** @returns {any[]} */
72
+ cacheArgs() {
73
+ return [this.modelId()].concat(this.args().cacheArgs || [], this.queryParams);
74
+ }
75
+ /** @returns {boolean} */
76
+ shouldWaitForUpdatedConnection() {
77
+ return Boolean(this.args().eventUpdated && this.modelId() && !this.s.model);
78
+ }
79
+ /** @returns {object} */
80
+ newModelDataFromParams() {
81
+ return this.queryParams?.[this.modelClass().modelName()
82
+ .paramKey()] || {};
61
83
  }
62
- const modelVariableName = inflection.camelize(modelClass.modelClassData().name, true);
63
- const cacheArgs = [modelId];
64
- const loadExistingModel = useCallback(async (loadModelGeneration) => {
84
+ /** @returns {boolean} */
85
+ hasAsyncDefaults() {
86
+ return Boolean(this.newIfNoIdDefaultsResult && typeof this.newIfNoIdDefaultsResult.then == "function");
87
+ }
88
+ /** @returns {object | null} */
89
+ syncDefaultsForNewModel() {
90
+ if (!this.args().newIfNoId?.defaults) {
91
+ return {};
92
+ }
93
+ else if (this.hasAsyncDefaults()) {
94
+ return null;
95
+ }
96
+ if (this.newIfNoIdDefaultsResult === null) {
97
+ const defaultsResult = this.args().newIfNoId.defaults();
98
+ if (defaultsResult && typeof defaultsResult.then == "function") {
99
+ this.newIfNoIdDefaultsResult = defaultsResult.catch((error) => {
100
+ throw error;
101
+ });
102
+ return null;
103
+ }
104
+ this.newIfNoIdDefaultsResult = defaultsResult;
105
+ }
106
+ return this.newIfNoIdDefaultsResult || {};
107
+ }
108
+ /** @returns {import("./base-model.js").default | undefined} */
109
+ syncNewModel() {
110
+ if (!this.active() || !this.args().newIfNoId || this.modelId()) {
111
+ return undefined;
112
+ }
113
+ const defaults = this.syncDefaultsForNewModel();
114
+ if (defaults === null) {
115
+ return undefined;
116
+ }
117
+ return new (this.modelClass())({
118
+ isNewRecord: true,
119
+ data: { a: Object.assign(defaults, this.args().newAttributes, this.newModelDataFromParams()) }
120
+ });
121
+ }
122
+ /** @returns {import("./base-model.js").default | undefined} */
123
+ subscriptionModel() {
124
+ if (!this.args().eventUpdated) {
125
+ return undefined;
126
+ }
127
+ else if (this.s.model) {
128
+ return this.s.model;
129
+ }
130
+ else if (!this.modelId()) {
131
+ return undefined;
132
+ }
133
+ return new (this.modelClass())({
134
+ data: { a: { [this.modelClass().primaryKey()]: this.modelId() } }
135
+ });
136
+ }
137
+ /** @param {number} loadModelGeneration */
138
+ loadExistingModel = async (loadModelGeneration) => {
65
139
  let query;
66
- if (s.m.modelId) {
67
- query = modelClass.ransack({ id_eq: s.m.modelId });
140
+ if (this.modelId()) {
141
+ query = this.modelClass().ransack({ id_eq: this.modelId() });
68
142
  }
69
- else if (s.m.args.query) {
70
- query = s.m.args.query.clone();
143
+ else if (this.args().query) {
144
+ query = this.args().query.clone();
71
145
  }
72
146
  else {
73
- throw new Error(`No model ID was given: ${s.m.modelId} by '${paramsVariableName}' in query params: ${Object.keys(s.props.match.params).join(", ")}`);
74
- }
75
- if (s.props.abilities)
76
- query.abilities(s.p.abilities);
77
- if (s.props.preload)
78
- query.preload(s.p.preload);
79
- if (s.props.select)
80
- query.select(s.p.select);
147
+ const matchParams = this.args().match?.params || {};
148
+ throw new Error(`No model ID was given: ${this.modelId()} by '${this.paramsVariableName()}' in query params: ${Object.keys(matchParams).join(", ")}`);
149
+ }
150
+ if (this.args().abilities)
151
+ query.abilities(this.args().abilities);
152
+ if (this.args().preload)
153
+ query.preload(this.args().preload);
154
+ if (this.args().select)
155
+ query.select(this.args().select);
81
156
  const model = await query.first();
82
- if (loadModelGeneration != loadModelGenerationRef.current)
157
+ if (loadModelGeneration != this.loadModelGeneration)
83
158
  return;
84
- if (s.s.model &&
159
+ if (this.s.model &&
85
160
  model &&
86
- !s.s.notFound &&
87
- s.s.model.fullCacheKey() == model.fullCacheKey()) {
161
+ !this.s.notFound &&
162
+ this.s.model.fullCacheKey() == model.fullCacheKey()) {
88
163
  return;
89
164
  }
90
- else if (!s.s.model && !model && s.s.notFound) {
165
+ else if (!this.s.model && !model && this.s.notFound) {
91
166
  return;
92
167
  }
93
- s.set({ model, notFound: !model });
94
- }, []);
95
- const loadNewModel = useCallback(async (loadModelGeneration) => {
96
- const ModelClass = modelClass;
97
- const paramKey = ModelClass.modelName().paramKey();
98
- const modelDataFromParams = s.m.queryParams?.[paramKey] || {};
168
+ this.setState({ model, notFound: !model });
169
+ };
170
+ /** @param {number} loadModelGeneration */
171
+ loadNewModel = async (loadModelGeneration) => {
99
172
  let defaults = {};
100
- if (s.props.newIfNoId?.defaults) {
101
- let defaultsResult = s.m.newIfNoIdDefaultsResult;
173
+ if (this.args().newIfNoId?.defaults) {
174
+ let defaultsResult = this.newIfNoIdDefaultsResult;
102
175
  if (defaultsResult === null) {
103
- defaultsResult = s.props.newIfNoId.defaults();
176
+ defaultsResult = this.args().newIfNoId.defaults();
104
177
  }
105
- s.meta.newIfNoIdDefaultsResult = null;
178
+ this.newIfNoIdDefaultsResult = null;
106
179
  defaults = await defaultsResult;
107
180
  }
108
- const modelData = Object.assign(defaults, s.props.newAttributes, modelDataFromParams);
109
- const model = new ModelClass({
181
+ const model = new (this.modelClass())({
110
182
  isNewRecord: true,
111
- data: { a: modelData }
183
+ data: { a: Object.assign(defaults, this.args().newAttributes, this.newModelDataFromParams()) }
112
184
  });
113
- if (loadModelGeneration != loadModelGenerationRef.current)
185
+ if (loadModelGeneration != this.loadModelGeneration)
114
186
  return;
115
- s.set({ model });
116
- }, []);
117
- const loadModel = useCallback(async () => {
187
+ this.setState({ model, notFound: false });
188
+ };
189
+ /** @returns {Promise<void>} */
190
+ loadModel = async () => {
118
191
  // Only the newest model request may update state after route or auth changes.
119
- const loadModelGeneration = loadModelGenerationRef.current + 1;
120
- loadModelGenerationRef.current = loadModelGeneration;
121
- if (!s.m.active) {
122
- // Not active - don't do anything
123
- }
124
- else if (s.props.newIfNoId && !s.m.modelId) {
125
- return await loadNewModel(loadModelGeneration);
126
- }
127
- else if (!s.props.optional || s.m.modelId || s.m.args.query) {
128
- return await loadExistingModel(loadModelGeneration);
129
- }
130
- }, []);
131
- const onDestroyed = useCallback(({ model }) => {
132
- const forwardArgs = { model };
133
- forwardArgs[s.m.modelVariableName] = model;
134
- s.p.onDestroyed(forwardArgs);
135
- }, []);
136
- const onSignedIn = useCallback(() => {
137
- loadModel();
138
- }, []);
139
- const onSignedOut = useCallback(() => {
140
- loadModel();
141
- }, []);
142
- if (args.cacheArgs) {
143
- cacheArgs.push(...args.cacheArgs);
144
- }
145
- cacheArgs.push(queryParams);
146
- s.updateMeta({ args, modelId, modelVariableName, queryParams });
147
- if (s.meta.syncNewModel == undefined)
148
- s.meta.syncNewModel = false;
149
- if (s.meta.newIfNoIdDefaultsResult == undefined)
150
- s.meta.newIfNoIdDefaultsResult = null;
151
- if (s.m.active && s.props.newIfNoId && !s.m.modelId && !s.s.model && !s.m.syncNewModel) {
152
- if (s.props.newIfNoId?.defaults && s.m.newIfNoIdDefaultsResult === null) {
153
- const defaultsResult = s.props.newIfNoId.defaults();
154
- if (defaultsResult && typeof defaultsResult.then == "function") {
155
- s.meta.newIfNoIdDefaultsResult = defaultsResult.catch((error) => {
156
- throw error;
157
- });
158
- }
159
- else {
160
- s.meta.newIfNoIdDefaultsResult = defaultsResult;
192
+ const loadModelGeneration = this.loadModelGeneration + 1;
193
+ this.initialLoadTriggered = true;
194
+ this.loadModelGeneration = loadModelGeneration;
195
+ if (this.active() && this.args().newIfNoId && !this.modelId()) {
196
+ await this.loadNewModel(loadModelGeneration);
197
+ }
198
+ else if (this.active() && (!this.args().optional || this.modelId() || this.args().query)) {
199
+ await this.loadExistingModel(loadModelGeneration);
200
+ }
201
+ };
202
+ /** @returns {void} */
203
+ clearUpdatedConnectionFallbackTimeout() {
204
+ if (this.updatedConnectionFallbackTimeoutId) {
205
+ clearTimeout(this.updatedConnectionFallbackTimeoutId);
206
+ this.updatedConnectionFallbackTimeoutId = undefined;
207
+ }
208
+ }
209
+ /** @returns {void} */
210
+ ensureInitialLoadFallback() {
211
+ if (!this.shouldWaitForUpdatedConnection() || this.initialLoadTriggered) {
212
+ return;
213
+ }
214
+ this.clearUpdatedConnectionFallbackTimeout();
215
+ this.updatedConnectionFallbackTimeoutId = setTimeout(() => {
216
+ if (!this.updatedConnectionReady && !this.initialLoadTriggered) {
217
+ this.loadModel();
161
218
  }
219
+ }, 1000);
220
+ }
221
+ /** @param {{model: import("./base-model.js").default}} args */
222
+ onDestroyed = (args) => {
223
+ const forwardArgs = { model: args.model };
224
+ forwardArgs[this.modelVariableName()] = args.model;
225
+ this.args().onDestroyed(forwardArgs);
226
+ };
227
+ /** @returns {void} */
228
+ onSignedIn = () => {
229
+ this.loadModel();
230
+ };
231
+ /** @returns {void} */
232
+ onSignedOut = () => {
233
+ this.loadModel();
234
+ };
235
+ /** @returns {void} */
236
+ onUpdatedEventConnected = () => {
237
+ this.updatedConnectionReady = true;
238
+ this.clearUpdatedConnectionFallbackTimeout();
239
+ if (this.shouldWaitForUpdatedConnection() && !this.initialLoadTriggered) {
240
+ this.loadModel();
241
+ }
242
+ };
243
+ /** @returns {import("./base-model.js").default | undefined} */
244
+ visibleModel() {
245
+ let model = this.s.model;
246
+ if (!model) {
247
+ model = this.syncNewModel();
162
248
  }
163
- if (!(s.m.newIfNoIdDefaultsResult && typeof s.m.newIfNoIdDefaultsResult.then == "function")) {
164
- const ModelClass = modelClass;
165
- const paramKey = ModelClass.modelName().paramKey();
166
- const modelDataFromParams = s.m.queryParams?.[paramKey] || {};
167
- const modelData = Object.assign(s.m.newIfNoIdDefaultsResult || {}, s.props.newAttributes, modelDataFromParams);
168
- const model = new ModelClass({
169
- isNewRecord: true,
170
- data: { a: modelData }
171
- });
172
- s.meta.syncNewModel = model;
173
- s.set({ model });
174
- }
175
- }
176
- // Start async model loading after mount so ShapeHook state updates do not race the mount lifecycle.
177
- useEffect(() => { loadModel(); }, cacheArgs);
178
- useEffect(() => () => {
179
- loadModelGenerationRef.current += 1;
180
- }, []);
181
- useEffect(() => {
182
- let reloadModelCallback;
183
- if (args.events) {
184
- reloadModelCallback = args.events.addListener("reloadModel", loadModel);
185
- }
186
- return () => {
187
- if (reloadModelCallback) {
188
- args.events.removeListener("reloadModel", loadModel);
249
+ if (!this.active()) {
250
+ return undefined;
251
+ }
252
+ else if (this.modelId() && model && model.id() != this.modelId()) {
253
+ return undefined;
254
+ }
255
+ else if (!this.modelId() && !this.args().query && !this.args().newIfNoId) {
256
+ return undefined;
257
+ }
258
+ return model;
259
+ }
260
+ /** @returns {boolean | undefined} */
261
+ visibleNotFound() {
262
+ if (!this.active()) {
263
+ return undefined;
264
+ }
265
+ else if (this.modelId() && this.visibleModel() === undefined) {
266
+ return undefined;
267
+ }
268
+ else if (!this.modelId() && !this.args().query && !this.args().newIfNoId) {
269
+ return undefined;
270
+ }
271
+ return this.s.notFound;
272
+ }
273
+ /** @returns {void} */
274
+ setup() {
275
+ this.useStates({
276
+ model: undefined,
277
+ notFound: undefined
278
+ });
279
+ this.setInstance({ queryParams: useQueryParams() });
280
+ useEffect(() => {
281
+ if (this.s.model === undefined) {
282
+ const syncNewModel = this.syncNewModel();
283
+ if (syncNewModel) {
284
+ this.setState({ model: syncNewModel, notFound: false });
285
+ }
286
+ }
287
+ if (this.shouldWaitForUpdatedConnection()) {
288
+ this.ensureInitialLoadFallback();
189
289
  }
190
- };
191
- }, [args.events]);
192
- useUpdatedEvent(args.eventUpdated ? s.s.model : undefined, loadModel, {
193
- onConnected: loadModel
194
- });
195
- useEffect(() => {
196
- Devise.events().addListener("onDeviseSignIn", onSignedIn);
197
- Devise.events().addListener("onDeviseSignOut", onSignedOut);
198
- return () => {
199
- Devise.events().removeListener("onDeviseSignIn", onSignedIn);
200
- Devise.events().removeListener("onDeviseSignOut", onSignedOut);
201
- };
202
- });
203
- useEffect(() => {
204
- let connectDestroyed;
205
- if (s.s.model && args.onDestroyed) {
206
- connectDestroyed = ModelEvents.connectDestroyed(s.s.model, onDestroyed);
207
- }
208
- return () => {
209
- connectDestroyed?.unsubscribe();
210
- };
211
- }, [args.onDestroyed, s.s.model?.id()]);
212
- let model = s.s.model;
213
- let notFound = s.s.notFound;
214
- if (!s.m.active) {
215
- model = undefined;
216
- notFound = undefined;
217
- }
218
- else if (modelId && model && model.id() != modelId) {
219
- model = undefined;
220
- notFound = undefined;
221
- }
222
- else if (!modelId && !args.query && !s.props.newIfNoId) {
223
- model = undefined;
224
- notFound = undefined;
290
+ else {
291
+ this.loadModel();
292
+ }
293
+ }, this.cacheArgs());
294
+ // Invalidate in-flight async responses so stale loads cannot write after unmount.
295
+ useEffect(() => () => {
296
+ this.clearUpdatedConnectionFallbackTimeout();
297
+ this.loadModelGeneration += 1;
298
+ }, []);
299
+ useEffect(() => {
300
+ if (!this.args().events)
301
+ return;
302
+ this.args().events.addListener("reloadModel", this.loadModel);
303
+ return () => {
304
+ this.args().events.removeListener("reloadModel", this.loadModel);
305
+ };
306
+ }, [this.args().events]);
307
+ useUpdatedEvent(this.subscriptionModel(), this.loadModel, {
308
+ onConnected: this.onUpdatedEventConnected
309
+ });
310
+ useEffect(() => {
311
+ Devise.events().addListener("onDeviseSignIn", this.onSignedIn);
312
+ Devise.events().addListener("onDeviseSignOut", this.onSignedOut);
313
+ return () => {
314
+ Devise.events().removeListener("onDeviseSignIn", this.onSignedIn);
315
+ Devise.events().removeListener("onDeviseSignOut", this.onSignedOut);
316
+ };
317
+ });
318
+ useEffect(() => {
319
+ if (!this.s.model || !this.args().onDestroyed)
320
+ return;
321
+ const connectDestroyed = ModelEvents.connectDestroyed(this.s.model, this.onDestroyed);
322
+ return () => {
323
+ connectDestroyed.unsubscribe();
324
+ };
325
+ }, [this.args().onDestroyed, this.s.model ? this.s.model.id() : undefined]);
225
326
  }
327
+ }
328
+ /**
329
+ * @param {Function|object} modelClassArg
330
+ * @param {object | ((args: {modelClass: typeof import("./base-model.js").default}) => useModelArgs)} [argsArg]
331
+ * @returns {Record<string, any>}
332
+ */
333
+ /** useModel. */
334
+ const useModel = (modelClassArg, argsArg = {}) => {
335
+ const shapeHook = useShapeHook(UseModelShapeHook, { argsArg, modelClassArg });
336
+ const model = shapeHook.visibleModel();
337
+ const modelId = shapeHook.modelId();
338
+ const notFound = shapeHook.visibleNotFound();
339
+ const modelVariableName = shapeHook.modelVariableName();
226
340
  const result = {
227
341
  model,
228
342
  modelId,
@@ -234,4 +348,4 @@ const useModel = (modelClassArg, argsArg = {}) => {
234
348
  return result;
235
349
  };
236
350
  export default useModel;
237
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLW1vZGVsLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJ1c2UtbW9kZWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBQyxNQUFNLE9BQU8sQ0FBQTtBQUNwRCxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxjQUFjLE1BQU0sK0NBQStDLENBQUE7QUFDMUUsT0FBTyxRQUFRLE1BQU0sZ0JBQWdCLENBQUE7QUFDckMsT0FBTyxlQUFlLE1BQU0sd0JBQXdCLENBQUE7QUFFcEQ7Ozs7Ozs7OztHQVNHO0FBRUg7OztHQUdHO0FBQ0gsZ0JBQWdCO0FBQ2hCLHNDQUFzQztBQUN0QyxNQUFNLFFBQVEsR0FBRyxDQUFDLGFBQWEsRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDL0MsTUFBTSxXQUFXLEdBQUcsY0FBYyxFQUFFLENBQUE7SUFDcEMsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDeEMsSUFBSSxJQUFJLEVBQUUsVUFBVSxDQUFBO0lBRXBCLElBQUksT0FBTyxPQUFPLElBQUksVUFBVSxFQUFFLENBQUM7UUFDakMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUE7SUFDOUIsQ0FBQztTQUFNLENBQUM7UUFDTixJQUFJLEdBQUcsT0FBTyxDQUFBO0lBQ2hCLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFeEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNWLEtBQUssRUFBRSxTQUFTO1FBQ2hCLFFBQVEsRUFBRSxTQUFTO0tBQ3BCLENBQUMsQ0FBQTtJQUVGLElBQUksUUFB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cG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlUmVmfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IERldmlzZSBmcm9tIFwiLi9kZXZpc2UuanNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTW9kZWxFdmVudHMgZnJvbSBcIi4vbW9kZWwtZXZlbnRzLmpzXCJcbmltcG9ydCB1c2VRdWVyeVBhcmFtcyBmcm9tIFwib24tbG9jYXRpb24tY2hhbmdlZC9idWlsZC91c2UtcXVlcnktcGFyYW1zLmpzXCJcbmltcG9ydCB1c2VTaGFwZSBmcm9tIFwiLi91c2Utc2hhcGUuanNcIlxuaW1wb3J0IHVzZVVwZGF0ZWRFdmVudCBmcm9tIFwiLi91c2UtdXBkYXRlZC1ldmVudC5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gdXNlTW9kZWxBcmdzXG4gKiBAcHJvcGVydHkgeyhhcmc6IG9iamVjdCkgPT4gRnVuY3Rpb259IFtjYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7KGFyZzogb2JqZWN0KSA9PiBvYmplY3R9IFthcmdzXVxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ8c3RyaW5nfSBbbG9hZEJ5UXVlcnlQYXJhbV1cbiAqIEBwcm9wZXJ0eSB7YW55W119IFtjYWNoZUFyZ3NdXG4gKiBAcHJvcGVydHkge3twYXJhbXM6IG9iamVjdH19IFttYXRjaF1cbiAqIEBwcm9wZXJ0eSB7KGN0eDogeyBtb2RlbDogaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHQgfSkgPT4gdm9pZH0gW29uRGVzdHJveWVkXVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdH0gW3F1ZXJ5XVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtGdW5jdGlvbnxvYmplY3R9IG1vZGVsQ2xhc3NBcmdcbiAqIEBwYXJhbSB7b2JqZWN0IHwgKChhcmdzOiB7bW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0fSkgPT4gdXNlTW9kZWxBcmdzKX0gW2FyZ3NBcmddXG4gKi9cbi8qKiB1c2VNb2RlbC4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5jb25zdCB1c2VNb2RlbCA9IChtb2RlbENsYXNzQXJnLCBhcmdzQXJnID0ge30pID0+IHtcbiAgY29uc3QgcXVlcnlQYXJhbXMgPSB1c2VRdWVyeVBhcmFtcygpXG4gIGNvbnN0IGxvYWRNb2RlbEdlbmVyYXRpb25SZWYgPSB1c2VSZWYoMClcbiAgbGV0IGFyZ3MsIG1vZGVsQ2xhc3NcblxuICBpZiAodHlwZW9mIGFyZ3NBcmcgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgYXJncyA9IGFyZ3NBcmcoe21vZGVsQ2xhc3N9KVxuICB9IGVsc2Uge1xuICAgIGFyZ3MgPSBhcmdzQXJnXG4gIH1cblxuICBjb25zdCBzID0gdXNlU2hhcGUoYXJncylcblxuICBzLnVzZVN0YXRlcyh7XG4gICAgbW9kZWw6IHVuZGVmaW5lZCxcbiAgICBub3RGb3VuZDogdW5kZWZpbmVkXG4gIH0pXG5cbiAgaWYgKFwiYWN0aXZlXCIgaW4gcy5wcm9wcyAmJiAhcy5wcm9wcy5hY3RpdmUpIHtcbiAgICBzLm1ldGEuYWN0aXZlID0gZmFsc2VcbiAgfSBlbHNlIHtcbiAgICBzLm1ldGEuYWN0aXZlID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiBtb2RlbENsYXNzQXJnID09IFwib2JqZWN0XCIpIHtcbiAgICBtb2RlbENsYXNzID0gbW9kZWxDbGFzc0FyZy5jYWxsYmFjayh7cXVlcnlQYXJhbXN9KVxuICB9IGVsc2Uge1xuICAgIG1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzQXJnXG4gIH1cblxuICBjb25zdCBwYXJhbXNWYXJpYWJsZU5hbWUgPSBgJHttb2RlbENsYXNzLm1vZGVsTmFtZSgpLnBhcmFtS2V5KCl9X2lkYFxuICBsZXQgbW9kZWxJZFxuXG4gIGlmIChhcmdzLmxvYWRCeVF1ZXJ5UGFyYW0pIHtcbiAgICBtb2RlbElkID0gYXJncy5sb2FkQnlRdWVyeVBhcmFtKHtxdWVyeVBhcmFtc30pXG4gIH0gZWxzZSBpZiAoIWFyZ3MucXVlcnkpIHtcbiAgICBpZiAoIWFyZ3MubWF0Y2gpIHRocm93IG5ldyBFcnJvcihcIkJvdGggJ2xvYWRCeVF1ZXJ5UGFyYW0nIGFuZCAnbWF0Y2gnIHdhc24ndCBnaXZlblwiKVxuXG4gICAgbW9kZWxJZCA9IGFyZ3MubWF0Y2gucGFyYW1zW3BhcmFtc1ZhcmlhYmxlTmFtZV0gfHwgYXJncy5tYXRjaC5wYXJhbXMuaWRcbiAgfVxuXG4gIGNvbnN0IG1vZGVsVmFyaWFibGVOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShtb2RlbENsYXNzLm1vZGVsQ2xhc3NEYXRhKCkubmFtZSwgdHJ1ZSlcbiAgY29uc3QgY2FjaGVBcmdzID0gW21vZGVsSWRdXG5cbiAgY29uc3QgbG9hZEV4aXN0aW5nTW9kZWwgPSB1c2VDYWxsYmFjayhhc3luYyAobG9hZE1vZGVsR2VuZXJhdGlvbikgPT4ge1xuICAgIGxldCBxdWVyeVxuXG4gICAgaWYgKHMubS5tb2RlbElkKSB7XG4gICAgICBxdWVyeSA9IG1vZGVsQ2xhc3MucmFuc2Fjayh7aWRfZXE6IHMubS5tb2RlbElkfSlcbiAgICB9IGVsc2UgaWYgKHMubS5hcmdzLnF1ZXJ5KSB7XG4gICAgICBxdWVyeSA9IHMubS5hcmdzLnF1ZXJ5LmNsb25lKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBtb2RlbCBJRCB3YXMgZ2l2ZW46ICR7cy5tLm1vZGVsSWR9IGJ5ICcke3BhcmFtc1ZhcmlhYmxlTmFtZX0nIGluIHF1ZXJ5IHBhcmFtczogJHtPYmplY3Qua2V5cyhzLnByb3BzLm1hdGNoLnBhcmFtcykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKHMucHJvcHMuYWJpbGl0aWVzKSBxdWVyeS5hYmlsaXRpZXMocy5wLmFiaWxpdGllcylcbiAgICBpZiAocy5wcm9wcy5wcmVsb2FkKSBxdWVyeS5wcmVsb2FkKHMucC5wcmVsb2FkKVxuICAgIGlmIChzLnByb3BzLnNlbGVjdCkgcXVlcnkuc2VsZWN0KHMucC5zZWxlY3QpXG5cbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHF1ZXJ5LmZpcnN0KClcblxuICAgIGlmIChsb2FkTW9kZWxHZW5lcmF0aW9uICE9IGxvYWRNb2RlbEdlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG5cbiAgICBpZiAoXG4gICAgICBzLnMubW9kZWwgJiZcbiAgICAgIG1vZGVsICYmXG4gICAgICAhcy5zLm5vdEZvdW5kICYmXG4gICAgICBzLnMubW9kZWwuZnVsbENhY2hlS2V5KCkgPT0gbW9kZWwuZnVsbENhY2hlS2V5KClcbiAgICApIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSBpZiAoIXMucy5tb2RlbCAmJiAhbW9kZWwgJiYgcy5zLm5vdEZvdW5kKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzLnNldCh7bW9kZWwsIG5vdEZvdW5kOiAhbW9kZWx9KVxuICB9LCBbXSlcblxuICBjb25zdCBsb2FkTmV3TW9kZWwgPSB1c2VDYWxsYmFjayhhc3luYyAobG9hZE1vZGVsR2VuZXJhdGlvbikgPT4ge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzXG4gICAgY29uc3QgcGFyYW1LZXkgPSBNb2RlbENsYXNzLm1vZGVsTmFtZSgpLnBhcmFtS2V5KClcbiAgICBjb25zdCBtb2RlbERhdGFGcm9tUGFyYW1zID0gcy5tLnF1ZXJ5UGFyYW1zPy5bcGFyYW1LZXldIHx8IHt9XG5cbiAgICBsZXQgZGVmYXVsdHMgPSB7fVxuXG4gICAgaWYgKHMucHJvcHMubmV3SWZOb0lkPy5kZWZhdWx0cykge1xuICAgICAgbGV0IGRlZmF1bHRzUmVzdWx0ID0gcy5tLm5ld0lmTm9JZERlZmF1bHRzUmVzdWx0XG5cbiAgICAgIGlmIChkZWZhdWx0c1Jlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICBkZWZhdWx0c1Jlc3VsdCA9IHMucHJvcHMubmV3SWZOb0lkLmRlZmF1bHRzKClcbiAgICAgIH1cblxuICAgICAgcy5tZXRhLm5ld0lmTm9JZERlZmF1bHRzUmVzdWx0ID0gbnVsbFxuICAgICAgZGVmYXVsdHMgPSBhd2FpdCBkZWZhdWx0c1Jlc3VsdFxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsRGF0YSA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdHMsIHMucHJvcHMubmV3QXR0cmlidXRlcywgbW9kZWxEYXRhRnJvbVBhcmFtcylcbiAgICBjb25zdCBtb2RlbCA9IG5ldyBNb2RlbENsYXNzKHtcbiAgICAgIGlzTmV3UmVjb3JkOiB0cnVlLFxuICAgICAgZGF0YToge2E6IG1vZGVsRGF0YX1cbiAgICB9KVxuXG4gICAgaWYgKGxvYWRNb2RlbEdlbmVyYXRpb24gIT0gbG9hZE1vZGVsR2VuZXJhdGlvblJlZi5jdXJyZW50KSByZXR1cm5cblxuICAgIHMuc2V0KHttb2RlbH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGxvYWRNb2RlbCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICAvLyBPbmx5IHRoZSBuZXdlc3QgbW9kZWwgcmVxdWVzdCBtYXkgdXBkYXRlIHN0YXRlIGFmdGVyIHJvdXRlIG9yIGF1dGggY2hhbmdlcy5cbiAgICBjb25zdCBsb2FkTW9kZWxHZW5lcmF0aW9uID0gbG9hZE1vZGVsR2VuZXJhdGlvblJlZi5jdXJyZW50ICsgMVxuXG4gICAgbG9hZE1vZGVsR2VuZXJhdGlvblJlZi5jdXJyZW50ID0gbG9hZE1vZGVsR2VuZXJhdGlvblxuICAgIGlmICghcy5tLmFjdGl2ZSkge1xuICAgICAgLy8gTm90IGFjdGl2ZSAtIGRvbid0IGRvIGFueXRoaW5nXG4gICAgfSBlbHNlIGlmIChzLnByb3BzLm5ld0lmTm9JZCAmJiAhcy5tLm1vZGVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCBsb2FkTmV3TW9kZWwobG9hZE1vZGVsR2VuZXJhdGlvbilcbiAgICB9IGVsc2UgaWYgKCFzLnByb3BzLm9wdGlvbmFsIHx8IHMubS5tb2RlbElkIHx8IHMubS5hcmdzLnF1ZXJ5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgbG9hZEV4aXN0aW5nTW9kZWwobG9hZE1vZGVsR2VuZXJhdGlvbilcbiAgICB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IG9uRGVzdHJveWVkID0gdXNlQ2FsbGJhY2soKHttb2RlbH0pID0+IHtcbiAgICBjb25zdCBmb3J3YXJkQXJncyA9IHttb2RlbH1cblxuICAgIGZvcndhcmRBcmdzW3MubS5tb2RlbFZhcmlhYmxlTmFtZV0gPSBtb2RlbFxuXG4gICAgcy5wLm9uRGVzdHJveWVkKGZvcndhcmRBcmdzKVxuICB9LCBbXSlcblxuICBjb25zdCBvblNpZ25lZEluID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGxvYWRNb2RlbCgpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IG9uU2lnbmVkT3V0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGxvYWRNb2RlbCgpXG4gIH0sIFtdKVxuXG4gIGlmIChhcmdzLmNhY2hlQXJncykge1xuICAgIGNhY2hlQXJncy5wdXNoKC4uLmFyZ3MuY2FjaGVBcmdzKVxuICB9XG5cbiAgY2FjaGVBcmdzLnB1c2gocXVlcnlQYXJhbXMpXG5cbiAgcy51cGRhdGVNZXRhKHthcmdzLCBtb2RlbElkLCBtb2RlbFZhcmlhYmxlTmFtZSwgcXVlcnlQYXJhbXN9KVxuICBpZiAocy5tZXRhLnN5bmNOZXdNb2RlbCA9PSB1bmRlZmluZWQpIHMubWV0YS5zeW5jTmV3TW9kZWwgPSBmYWxzZVxuICBpZiAocy5tZXRhLm5ld0lmTm9JZERlZmF1bHRzUmVzdWx0ID09IHVuZGVmaW5lZCkgcy5tZXRhLm5ld0lmTm9JZERlZmF1bHRzUmVzdWx0ID0gbnVsbFxuXG4gIGlmIChzLm0uYWN0aXZlICYmIHMucHJvcHMubmV3SWZOb0lkICYmICFzLm0ubW9kZWxJZCAmJiAhcy5zLm1vZGVsICYmICFzLm0uc3luY05ld01vZGVsKSB7XG4gICAgaWYgKHMucHJvcHMubmV3SWZOb0lkPy5kZWZhdWx0cyAmJiBzLm0ubmV3SWZOb0lkRGVmYXVsdHNSZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRzUmVzdWx0ID0gcy5wcm9wcy5uZXdJZk5vSWQuZGVmYXVsdHMoKVxuXG4gICAgICBpZiAoZGVmYXVsdHNSZXN1bHQgJiYgdHlwZW9mIGRlZmF1bHRzUmVzdWx0LnRoZW4gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHMubWV0YS5uZXdJZk5vSWREZWZhdWx0c1Jlc3VsdCA9IGRlZmF1bHRzUmVzdWx0LmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzLm1ldGEubmV3SWZOb0lkRGVmYXVsdHNSZXN1bHQgPSBkZWZhdWx0c1Jlc3VsdFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghKHMubS5uZXdJZk5vSWREZWZhdWx0c1Jlc3VsdCAmJiB0eXBlb2Ygcy5tLm5ld0lmTm9JZERlZmF1bHRzUmVzdWx0LnRoZW4gPT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgY29uc3QgTW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3NcbiAgICAgIGNvbnN0IHBhcmFtS2V5ID0gTW9kZWxDbGFzcy5tb2RlbE5hbWUoKS5wYXJhbUtleSgpXG4gICAgICBjb25zdCBtb2RlbERhdGFGcm9tUGFyYW1zID0gcy5tLnF1ZXJ5UGFyYW1zPy5bcGFyYW1LZXldIHx8IHt9XG4gICAgICBjb25zdCBtb2RlbERhdGEgPSBPYmplY3QuYXNzaWduKHMubS5uZXdJZk5vSWREZWZhdWx0c1Jlc3VsdCB8fCB7fSwgcy5wcm9wcy5uZXdBdHRyaWJ1dGVzLCBtb2RlbERhdGFGcm9tUGFyYW1zKVxuICAgICAgY29uc3QgbW9kZWwgPSBuZXcgTW9kZWxDbGFzcyh7XG4gICAgICAgIGlzTmV3UmVjb3JkOiB0cnVlLFxuICAgICAgICBkYXRhOiB7YTogbW9kZWxEYXRhfVxuICAgICAgfSlcblxuICAgICAgcy5tZXRhLnN5bmNOZXdNb2RlbCA9IG1vZGVsXG4gICAgICBzLnNldCh7bW9kZWx9KVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXJ0IGFzeW5jIG1vZGVsIGxvYWRpbmcgYWZ0ZXIgbW91bnQgc28gU2hhcGVIb29rIHN0YXRlIHVwZGF0ZXMgZG8gbm90IHJhY2UgdGhlIG1vdW50IGxpZmVjeWNsZS5cbiAgdXNlRWZmZWN0KFxuICAgICgpID0+IHsgbG9hZE1vZGVsKCkgfSxcbiAgICBjYWNoZUFyZ3NcbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiAoKSA9PiB7XG4gICAgbG9hZE1vZGVsR2VuZXJhdGlvblJlZi5jdXJyZW50ICs9IDFcbiAgfSwgW10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgcmVsb2FkTW9kZWxDYWxsYmFja1xuXG4gICAgaWYgKGFyZ3MuZXZlbnRzKSB7XG4gICAgICByZWxvYWRNb2RlbENhbGxiYWNrID0gYXJncy5ldmVudHMuYWRkTGlzdGVuZXIoXCJyZWxvYWRNb2RlbFwiLCBsb2FkTW9kZWwpXG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChyZWxvYWRNb2RlbENhbGxiYWNrKSB7XG4gICAgICAgIGFyZ3MuZXZlbnRzLnJlbW92ZUxpc3RlbmVyKFwicmVsb2FkTW9kZWxcIiwgbG9hZE1vZGVsKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW2FyZ3MuZXZlbnRzXSlcblxuICB1c2VVcGRhdGVkRXZlbnQoYXJncy5ldmVudFVwZGF0ZWQgPyBzLnMubW9kZWwgOiB1bmRlZmluZWQsIGxvYWRNb2RlbCwge1xuICAgIG9uQ29ubmVjdGVkOiBsb2FkTW9kZWxcbiAgfSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIERldmlzZS5ldmVudHMoKS5hZGRMaXN0ZW5lcihcIm9uRGV2aXNlU2lnbkluXCIsIG9uU2lnbmVkSW4pXG4gICAgRGV2aXNlLmV2ZW50cygpLmFkZExpc3RlbmVyKFwib25EZXZpc2VTaWduT3V0XCIsIG9uU2lnbmVkT3V0KVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIERldmlzZS5ldmVudHMoKS5yZW1vdmVMaXN0ZW5lcihcIm9uRGV2aXNlU2lnbkluXCIsIG9uU2lnbmVkSW4pXG4gICAgICBEZXZpc2UuZXZlbnRzKCkucmVtb3ZlTGlzdGVuZXIoXCJvbkRldmlzZVNpZ25PdXRcIiwgb25TaWduZWRPdXQpXG4gICAgfVxuICB9KVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGNvbm5lY3REZXN0cm95ZWRcblxuICAgIGlmIChzLnMubW9kZWwgJiYgYXJncy5vbkRlc3Ryb3llZCkge1xuICAgICAgY29ubmVjdERlc3Ryb3llZCA9IE1vZGVsRXZlbnRzLmNvbm5lY3REZXN0cm95ZWQocy5zLm1vZGVsLCBvbkRlc3Ryb3llZClcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29ubmVjdERlc3Ryb3llZD8udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgfSwgW2FyZ3Mub25EZXN0cm95ZWQsIHMucy5tb2RlbD8uaWQoKV0pXG5cbiAgbGV0IG1vZGVsID0gcy5zLm1vZGVsXG4gIGxldCBub3RGb3VuZCA9IHMucy5ub3RGb3VuZFxuXG4gIGlmICghcy5tLmFjdGl2ZSkge1xuICAgIG1vZGVsID0gdW5kZWZpbmVkXG4gICAgbm90Rm91bmQgPSB1bmRlZmluZWRcbiAgfSBlbHNlIGlmIChtb2RlbElkICYmIG1vZGVsICYmIG1vZGVsLmlkKCkgIT0gbW9kZWxJZCkge1xuICAgIG1vZGVsID0gdW5kZWZpbmVkXG4gICAgbm90Rm91bmQgPSB1bmRlZmluZWRcbiAgfSBlbHNlIGlmICghbW9kZWxJZCAmJiAhYXJncy5xdWVyeSAmJiAhcy5wcm9wcy5uZXdJZk5vSWQpIHtcbiAgICBtb2RlbCA9IHVuZGVmaW5lZFxuICAgIG5vdEZvdW5kID0gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgbW9kZWwsXG4gICAgbW9kZWxJZCxcbiAgICBub3RGb3VuZFxuICB9XG5cbiAgcmVzdWx0W21vZGVsVmFyaWFibGVOYW1lXSA9IG1vZGVsXG4gIHJlc3VsdFtgJHttb2RlbFZhcmlhYmxlTmFtZX1JZGBdID0gbW9kZWxJZFxuICByZXN1bHRbYCR7bW9kZWxWYXJpYWJsZU5hbWV9Tm90Rm91bmRgXSA9IG5vdEZvdW5kXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VNb2RlbFxuIl19
351
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLW1vZGVsLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJ1c2UtbW9kZWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLE9BQU8sQ0FBQTtBQUMvQixPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxjQUFjLE1BQU0sK0NBQStDLENBQUE7QUFDMUUsT0FBTyxlQUFlLE1BQU0sd0JBQXdCLENBQUE7QUFFcEQ7Ozs7Ozs7OztHQVNHO0FBRUgseUNBQXlDO0FBQ3pDLE1BQU0saUJBQWtCLFNBQVEsU0FBUztJQUN2QyxrQ0FBa0MsR0FBRyxTQUFTLENBQUE7SUFFOUMsbUJBQW1CO0lBQ25CLFlBQVksS0FBSztRQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNaLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUE7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtRQUM1QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFBO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFBO1FBQzVCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUE7SUFDckMsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixNQUFNO1FBQ0osT0FBTyxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxJQUFJO1FBQ0YsSUFBSSxP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Q0FBQTtJQUVELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEtBQUssQ0FBQTtJQUNqQyxNQUFNLENBQUMsR0FBRyxpQkFBaUIsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFBO0lBQzFDLE1BQU0sQ0FBQyxHQUFHLGlCQUFpQixVQUFVLENBQUMsR0FBRyxRQUFRLENBQUE7SUFFakQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUE7QUFFRCxlQUFlLFFBQVEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHNvcnQtaW1wb3J0cyAqL1xuaW1wb3J0IHtTaGFwZUhvb2ssIHVzZVNoYXBlSG9va30gZnJvbSBcInNldC1zdGF0ZS1jb21wYXJlXCJcbmltcG9ydCB7dXNlRWZmZWN0fSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IERldmlzZSBmcm9tIFwiLi9kZXZpc2UuanNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTW9kZWxFdmVudHMgZnJvbSBcIi4vbW9kZWwtZXZlbnRzLmpzXCJcbmltcG9ydCB1c2VRdWVyeVBhcmFtcyBmcm9tIFwib24tbG9jYXRpb24tY2hhbmdlZC9idWlsZC91c2UtcXVlcnktcGFyYW1zLmpzXCJcbmltcG9ydCB1c2VVcGRhdGVkRXZlbnQgZnJvbSBcIi4vdXNlLXVwZGF0ZWQtZXZlbnQuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IHVzZU1vZGVsQXJnc1xuICogQHByb3BlcnR5IHsoYXJnOiBvYmplY3QpID0+IEZ1bmN0aW9ufSBbY2FsbGJhY2tdXG4gKiBAcHJvcGVydHkgeyhhcmc6IG9iamVjdCkgPT4gb2JqZWN0fSBbYXJnc11cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZH0pID0+IG51bWJlcnxzdHJpbmd9IFtsb2FkQnlRdWVyeVBhcmFtXVxuICogQHByb3BlcnR5IHthbnlbXX0gW2NhY2hlQXJnc11cbiAqIEBwcm9wZXJ0eSB7e3BhcmFtczogb2JqZWN0fX0gW21hdGNoXVxuICogQHByb3BlcnR5IHsoY3R4OiB7IG1vZGVsOiBpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdCB9KSA9PiB2b2lkfSBbb25EZXN0cm95ZWRdXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0fSBbcXVlcnldXG4gKi9cblxuLyoqIEhvb2sgc3RhdGUgY29udGFpbmVyIGZvciB1c2VNb2RlbC4gKi9cbmNsYXNzIFVzZU1vZGVsU2hhcGVIb29rIGV4dGVuZHMgU2hhcGVIb29rIHtcbiAgdXBkYXRlZENvbm5lY3Rpb25GYWxsYmFja1RpbWVvdXRJZCA9IHVuZGVmaW5lZFxuXG4gIC8qKiBDb25zdHJ1Y3Rvci4gKi9cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLmluaXRpYWxMb2FkVHJpZ2dlcmVkID0gZmFsc2VcbiAgICB0aGlzLmxvYWRNb2RlbEdlbmVyYXRpb24gPSAwXG4gICAgdGhpcy5uZXdJZk5vSWREZWZhdWx0c1Jlc3VsdCA9IG51bGxcbiAgICB0aGlzLnF1ZXJ5UGFyYW1zID0gdW5kZWZpbmVkXG4gICAgdGhpcy51cGRhdGVkQ29ubmVjdGlvblJlYWR5ID0gZmFsc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgYWN0aXZlKCkge1xuICAgIHJldHVybiAhKFwiYWN0aXZlXCIgaW4gdGhpcy5hcmdzKCkpIHx8IEJvb2xlYW4odGhpcy5hcmdzKCkuYWN0aXZlKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt1c2VNb2RlbEFyZ3MgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICBhcmdzKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5wLmFyZ3NBcmcgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5wLmFyZ3NBcmcoe21vZGVsQ2xhc3M6IHRoaXMubW9kZWxDbGFzcygpfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wLmFyZ3NBcmcgfHwge31cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0fSAqL1xuICBtb2RlbENsYXNzKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5wLm1vZGVsQ2xhc3NBcmcgPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHRoaXMucC5tb2RlbENsYXNzQXJnLmNhbGxiYWNrKHtxdWVyeVBhcmFtczogdGhpcy5xdWVyeVBhcmFtc30pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucC5tb2RlbENsYXNzQXJnXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgcGFyYW1zVmFyaWFibGVOYW1lKCkge1xuICAgIHJldHVybiBgJHt0aGlzLm1vZGVsQ2xhc3MoKS5tb2RlbE5hbWUoKVxuICAgICAgLnBhcmFtS2V5KCl9X2lkYFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIG1vZGVsSWQoKSB7XG4gICAgaWYgKHRoaXMuYXJncygpLmxvYWRCeVF1ZXJ5UGFyYW0pIHtcbiAgICAgIHJldHVybiB0aGlzLmFyZ3MoKS5sb2FkQnlRdWVyeVBhcmFtKHtxdWVyeVBhcmFtczogdGhpcy5xdWVyeVBhcmFtc30pXG4gICAgfSBlbHNlIGlmICh0aGlzLmFyZ3MoKS5xdWVyeSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH0gZWxzZSBpZiAoIXRoaXMuYXJncygpLm1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCb3RoICdsb2FkQnlRdWVyeVBhcmFtJyBhbmQgJ21hdGNoJyB3YXNuJ3QgZ2l2ZW5cIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hcmdzKCkubWF0Y2gucGFyYW1zW3RoaXMucGFyYW1zVmFyaWFibGVOYW1lKCldIHx8IHRoaXMuYXJncygpLm1hdGNoLnBhcmFtcy5pZFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIG1vZGVsVmFyaWFibGVOYW1lKCkge1xuICAgIHJldHVybiBpbmZsZWN0aW9uLmNhbWVsaXplKHRoaXMubW9kZWxDbGFzcygpLm1vZGVsQ2xhc3NEYXRhKCkubmFtZSwgdHJ1ZSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7YW55W119ICovXG4gIGNhY2hlQXJncygpIHtcbiAgICByZXR1cm4gW3RoaXMubW9kZWxJZCgpXS5jb25jYXQodGhpcy5hcmdzKCkuY2FjaGVBcmdzIHx8IFtdLCB0aGlzLnF1ZXJ5UGFyYW1zKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBzaG91bGRXYWl0Rm9yVXBkYXRlZENvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5hcmdzKCkuZXZlbnRVcGRhdGVkICYmIHRoaXMubW9kZWxJZCgpICYmICF0aGlzLnMubW9kZWwpXG4gIH1cblxuICAvKiogQHJldHVybnMge29iamVjdH0gKi9cbiAgbmV3TW9kZWxEYXRhRnJvbVBhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVBhcmFtcz8uW3RoaXMubW9kZWxDbGFzcygpLm1vZGVsTmFtZSgpXG4gICAgICAucGFyYW1LZXkoKV0gfHwge31cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaGFzQXN5bmNEZWZhdWx0cygpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLm5ld0lmTm9JZERlZmF1bHRzUmVzdWx0ICYmIHR5cGVvZiB0aGlzLm5ld0lmTm9JZERlZmF1bHRzUmVzdWx0LnRoZW4gPT0gXCJmdW5jdGlvblwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtvYmplY3QgfCBudWxsfSAqL1xuICBzeW5jRGVmYXVsdHNGb3JOZXdNb2RlbCgpIHtcbiAgICBpZiAoIXRoaXMuYXJncygpLm5ld0lmTm9JZD8uZGVmYXVsdHMpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH0gZWxzZSBpZiAodGhpcy5oYXNBc3luY0RlZmF1bHRzKCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmV3SWZOb0lkRGVmYXVsdHNSZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRzUmVzdWx0ID0gdGhpcy5hcmdzKCkubmV3SWZOb0lkLmRlZmF1bHRzKClcblxuICAgICAgaWYgKGRlZmF1bHRzUmVzdWx0ICYmIHR5cGVvZiBkZWZhdWx0c1Jlc3VsdC50aGVuID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aGlzLm5ld0lmTm9JZERlZmF1bHRzUmVzdWx0ID0gZGVmYXVsdHNSZXN1bHQuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICB0aGlzLm5ld0lmTm9JZERlZmF1bHRzUmVzdWx0ID0gZGVmYXVsdHNSZXN1bHRcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5uZXdJZk5vSWREZWZhdWx0c1Jlc3VsdCB8fCB7fVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gKi9cbiAgc3luY05ld01vZGVsKCkge1xuICAgIGlmICghdGhpcy5hY3RpdmUoKSB8fCAhdGhpcy5hcmdzKCkubmV3SWZOb0lkIHx8IHRoaXMubW9kZWxJZCgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLnN5bmNEZWZhdWx0c0Zvck5ld01vZGVsKClcblxuICAgIGlmIChkZWZhdWx0cyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHJldHVybiBuZXcgKHRoaXMubW9kZWxDbGFzcygpKSh7XG4gICAgICBpc05ld1JlY29yZDogdHJ1ZSxcbiAgICAgIGRhdGE6IHthOiBPYmplY3QuYXNzaWduKGRlZmF1bHRzLCB0aGlzLmFyZ3MoKS5uZXdBdHRyaWJ1dGVzLCB0aGlzLm5ld01vZGVsRGF0YUZyb21QYXJhbXMoKSl9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9ICovXG4gIHN1YnNjcmlwdGlvbk1vZGVsKCkge1xuICAgIGlmICghdGhpcy5hcmdzKCkuZXZlbnRVcGRhdGVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIGlmICh0aGlzLnMubW9kZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnMubW9kZWxcbiAgICB9IGVsc2UgaWYgKCF0aGlzLm1vZGVsSWQoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHJldHVybiBuZXcgKHRoaXMubW9kZWxDbGFzcygpKSh7XG4gICAgICBkYXRhOiB7YToge1t0aGlzLm1vZGVsQ2xhc3MoKS5wcmltYXJ5S2V5KCldOiB0aGlzLm1vZGVsSWQoKX19XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge251bWJlcn0gbG9hZE1vZGVsR2VuZXJhdGlvbiAqL1xuICBsb2FkRXhpc3RpbmdNb2RlbCA9IGFzeW5jIChsb2FkTW9kZWxHZW5lcmF0aW9uKSA9PiB7XG4gICAgbGV0IHF1ZXJ5XG5cbiAgICBpZiAodGhpcy5tb2RlbElkKCkpIHtcbiAgICAgIHF1ZXJ5ID0gdGhpcy5tb2RlbENsYXNzKCkucmFuc2Fjayh7aWRfZXE6IHRoaXMubW9kZWxJZCgpfSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXJncygpLnF1ZXJ5KSB7XG4gICAgICBxdWVyeSA9IHRoaXMuYXJncygpLnF1ZXJ5LmNsb25lKClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWF0Y2hQYXJhbXMgPSB0aGlzLmFyZ3MoKS5tYXRjaD8ucGFyYW1zIHx8IHt9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gbW9kZWwgSUQgd2FzIGdpdmVuOiAke3RoaXMubW9kZWxJZCgpfSBieSAnJHt0aGlzLnBhcmFtc1ZhcmlhYmxlTmFtZSgpfScgaW4gcXVlcnkgcGFyYW1zOiAke09iamVjdC5rZXlzKG1hdGNoUGFyYW1zKS5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hcmdzKCkuYWJpbGl0aWVzKSBxdWVyeS5hYmlsaXRpZXModGhpcy5hcmdzKCkuYWJpbGl0aWVzKVxuICAgIGlmICh0aGlzLmFyZ3MoKS5wcmVsb2FkKSBxdWVyeS5wcmVsb2FkKHRoaXMuYXJncygpLnByZWxvYWQpXG4gICAgaWYgKHRoaXMuYXJncygpLnNlbGVjdCkgcXVlcnkuc2VsZWN0KHRoaXMuYXJncygpLnNlbGVjdClcblxuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgcXVlcnkuZmlyc3QoKVxuXG4gICAgaWYgKGxvYWRNb2RlbEdlbmVyYXRpb24gIT0gdGhpcy5sb2FkTW9kZWxHZW5lcmF0aW9uKSByZXR1cm5cblxuICAgIGlmIChcbiAgICAgIHRoaXMucy5tb2RlbCAmJlxuICAgICAgbW9kZWwgJiZcbiAgICAgICF0aGlzLnMubm90Rm91bmQgJiZcbiAgICAgIHRoaXMucy5tb2RlbC5mdWxsQ2FjaGVLZXkoKSA9PSBtb2RlbC5mdWxsQ2FjaGVLZXkoKVxuICAgICkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIGlmICghdGhpcy5zLm1vZGVsICYmICFtb2RlbCAmJiB0aGlzLnMubm90Rm91bmQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe21vZGVsLCBub3RGb3VuZDogIW1vZGVsfSlcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge251bWJlcn0gbG9hZE1vZGVsR2VuZXJhdGlvbiAqL1xuICBsb2FkTmV3TW9kZWwgPSBhc3luYyAobG9hZE1vZGVsR2VuZXJhdGlvbikgPT4ge1xuICAgIGxldCBkZWZhdWx0cyA9IHt9XG5cbiAgICBpZiAodGhpcy5hcmdzKCkubmV3SWZOb0lkPy5kZWZhdWx0cykge1xuICAgICAgbGV0IGRlZmF1bHRzUmVzdWx0ID0gdGhpcy5uZXdJZk5vSWREZWZhdWx0c1Jlc3VsdFxuXG4gICAgICBpZiAoZGVmYXVsdHNSZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgZGVmYXVsdHNSZXN1bHQgPSB0aGlzLmFyZ3MoKS5uZXdJZk5vSWQuZGVmYXVsdHMoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLm5ld0lmTm9JZERlZmF1bHRzUmVzdWx0ID0gbnVsbFxuICAgICAgZGVmYXVsdHMgPSBhd2FpdCBkZWZhdWx0c1Jlc3VsdFxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsID0gbmV3ICh0aGlzLm1vZGVsQ2xhc3MoKSkoe1xuICAgICAgaXNOZXdSZWNvcmQ6IHRydWUsXG4gICAgICBkYXRhOiB7YTogT2JqZWN0LmFzc2lnbihkZWZhdWx0cywgdGhpcy5hcmdzKCkubmV3QXR0cmlidXRlcywgdGhpcy5uZXdNb2RlbERhdGFGcm9tUGFyYW1zKCkpfVxuICAgIH0pXG5cbiAgICBpZiAobG9hZE1vZGVsR2VuZXJhdGlvbiAhPSB0aGlzLmxvYWRNb2RlbEdlbmVyYXRpb24pIHJldHVyblxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7bW9kZWwsIG5vdEZvdW5kOiBmYWxzZX0pXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGxvYWRNb2RlbCA9IGFzeW5jICgpID0+IHtcbiAgICAvLyBPbmx5IHRoZSBuZXdlc3QgbW9kZWwgcmVxdWVzdCBtYXkgdXBkYXRlIHN0YXRlIGFmdGVyIHJvdXRlIG9yIGF1dGggY2hhbmdlcy5cbiAgICBjb25zdCBsb2FkTW9kZWxHZW5lcmF0aW9uID0gdGhpcy5sb2FkTW9kZWxHZW5lcmF0aW9uICsgMVxuXG4gICAgdGhpcy5pbml0aWFsTG9hZFRyaWdnZXJlZCA9IHRydWVcbiAgICB0aGlzLmxvYWRNb2RlbEdlbmVyYXRpb24gPSBsb2FkTW9kZWxHZW5lcmF0aW9uXG4gICAgaWYgKHRoaXMuYWN0aXZlKCkgJiYgdGhpcy5hcmdzKCkubmV3SWZOb0lkICYmICF0aGlzLm1vZGVsSWQoKSkge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTmV3TW9kZWwobG9hZE1vZGVsR2VuZXJhdGlvbilcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlKCkgJiYgKCF0aGlzLmFyZ3MoKS5vcHRpb25hbCB8fCB0aGlzLm1vZGVsSWQoKSB8fCB0aGlzLmFyZ3MoKS5xdWVyeSkpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZEV4aXN0aW5nTW9kZWwobG9hZE1vZGVsR2VuZXJhdGlvbilcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIGNsZWFyVXBkYXRlZENvbm5lY3Rpb25GYWxsYmFja1RpbWVvdXQoKSB7XG4gICAgaWYgKHRoaXMudXBkYXRlZENvbm5lY3Rpb25GYWxsYmFja1RpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudXBkYXRlZENvbm5lY3Rpb25GYWxsYmFja1RpbWVvdXRJZClcbiAgICAgIHRoaXMudXBkYXRlZENvbm5lY3Rpb25GYWxsYmFja1RpbWVvdXRJZCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgZW5zdXJlSW5pdGlhbExvYWRGYWxsYmFjaygpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEZvclVwZGF0ZWRDb25uZWN0aW9uKCkgfHwgdGhpcy5pbml0aWFsTG9hZFRyaWdnZXJlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5jbGVhclVwZGF0ZWRDb25uZWN0aW9uRmFsbGJhY2tUaW1lb3V0KClcbiAgICB0aGlzLnVwZGF0ZWRDb25uZWN0aW9uRmFsbGJhY2tUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy51cGRhdGVkQ29ubmVjdGlvblJlYWR5ICYmICF0aGlzLmluaXRpYWxMb2FkVHJpZ2dlcmVkKSB7XG4gICAgICAgIHRoaXMubG9hZE1vZGVsKClcbiAgICAgIH1cbiAgICB9LCAxMDAwKVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7e21vZGVsOiBpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdH19IGFyZ3MgKi9cbiAgb25EZXN0cm95ZWQgPSAoYXJncykgPT4ge1xuICAgIGNvbnN0IGZvcndhcmRBcmdzID0ge21vZGVsOiBhcmdzLm1vZGVsfVxuXG4gICAgZm9yd2FyZEFyZ3NbdGhpcy5tb2RlbFZhcmlhYmxlTmFtZSgpXSA9IGFyZ3MubW9kZWxcblxuICAgIHRoaXMuYXJncygpLm9uRGVzdHJveWVkKGZvcndhcmRBcmdzKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBvblNpZ25lZEluID0gKCkgPT4ge1xuICAgIHRoaXMubG9hZE1vZGVsKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgb25TaWduZWRPdXQgPSAoKSA9PiB7XG4gICAgdGhpcy5sb2FkTW9kZWwoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBvblVwZGF0ZWRFdmVudENvbm5lY3RlZCA9ICgpID0+IHtcbiAgICB0aGlzLnVwZGF0ZWRDb25uZWN0aW9uUmVhZHkgPSB0cnVlXG4gICAgdGhpcy5jbGVhclVwZGF0ZWRDb25uZWN0aW9uRmFsbGJhY2tUaW1lb3V0KClcblxuICAgIGlmICh0aGlzLnNob3VsZFdhaXRGb3JVcGRhdGVkQ29ubmVjdGlvbigpICYmICF0aGlzLmluaXRpYWxMb2FkVHJpZ2dlcmVkKSB7XG4gICAgICB0aGlzLmxvYWRNb2RlbCgpXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gKi9cbiAgdmlzaWJsZU1vZGVsKCkge1xuICAgIGxldCBtb2RlbCA9IHRoaXMucy5tb2RlbFxuXG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgbW9kZWwgPSB0aGlzLnN5bmNOZXdNb2RlbCgpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmFjdGl2ZSgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGVsSWQoKSAmJiBtb2RlbCAmJiBtb2RlbC5pZCgpICE9IHRoaXMubW9kZWxJZCgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIGlmICghdGhpcy5tb2RlbElkKCkgJiYgIXRoaXMuYXJncygpLnF1ZXJ5ICYmICF0aGlzLmFyZ3MoKS5uZXdJZk5vSWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kZWxcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gKi9cbiAgdmlzaWJsZU5vdEZvdW5kKCkge1xuICAgIGlmICghdGhpcy5hY3RpdmUoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlbElkKCkgJiYgdGhpcy52aXNpYmxlTW9kZWwoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIGlmICghdGhpcy5tb2RlbElkKCkgJiYgIXRoaXMuYXJncygpLnF1ZXJ5ICYmICF0aGlzLmFyZ3MoKS5uZXdJZk5vSWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zLm5vdEZvdW5kXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIHNldHVwKCkge1xuICAgIHRoaXMudXNlU3RhdGVzKHtcbiAgICAgIG1vZGVsOiB1bmRlZmluZWQsXG4gICAgICBub3RGb3VuZDogdW5kZWZpbmVkXG4gICAgfSlcbiAgICB0aGlzLnNldEluc3RhbmNlKHtxdWVyeVBhcmFtczogdXNlUXVlcnlQYXJhbXMoKX0pXG5cbiAgICB1c2VFZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnMubW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHN5bmNOZXdNb2RlbCA9IHRoaXMuc3luY05ld01vZGVsKClcblxuICAgICAgICAgIGlmIChzeW5jTmV3TW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe21vZGVsOiBzeW5jTmV3TW9kZWwsIG5vdEZvdW5kOiBmYWxzZX0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkV2FpdEZvclVwZGF0ZWRDb25uZWN0aW9uKCkpIHtcbiAgICAgICAgICB0aGlzLmVuc3VyZUluaXRpYWxMb2FkRmFsbGJhY2soKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9hZE1vZGVsKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRoaXMuY2FjaGVBcmdzKClcbiAgICApXG5cbiAgICAvLyBJbnZhbGlkYXRlIGluLWZsaWdodCBhc3luYyByZXNwb25zZXMgc28gc3RhbGUgbG9hZHMgY2Fubm90IHdyaXRlIGFmdGVyIHVubW91bnQuXG4gICAgdXNlRWZmZWN0KCgpID0+ICgpID0+IHtcbiAgICAgIHRoaXMuY2xlYXJVcGRhdGVkQ29ubmVjdGlvbkZhbGxiYWNrVGltZW91dCgpXG4gICAgICB0aGlzLmxvYWRNb2RlbEdlbmVyYXRpb24gKz0gMVxuICAgIH0sIFtdKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5hcmdzKCkuZXZlbnRzKSByZXR1cm5cblxuICAgICAgdGhpcy5hcmdzKCkuZXZlbnRzLmFkZExpc3RlbmVyKFwicmVsb2FkTW9kZWxcIiwgdGhpcy5sb2FkTW9kZWwpXG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHRoaXMuYXJncygpLmV2ZW50cy5yZW1vdmVMaXN0ZW5lcihcInJlbG9hZE1vZGVsXCIsIHRoaXMubG9hZE1vZGVsKVxuICAgICAgfVxuICAgIH0sIFt0aGlzLmFyZ3MoKS5ldmVudHNdKVxuXG4gICAgdXNlVXBkYXRlZEV2ZW50KHRoaXMuc3Vic2NyaXB0aW9uTW9kZWwoKSwgdGhpcy5sb2FkTW9kZWwsIHtcbiAgICAgIG9uQ29ubmVjdGVkOiB0aGlzLm9uVXBkYXRlZEV2ZW50Q29ubmVjdGVkXG4gICAgfSlcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBEZXZpc2UuZXZlbnRzKCkuYWRkTGlzdGVuZXIoXCJvbkRldmlzZVNpZ25JblwiLCB0aGlzLm9uU2lnbmVkSW4pXG4gICAgICBEZXZpc2UuZXZlbnRzKCkuYWRkTGlzdGVuZXIoXCJvbkRldmlzZVNpZ25PdXRcIiwgdGhpcy5vblNpZ25lZE91dClcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgRGV2aXNlLmV2ZW50cygpLnJlbW92ZUxpc3RlbmVyKFwib25EZXZpc2VTaWduSW5cIiwgdGhpcy5vblNpZ25lZEluKVxuICAgICAgICBEZXZpc2UuZXZlbnRzKCkucmVtb3ZlTGlzdGVuZXIoXCJvbkRldmlzZVNpZ25PdXRcIiwgdGhpcy5vblNpZ25lZE91dClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5zLm1vZGVsIHx8ICF0aGlzLmFyZ3MoKS5vbkRlc3Ryb3llZCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGNvbm5lY3REZXN0cm95ZWQgPSBNb2RlbEV2ZW50cy5jb25uZWN0RGVzdHJveWVkKHRoaXMucy5tb2RlbCwgdGhpcy5vbkRlc3Ryb3llZClcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29ubmVjdERlc3Ryb3llZC51bnN1YnNjcmliZSgpXG4gICAgICB9XG4gICAgfSwgW3RoaXMuYXJncygpLm9uRGVzdHJveWVkLCB0aGlzLnMubW9kZWwgPyB0aGlzLnMubW9kZWwuaWQoKSA6IHVuZGVmaW5lZF0pXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufG9iamVjdH0gbW9kZWxDbGFzc0FyZ1xuICogQHBhcmFtIHtvYmplY3QgfCAoKGFyZ3M6IHttb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9KSA9PiB1c2VNb2RlbEFyZ3MpfSBbYXJnc0FyZ11cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICovXG4vKiogdXNlTW9kZWwuICovXG5jb25zdCB1c2VNb2RlbCA9IChtb2RlbENsYXNzQXJnLCBhcmdzQXJnID0ge30pID0+IHtcbiAgY29uc3Qgc2hhcGVIb29rID0gdXNlU2hhcGVIb29rKFVzZU1vZGVsU2hhcGVIb29rLCB7YXJnc0FyZywgbW9kZWxDbGFzc0FyZ30pXG4gIGNvbnN0IG1vZGVsID0gc2hhcGVIb29rLnZpc2libGVNb2RlbCgpXG4gIGNvbnN0IG1vZGVsSWQgPSBzaGFwZUhvb2subW9kZWxJZCgpXG4gIGNvbnN0IG5vdEZvdW5kID0gc2hhcGVIb29rLnZpc2libGVOb3RGb3VuZCgpXG4gIGNvbnN0IG1vZGVsVmFyaWFibGVOYW1lID0gc2hhcGVIb29rLm1vZGVsVmFyaWFibGVOYW1lKClcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIG1vZGVsLFxuICAgIG1vZGVsSWQsXG4gICAgbm90Rm91bmRcbiAgfVxuXG4gIHJlc3VsdFttb2RlbFZhcmlhYmxlTmFtZV0gPSBtb2RlbFxuICByZXN1bHRbYCR7bW9kZWxWYXJpYWJsZU5hbWV9SWRgXSA9IG1vZGVsSWRcbiAgcmVzdWx0W2Ake21vZGVsVmFyaWFibGVOYW1lfU5vdEZvdW5kYF0gPSBub3RGb3VuZFxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlTW9kZWxcbiJdfQ==