single-scripture-rcl 3.3.2 → 3.3.3-beta.100

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,16 +1,33 @@
1
1
  import "core-js/modules/es.array.concat.js";
2
+ import "core-js/modules/es.array.every.js";
2
3
  import "core-js/modules/es.array.find-index.js";
4
+ import "core-js/modules/es.array.for-each.js";
3
5
  import "core-js/modules/es.array.includes.js";
4
6
  import "core-js/modules/es.array.is-array.js";
7
+ import "core-js/modules/es.array.iterator.js";
5
8
  import "core-js/modules/es.array.join.js";
6
9
  import "core-js/modules/es.array.map.js";
10
+ import "core-js/modules/es.map.js";
7
11
  import "core-js/modules/es.object.keys.js";
12
+ import "core-js/modules/es.object.to-string.js";
13
+ import "core-js/modules/es.object.values.js";
8
14
  import "core-js/modules/es.parse-int.js";
9
15
  import "core-js/modules/es.regexp.exec.js";
10
16
  import "core-js/modules/es.string.includes.js";
17
+ import "core-js/modules/es.string.iterator.js";
11
18
  import "core-js/modules/es.string.split.js";
19
+ import "core-js/modules/web.dom-collections.for-each.js";
20
+ import "core-js/modules/web.dom-collections.iterator.js";
12
21
  import "regenerator-runtime/runtime.js";
13
22
 
23
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
24
+
25
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
26
+
27
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
28
+
29
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
30
+
14
31
  function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
15
32
 
16
33
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
@@ -39,84 +56,161 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
39
56
 
40
57
  import * as React from 'react';
41
58
  import * as PropTypes from 'prop-types';
42
- import { core } from 'scripture-resources-rcl';
59
+ import { core, SelectionsContextProvider } from 'scripture-resources-rcl';
43
60
  import usfmjs from 'usfm-js';
44
61
  import { useEdit } from 'gitea-react-toolkit';
45
- import { Card, useCardState, useUserBranch, ERROR_STATE, MANIFEST_NOT_LOADED_ERROR } from 'translation-helps-rcl';
62
+ import { IconButton } from '@mui/material';
63
+ import { RxLink2, RxLinkBreak2 } from 'react-icons/rx';
64
+ import { Card, ERROR_STATE, MANIFEST_NOT_LOADED_ERROR, useCardState, useUserBranch } from 'translation-helps-rcl'; // @ts-ignore
65
+
66
+ import { getQuoteMatchesInBookRef } from 'uw-quote-helpers';
46
67
  import { AlignmentHelpers, UsfmFileConversionHelpers } from 'word-aligner-rcl';
47
68
  import * as isEqual from 'deep-equal';
69
+ import { getVerses } from 'bible-reference-range';
48
70
  import { ScripturePane, ScriptureSelector } from '..';
49
71
  import { useScriptureSettings } from '../../hooks/useScriptureSettings';
50
- import { getResourceLink, getResourceMessage, getScriptureVersionSettings, isOriginalBible } from '../../utils/ScriptureSettings';
72
+ import { cleanupVerseObjects, fixOccurrence, getResourceLink, getResourceMessage, getScriptureVersionSettings, isOriginalBible } from '../../utils/ScriptureSettings';
73
+ import { delay } from '../../utils/delay';
74
+ import { areMapsTheSame } from '../../utils/maps';
51
75
  import { Title } from '../ScripturePane/styled';
52
76
  import { NT_ORIG_LANG, ORIGINAL_SOURCE, OT_ORIG_LANG } from '../../utils';
77
+ import { VerseSelectorPopup } from '../VerseSelectorPopup';
53
78
  var KEY_FONT_SIZE_BASE = 'scripturePaneFontSize_';
54
79
  var label = 'Version';
55
80
  var style = {
56
81
  marginTop: '16px',
57
82
  width: '500px'
58
83
  };
59
- export default function ScriptureCard(_ref) {
60
- var _scriptureConfig$reso, _scriptureConfig$reso2, _scriptureConfig$reso3, _scriptureConfig$reso4, _scriptureConfig$reso6, _scriptureConfig$reso7, _scriptureConfig$reso8, _httpConfig, _httpConfig2;
61
-
62
- var id = _ref.id,
63
- isNT = _ref.isNT,
64
- title = _ref.title,
65
- server = _ref.server,
66
- appRef = _ref.appRef,
67
- cardNum = _ref.cardNum,
68
- classes = _ref.classes,
69
- _ref$resource = _ref.resource,
70
- owner = _ref$resource.owner,
71
- languageId = _ref$resource.languageId,
72
- resourceId = _ref$resource.resourceId,
73
- originalLanguageOwner = _ref$resource.originalLanguageOwner,
74
- getLanguage = _ref.getLanguage,
75
- _ref$reference = _ref.reference,
76
- verse = _ref$reference.verse,
77
- chapter = _ref$reference.chapter,
78
- bookId = _ref$reference.projectId,
79
- resourceLink = _ref.resourceLink,
80
- useUserLocalStorage = _ref.useUserLocalStorage,
81
- disableWordPopover = _ref.disableWordPopover,
82
- onResourceError = _ref.onResourceError,
83
- httpConfig = _ref.httpConfig,
84
- greekRepoUrl = _ref.greekRepoUrl,
85
- hebrewRepoUrl = _ref.hebrewRepoUrl,
86
- getLexiconData = _ref.getLexiconData,
87
- fetchGlossesForVerse = _ref.fetchGlossesForVerse,
88
- translate = _ref.translate,
89
- onMinimize = _ref.onMinimize,
90
- loggedInUser = _ref.loggedInUser,
91
- authentication = _ref.authentication,
92
- setSavedChanges = _ref.setSavedChanges,
93
- bookIndex = _ref.bookIndex,
94
- addVerseRange = _ref.addVerseRange,
95
- setWordAlignerStatus = _ref.setWordAlignerStatus;
84
+ /**
85
+ * create a short comparison verse ref object without all the verseData
86
+ * @param verseRef
87
+ */
88
+
89
+ function compareObject(verseRef) {
90
+ var _verseData$verseObjec;
91
+
92
+ var _ref = verseRef || {},
93
+ chapter = _ref.chapter,
94
+ verse = _ref.verse,
95
+ verseData = _ref.verseData;
96
+
97
+ var verseObjects = (verseData === null || verseData === void 0 ? void 0 : (_verseData$verseObjec = verseData.verseObjects) === null || _verseData$verseObjec === void 0 ? void 0 : _verseData$verseObjec.length) || 0;
98
+ return {
99
+ chapter: chapter,
100
+ verse: verse,
101
+ verseObjects: verseObjects
102
+ };
103
+ }
104
+ /**
105
+ * compare two verse refs to see if they are substantially similar
106
+ * @param versesForRef1
107
+ * @param versesForRef2
108
+ */
109
+
110
+
111
+ function areVersesSame(versesForRef1, versesForRef2) {
112
+ versesForRef1 = versesForRef1 || [];
113
+ versesForRef2 = versesForRef2 || [];
114
+ var areSame = false;
115
+
116
+ if (versesForRef1.length === versesForRef2.length) {
117
+ areSame = true;
118
+
119
+ for (var i = 0, l = versesForRef1.length; i < l; i++) {
120
+ var verse1 = compareObject(versesForRef1[i]);
121
+ var verse2 = compareObject(versesForRef2[i]);
122
+ areSame = isEqual(verse1, verse2);
123
+
124
+ if (!areSame) {
125
+ break;
126
+ }
127
+ }
128
+ }
129
+
130
+ return areSame;
131
+ }
132
+
133
+ export default function ScriptureCard(_ref2) {
134
+ var _scriptureConfig$reso, _scriptureConfig$reso2, _scriptureConfig$reso3, _scriptureConfig$reso4, _scriptureConfig$reso6, _scriptureConfig$reso7, _scriptureConfig$reso8, _httpConfig, _httpConfig2, _versesForRef3, _versesForRef4;
135
+
136
+ var appRef = _ref2.appRef,
137
+ authentication = _ref2.authentication,
138
+ bookIndex = _ref2.bookIndex,
139
+ cardNum = _ref2.cardNum,
140
+ classes = _ref2.classes,
141
+ disableWordPopover = _ref2.disableWordPopover,
142
+ getLanguage = _ref2.getLanguage,
143
+ getLexiconData = _ref2.getLexiconData,
144
+ greekRepoUrl = _ref2.greekRepoUrl,
145
+ hebrewRepoUrl = _ref2.hebrewRepoUrl,
146
+ httpConfig = _ref2.httpConfig,
147
+ id = _ref2.id,
148
+ isNT = _ref2.isNT,
149
+ loggedInUser = _ref2.loggedInUser,
150
+ onMinimize = _ref2.onMinimize,
151
+ onResourceError = _ref2.onResourceError,
152
+ originalScriptureBookObjects = _ref2.originalScriptureBookObjects,
153
+ reference = _ref2.reference,
154
+ _ref2$resource = _ref2.resource,
155
+ owner = _ref2$resource.owner,
156
+ languageId = _ref2$resource.languageId,
157
+ resourceId = _ref2$resource.resourceId,
158
+ originalLanguageOwner = _ref2$resource.originalLanguageOwner,
159
+ resourceLink = _ref2.resourceLink,
160
+ selectedQuote = _ref2.selectedQuote,
161
+ server = _ref2.server,
162
+ setSavedChanges = _ref2.setSavedChanges,
163
+ setWordAlignerStatus = _ref2.setWordAlignerStatus,
164
+ translate = _ref2.translate,
165
+ title = _ref2.title,
166
+ useUserLocalStorage = _ref2.useUserLocalStorage;
167
+ var bookId = reference === null || reference === void 0 ? void 0 : reference.projectId;
96
168
 
97
169
  var _React$useState = React.useState({
170
+ checkForEditBranch: 0,
171
+ currentReference: null,
172
+ editBranchReady: false,
98
173
  haveUnsavedChanges: false,
174
+ lastSelectedQuote: null,
175
+ readyForFetch: false,
99
176
  ref: appRef,
177
+ saveClicked: false,
100
178
  saveContent: null,
179
+ selections: new Map(),
101
180
  sha: null,
102
181
  startSave: false,
103
182
  urlError: null,
104
183
  usingUserBranch: false,
105
184
  unsavedChangesList: {},
106
- versesForRef: null
185
+ versesForRef: null,
186
+ showAlignmentPopup: false,
187
+ verseSelectedForAlignment: null,
188
+ versesAlignmentStatus: null,
189
+ verseObjectsMap: new Map()
107
190
  }),
108
191
  _React$useState2 = _slicedToArray(_React$useState, 2),
109
192
  state = _React$useState2[0],
110
193
  setState_ = _React$useState2[1];
111
194
 
112
- var ref = state.ref,
195
+ var checkForEditBranch = state.checkForEditBranch,
196
+ currentReference = state.currentReference,
197
+ editBranchReady = state.editBranchReady,
198
+ haveUnsavedChanges = state.haveUnsavedChanges,
199
+ lastSelectedQuote = state.lastSelectedQuote,
200
+ readyForFetch = state.readyForFetch,
201
+ ref = state.ref,
202
+ saveClicked = state.saveClicked,
113
203
  saveContent = state.saveContent,
204
+ selections = state.selections,
114
205
  sha = state.sha,
206
+ showAlignmentPopup = state.showAlignmentPopup,
115
207
  startSave = state.startSave,
116
208
  urlError = state.urlError,
117
209
  usingUserBranch = state.usingUserBranch,
118
210
  unsavedChangesList = state.unsavedChangesList,
119
- haveUnsavedChanges = state.haveUnsavedChanges,
211
+ verseObjectsMap = state.verseObjectsMap,
212
+ verseSelectedForAlignment = state.verseSelectedForAlignment,
213
+ versesAlignmentStatus = state.versesAlignmentStatus,
120
214
  versesForRef = state.versesForRef;
121
215
 
122
216
  var _useUserLocalStorage = useUserLocalStorage(KEY_FONT_SIZE_BASE + cardNum, 100),
@@ -136,34 +230,34 @@ export default function ScriptureCard(_ref) {
136
230
  httpConfig = _objectSpread(_objectSpread({}, httpConfig), {}, {
137
231
  cache: {
138
232
  maxAge: 0
139
- }
233
+ },
234
+ noCache: true
140
235
  }); // disable http caching
141
236
  }
142
237
 
143
238
  var _useScriptureSettings = useScriptureSettings({
144
239
  isNT: isNT,
145
240
  title: title,
146
- verse: verse,
147
241
  owner: owner,
148
- bookId: bookId,
242
+ reference: currentReference || reference,
149
243
  appRef: ref,
150
244
  server: server,
151
245
  cardNum: cardNum,
152
- chapter: chapter,
246
+ disableWordPopover: disableWordPopover,
247
+ greekRepoUrl: greekRepoUrl,
248
+ hebrewRepoUrl: hebrewRepoUrl,
249
+ httpConfig: httpConfig,
153
250
  languageId: languageId,
251
+ originalLanguageOwner: originalLanguageOwner,
252
+ readyForFetch: readyForFetch,
154
253
  resourceId: resourceId,
155
254
  resourceLink: resourceLink,
156
- useUserLocalStorage: useUserLocalStorage,
157
- disableWordPopover: disableWordPopover,
158
- originalLanguageOwner: originalLanguageOwner,
159
255
  setUrlError: function setUrlError(error) {
160
256
  return setState({
161
257
  urlError: error
162
258
  });
163
259
  },
164
- httpConfig: httpConfig,
165
- greekRepoUrl: greekRepoUrl,
166
- hebrewRepoUrl: hebrewRepoUrl,
260
+ useUserLocalStorage: useUserLocalStorage,
167
261
  wholeBook: true
168
262
  }),
169
263
  isNewTestament = _useScriptureSettings.isNewTestament,
@@ -177,14 +271,23 @@ export default function ScriptureCard(_ref) {
177
271
  var repo = "".concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso = scriptureConfig.resource) === null || _scriptureConfig$reso === void 0 ? void 0 : _scriptureConfig$reso.languageId, "_").concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso2 = scriptureConfig.resource) === null || _scriptureConfig$reso2 === void 0 ? void 0 : _scriptureConfig$reso2.projectId);
178
272
  var reference_ = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reference) || null;
179
273
  React.useEffect(function () {
180
- var _fetchResp_$data;
274
+ var _fetchResp_$data, _fetchResp_$data2;
181
275
 
182
276
  // get the _sha from last scripture download
183
277
  var _sha = (fetchResp_ === null || fetchResp_ === void 0 ? void 0 : (_fetchResp_$data = fetchResp_.data) === null || _fetchResp_$data === void 0 ? void 0 : _fetchResp_$data.sha) || null;
184
278
 
185
- console.log("for ".concat(JSON.stringify(reference_), " new sha is ").concat(_sha));
279
+ var url = (fetchResp_ === null || fetchResp_ === void 0 ? void 0 : (_fetchResp_$data2 = fetchResp_.data) === null || _fetchResp_$data2 === void 0 ? void 0 : _fetchResp_$data2.download_url) || null;
280
+ var validBranch = true;
281
+
282
+ if (_sha) {
283
+ // TRICKY: since this fetch may be delayed - make sure it was for the current branch before using the sha
284
+ var parts = (url || '').split('/');
285
+ var fetchBranch = parts.length > 7 ? parts[7] : '';
286
+ validBranch = fetchBranch === ref;
287
+ }
186
288
 
187
- if (_sha !== sha) {
289
+ if (validBranch && _sha !== sha) {
290
+ console.log("ScriptureCard: for ".concat(url, " ").concat(JSON.stringify(reference_), " new sha is ").concat(_sha));
188
291
  setState({
189
292
  sha: _sha
190
293
  });
@@ -194,45 +297,83 @@ export default function ScriptureCard(_ref) {
194
297
  var cardResourceId = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso3 = scriptureConfig.resource) === null || _scriptureConfig$reso3 === void 0 ? void 0 : _scriptureConfig$reso3.projectId) || resourceId; // @ts-ignore
195
298
 
196
299
  var ref_ = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso4 = scriptureConfig.resource) === null || _scriptureConfig$reso4 === void 0 ? void 0 : _scriptureConfig$reso4.ref) || appRef;
197
- var canUseEditBranch = loggedInUser && authentication && resourceId !== ORIGINAL_SOURCE && (ref_ === 'master' || ref_.substring(0, loggedInUser.length) === loggedInUser); // not tag
300
+ var canUseEditBranch = !!(loggedInUser && authentication && resourceId !== ORIGINAL_SOURCE && ( // TRICKY if not original language and we have login data, then we can use the edit branch
301
+ ref_ === 'master' || ref_.includes(loggedInUser))); // also make sure not a version tag
198
302
 
199
303
  var _useUserBranch = useUserBranch({
200
- owner: owner,
201
- server: server,
202
304
  appRef: appRef,
203
- languageId: languageId,
204
- cardId: id,
205
- loggedInUser: canUseEditBranch ? loggedInUser : null,
206
305
  authentication: canUseEditBranch ? authentication : null,
306
+ bookId: bookId,
307
+ cardId: id,
207
308
  cardResourceId: cardResourceId,
309
+ checkForEditBranch: checkForEditBranch,
310
+ languageId: languageId,
311
+ loggedInUser: canUseEditBranch ? loggedInUser : null,
312
+ owner: owner,
208
313
  onResourceError: onResourceError,
314
+ server: server,
209
315
  useUserLocalStorage: useUserLocalStorage
210
316
  }),
211
317
  _useUserBranch$state = _useUserBranch.state,
318
+ branchDetermined = _useUserBranch$state.branchDetermined,
319
+ userEditBranchName = _useUserBranch$state.userEditBranchName,
320
+ _usingUserBranch = _useUserBranch$state.usingUserBranch,
212
321
  workingResourceBranch = _useUserBranch$state.workingResourceBranch,
213
- usingUserBranch_ = _useUserBranch$state.usingUserBranch,
214
322
  startEditBranch = _useUserBranch.actions.startEdit;
215
323
 
216
324
  var workingRef = canUseEditBranch ? workingResourceBranch : appRef;
217
325
  var scriptureTitle;
326
+
327
+ if (!canUseEditBranch && !readyForFetch) {
328
+ // if bible not eligible for user branch, make sure it's ready
329
+ setState({
330
+ readyForFetch: true
331
+ });
332
+ }
333
+
218
334
  React.useEffect(function () {
219
- // select correct working ref - could be master, user branch, or release
220
- if (usingUserBranch_ !== usingUserBranch) {
335
+ console.log("ScriptureCard book changed", {
336
+ bookId: bookId,
337
+ owner: owner,
338
+ languageId: languageId,
339
+ resourceId: resourceId
340
+ });
341
+
342
+ if (canUseEditBranch) {
343
+ // if bible eligible for user branch, refresh it
221
344
  setState({
222
- usingUserBranch: usingUserBranch_
345
+ readyForFetch: false,
346
+ checkForEditBranch: checkForEditBranch + 1
223
347
  });
224
348
  }
225
- }, [usingUserBranch_, usingUserBranch]);
349
+ }, [bookId, owner, languageId, resourceId]);
226
350
  React.useEffect(function () {
227
- // select correct working ref - could be master, user branch, or release
228
- var workingRef_ = workingRef || appRef;
351
+ if (!isEqual(reference, currentReference)) {
352
+ // console.log(`ScriptureCard reference changed`, reference)
353
+ setState({
354
+ currentReference: reference
355
+ });
356
+ }
357
+ }, [reference]);
358
+ React.useEffect(function () {
359
+ // waiting for branch fetch to complete
360
+ console.log("ScriptureCard branchDetermined is ".concat(branchDetermined, " and workingRef is ").concat(workingRef, " and readyForFetch is ").concat(readyForFetch));
229
361
 
230
- if (ref !== workingRef_) {
362
+ if (!readyForFetch && branchDetermined) {
231
363
  setState({
232
- ref: workingRef_
364
+ readyForFetch: true,
365
+ ref: workingRef
233
366
  });
234
367
  }
235
- }, [workingRef, ref, appRef]);
368
+ }, [branchDetermined]);
369
+ React.useEffect(function () {
370
+ // select correct working ref - could be master, user branch, or release
371
+ if (_usingUserBranch !== usingUserBranch) {
372
+ setState({
373
+ usingUserBranch: _usingUserBranch
374
+ });
375
+ }
376
+ }, [_usingUserBranch, usingUserBranch]);
236
377
  React.useEffect(function () {
237
378
  var _scriptureConfig$reso5;
238
379
 
@@ -287,7 +428,7 @@ export default function ScriptureCard(_ref) {
287
428
  });
288
429
  var direction = (language === null || language === void 0 ? void 0 : language.direction) || 'ltr';
289
430
 
290
- var reference = _objectSpread({}, scriptureConfig.reference);
431
+ var _reference = currentReference || reference;
291
432
 
292
433
  var isHebrew = languageId_ === 'hbo';
293
434
  var fontFactor = isHebrew ? 1.4 : 1; // we automatically scale up font size for Hebrew
@@ -329,66 +470,13 @@ export default function ScriptureCard(_ref) {
329
470
  disableWordPopover_ = !usingOriginalBible;
330
471
  }
331
472
 
332
- React.useEffect(function () {
333
- // pre-cache glosses on verse change
334
- var fetchGlossDataForVerse = /*#__PURE__*/function () {
335
- var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
336
- var _verseObjects2;
337
-
338
- var verseObjects, _iterator, _step, _verseRef$verseData, verseRef, _verseObjects;
339
-
340
- return regeneratorRuntime.wrap(function _callee$(_context) {
341
- while (1) {
342
- switch (_context.prev = _context.next) {
343
- case 0:
344
- verseObjects = []; // get verse objects of all the verses
345
-
346
- _iterator = _createForOfIteratorHelper((scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef) || []);
347
-
348
- try {
349
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
350
- verseRef = _step.value;
351
- _verseObjects = verseRef === null || verseRef === void 0 ? void 0 : (_verseRef$verseData = verseRef.verseData) === null || _verseRef$verseData === void 0 ? void 0 : _verseRef$verseData.verseObjects;
352
- verseObjects = verseObjects.concat(_verseObjects);
353
- }
354
- } catch (err) {
355
- _iterator.e(err);
356
- } finally {
357
- _iterator.f();
358
- }
359
-
360
- if (!(!disableWordPopover && (_verseObjects2 = verseObjects) !== null && _verseObjects2 !== void 0 && _verseObjects2.length && fetchGlossesForVerse)) {
361
- _context.next = 6;
362
- break;
363
- }
364
-
365
- _context.next = 6;
366
- return fetchGlossesForVerse(verseObjects, languageId_);
367
-
368
- case 6:
369
- case "end":
370
- return _context.stop();
371
- }
372
- }
373
- }, _callee);
374
- }));
375
-
376
- return function fetchGlossDataForVerse() {
377
- return _ref2.apply(this, arguments);
378
- };
379
- }();
380
-
381
- if (usingOriginalBible) {
382
- fetchGlossDataForVerse();
383
- }
384
- }, [versesForRef, languageId_]);
385
473
  var enableEdit = !usingOriginalBible;
386
474
  var enableAlignment = !usingOriginalBible;
387
475
  var originalRepoUrl = isNewTestament ? greekRepoUrl : hebrewRepoUrl;
388
476
  var scriptureAlignmentEditConfig = {
389
477
  authentication: canUseEditBranch ? authentication : null,
390
478
  bookIndex: bookIndex,
391
- currentVerseRef: reference,
479
+ currentVerseRef: _reference,
392
480
  enableEdit: enableEdit,
393
481
  enableAlignment: enableAlignment,
394
482
  httpConfig: httpConfig,
@@ -413,11 +501,16 @@ export default function ScriptureCard(_ref) {
413
501
  * @param {boolean} saved
414
502
  * @param {function} getChanges - will be called whenever user clicks save button
415
503
  * @param {function} clearChanges - will be called whenever save has completed
504
+ * @param {object} state - current state of word alignment/edit
416
505
  */
417
506
 
418
- function _setSavedChanges(currentIndex, saved) {
419
- var getChanges = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
420
- var clearChanges = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
507
+ function _setSavedChanges(currentIndex, saved, _ref3) {
508
+ var _ref3$getChanges = _ref3.getChanges,
509
+ getChanges = _ref3$getChanges === void 0 ? null : _ref3$getChanges,
510
+ _ref3$clearChanges = _ref3.clearChanges,
511
+ clearChanges = _ref3$clearChanges === void 0 ? null : _ref3$clearChanges,
512
+ _ref3$state = _ref3.state,
513
+ state = _ref3$state === void 0 ? null : _ref3$state;
421
514
 
422
515
  var _unsavedChangesList = _objectSpread({}, unsavedChangesList);
423
516
 
@@ -426,12 +519,11 @@ export default function ScriptureCard(_ref) {
426
519
  delete _unsavedChangesList[currentIndex];
427
520
  }
428
521
  } else {
429
- if (!_unsavedChangesList.hasOwnProperty(currentIndex)) {
430
- _unsavedChangesList[currentIndex] = {
431
- getChanges: getChanges,
432
- clearChanges: clearChanges
433
- };
434
- }
522
+ _unsavedChangesList[currentIndex] = {
523
+ getChanges: getChanges,
524
+ clearChanges: clearChanges,
525
+ state: state
526
+ }; // update with latest
435
527
  }
436
528
 
437
529
  var _haveUnsavedChanges = !!Object.keys(_unsavedChangesList).length;
@@ -462,7 +554,7 @@ export default function ScriptureCard(_ref) {
462
554
  var index = chunks.findIndex(function (chunk, idx) {
463
555
  if (idx > 0) {
464
556
  if (chunk.substring(0, refLen) === ref_) {
465
- var nextChar = chunk[ref_];
557
+ var nextChar = chunk[refLen];
466
558
 
467
559
  if (nextChar > '9' || nextChar < '0') {
468
560
  return true;
@@ -478,6 +570,7 @@ export default function ScriptureCard(_ref) {
478
570
  function getBookName() {
479
571
  var _scriptureConfig$refe;
480
572
 
573
+ // @ts-ignore
481
574
  var bookCaps = scriptureConfig !== null && scriptureConfig !== void 0 && (_scriptureConfig$refe = scriptureConfig.reference) !== null && _scriptureConfig$refe !== void 0 && _scriptureConfig$refe.projectId ? scriptureConfig.reference.projectId.toUpperCase() : '';
482
575
  return "".concat(bookIndex, "-").concat(bookCaps, ".usfm");
483
576
  }
@@ -495,7 +588,9 @@ export default function ScriptureCard(_ref) {
495
588
  }, authentication === null || authentication === void 0 ? void 0 : authentication.config), {}, {
496
589
  token: authentication === null || authentication === void 0 ? void 0 : authentication.token,
497
590
  // @ts-ignore
498
- timeout: ((_httpConfig = httpConfig) === null || _httpConfig === void 0 ? void 0 : _httpConfig.serverTimeOut) || ((_httpConfig2 = httpConfig) === null || _httpConfig2 === void 0 ? void 0 : _httpConfig2.timeout) || 5000
591
+ timeout: ((_httpConfig = httpConfig) === null || _httpConfig === void 0 ? void 0 : _httpConfig.serverTimeOut) || ((_httpConfig2 = httpConfig) === null || _httpConfig2 === void 0 ? void 0 : _httpConfig2.timeout) || 10000,
592
+ server: server,
593
+ dontCreateBranch: true
499
594
  }),
500
595
  author: loggedInUser,
501
596
  token: authentication === null || authentication === void 0 ? void 0 : authentication.token,
@@ -503,245 +598,558 @@ export default function ScriptureCard(_ref) {
503
598
  filepath: filepath,
504
599
  repo: repo
505
600
  }),
601
+ saveError = _useEdit.error,
602
+ isSaveError = _useEdit.isError,
506
603
  onSaveEdit = _useEdit.onSaveEdit;
507
604
 
605
+ React.useEffect(function () {
606
+ // when we get a save saveError
607
+ if (saveError && isSaveError) {
608
+ console.log("save error", saveError);
609
+ onResourceError && onResourceError(null, false, null, "Error saving ".concat(languageId_, "_").concat(resourceId, " ").concat(saveError), true);
610
+ }
611
+ }, [saveError, isSaveError]);
508
612
  React.useEffect(function () {
509
613
  // when startSave goes true, save edits to user branch and then clear startSave
510
614
  var _saveEdit = /*#__PURE__*/function () {
511
- var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
512
- var branch;
513
- return regeneratorRuntime.wrap(function _callee2$(_context2) {
615
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
616
+ return regeneratorRuntime.wrap(function _callee$(_context) {
514
617
  while (1) {
515
- switch (_context2.prev = _context2.next) {
618
+ switch (_context.prev = _context.next) {
516
619
  case 0:
517
620
  // begin uploading new USFM
518
- branch = workingResourceBranch !== 'master' ? workingResourceBranch : undefined;
519
-
520
- if (branch) {
521
- _context2.next = 5;
522
- break;
523
- }
524
-
525
- _context2.next = 4;
526
- return startEditBranch();
527
-
528
- case 4:
529
- branch = _context2.sent;
530
-
531
- case 5:
532
- _context2.next = 7;
533
- return onSaveEdit(branch).then(function (success) {
621
+ console.info("saveChangesToCloud() - Using sha: ".concat(sha));
622
+ _context.next = 3;
623
+ return onSaveEdit(userEditBranchName).then(function (success) {
534
624
  // push changed to server
535
625
  if (success) {
536
626
  console.log("saveChangesToCloud() - save scripture edits success");
537
- setState({
538
- startSave: false
539
- });
540
627
  var unsavedCardIndices = Object.keys(unsavedChangesList);
541
628
 
542
629
  if (unsavedCardIndices !== null && unsavedCardIndices !== void 0 && unsavedCardIndices.length) {
543
- var _iterator2 = _createForOfIteratorHelper(unsavedCardIndices),
544
- _step2;
630
+ var _iterator = _createForOfIteratorHelper(unsavedCardIndices),
631
+ _step;
545
632
 
546
633
  try {
547
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
548
- var cardIndex = _step2.value;
634
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
635
+ var cardIndex = _step.value;
549
636
  var clearChanges = unsavedChangesList[cardIndex].clearChanges;
550
637
  clearChanges && clearChanges();
551
638
  }
552
639
  } catch (err) {
553
- _iterator2.e(err);
640
+ _iterator.e(err);
554
641
  } finally {
555
- _iterator2.f();
642
+ _iterator.f();
556
643
  }
557
644
  }
558
645
 
559
646
  console.info('saveChangesToCloud() - Reloading resource');
560
- scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reloadResource();
647
+ setState({
648
+ startSave: false,
649
+ readyForFetch: true,
650
+ ref: userEditBranchName
651
+ });
652
+ delay(500).then(function () {
653
+ scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reloadResource(sha);
654
+ });
561
655
  } else {
562
- console.error('saveChangesToCloud() - saving changed scripture failed');
656
+ console.error('saveChangesToCloud() - error creating edit branch');
563
657
  setState({
564
658
  startSave: false
565
659
  });
660
+ onResourceError && onResourceError(null, false, null, "Error creating edit branch ".concat(languageId_, "_").concat(resourceId), true);
566
661
  }
567
662
  });
568
663
 
569
- case 7:
664
+ case 3:
570
665
  case "end":
571
- return _context2.stop();
666
+ return _context.stop();
572
667
  }
573
668
  }
574
- }, _callee2);
669
+ }, _callee);
575
670
  }));
576
671
 
577
672
  return function _saveEdit() {
578
- return _ref3.apply(this, arguments);
673
+ return _ref4.apply(this, arguments);
579
674
  };
580
675
  }();
581
676
 
582
677
  if (startSave) {
583
- console.log("saveChangesToCloud - calling _saveEdit()");
584
-
585
- _saveEdit();
678
+ if (!editBranchReady) {// console.log(`saveChangesToCloud - edit branch not yet created`)
679
+ } else if (!sha) {// console.log(`saveChangesToCloud - save sha not yet ready`)
680
+ } else {
681
+ // console.log(`saveChangesToCloud - calling _saveEdit()`)
682
+ _saveEdit();
683
+ }
586
684
  }
587
- }, [startSave]);
685
+ }, [startSave, editBranchReady, sha]);
588
686
  /**
589
- * for each unsaved change, call into versePane to get latest changes for verse to save
687
+ * convert updatedVerseObjects to USFM and merge into the bibleUsfm
688
+ * @param {string} bibleUsfm - USFM of bible
689
+ * @param {object} ref - reference of verse to merge in
690
+ * @param {object[]} updatedVerseObjects - new verse in verseObject format
691
+ * @param {number} cardNum
590
692
  */
591
693
 
592
- function saveChangesToCloud() {
593
- var unsavedCardIndices = Object.keys(unsavedChangesList);
694
+ function mergeVerseObjectsIntoBibleUsfm(bibleUsfm, ref, updatedVerseObjects, cardNum) {
695
+ var newUsfm;
696
+ var chapterChunks = bibleUsfm === null || bibleUsfm === void 0 ? void 0 : bibleUsfm.split('\\c ');
697
+ var chapterIndex = findRefInArray(ref === null || ref === void 0 ? void 0 : ref.chapter, chapterChunks);
698
+
699
+ if (chapterIndex >= 0) {
700
+ var currentChapter = chapterChunks[chapterIndex];
701
+ var verseChunks = currentChapter.split('\\v ');
702
+ var verseIndex = findRefInArray(ref === null || ref === void 0 ? void 0 : ref.verse, verseChunks);
703
+
704
+ if (verseIndex >= 0) {
705
+ var newVerseUsfm = UsfmFileConversionHelpers.convertVerseDataToUSFM(updatedVerseObjects);
706
+ console.log("saveChangesToCloud(".concat(cardNum, ") - new USFM for card:} - ").concat(newVerseUsfm.substring(0, 100)));
707
+ var oldVerse = verseChunks[verseIndex];
708
+ var verseNumLen = ((ref === null || ref === void 0 ? void 0 : ref.verse) + '').length;
709
+ verseChunks[verseIndex] = oldVerse.substring(0, verseNumLen + 1) + newVerseUsfm;
710
+ var newChapter = verseChunks.join('\\v ');
711
+ chapterChunks[chapterIndex] = newChapter;
712
+ newUsfm = chapterChunks.join('\\c ');
713
+ }
714
+ }
594
715
 
595
- if (unsavedCardIndices !== null && unsavedCardIndices !== void 0 && unsavedCardIndices.length) {
596
- var originalUsfm = core.getResponseData(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse);
597
- var updatedBibleUsfm = originalUsfm;
716
+ return newUsfm;
717
+ }
598
718
 
599
- var _iterator3 = _createForOfIteratorHelper(unsavedCardIndices),
600
- _step3;
719
+ React.useEffect(function () {
720
+ // for each unsaved change, call into scripturePane to get latest changes for verse to save
721
+ function getReadyForSave() {
722
+ return _getReadyForSave.apply(this, arguments);
723
+ }
601
724
 
602
- try {
603
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
604
- var cardIndex = _step3.value;
725
+ function _getReadyForSave() {
726
+ _getReadyForSave = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
727
+ var createEditBranch, branch, unsavedCardIndices, bibleUsfm, mergeFail, _cardNum, _iterator2, _step2, _cardIndex, _unsavedChangesList$_2, _getChanges2, _state2, _newUsfm, _getChanges3, _ref6, _updatedVerseObjects, newBookJson, _iterator3, _step3, cardIndex, _cardNum2, _unsavedChangesList$_, getChanges, _state, newUsfm, _getChanges, newVerseText, _ref5, updatedVerseObjects, targetVerseObjects_, _AlignmentHelpers$upd, targetVerseObjects;
605
728
 
606
- var _cardNum = parseInt(cardIndex);
729
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
730
+ while (1) {
731
+ switch (_context2.prev = _context2.next) {
732
+ case 0:
733
+ if (!saveClicked) {
734
+ _context2.next = 46;
735
+ break;
736
+ }
737
+
738
+ createEditBranch = !_usingUserBranch;
739
+
740
+ if (!createEditBranch) {
741
+ // if already using the user branch
742
+ if (workingResourceBranch !== userEditBranchName) {
743
+ console.warn("saveChangesToCloud - state conflict - should be in user branch ".concat(userEditBranchName, ", but actually using ").concat(workingResourceBranch));
744
+ createEditBranch = true;
745
+ } else {
746
+ console.log("saveChangesToCloud - already using edit branch: ".concat(workingResourceBranch));
747
+ setState({
748
+ editBranchReady: true
749
+ });
750
+ }
751
+ }
607
752
 
608
- var getChanges = unsavedChangesList[_cardNum].getChanges;
753
+ if (!createEditBranch) {
754
+ _context2.next = 10;
755
+ break;
756
+ }
609
757
 
610
- if (getChanges) {
611
- var newUsfm = void 0;
758
+ // if not yet using the user branch, create it
759
+ console.log("saveChangesToCloud - creating edit branch");
760
+ setState({
761
+ editBranchReady: false,
762
+ readyForFetch: false,
763
+ sha: null
764
+ }); // we will need a new sha for book/branch
612
765
 
613
- var _getChanges = getChanges(),
614
- newVerseText = _getChanges.newVerseText,
615
- _ref4 = _getChanges.ref,
616
- updatedVerseObjects = _getChanges.updatedVerseObjects;
766
+ _context2.next = 8;
767
+ return startEditBranch();
617
768
 
618
- if (updatedVerseObjects && updatedBibleUsfm) {
619
- var _updatedBibleUsfm;
769
+ case 8:
770
+ branch = _context2.sent;
620
771
 
621
- // just replace verse
622
- var chapterChunks = (_updatedBibleUsfm = updatedBibleUsfm) === null || _updatedBibleUsfm === void 0 ? void 0 : _updatedBibleUsfm.split('\\c ');
623
- var chapterIndex = findRefInArray(_ref4 === null || _ref4 === void 0 ? void 0 : _ref4.chapter, chapterChunks);
772
+ if (branch) {
773
+ console.log("saveChangesToCloud - edit branch created");
774
+ setState({
775
+ editBranchReady: true,
776
+ readyForFetch: true,
777
+ ref: branch
778
+ });
779
+ } else {
780
+ console.log("saveChangesToCloud - failed to create edit branch");
781
+ }
624
782
 
625
- if (chapterIndex >= 0) {
626
- var currentChapter = chapterChunks[chapterIndex];
627
- var verseChunks = currentChapter.split('\\v ');
628
- var verseIndex = findRefInArray(_ref4 === null || _ref4 === void 0 ? void 0 : _ref4.verse, verseChunks);
783
+ case 10:
784
+ console.log("saveChangesToCloud - getting verse changes");
785
+ unsavedCardIndices = Object.keys(unsavedChangesList);
629
786
 
630
- if (verseIndex >= 0) {
631
- var newVerseUsfm = UsfmFileConversionHelpers.convertVerseDataToUSFM(updatedVerseObjects);
632
- var oldVerse = verseChunks[verseIndex];
633
- var verseNumLen = ((_ref4 === null || _ref4 === void 0 ? void 0 : _ref4.verse) + '').length;
634
- verseChunks[verseIndex] = oldVerse.substring(0, verseNumLen + 1) + newVerseUsfm;
635
- var newChapter = verseChunks.join('\\v ');
636
- chapterChunks[chapterIndex] = newChapter;
637
- newUsfm = chapterChunks.join('\\c ');
787
+ if (!(unsavedCardIndices !== null && unsavedCardIndices !== void 0 && unsavedCardIndices.length)) {
788
+ _context2.next = 46;
789
+ break;
638
790
  }
639
- }
640
- }
641
791
 
642
- if (updatedVerseObjects && !newUsfm) {
643
- var targetVerseObjects_ = null;
792
+ bibleUsfm = core.getResponseData(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse);
793
+ mergeFail = false;
794
+ _cardNum = 0;
795
+ _iterator2 = _createForOfIteratorHelper(unsavedCardIndices);
796
+ _context2.prev = 17;
644
797
 
645
- if (_ref4) {
646
- if (newVerseText) {
647
- var _AlignmentHelpers$upd = AlignmentHelpers.updateAlignmentsToTargetVerse(updatedVerseObjects, newVerseText),
648
- targetVerseObjects = _AlignmentHelpers$upd.targetVerseObjects;
798
+ _iterator2.s();
649
799
 
650
- targetVerseObjects_ = targetVerseObjects;
651
- } else {
652
- targetVerseObjects_ = updatedVerseObjects;
800
+ case 19:
801
+ if ((_step2 = _iterator2.n()).done) {
802
+ _context2.next = 35;
803
+ break;
653
804
  }
654
- }
655
805
 
656
- var newBookJson = targetVerseObjects_ && (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.updateVerse(_ref4.chapter, _ref4.verse, {
657
- verseObjects: targetVerseObjects_
658
- }));
659
- updatedBibleUsfm = usfmjs.toUSFM(newBookJson, {
660
- forcedNewLines: true
661
- });
806
+ _cardIndex = _step2.value;
807
+ _cardNum = parseInt(_cardIndex);
808
+ _unsavedChangesList$_2 = unsavedChangesList[_cardNum], _getChanges2 = _unsavedChangesList$_2.getChanges, _state2 = _unsavedChangesList$_2.state;
809
+
810
+ if (!_getChanges2) {
811
+ _context2.next = 33;
812
+ break;
813
+ }
814
+
815
+ _newUsfm = void 0;
816
+ _getChanges3 = _getChanges2(_state2), _ref6 = _getChanges3.ref, _updatedVerseObjects = _getChanges3.updatedVerseObjects;
817
+
818
+ if (_updatedVerseObjects && bibleUsfm) {
819
+ // just replace verse
820
+ _newUsfm = mergeVerseObjectsIntoBibleUsfm(bibleUsfm, _ref6, _updatedVerseObjects, _cardNum);
821
+ }
822
+
823
+ if (!_newUsfm) {
824
+ _context2.next = 31;
825
+ break;
826
+ }
827
+
828
+ bibleUsfm = _newUsfm;
829
+ _context2.next = 33;
830
+ break;
831
+
832
+ case 31:
833
+ mergeFail = true;
834
+ return _context2.abrupt("break", 35);
835
+
836
+ case 33:
837
+ _context2.next = 19;
838
+ break;
839
+
840
+ case 35:
841
+ _context2.next = 40;
842
+ break;
843
+
844
+ case 37:
845
+ _context2.prev = 37;
846
+ _context2.t0 = _context2["catch"](17);
847
+
848
+ _iterator2.e(_context2.t0);
849
+
850
+ case 40:
851
+ _context2.prev = 40;
852
+
853
+ _iterator2.f();
854
+
855
+ return _context2.finish(40);
856
+
857
+ case 43:
858
+ if (mergeFail) {
859
+ // if we failed to merge, fallback to brute force verse objects to USFM
860
+ console.log("saveChangesToCloud(".concat(_cardNum, ") - verse not found, falling back to inserting verse object"));
861
+ _iterator3 = _createForOfIteratorHelper(unsavedCardIndices);
862
+
863
+ try {
864
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
865
+ cardIndex = _step3.value;
866
+ _cardNum2 = parseInt(cardIndex);
867
+ _unsavedChangesList$_ = unsavedChangesList[_cardNum2], getChanges = _unsavedChangesList$_.getChanges, _state = _unsavedChangesList$_.state;
868
+
869
+ if (getChanges) {
870
+ newUsfm = void 0;
871
+ _getChanges = getChanges(_state), newVerseText = _getChanges.newVerseText, _ref5 = _getChanges.ref, updatedVerseObjects = _getChanges.updatedVerseObjects;
872
+
873
+ if (updatedVerseObjects && !newUsfm) {
874
+ targetVerseObjects_ = null;
875
+
876
+ if (_ref5) {
877
+ if (newVerseText) {
878
+ _AlignmentHelpers$upd = AlignmentHelpers.updateAlignmentsToTargetVerse(updatedVerseObjects, newVerseText), targetVerseObjects = _AlignmentHelpers$upd.targetVerseObjects;
879
+ targetVerseObjects_ = targetVerseObjects;
880
+ } else {
881
+ targetVerseObjects_ = updatedVerseObjects;
882
+ }
883
+
884
+ newBookJson = targetVerseObjects_ && (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.updateVerse(_ref5.chapter, _ref5.verse, {
885
+ verseObjects: targetVerseObjects_
886
+ }));
887
+ }
888
+ }
889
+ }
890
+ }
891
+ } catch (err) {
892
+ _iterator3.e(err);
893
+ } finally {
894
+ _iterator3.f();
895
+ }
896
+
897
+ bibleUsfm = usfmjs.toUSFM(newBookJson, {
898
+ forcedNewLines: true
899
+ });
900
+ }
901
+
902
+ console.log("saveChangesToCloud() - saving new USFM: ".concat(bibleUsfm.substring(0, 100), "..."));
903
+ setState({
904
+ saveContent: bibleUsfm,
905
+ startSave: true,
906
+ saveClicked: false
907
+ });
908
+
909
+ case 46:
910
+ case "end":
911
+ return _context2.stop();
662
912
  }
913
+ }
914
+ }, _callee2, null, [[17, 37, 40, 43]]);
915
+ }));
916
+ return _getReadyForSave.apply(this, arguments);
917
+ }
918
+
919
+ getReadyForSave();
920
+ }, [saveClicked]); // @ts-ignore
921
+
922
+ var _ref7 = _reference || {},
923
+ chapter = _ref7.chapter;
924
+
925
+ React.useEffect(function () {
926
+ var _versesForRef = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef;
927
+
928
+ var newSelections = new Map();
929
+ var updateSelections = false;
930
+ var _map = newSelections;
931
+ var originalBookId = originalScriptureBookObjects === null || originalScriptureBookObjects === void 0 ? void 0 : originalScriptureBookObjects.bookId;
932
+ var bookVerseObject = originalScriptureBookObjects === null || originalScriptureBookObjects === void 0 ? void 0 : originalScriptureBookObjects.chapters;
933
+ var newSelectedQuote = null; // if we have everything we need to calculate selections
934
+
935
+ if (_versesForRef !== null && _versesForRef !== void 0 && _versesForRef.length && bookVerseObject && bookId === originalBookId && bookVerseObject[chapter] && // we need to have data for chapter
936
+ selectedQuote !== null && selectedQuote !== void 0 && selectedQuote.quote) {
937
+ // if quote is different than last
938
+ if (!isEqual(lastSelectedQuote, selectedQuote) || !isEqual(versesForRef, _versesForRef)) {
939
+ var _selectedQuote$refere3;
940
+
941
+ var originalVerses = {};
942
+ var substitute = {}; // keep track of verse substitutions
943
+
944
+ var startVerse = _versesForRef[0].verse;
945
+
946
+ if (typeof startVerse === 'string') {
947
+ startVerse = parseInt(startVerse);
948
+ }
949
+
950
+ var lastVerse = startVerse;
951
+
952
+ for (var i = 0, l = _versesForRef.length; i < l; i++) {
953
+ var verseRef = _versesForRef[i];
954
+ var _chapter2 = verseRef.chapter,
955
+ verse = verseRef.verse; // TRICKY - we remap verses in reference range to a linear series of verses so verse spans don't choke getQuoteMatchesInBookRef
956
+
957
+ var _verse = startVerse + i;
663
958
 
664
- if (newUsfm) {
665
- updatedBibleUsfm = newUsfm;
959
+ lastVerse = _verse;
960
+ substitute["".concat(_chapter2, ":").concat(_verse)] = "".concat(_chapter2, ":").concat(verse);
961
+
962
+ if (!originalVerses[_chapter2]) {
963
+ originalVerses[_chapter2] = {};
964
+ }
965
+
966
+ var verseObjects = [];
967
+
968
+ if (typeof verse === 'string' && verse.includes('-')) {
969
+ var verses = getVerses(bookVerseObject, "".concat(_chapter2, ":").concat(verse));
970
+
971
+ var _iterator4 = _createForOfIteratorHelper(verses),
972
+ _step4;
973
+
974
+ try {
975
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
976
+ var verseItem = _step4.value;
977
+ var vo = verseItem.verseData.verseObjects;
978
+ verseObjects = verseObjects.concat(vo);
979
+ }
980
+ } catch (err) {
981
+ _iterator4.e(err);
982
+ } finally {
983
+ _iterator4.f();
666
984
  }
985
+ } else {
986
+ var _bookVerseObject$_cha;
987
+
988
+ verseObjects = (_bookVerseObject$_cha = bookVerseObject[_chapter2][verse]) === null || _bookVerseObject$_cha === void 0 ? void 0 : _bookVerseObject$_cha.verseObjects;
989
+ }
990
+
991
+ if (verseObjects) {
992
+ verseObjects = cleanupVerseObjects(verseObjects);
993
+ originalVerses[_chapter2][_verse] = {
994
+ verseObjects: verseObjects
995
+ };
996
+
997
+ _map.set("".concat(_chapter2, ":").concat(verse), verseObjects);
667
998
  }
999
+ } // create new reference range for new linear verse range
1000
+
1001
+
1002
+ var _selectedQuote$refere = selectedQuote === null || selectedQuote === void 0 ? void 0 : (_selectedQuote$refere3 = selectedQuote.reference) === null || _selectedQuote$refere3 === void 0 ? void 0 : _selectedQuote$refere3.split(':'),
1003
+ _selectedQuote$refere2 = _slicedToArray(_selectedQuote$refere, 1),
1004
+ _chapter = _selectedQuote$refere2[0];
1005
+
1006
+ var subRef = "".concat(_chapter, ":").concat(startVerse);
1007
+
1008
+ if (lastVerse != startVerse) {
1009
+ subRef += "-".concat(lastVerse);
1010
+ }
1011
+
1012
+ var quoteMatches = getQuoteMatchesInBookRef({
1013
+ bookObject: originalVerses,
1014
+ ref: subRef,
1015
+ quote: selectedQuote === null || selectedQuote === void 0 ? void 0 : selectedQuote.quote,
1016
+ occurrence: selectedQuote === null || selectedQuote === void 0 ? void 0 : selectedQuote.occurrence
1017
+ });
1018
+
1019
+ var _selections = new Map();
1020
+
1021
+ if (quoteMatches !== null && quoteMatches !== void 0 && quoteMatches.size) {
1022
+ quoteMatches.forEach(function (words, key) {
1023
+ var _key = substitute[key];
1024
+
1025
+ _selections.set(_key, words.map(function (word) {
1026
+ return _objectSpread(_objectSpread({}, word), {}, {
1027
+ text: core.normalizeString(word.text)
1028
+ });
1029
+ }));
1030
+ });
668
1031
  }
669
- } catch (err) {
670
- _iterator3.e(err);
671
- } finally {
672
- _iterator3.f();
1032
+
1033
+ newSelections = _selections;
1034
+ newSelectedQuote = selectedQuote;
1035
+ updateSelections = true;
673
1036
  }
1037
+ }
674
1038
 
675
- console.log("saveChangesToCloud() - saving new USFM: ".concat(updatedBibleUsfm.substring(0, 100), "..."));
676
- setState({
677
- saveContent: updatedBibleUsfm,
678
- startSave: true
679
- });
1039
+ var newState = {}; // update states that have changed
1040
+
1041
+ if (!areMapsTheSame(verseObjectsMap, _map)) {
1042
+ newState.verseObjectsMap = _map;
680
1043
  }
681
- }
682
1044
 
1045
+ var booksNotSame = (reference === null || reference === void 0 ? void 0 : reference.projectId) !== (currentReference === null || currentReference === void 0 ? void 0 : currentReference.projectId);
1046
+
1047
+ if (booksNotSame || !areVersesSame(versesForRef, _versesForRef)) {
1048
+ newState.versesForRef = _versesForRef;
1049
+ newState.lastSelectedQuote = newSelectedQuote;
1050
+ newState.selections = newSelections;
1051
+ }
1052
+
1053
+ if (newSelectedQuote) {
1054
+ newState.lastSelectedQuote = newSelectedQuote;
1055
+ }
1056
+
1057
+ if (updateSelections) {
1058
+ if (!areMapsTheSame(selections || new Map(), newSelections)) {
1059
+ newState.selections = newSelections;
1060
+ }
1061
+ }
1062
+
1063
+ if (Object.keys(newState).length) {
1064
+ setState(newState);
1065
+ }
1066
+ }, [owner, resourceId, bookId, languageId_, scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef, originalScriptureBookObjects, selectedQuote]);
683
1067
  React.useEffect(function () {
684
- if (!isEqual(versesForRef, scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef)) {
685
- var _versesForRef = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef;
1068
+ // clear settings on verse change
1069
+ setState({
1070
+ versesAlignmentStatus: null,
1071
+ unsavedChangesList: {},
1072
+ haveUnsavedChanges: false
1073
+ });
1074
+ }, [_reference]);
686
1075
 
687
- setState({
688
- versesForRef: _versesForRef
1076
+ var updateVersesAlignmentStatus = function updateVersesAlignmentStatus(reference, aligned) {
1077
+ setState_(function (prevState) {
1078
+ return _objectSpread(_objectSpread({}, prevState), {}, {
1079
+ versesAlignmentStatus: _objectSpread(_objectSpread({}, prevState.versesAlignmentStatus), {}, _defineProperty({}, "".concat(reference.chapter, ":").concat(reference.verse), aligned))
689
1080
  });
1081
+ });
1082
+ };
690
1083
 
691
- var _iterator4 = _createForOfIteratorHelper(_versesForRef || []),
692
- _step4;
1084
+ var _versesForRef = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef;
693
1085
 
694
- try {
695
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
696
- var verseRef = _step4.value;
697
- // check for verse range
698
- var _verse = verseRef.verse;
1086
+ React.useEffect(function () {
1087
+ var _versesForRef2;
699
1088
 
700
- if (addVerseRange && typeof _verse === 'string') {
701
- // @ts-ignore
702
- if (_verse.includes('-')) {
703
- var _scriptureConfig$refe2;
1089
+ if ((_versesForRef2 = _versesForRef) !== null && _versesForRef2 !== void 0 && _versesForRef2.length) {
1090
+ var _ref8 = scriptureConfig || {},
1091
+ _reference2 = _ref8.reference,
1092
+ _resourceLink2 = _ref8.resourceLink;
704
1093
 
705
- addVerseRange("".concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$refe2 = scriptureConfig.reference) === null || _scriptureConfig$refe2 === void 0 ? void 0 : _scriptureConfig$refe2.chapter, ":").concat(_verse));
706
- }
707
- }
708
- }
709
- } catch (err) {
710
- _iterator4.e(err);
711
- } finally {
712
- _iterator4.f();
713
- }
1094
+ console.log("ScriptureCard._versesForRef changed", {
1095
+ reference: _reference2,
1096
+ resourceLink: _resourceLink2
1097
+ });
714
1098
  }
715
- }, [scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef]);
716
- var renderedScripturePanes = versesForRef === null || versesForRef === void 0 ? void 0 : versesForRef.map(function (_currentVerseData, index) {
1099
+ }, [_versesForRef]);
1100
+
1101
+ if (!((_versesForRef3 = _versesForRef) !== null && _versesForRef3 !== void 0 && _versesForRef3.length)) {
1102
+ // if empty of references, create single empty reference
1103
+ _versesForRef = [_objectSpread({}, reference)];
1104
+ }
1105
+
1106
+ var renderedScripturePanes = (_versesForRef4 = _versesForRef) === null || _versesForRef4 === void 0 ? void 0 : _versesForRef4.map(function (_currentVerseData, index) {
717
1107
  var _currentVerseData$ver;
718
1108
 
719
- var initialVerseObjects = (_currentVerseData === null || _currentVerseData === void 0 ? void 0 : (_currentVerseData$ver = _currentVerseData.verseData) === null || _currentVerseData$ver === void 0 ? void 0 : _currentVerseData$ver.verseObjects) || null; // @ts-ignore
1109
+ var initialVerseObjects = (_currentVerseData === null || _currentVerseData === void 0 ? void 0 : (_currentVerseData$ver = _currentVerseData.verseData) === null || _currentVerseData$ver === void 0 ? void 0 : _currentVerseData$ver.verseObjects) || []; // @ts-ignore
1110
+
1111
+ var _ref9 = _currentVerseData || {},
1112
+ chapter = _ref9.chapter,
1113
+ verse = _ref9.verse;
720
1114
 
721
- var _ref5 = _currentVerseData || {},
722
- chapter = _ref5.chapter,
723
- verse = _ref5.verse;
1115
+ var projectId = (currentReference === null || currentReference === void 0 ? void 0 : currentReference.projectId) || (reference === null || reference === void 0 ? void 0 : reference.projectId);
724
1116
 
725
- var _reference = _objectSpread(_objectSpread({}, reference), {}, {
1117
+ var _reference = _objectSpread(_objectSpread({}, _versesForRef), {}, {
726
1118
  chapter: chapter,
727
- verse: verse
1119
+ verse: verse,
1120
+ projectId: projectId
728
1121
  });
729
1122
 
730
1123
  var _scriptureAlignmentEditConfig = _objectSpread(_objectSpread({}, scriptureAlignmentEditConfig), {}, {
731
1124
  currentIndex: index,
732
1125
  initialVerseObjects: initialVerseObjects,
733
- reference: _reference
1126
+ reference: _reference,
1127
+ isNewTestament: isNewTestament
734
1128
  });
735
1129
 
1130
+ var isVerseSelectedForAlignment = false;
1131
+
1132
+ if (verseSelectedForAlignment) {
1133
+ isVerseSelectedForAlignment = verseSelectedForAlignment.chapter == chapter && verseSelectedForAlignment.verse == verse;
1134
+ }
1135
+
736
1136
  return /*#__PURE__*/React.createElement(ScripturePane, _extends({}, scriptureConfig, {
737
1137
  contentStyle: contentStyle,
738
1138
  currentIndex: index,
1139
+ determiningBranch: !readyForFetch,
739
1140
  direction: direction,
740
1141
  disableWordPopover: disableWordPopover_,
741
1142
  fontSize: fontSize,
742
1143
  getLexiconData: getLexiconData,
743
1144
  isNT: isNT_,
1145
+ isVerseSelectedForAlignment: isVerseSelectedForAlignment,
744
1146
  key: index,
1147
+ onAlignmentFinish: function onAlignmentFinish() {
1148
+ return setState({
1149
+ verseSelectedForAlignment: null
1150
+ });
1151
+ },
1152
+ originalScriptureBookObjects: originalScriptureBookObjects,
745
1153
  refStyle: refStyle,
746
1154
  reference: _reference,
747
1155
  saving: startSave // @ts-ignore
@@ -749,10 +1157,77 @@ export default function ScriptureCard(_ref) {
749
1157
  scriptureAlignmentEditConfig: _scriptureAlignmentEditConfig,
750
1158
  setWordAlignerStatus: setWordAlignerStatus,
751
1159
  server: server,
752
- translate: translate
1160
+ translate: translate,
1161
+ updateVersesAlignmentStatus: updateVersesAlignmentStatus
753
1162
  }));
754
1163
  });
755
- return /*#__PURE__*/React.createElement(Card, {
1164
+
1165
+ var handleAlignButtonClick = function handleAlignButtonClick() {
1166
+ if ((versesForRef === null || versesForRef === void 0 ? void 0 : versesForRef.length) > 1) {
1167
+ setState({
1168
+ showAlignmentPopup: true
1169
+ });
1170
+ } else if ((versesForRef === null || versesForRef === void 0 ? void 0 : versesForRef.length) === 1) {
1171
+ setState({
1172
+ verseSelectedForAlignment: versesForRef[0]
1173
+ });
1174
+ }
1175
+ };
1176
+
1177
+ var onRenderToolbar = function onRenderToolbar(_ref10) {
1178
+ var items = _ref10.items;
1179
+
1180
+ var newItems = _toConsumableArray(items);
1181
+
1182
+ var allVersesAligned = false; // Check if all values in versesAlignmentStatus are true
1183
+
1184
+ if (versesAlignmentStatus) {
1185
+ allVersesAligned = Object.values(versesAlignmentStatus).every(function (alignStatus) {
1186
+ return alignStatus === true;
1187
+ });
1188
+ }
1189
+
1190
+ var alignIcon = null;
1191
+ var alignButtonText = '';
1192
+
1193
+ if (allVersesAligned) {
1194
+ alignIcon = /*#__PURE__*/React.createElement(RxLink2, {
1195
+ id: "valid_icon_".concat(resourceId),
1196
+ color: "#BBB"
1197
+ });
1198
+ alignButtonText = 'Alignment is Valid';
1199
+ } else {
1200
+ alignIcon = /*#__PURE__*/React.createElement(RxLinkBreak2, {
1201
+ id: "invalid_alignment_icon_".concat(resourceId),
1202
+ color: "#000"
1203
+ });
1204
+ alignButtonText = 'Alignment is Invalid';
1205
+ }
1206
+
1207
+ if (setWordAlignerStatus && resourceId !== 'ORIGINAL_SOURCE') {
1208
+ newItems.push( /*#__PURE__*/React.createElement(IconButton, {
1209
+ id: "alignment_icon_".concat(resourceId),
1210
+ key: "checking-button",
1211
+ onClick: handleAlignButtonClick,
1212
+ title: alignButtonText,
1213
+ "aria-label": alignButtonText,
1214
+ style: {
1215
+ cursor: 'pointer'
1216
+ }
1217
+ }, alignIcon));
1218
+ }
1219
+
1220
+ return newItems;
1221
+ };
1222
+
1223
+ return /*#__PURE__*/React.createElement(SelectionsContextProvider, {
1224
+ selections: selections,
1225
+ onSelections: function onSelections(newSelections) {// console.log('onSelections', newSelections)
1226
+ },
1227
+ quote: selectedQuote === null || selectedQuote === void 0 ? void 0 : selectedQuote.quote,
1228
+ occurrence: fixOccurrence(selectedQuote === null || selectedQuote === void 0 ? void 0 : selectedQuote.occurrence),
1229
+ verseObjectsMap: verseObjectsMap
1230
+ }, /*#__PURE__*/React.createElement(Card, {
756
1231
  id: "scripture_card_".concat(cardNum),
757
1232
  title: scriptureLabel,
758
1233
  settingsTitle: scriptureTitle + ' Settings',
@@ -775,69 +1250,77 @@ export default function ScriptureCard(_ref) {
775
1250
  } : null,
776
1251
  editable: enableEdit || enableAlignment,
777
1252
  saved: startSave || !haveUnsavedChanges,
778
- onSaveEdit: saveChangesToCloud
1253
+ onSaveEdit: function onSaveEdit() {
1254
+ return setState({
1255
+ saveClicked: true
1256
+ });
1257
+ },
1258
+ onRenderToolbar: onRenderToolbar
779
1259
  }, /*#__PURE__*/React.createElement("div", {
780
1260
  id: "scripture-pane-list"
781
- }, renderedScripturePanes));
1261
+ }, renderedScripturePanes)), /*#__PURE__*/React.createElement(VerseSelectorPopup, {
1262
+ resourceId: resourceId,
1263
+ open: showAlignmentPopup,
1264
+ onClose: function onClose() {
1265
+ return setState({
1266
+ showAlignmentPopup: false
1267
+ });
1268
+ },
1269
+ versesForRef: versesForRef,
1270
+ versesAlignmentStatus: versesAlignmentStatus,
1271
+ onVerseSelect: function onVerseSelect(verse) {
1272
+ return setState({
1273
+ verseSelectedForAlignment: verse,
1274
+ showAlignmentPopup: false
1275
+ });
1276
+ }
1277
+ }));
782
1278
  }
783
1279
  ScriptureCard.propTypes = {
784
- /** html identifier to use for card */
785
- id: PropTypes.string,
786
-
787
- /** method to determine if NT or OT */
788
- isNT: PropTypes.func.isRequired,
1280
+ /** repo branch or tag such as master */
1281
+ appRef: PropTypes.string.isRequired,
789
1282
 
790
- /** title for scripture card */
791
- title: PropTypes.string.isRequired,
1283
+ /** authentication info */
1284
+ authentication: PropTypes.object,
792
1285
 
793
- /** get language details */
794
- getLanguage: PropTypes.func.isRequired,
1286
+ /** index for current book (e.g. '01' for 'gen')*/
1287
+ bookIndex: PropTypes.string,
795
1288
 
796
1289
  /** scripture card number (0 to 2 for example) */
797
1290
  cardNum: PropTypes.number.isRequired,
798
1291
 
799
- /** resource object */
800
- resource: PropTypes.shape({
801
- /** resource language to use */
802
- languageId: PropTypes.string.isRequired,
803
-
804
- /** repo owner such as unfoldingWord */
805
- owner: PropTypes.string.isRequired,
1292
+ /** CSS classes */
1293
+ classes: PropTypes.object,
806
1294
 
807
- /** resourceId to use (e.g. ugnt) */
808
- resourceId: PropTypes.string.isRequired,
1295
+ /** if true then word data hover is shown */
1296
+ disableWordPopover: PropTypes.bool,
809
1297
 
810
- /** repo owner for original languages such as unfoldingWord */
811
- originalLanguageOwner: PropTypes.string.isRequired
812
- }),
813
- reference: PropTypes.shape({
814
- /** projectId (bookID) to use */
815
- projectId: PropTypes.string.isRequired,
1298
+ /** get language details */
1299
+ getLanguage: PropTypes.func.isRequired,
816
1300
 
817
- /** current chapter number */
818
- chapter: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
1301
+ /** function to get latest lexicon data */
1302
+ getLexiconData: PropTypes.func,
819
1303
 
820
- /** current verse number */
821
- verse: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired
822
- }),
1304
+ /** optional url for greek repo */
1305
+ greekRepoUrl: PropTypes.string,
823
1306
 
824
- /** server (e.g. 'https://git.door43.org') */
825
- server: PropTypes.string.isRequired,
1307
+ /** optional url for hebrew repo */
1308
+ hebrewRepoUrl: PropTypes.string,
826
1309
 
827
- /** repo branch or tag such as master */
828
- appRef: PropTypes.string.isRequired,
1310
+ /** optional http timeout in milliseconds for fetching resources, default is 0 (very long wait) */
1311
+ httpConfig: PropTypes.object,
829
1312
 
830
- /** if true then word data hover is shown */
831
- disableWordPopover: PropTypes.bool,
1313
+ /** html identifier to use for card */
1314
+ id: PropTypes.string,
832
1315
 
833
- /** CSS classes */
834
- classes: PropTypes.object,
1316
+ /** method to determine if NT or OT */
1317
+ isNT: PropTypes.func.isRequired,
835
1318
 
836
- /** resourceLink */
837
- resourceLink: PropTypes.any,
1319
+ /** user-name */
1320
+ loggedInUser: PropTypes.string,
838
1321
 
839
- /** use method for using local storage specific for user */
840
- useUserLocalStorage: PropTypes.func.isRequired,
1322
+ /** function to minimize the card (optional) */
1323
+ onMinimize: PropTypes.func,
841
1324
 
842
1325
  /** optional callback if error loading resource, parameter returned are:
843
1326
  * ({string} errorMessage, {boolean} isAccessError, {object} resourceStatus)
@@ -845,43 +1328,56 @@ ScriptureCard.propTypes = {
845
1328
  * - resourceStatus - is object containing details about problems fetching resource */
846
1329
  onResourceError: PropTypes.func,
847
1330
 
848
- /** optional http timeout in milliseconds for fetching resources, default is 0 (very long wait) */
849
- httpConfig: PropTypes.object,
1331
+ /** the original scripture bookObjects for current book */
1332
+ originalScriptureBookObjects: PropTypes.object,
1333
+ reference: PropTypes.shape({
1334
+ /** projectId (bookID) to use */
1335
+ projectId: PropTypes.string.isRequired,
850
1336
 
851
- /** optional url for greek repo */
852
- greekRepoUrl: PropTypes.string,
1337
+ /** current chapter number */
1338
+ chapter: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
853
1339
 
854
- /** optional url for hebrew repo */
855
- hebrewRepoUrl: PropTypes.string,
1340
+ /** current verse number */
1341
+ verse: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired
1342
+ }),
856
1343
 
857
- /** function to get latest lexicon data */
858
- getLexiconData: PropTypes.func,
1344
+ /** resource object */
1345
+ resource: PropTypes.shape({
1346
+ /** resource language to use */
1347
+ languageId: PropTypes.string.isRequired,
859
1348
 
860
- /** function to pre-load lexicon data for verse */
861
- fetchGlossesForVerse: PropTypes.func,
1349
+ /** repo owner such as unfoldingWord */
1350
+ owner: PropTypes.string.isRequired,
862
1351
 
863
- /** optional function for localization */
864
- translate: PropTypes.func,
1352
+ /** resourceId to use (e.g. ugnt) */
1353
+ resourceId: PropTypes.string.isRequired,
865
1354
 
866
- /** function to minimize the card (optional) */
867
- onMinimize: PropTypes.func,
1355
+ /** repo owner for original languages such as unfoldingWord */
1356
+ originalLanguageOwner: PropTypes.string.isRequired
1357
+ }),
868
1358
 
869
- /** user-name */
870
- loggedInUser: PropTypes.string,
1359
+ /** resourceLink */
1360
+ resourceLink: PropTypes.any,
871
1361
 
872
- /** authentication info */
873
- authentication: PropTypes.object,
1362
+ /**This is currently selected quote */
1363
+ selectedQuote: PropTypes.object,
1364
+
1365
+ /** server (e.g. 'https://git.door43.org') */
1366
+ server: PropTypes.string.isRequired,
874
1367
 
875
1368
  /** function to set state in app that there are unsaved changes */
876
1369
  setSavedChanges: PropTypes.func,
877
1370
 
878
- /** index for current book (e.g. '01' for 'gen')*/
879
- bookIndex: PropTypes.string,
1371
+ /** callback to update word aligner state */
1372
+ setWordAlignerStatus: PropTypes.func,
880
1373
 
881
- /** callback to indicate that we are using a verse range here */
882
- addVerseRange: PropTypes.func,
1374
+ /** title for scripture card */
1375
+ title: PropTypes.string.isRequired,
883
1376
 
884
- /** callback to update word aligner state */
885
- setWordAlignerStatus: PropTypes.func
1377
+ /** optional function for localization */
1378
+ translate: PropTypes.func,
1379
+
1380
+ /** use method for using local storage specific for user */
1381
+ useUserLocalStorage: PropTypes.func.isRequired
886
1382
  };
887
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1NjcmlwdHVyZUNhcmQvU2NyaXB0dXJlQ2FyZC50c3giXSwibmFtZXMiOlsiUmVhY3QiLCJQcm9wVHlwZXMiLCJjb3JlIiwidXNmbWpzIiwidXNlRWRpdCIsIkNhcmQiLCJ1c2VDYXJkU3RhdGUiLCJ1c2VVc2VyQnJhbmNoIiwiRVJST1JfU1RBVEUiLCJNQU5JRkVTVF9OT1RfTE9BREVEX0VSUk9SIiwiQWxpZ25tZW50SGVscGVycyIsIlVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMiLCJpc0VxdWFsIiwiU2NyaXB0dXJlUGFuZSIsIlNjcmlwdHVyZVNlbGVjdG9yIiwidXNlU2NyaXB0dXJlU2V0dGluZ3MiLCJnZXRSZXNvdXJjZUxpbmsiLCJnZXRSZXNvdXJjZU1lc3NhZ2UiLCJnZXRTY3JpcHR1cmVWZXJzaW9uU2V0dGluZ3MiLCJpc09yaWdpbmFsQmlibGUiLCJUaXRsZSIsIk5UX09SSUdfTEFORyIsIk9SSUdJTkFMX1NPVVJDRSIsIk9UX09SSUdfTEFORyIsIktFWV9GT05UX1NJWkVfQkFTRSIsImxhYmVsIiwic3R5bGUiLCJtYXJnaW5Ub3AiLCJ3aWR0aCIsIlNjcmlwdHVyZUNhcmQiLCJpZCIsImlzTlQiLCJ0aXRsZSIsInNlcnZlciIsImFwcFJlZiIsImNhcmROdW0iLCJjbGFzc2VzIiwicmVzb3VyY2UiLCJvd25lciIsImxhbmd1YWdlSWQiLCJyZXNvdXJjZUlkIiwib3JpZ2luYWxMYW5ndWFnZU93bmVyIiwiZ2V0TGFuZ3VhZ2UiLCJyZWZlcmVuY2UiLCJ2ZXJzZSIsImNoYXB0ZXIiLCJib29rSWQiLCJwcm9qZWN0SWQiLCJyZXNvdXJjZUxpbmsiLCJ1c2VVc2VyTG9jYWxTdG9yYWdlIiwiZGlzYWJsZVdvcmRQb3BvdmVyIiwib25SZXNvdXJjZUVycm9yIiwiaHR0cENvbmZpZyIsImdyZWVrUmVwb1VybCIsImhlYnJld1JlcG9VcmwiLCJnZXRMZXhpY29uRGF0YSIsImZldGNoR2xvc3Nlc0ZvclZlcnNlIiwidHJhbnNsYXRlIiwib25NaW5pbWl6ZSIsImxvZ2dlZEluVXNlciIsImF1dGhlbnRpY2F0aW9uIiwic2V0U2F2ZWRDaGFuZ2VzIiwiYm9va0luZGV4IiwiYWRkVmVyc2VSYW5nZSIsInNldFdvcmRBbGlnbmVyU3RhdHVzIiwidXNlU3RhdGUiLCJoYXZlVW5zYXZlZENoYW5nZXMiLCJyZWYiLCJzYXZlQ29udGVudCIsInNoYSIsInN0YXJ0U2F2ZSIsInVybEVycm9yIiwidXNpbmdVc2VyQnJhbmNoIiwidW5zYXZlZENoYW5nZXNMaXN0IiwidmVyc2VzRm9yUmVmIiwic3RhdGUiLCJzZXRTdGF0ZV8iLCJmb250U2l6ZSIsInNldEZvbnRTaXplIiwiaXNOVF8iLCJzZXRTdGF0ZSIsIm5ld1N0YXRlIiwicHJldlN0YXRlIiwiY2FjaGUiLCJtYXhBZ2UiLCJzZXRVcmxFcnJvciIsImVycm9yIiwid2hvbGVCb29rIiwiaXNOZXdUZXN0YW1lbnQiLCJzY3JpcHR1cmVDb25maWciLCJzZXRTY3JpcHR1cmUiLCJzY3JpcHR1cmVTZXR0aW5ncyIsInNjcmlwdHVyZVZlcnNpb25IaXN0IiwiZmV0Y2hSZXNwXyIsImZldGNoUmVzcG9uc2UiLCJyZXBvIiwicmVmZXJlbmNlXyIsInVzZUVmZmVjdCIsIl9zaGEiLCJkYXRhIiwiY29uc29sZSIsImxvZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjYXJkUmVzb3VyY2VJZCIsInJlZl8iLCJjYW5Vc2VFZGl0QnJhbmNoIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiY2FyZElkIiwid29ya2luZ1Jlc291cmNlQnJhbmNoIiwidXNpbmdVc2VyQnJhbmNoXyIsInN0YXJ0RWRpdEJyYW5jaCIsImFjdGlvbnMiLCJzdGFydEVkaXQiLCJ3b3JraW5nUmVmIiwic2NyaXB0dXJlVGl0bGUiLCJ3b3JraW5nUmVmXyIsInJlc291cmNlU3RhdHVzIiwibWVzc2FnZSIsImlzQWNjZXNzRXJyb3IiLCJ2ZXJzaW9uIiwidXBkYXRlVGl0bGUiLCJnZXRTY3JpcHR1cmVTZWxlY3RvciIsInNjcmlwdHVyZVNlbGVjdGlvbkNvbmZpZyIsIm9uTWVudUNsb3NlIiwibGFuZ3VhZ2VJZF8iLCJsYW5ndWFnZSIsImRpcmVjdGlvbiIsImlzSGVicmV3IiwiZm9udEZhY3RvciIsInNjYWxlZEZvbnRTaXplIiwiaXRlbXMiLCJoZWFkZXJzIiwiZmlsdGVycyIsIml0ZW1JbmRleCIsIm1hcmtkb3duVmlldyIsInNldEZpbHRlcnMiLCJzZXRJdGVtSW5kZXgiLCJzZXRNYXJrZG93blZpZXciLCJyZWZTdHlsZSIsInVzZU1lbW8iLCJmb250RmFtaWx5IiwiTWF0aCIsInJvdW5kIiwiY29udGVudFN0eWxlIiwic2NyaXB0dXJlTGFiZWwiLCJkaXNhYmxlV29yZFBvcG92ZXJfIiwidXNpbmdPcmlnaW5hbEJpYmxlIiwidW5kZWZpbmVkIiwiZmV0Y2hHbG9zc0RhdGFGb3JWZXJzZSIsInZlcnNlT2JqZWN0cyIsInZlcnNlUmVmIiwiX3ZlcnNlT2JqZWN0cyIsInZlcnNlRGF0YSIsImNvbmNhdCIsImVuYWJsZUVkaXQiLCJlbmFibGVBbGlnbm1lbnQiLCJvcmlnaW5hbFJlcG9VcmwiLCJzY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnIiwiY3VycmVudFZlcnNlUmVmIiwiX3NldFNhdmVkQ2hhbmdlcyIsInNvdXJjZUxhbmd1YWdlIiwidGFyZ2V0TGFuZ3VhZ2UiLCJjdXJyZW50SW5kZXgiLCJzYXZlZCIsImdldENoYW5nZXMiLCJjbGVhckNoYW5nZXMiLCJfdW5zYXZlZENoYW5nZXNMaXN0IiwiaGFzT3duUHJvcGVydHkiLCJfaGF2ZVVuc2F2ZWRDaGFuZ2VzIiwiT2JqZWN0Iiwia2V5cyIsImZpbmRSZWZJbkFycmF5IiwiZmluZEl0ZW0iLCJjaHVua3MiLCJyZWZMZW4iLCJpbmRleCIsImZpbmRJbmRleCIsImNodW5rIiwiaWR4IiwibmV4dENoYXIiLCJnZXRCb29rTmFtZSIsImJvb2tDYXBzIiwidG9VcHBlckNhc2UiLCJmaWxlcGF0aCIsImNvbnRlbnQiLCJjb25maWciLCJ0b2tlbiIsInRpbWVvdXQiLCJzZXJ2ZXJUaW1lT3V0IiwiYXV0aG9yIiwiYnJhbmNoIiwib25TYXZlRWRpdCIsIl9zYXZlRWRpdCIsInRoZW4iLCJzdWNjZXNzIiwidW5zYXZlZENhcmRJbmRpY2VzIiwiY2FyZEluZGV4IiwiaW5mbyIsInJlbG9hZFJlc291cmNlIiwic2F2ZUNoYW5nZXNUb0Nsb3VkIiwib3JpZ2luYWxVc2ZtIiwiZ2V0UmVzcG9uc2VEYXRhIiwidXBkYXRlZEJpYmxlVXNmbSIsInBhcnNlSW50IiwibmV3VXNmbSIsIm5ld1ZlcnNlVGV4dCIsInVwZGF0ZWRWZXJzZU9iamVjdHMiLCJjaGFwdGVyQ2h1bmtzIiwic3BsaXQiLCJjaGFwdGVySW5kZXgiLCJjdXJyZW50Q2hhcHRlciIsInZlcnNlQ2h1bmtzIiwidmVyc2VJbmRleCIsIm5ld1ZlcnNlVXNmbSIsImNvbnZlcnRWZXJzZURhdGFUb1VTRk0iLCJvbGRWZXJzZSIsInZlcnNlTnVtTGVuIiwibmV3Q2hhcHRlciIsImpvaW4iLCJ0YXJnZXRWZXJzZU9iamVjdHNfIiwidXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UiLCJ0YXJnZXRWZXJzZU9iamVjdHMiLCJuZXdCb29rSnNvbiIsInVwZGF0ZVZlcnNlIiwidG9VU0ZNIiwiZm9yY2VkTmV3TGluZXMiLCJfdmVyc2UiLCJpbmNsdWRlcyIsInJlbmRlcmVkU2NyaXB0dXJlUGFuZXMiLCJtYXAiLCJfY3VycmVudFZlcnNlRGF0YSIsImluaXRpYWxWZXJzZU9iamVjdHMiLCJfcmVmZXJlbmNlIiwiX3NjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWciLCJwcm9wVHlwZXMiLCJzdHJpbmciLCJmdW5jIiwiaXNSZXF1aXJlZCIsIm51bWJlciIsInNoYXBlIiwib25lT2ZUeXBlIiwiYm9vbCIsIm9iamVjdCIsImFueSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLQSxLQUFaLE1BQXVCLE9BQXZCO0FBQ0EsT0FBTyxLQUFLQyxTQUFaLE1BQTJCLFlB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Nk8sSUFsRUg7O0FBbUV4QjtBQUNBaEwsRUFBQUEsU0FBUyxFQUFFN0QsU0FBUyxDQUFDNE8sTUFwRUc7O0FBcUV4QjtBQUNBOUssRUFBQUEsYUFBYSxFQUFFOUQsU0FBUyxDQUFDNk8sSUF0RUQ7O0FBdUV4QjtBQUNBOUssRUFBQUEsb0JBQW9CLEVBQUUvRCxTQUFTLENBQUM2TztBQXhFUixDQUExQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnXG5pbXBvcnQgeyBjb3JlIH0gZnJvbSAnc2NyaXB0dXJlLXJlc291cmNlcy1yY2wnXG5pbXBvcnQgdXNmbWpzIGZyb20gJ3VzZm0tanMnXG5pbXBvcnQgeyB1c2VFZGl0IH0gZnJvbSAnZ2l0ZWEtcmVhY3QtdG9vbGtpdCdcbmltcG9ydCB7XG4gIENhcmQsXG4gIHVzZUNhcmRTdGF0ZSxcbiAgdXNlVXNlckJyYW5jaCxcbiAgRVJST1JfU1RBVEUsXG4gIE1BTklGRVNUX05PVF9MT0FERURfRVJST1IsXG59IGZyb20gJ3RyYW5zbGF0aW9uLWhlbHBzLXJjbCdcbmltcG9ydCB7IEFsaWdubWVudEhlbHBlcnMsIFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMgfSBmcm9tICd3b3JkLWFsaWduZXItcmNsJ1xuaW1wb3J0ICogYXMgaXNFcXVhbCBmcm9tICdkZWVwLWVxdWFsJ1xuaW1wb3J0IHsgU2NyaXB0dXJlUGFuZSwgU2NyaXB0dXJlU2VsZWN0b3IgfSBmcm9tICcuLidcbmltcG9ydCB7IHVzZVNjcmlwdHVyZVNldHRpbmdzIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlU2NyaXB0dXJlU2V0dGluZ3MnXG5pbXBvcnQge1xuICBnZXRSZXNvdXJjZUxpbmssXG4gIGdldFJlc291cmNlTWVzc2FnZSxcbiAgZ2V0U2NyaXB0dXJlVmVyc2lvblNldHRpbmdzLFxuICBpc09yaWdpbmFsQmlibGUsXG59IGZyb20gJy4uLy4uL3V0aWxzL1NjcmlwdHVyZVNldHRpbmdzJ1xuaW1wb3J0IHsgVGl0bGUgfSBmcm9tICcuLi9TY3JpcHR1cmVQYW5lL3N0eWxlZCdcbmltcG9ydCB7XG4gIE5UX09SSUdfTEFORyxcbiAgT1JJR0lOQUxfU09VUkNFLFxuICBPVF9PUklHX0xBTkcsXG59IGZyb20gJy4uLy4uL3V0aWxzJ1xuXG5jb25zdCBLRVlfRk9OVF9TSVpFX0JBU0UgPSAnc2NyaXB0dXJlUGFuZUZvbnRTaXplXydcbmNvbnN0IGxhYmVsID0gJ1ZlcnNpb24nXG5jb25zdCBzdHlsZSA9IHsgbWFyZ2luVG9wOiAnMTZweCcsIHdpZHRoOiAnNTAwcHgnIH1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU2NyaXB0dXJlQ2FyZCh7XG4gIGlkLFxuICBpc05ULFxuICB0aXRsZSxcbiAgc2VydmVyLFxuICBhcHBSZWYsXG4gIGNhcmROdW0sXG4gIGNsYXNzZXMsXG4gIHJlc291cmNlOiB7XG4gICAgb3duZXIsXG4gICAgbGFuZ3VhZ2VJZCxcbiAgICByZXNvdXJjZUlkLFxuICAgIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcixcbiAgfSxcbiAgZ2V0TGFuZ3VhZ2UsXG4gIHJlZmVyZW5jZToge1xuICAgIHZlcnNlLFxuICAgIGNoYXB0ZXIsXG4gICAgcHJvamVjdElkOiBib29rSWQsXG4gIH0sXG4gIHJlc291cmNlTGluayxcbiAgdXNlVXNlckxvY2FsU3RvcmFnZSxcbiAgZGlzYWJsZVdvcmRQb3BvdmVyLFxuICBvblJlc291cmNlRXJyb3IsXG4gIGh0dHBDb25maWcsXG4gIGdyZWVrUmVwb1VybCxcbiAgaGVicmV3UmVwb1VybCxcbiAgZ2V0TGV4aWNvbkRhdGEsXG4gIGZldGNoR2xvc3Nlc0ZvclZlcnNlLFxuICB0cmFuc2xhdGUsXG4gIG9uTWluaW1pemUsXG4gIGxvZ2dlZEluVXNlcixcbiAgYXV0aGVudGljYXRpb24sXG4gIHNldFNhdmVkQ2hhbmdlcyxcbiAgYm9va0luZGV4LFxuICBhZGRWZXJzZVJhbmdlLFxuICBzZXRXb3JkQWxpZ25lclN0YXR1cyxcbn0pIHtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV9dID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIGhhdmVVbnNhdmVkQ2hhbmdlczogZmFsc2UsXG4gICAgcmVmOiBhcHBSZWYsXG4gICAgc2F2ZUNvbnRlbnQ6IG51bGwsXG4gICAgc2hhOiBudWxsLFxuICAgIHN0YXJ0U2F2ZTogZmFsc2UsXG4gICAgdXJsRXJyb3I6IG51bGwsXG4gICAgdXNpbmdVc2VyQnJhbmNoOiBmYWxzZSxcbiAgICB1bnNhdmVkQ2hhbmdlc0xpc3Q6IHt9LFxuICAgIHZlcnNlc0ZvclJlZjogbnVsbCxcbiAgfSlcbiAgY29uc3Qge1xuICAgIHJlZixcbiAgICBzYXZlQ29udGVudCxcbiAgICBzaGEsXG4gICAgc3RhcnRTYXZlLFxuICAgIHVybEVycm9yLFxuICAgIHVzaW5nVXNlckJyYW5jaCxcbiAgICB1bnNhdmVkQ2hhbmdlc0xpc3QsXG4gICAgaGF2ZVVuc2F2ZWRDaGFuZ2VzLFxuICAgIHZlcnNlc0ZvclJlZixcbiAgfSA9IHN0YXRlXG5cbiAgY29uc3QgW2ZvbnRTaXplLCBzZXRGb250U2l6ZV0gPSB1c2VVc2VyTG9jYWxTdG9yYWdlKEtFWV9GT05UX1NJWkVfQkFTRSArIGNhcmROdW0sIDEwMClcbiAgY29uc3QgaXNOVF8gPSBpc05UKGJvb2tJZClcblxuICBmdW5jdGlvbiBzZXRTdGF0ZShuZXdTdGF0ZSkge1xuICAgIHNldFN0YXRlXyhwcmV2U3RhdGUgPT4gKHsgLi4ucHJldlN0YXRlLCAuLi5uZXdTdGF0ZSB9KSlcbiAgfVxuXG4gIGlmICh1c2luZ1VzZXJCcmFuY2gpIHtcbiAgICBodHRwQ29uZmlnID0geyAuLi5odHRwQ29uZmlnLCBjYWNoZTogeyBtYXhBZ2U6IDAgfSB9IC8vIGRpc2FibGUgaHR0cCBjYWNoaW5nXG4gIH1cblxuICBjb25zdCB7XG4gICAgaXNOZXdUZXN0YW1lbnQsXG4gICAgc2NyaXB0dXJlQ29uZmlnLFxuICAgIHNldFNjcmlwdHVyZSxcbiAgICBzY3JpcHR1cmVTZXR0aW5ncyxcbiAgICBzY3JpcHR1cmVWZXJzaW9uSGlzdCxcbiAgfSA9IHVzZVNjcmlwdHVyZVNldHRpbmdzKHtcbiAgICBpc05ULFxuICAgIHRpdGxlLFxuICAgIHZlcnNlLFxuICAgIG93bmVyLFxuICAgIGJvb2tJZCxcbiAgICBhcHBSZWY6IHJlZixcbiAgICBzZXJ2ZXIsXG4gICAgY2FyZE51bSxcbiAgICBjaGFwdGVyLFxuICAgIGxhbmd1YWdlSWQsXG4gICAgcmVzb3VyY2VJZCxcbiAgICByZXNvdXJjZUxpbmssXG4gICAgdXNlVXNlckxvY2FsU3RvcmFnZSxcbiAgICBkaXNhYmxlV29yZFBvcG92ZXIsXG4gICAgb3JpZ2luYWxMYW5ndWFnZU93bmVyLFxuICAgIHNldFVybEVycm9yOiAoZXJyb3IpID0+IHNldFN0YXRlKHsgdXJsRXJyb3I6IGVycm9yIH0pLFxuICAgIGh0dHBDb25maWcsXG4gICAgZ3JlZWtSZXBvVXJsLFxuICAgIGhlYnJld1JlcG9VcmwsXG4gICAgd2hvbGVCb29rOiB0cnVlLFxuICB9KVxuXG4gIGNvbnN0IGZldGNoUmVzcF8gPSBzY3JpcHR1cmVDb25maWc/LmZldGNoUmVzcG9uc2VcbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCByZXBvID0gYCR7c2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ubGFuZ3VhZ2VJZH1fJHtzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5wcm9qZWN0SWR9YFxuICBjb25zdCByZWZlcmVuY2VfID0gc2NyaXB0dXJlQ29uZmlnPy5yZWZlcmVuY2UgfHwgbnVsbFxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIGdldCB0aGUgX3NoYSBmcm9tIGxhc3Qgc2NyaXB0dXJlIGRvd25sb2FkXG4gICAgY29uc3QgX3NoYSA9IGZldGNoUmVzcF8/LmRhdGE/LnNoYSB8fCBudWxsXG4gICAgY29uc29sZS5sb2coYGZvciAke0pTT04uc3RyaW5naWZ5KHJlZmVyZW5jZV8pfSBuZXcgc2hhIGlzICR7X3NoYX1gKVxuXG4gICAgaWYgKF9zaGEgIT09IHNoYSkge1xuICAgICAgc2V0U3RhdGUoeyBzaGE6IF9zaGEgfSlcbiAgICB9XG4gIH0sIFtmZXRjaFJlc3BfXSlcblxuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IGNhcmRSZXNvdXJjZUlkID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ucHJvamVjdElkIHx8IHJlc291cmNlSWRcbiAgLy8gQHRzLWlnbm9yZVxuICBsZXQgcmVmXyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/LnJlZiB8fCBhcHBSZWZcbiAgY29uc3QgY2FuVXNlRWRpdEJyYW5jaCA9IGxvZ2dlZEluVXNlciAmJiBhdXRoZW50aWNhdGlvbiAmJlxuICAgIChyZXNvdXJjZUlkICE9PSBPUklHSU5BTF9TT1VSQ0UpICYmXG4gICAgKChyZWZfID09PSAnbWFzdGVyJykgfHwgKHJlZl8uc3Vic3RyaW5nKDAsIGxvZ2dlZEluVXNlci5sZW5ndGgpID09PSBsb2dnZWRJblVzZXIpICkgLy8gbm90IHRhZ1xuXG4gIGNvbnN0IHtcbiAgICBzdGF0ZTogeyB3b3JraW5nUmVzb3VyY2VCcmFuY2gsIHVzaW5nVXNlckJyYW5jaDogdXNpbmdVc2VyQnJhbmNoXyB9LFxuICAgIGFjdGlvbnM6IHsgc3RhcnRFZGl0OiBzdGFydEVkaXRCcmFuY2ggfSxcbiAgfSA9IHVzZVVzZXJCcmFuY2goe1xuICAgIG93bmVyLFxuICAgIHNlcnZlcixcbiAgICBhcHBSZWYsXG4gICAgbGFuZ3VhZ2VJZCxcbiAgICBjYXJkSWQ6IGlkLFxuICAgIGxvZ2dlZEluVXNlcjogY2FuVXNlRWRpdEJyYW5jaCA/IGxvZ2dlZEluVXNlciA6IG51bGwsXG4gICAgYXV0aGVudGljYXRpb246IGNhblVzZUVkaXRCcmFuY2ggPyBhdXRoZW50aWNhdGlvbiA6IG51bGwsXG4gICAgY2FyZFJlc291cmNlSWQsXG4gICAgb25SZXNvdXJjZUVycm9yLFxuICAgIHVzZVVzZXJMb2NhbFN0b3JhZ2UsXG4gIH0pXG5cbiAgY29uc3Qgd29ya2luZ1JlZiA9IGNhblVzZUVkaXRCcmFuY2ggPyB3b3JraW5nUmVzb3VyY2VCcmFuY2ggOiBhcHBSZWZcbiAgbGV0IHNjcmlwdHVyZVRpdGxlXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gc2VsZWN0IGNvcnJlY3Qgd29ya2luZyByZWYgLSBjb3VsZCBiZSBtYXN0ZXIsIHVzZXIgYnJhbmNoLCBvciByZWxlYXNlXG4gICAgaWYgKHVzaW5nVXNlckJyYW5jaF8gIT09IHVzaW5nVXNlckJyYW5jaCkge1xuICAgICAgc2V0U3RhdGUoeyB1c2luZ1VzZXJCcmFuY2g6IHVzaW5nVXNlckJyYW5jaF8gfSlcbiAgICB9XG4gIH0sIFt1c2luZ1VzZXJCcmFuY2hfLCB1c2luZ1VzZXJCcmFuY2hdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHNlbGVjdCBjb3JyZWN0IHdvcmtpbmcgcmVmIC0gY291bGQgYmUgbWFzdGVyLCB1c2VyIGJyYW5jaCwgb3IgcmVsZWFzZVxuICAgIGxldCB3b3JraW5nUmVmXyA9IHdvcmtpbmdSZWYgfHwgYXBwUmVmXG5cbiAgICBpZiAocmVmICE9PSB3b3JraW5nUmVmXykge1xuICAgICAgc2V0U3RhdGUoeyByZWY6IHdvcmtpbmdSZWZfIH0pXG4gICAgfVxuICB9LCBbd29ya2luZ1JlZiwgcmVmLCBhcHBSZWZdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHVwZGF0ZSBkaXNwbGF5IHN0YXR1cyBpZiBlcnJvclxuICAgIGNvbnN0IGVycm9yID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZVN0YXR1cz8uW0VSUk9SX1NUQVRFXVxuXG4gICAgaWYgKGVycm9yKSB7IC8vIGlmIGVycm9yIHdhcyBmb3VuZCBkbyBjYWxsYmFja1xuICAgICAgY29uc3QgcmVzb3VyY2VTdGF0dXMgPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlU3RhdHVzXG4gICAgICBjb25zdCByZXNvdXJjZUxpbmsgPSBnZXRSZXNvdXJjZUxpbmsoc2NyaXB0dXJlQ29uZmlnKVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGdldFJlc291cmNlTWVzc2FnZShyZXNvdXJjZVN0YXR1cywgc2VydmVyLCByZXNvdXJjZUxpbmssIGlzTlRfKVxuICAgICAgY29uc3QgaXNBY2Nlc3NFcnJvciA9IHJlc291cmNlU3RhdHVzW01BTklGRVNUX05PVF9MT0FERURfRVJST1JdXG4gICAgICBvblJlc291cmNlRXJyb3IgJiYgb25SZXNvdXJjZUVycm9yKG1lc3NhZ2UsIGlzQWNjZXNzRXJyb3IsIHJlc291cmNlU3RhdHVzKVxuICAgIH1cbiAgfSwgW3NjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2VTdGF0dXM/LltFUlJPUl9TVEFURV1dKVxuXG4gIGlmIChzY3JpcHR1cmVDb25maWcudGl0bGUgJiYgc2NyaXB0dXJlQ29uZmlnLnZlcnNpb24pIHtcbiAgICBzY3JpcHR1cmVUaXRsZSA9IGAke3NjcmlwdHVyZUNvbmZpZy50aXRsZX0gdiR7c2NyaXB0dXJlQ29uZmlnLnZlcnNpb259YFxuICAgIHNjcmlwdHVyZVZlcnNpb25IaXN0LnVwZGF0ZVRpdGxlKHNjcmlwdHVyZUNvbmZpZy5yZXNvdXJjZUxpbmssIHNjcmlwdHVyZVRpdGxlKVxuICB9IGVsc2Uge1xuICAgIHNjcmlwdHVyZVRpdGxlID0gYFRpdGxlIG1pc3NpbmcgZnJvbSBwcm9qZWN0IG1hbmlmZXN0YFxuICB9XG5cbiAgLyoqIER5bmFtaWNhbGx5IGNyZWF0ZXMgdGhlIHNjcmlwdHVyZSBzZWxlY3Rpb24gZHJvcGRvd24gdG8gYmUgaW5zZXJ0ZWQgaW50byBjYXJkIHNldHRpbmdzICovXG4gIGZ1bmN0aW9uIGdldFNjcmlwdHVyZVNlbGVjdG9yKCkge1xuICAgIGNvbnN0IHNjcmlwdHVyZVNlbGVjdGlvbkNvbmZpZyA9IGdldFNjcmlwdHVyZVZlcnNpb25TZXR0aW5ncyh7XG4gICAgICBsYWJlbCxcbiAgICAgIHJlc291cmNlTGluazogc2NyaXB0dXJlQ29uZmlnLnJlc291cmNlTGluayxcbiAgICAgIHNldFNjcmlwdHVyZSxcbiAgICAgIHNjcmlwdHVyZVZlcnNpb25IaXN0LFxuICAgIH0pXG5cbiAgICByZXR1cm4gPFNjcmlwdHVyZVNlbGVjdG9yIHsuLi5zY3JpcHR1cmVTZWxlY3Rpb25Db25maWd9IHN0eWxlPXtzdHlsZX0gZXJyb3JNZXNzYWdlPXt1cmxFcnJvcn0gLz5cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTWVudUNsb3NlKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKGBvbk1lbnVDbG9zZSgpYClcbiAgICBzZXRTdGF0ZSh7IHVybEVycm9yOiBudWxsIH0pXG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IGxhbmd1YWdlSWRfID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ubGFuZ3VhZ2VJZFxuICBjb25zdCBsYW5ndWFnZSA9IGdldExhbmd1YWdlKHsgbGFuZ3VhZ2VJZDogbGFuZ3VhZ2VJZF8gfSlcbiAgY29uc3QgZGlyZWN0aW9uID0gKGxhbmd1YWdlPy5kaXJlY3Rpb24pIHx8ICdsdHInXG4gIGNvbnN0IHJlZmVyZW5jZSA9IHsgLi4uc2NyaXB0dXJlQ29uZmlnLnJlZmVyZW5jZSB9XG5cbiAgY29uc3QgaXNIZWJyZXcgPSAobGFuZ3VhZ2VJZF8gPT09ICdoYm8nKVxuICBjb25zdCBmb250RmFjdG9yID0gaXNIZWJyZXcgPyAxLjQgOiAxIC8vIHdlIGF1dG9tYXRpY2FsbHkgc2NhbGUgdXAgZm9udCBzaXplIGZvciBIZWJyZXdcbiAgY29uc3Qgc2NhbGVkRm9udFNpemUgPSBmb250U2l6ZSAqIGZvbnRGYWN0b3JcblxuICBjb25zdCBpdGVtcyA9IG51bGxcbiAgY29uc3Qge1xuICAgIHN0YXRlOiB7XG4gICAgICBoZWFkZXJzLCBmaWx0ZXJzLCBpdGVtSW5kZXgsIG1hcmtkb3duVmlldyxcbiAgICB9LFxuICAgIGFjdGlvbnM6IHtcbiAgICAgIHNldEZpbHRlcnMsIHNldEl0ZW1JbmRleCwgc2V0TWFya2Rvd25WaWV3LFxuICAgIH0sXG4gIH0gPSB1c2VDYXJkU3RhdGUoeyBpdGVtcyB9KVxuXG4gIGNvbnN0IHJlZlN0eWxlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIGZvbnRGYW1pbHk6ICdOb3RvIFNhbnMnLFxuICAgIGZvbnRTaXplOiBgJHtNYXRoLnJvdW5kKHNjYWxlZEZvbnRTaXplICogMC45KX0lYCxcbiAgfSksIFtzY2FsZWRGb250U2l6ZV0pXG5cbiAgY29uc3QgY29udGVudFN0eWxlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIGZvbnRGYW1pbHk6ICdOb3RvIFNhbnMnLFxuICAgIGZvbnRTaXplOiBgJHtzY2FsZWRGb250U2l6ZX0lYCxcbiAgfSksIFtzY2FsZWRGb250U2l6ZV0pXG5cbiAgY29uc3Qgc2NyaXB0dXJlTGFiZWwgPSA8VGl0bGU+e3NjcmlwdHVyZVRpdGxlfTwvVGl0bGU+XG4gIGxldCBkaXNhYmxlV29yZFBvcG92ZXJfID0gZGlzYWJsZVdvcmRQb3BvdmVyXG4gIGNvbnN0IHVzaW5nT3JpZ2luYWxCaWJsZSA9IGlzT3JpZ2luYWxCaWJsZShzY3JpcHR1cmVDb25maWdbJ3Jlc291cmNlJ10/LnByb2plY3RJZClcblxuICBpZiAoZGlzYWJsZVdvcmRQb3BvdmVyID09PSB1bmRlZmluZWQpIHsgLy8gaWYgbm90IHNwZWNpZmllZCwgdGhlbiBkZXRlcm1pbmUgaWYgb3JpZ2luYWwgbGFuZ3VhZ2UgcmVzb3VyY2VcbiAgICBkaXNhYmxlV29yZFBvcG92ZXJfID0gIXVzaW5nT3JpZ2luYWxCaWJsZVxuICB9XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gcHJlLWNhY2hlIGdsb3NzZXMgb24gdmVyc2UgY2hhbmdlXG4gICAgY29uc3QgZmV0Y2hHbG9zc0RhdGFGb3JWZXJzZSA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxldCB2ZXJzZU9iamVjdHMgPSBbXVxuXG4gICAgICAvLyBnZXQgdmVyc2Ugb2JqZWN0cyBvZiBhbGwgdGhlIHZlcnNlc1xuICAgICAgZm9yIChjb25zdCB2ZXJzZVJlZiBvZiBzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZiB8fCBbXSkge1xuICAgICAgICBjb25zdCBfdmVyc2VPYmplY3RzID0gdmVyc2VSZWY/LnZlcnNlRGF0YT8udmVyc2VPYmplY3RzXG4gICAgICAgIHZlcnNlT2JqZWN0cyA9IHZlcnNlT2JqZWN0cy5jb25jYXQoX3ZlcnNlT2JqZWN0cylcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaXNhYmxlV29yZFBvcG92ZXIgJiYgdmVyc2VPYmplY3RzPy5sZW5ndGggJiYgZmV0Y2hHbG9zc2VzRm9yVmVyc2UpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgYXdhaXQgZmV0Y2hHbG9zc2VzRm9yVmVyc2UodmVyc2VPYmplY3RzLCBsYW5ndWFnZUlkXylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXNpbmdPcmlnaW5hbEJpYmxlKSB7XG4gICAgICBmZXRjaEdsb3NzRGF0YUZvclZlcnNlKClcbiAgICB9XG4gIH0sIFsgdmVyc2VzRm9yUmVmLCBsYW5ndWFnZUlkXyBdKVxuXG4gIGNvbnN0IGVuYWJsZUVkaXQgPSAhdXNpbmdPcmlnaW5hbEJpYmxlXG4gIGNvbnN0IGVuYWJsZUFsaWdubWVudCA9ICF1c2luZ09yaWdpbmFsQmlibGVcbiAgY29uc3Qgb3JpZ2luYWxSZXBvVXJsID0gaXNOZXdUZXN0YW1lbnQgPyBncmVla1JlcG9VcmwgOiBoZWJyZXdSZXBvVXJsXG4gIGNvbnN0IHNjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWcgPSB7XG4gICAgYXV0aGVudGljYXRpb246IGNhblVzZUVkaXRCcmFuY2ggPyBhdXRoZW50aWNhdGlvbiA6IG51bGwsXG4gICAgYm9va0luZGV4LFxuICAgIGN1cnJlbnRWZXJzZVJlZjogcmVmZXJlbmNlLFxuICAgIGVuYWJsZUVkaXQsXG4gICAgZW5hYmxlQWxpZ25tZW50LFxuICAgIGh0dHBDb25maWcsXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlzTmV3VGVzdGFtZW50LFxuICAgIGxvZ2dlZEluVXNlcjogY2FuVXNlRWRpdEJyYW5jaCA/IGxvZ2dlZEluVXNlciA6IG51bGwsXG4gICAgb3JpZ2luYWxMYW5ndWFnZU93bmVyLFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcmlnaW5hbFJlcG9VcmwsXG4gICAgc2NyaXB0dXJlQ29uZmlnLFxuICAgIHNjcmlwdHVyZVNldHRpbmdzLFxuICAgIHN0YXJ0RWRpdEJyYW5jaCxcbiAgICBzZXRTYXZlZENoYW5nZXM6IF9zZXRTYXZlZENoYW5nZXMsXG4gICAgc291cmNlTGFuZ3VhZ2U6IGlzTlRfID8gTlRfT1JJR19MQU5HIDogT1RfT1JJR19MQU5HLFxuICAgIHRhcmdldExhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICB0aXRsZTogc2NyaXB0dXJlVGl0bGUsXG4gICAgd29ya2luZ1Jlc291cmNlQnJhbmNoOiByZWYsXG4gIH1cblxuICAvKipcbiAgICogdGhpcyBnZXRzIGNhbGxlZCB3aGVuZXZlciBhIHNjcmlwdHVyZSBwYW5lIGhhcyBhIGNoYW5nZSBpbiBzYXZlIHN0YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50SW5kZXhcbiAgICogQHBhcmFtIHtib29sZWFufSBzYXZlZFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBnZXRDaGFuZ2VzIC0gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgdXNlciBjbGlja3Mgc2F2ZSBidXR0b25cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2xlYXJDaGFuZ2VzIC0gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgc2F2ZSBoYXMgY29tcGxldGVkXG4gICAqL1xuICBmdW5jdGlvbiBfc2V0U2F2ZWRDaGFuZ2VzKGN1cnJlbnRJbmRleCwgc2F2ZWQsIGdldENoYW5nZXMgPSBudWxsLCBjbGVhckNoYW5nZXMgPSBudWxsKSB7XG4gICAgY29uc3QgX3Vuc2F2ZWRDaGFuZ2VzTGlzdCA9IHsgLi4udW5zYXZlZENoYW5nZXNMaXN0IH1cblxuICAgIGlmIChzYXZlZCkge1xuICAgICAgaWYgKF91bnNhdmVkQ2hhbmdlc0xpc3QuaGFzT3duUHJvcGVydHkoY3VycmVudEluZGV4KSkge1xuICAgICAgICBkZWxldGUgX3Vuc2F2ZWRDaGFuZ2VzTGlzdFtjdXJyZW50SW5kZXhdXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghX3Vuc2F2ZWRDaGFuZ2VzTGlzdC5oYXNPd25Qcm9wZXJ0eShjdXJyZW50SW5kZXgpKSB7XG4gICAgICAgIF91bnNhdmVkQ2hhbmdlc0xpc3RbY3VycmVudEluZGV4XSA9IHsgZ2V0Q2hhbmdlcywgY2xlYXJDaGFuZ2VzIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBfaGF2ZVVuc2F2ZWRDaGFuZ2VzID0gISFPYmplY3Qua2V5cyhfdW5zYXZlZENoYW5nZXNMaXN0KS5sZW5ndGhcblxuICAgIGlmIChoYXZlVW5zYXZlZENoYW5nZXMgIT0gX2hhdmVVbnNhdmVkQ2hhbmdlcykge1xuICAgICAgc2V0U2F2ZWRDaGFuZ2VzICYmIHNldFNhdmVkQ2hhbmdlcyhyZXNvdXJjZUlkLCAhX2hhdmVVbnNhdmVkQ2hhbmdlcylcbiAgICAgIHNldFN0YXRlKHsgaGF2ZVVuc2F2ZWRDaGFuZ2VzOiBfaGF2ZVVuc2F2ZWRDaGFuZ2VzIH0pXG4gICAgfVxuXG4gICAgaWYgKCFpc0VxdWFsKF91bnNhdmVkQ2hhbmdlc0xpc3QsIHVuc2F2ZWRDaGFuZ2VzTGlzdCkpIHtcbiAgICAgIHNldFN0YXRlKHsgdW5zYXZlZENoYW5nZXNMaXN0OiBfdW5zYXZlZENoYW5nZXNMaXN0IH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNlYXJjaCBjaGFwdGVyIG9yIHZlcnNlIGNodW5rIHRvIGxpbmUgdGhhdCBzdGFydHMgd2l0aCBmaW5kSXRlbVxuICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGZpbmRJdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGNodW5rc1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZFJlZkluQXJyYXkoZmluZEl0ZW0sIGNodW5rcykge1xuICAgIGNvbnN0IHJlZl8gPSBmaW5kSXRlbSArICcnXG4gICAgY29uc3QgcmVmTGVuID0gcmVmXy5sZW5ndGhcbiAgICBjb25zdCBpbmRleCA9IGNodW5rcy5maW5kSW5kZXgoKGNodW5rLCBpZHgpID0+IHtcbiAgICAgIGlmIChpZHggPiAwKSB7XG4gICAgICAgIGlmIChjaHVuay5zdWJzdHJpbmcoMCwgcmVmTGVuKSA9PT0gcmVmXykge1xuICAgICAgICAgIGNvbnN0IG5leHRDaGFyID0gY2h1bmtbcmVmX11cblxuICAgICAgICAgIGlmICgobmV4dENoYXIgPiAnOScpIHx8IChuZXh0Q2hhciA8ICcwJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9KVxuICAgIHJldHVybiBpbmRleFxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Qm9va05hbWUoKSB7XG4gICAgY29uc3QgYm9va0NhcHMgPSBzY3JpcHR1cmVDb25maWc/LnJlZmVyZW5jZT8ucHJvamVjdElkID8gc2NyaXB0dXJlQ29uZmlnLnJlZmVyZW5jZS5wcm9qZWN0SWQudG9VcHBlckNhc2UoKSA6ICcnXG4gICAgcmV0dXJuIGAke2Jvb2tJbmRleH0tJHtib29rQ2Fwc30udXNmbWBcbiAgfVxuXG4gIGNvbnN0IGZpbGVwYXRoID0gZ2V0Qm9va05hbWUoKVxuXG4gIC8vIGtlZXAgdHJhY2sgb2YgdmVyc2UgZWRpdCBzdGF0ZVxuICBjb25zdCB7IG9uU2F2ZUVkaXQgfSA9IHVzZUVkaXQoe1xuICAgIHNoYSxcbiAgICBvd25lcixcbiAgICBjb250ZW50OiBzYXZlQ29udGVudCxcbiAgICBjb25maWc6IHtcbiAgICAgIGNhY2hlOiB7IG1heEFnZTogMCB9LFxuICAgICAgLi4uYXV0aGVudGljYXRpb24/LmNvbmZpZyxcbiAgICAgIHRva2VuOiBhdXRoZW50aWNhdGlvbj8udG9rZW4sXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aW1lb3V0OiBodHRwQ29uZmlnPy5zZXJ2ZXJUaW1lT3V0IHx8IGh0dHBDb25maWc/LnRpbWVvdXQgfHwgNTAwMCxcbiAgICB9LFxuICAgIGF1dGhvcjogbG9nZ2VkSW5Vc2VyLFxuICAgIHRva2VuOiBhdXRoZW50aWNhdGlvbj8udG9rZW4sXG4gICAgYnJhbmNoOiB3b3JraW5nUmVzb3VyY2VCcmFuY2gsXG4gICAgZmlsZXBhdGgsXG4gICAgcmVwbyxcbiAgfSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyB3aGVuIHN0YXJ0U2F2ZSBnb2VzIHRydWUsIHNhdmUgZWRpdHMgdG8gdXNlciBicmFuY2ggYW5kIHRoZW4gY2xlYXIgc3RhcnRTYXZlXG4gICAgY29uc3QgX3NhdmVFZGl0ID0gYXN5bmMgKCkgPT4geyAvLyBiZWdpbiB1cGxvYWRpbmcgbmV3IFVTRk1cbiAgICAgIGxldCBicmFuY2ggPSAod29ya2luZ1Jlc291cmNlQnJhbmNoICE9PSAnbWFzdGVyJykgPyB3b3JraW5nUmVzb3VyY2VCcmFuY2ggOiB1bmRlZmluZWRcblxuICAgICAgaWYgKCFicmFuY2gpIHtcbiAgICAgICAgYnJhbmNoID0gYXdhaXQgc3RhcnRFZGl0QnJhbmNoKCkgLy8gbWFrZSBzdXJlIHVzZXIgYnJhbmNoIGV4aXN0cyBhbmQgZ2V0IG5hbWVcbiAgICAgIH1cblxuICAgICAgYXdhaXQgb25TYXZlRWRpdChicmFuY2gpLnRoZW4oKHN1Y2Nlc3MpID0+IHsgLy8gcHVzaCBjaGFuZ2VkIHRvIHNlcnZlclxuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIHNhdmUgc2NyaXB0dXJlIGVkaXRzIHN1Y2Nlc3NgKVxuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIHN0YXJ0U2F2ZTogZmFsc2UsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IHVuc2F2ZWRDYXJkSW5kaWNlcyA9IE9iamVjdC5rZXlzKHVuc2F2ZWRDaGFuZ2VzTGlzdClcblxuICAgICAgICAgIGlmICh1bnNhdmVkQ2FyZEluZGljZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYXJkSW5kZXggb2YgdW5zYXZlZENhcmRJbmRpY2VzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgY2xlYXJDaGFuZ2VzIH0gPSB1bnNhdmVkQ2hhbmdlc0xpc3RbY2FyZEluZGV4XVxuICAgICAgICAgICAgICBjbGVhckNoYW5nZXMgJiYgY2xlYXJDaGFuZ2VzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zb2xlLmluZm8oJ3NhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gUmVsb2FkaW5nIHJlc291cmNlJylcbiAgICAgICAgICBzY3JpcHR1cmVDb25maWc/LnJlbG9hZFJlc291cmNlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIHNhdmluZyBjaGFuZ2VkIHNjcmlwdHVyZSBmYWlsZWQnKVxuICAgICAgICAgIHNldFN0YXRlKHsgc3RhcnRTYXZlOiBmYWxzZSB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChzdGFydFNhdmUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQgLSBjYWxsaW5nIF9zYXZlRWRpdCgpYClcbiAgICAgIF9zYXZlRWRpdCgpXG4gICAgfVxuICB9LCBbc3RhcnRTYXZlXSlcblxuXG4gIC8qKlxuICAgKiBmb3IgZWFjaCB1bnNhdmVkIGNoYW5nZSwgY2FsbCBpbnRvIHZlcnNlUGFuZSB0byBnZXQgbGF0ZXN0IGNoYW5nZXMgZm9yIHZlcnNlIHRvIHNhdmVcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVDaGFuZ2VzVG9DbG91ZCgpIHtcbiAgICBjb25zdCB1bnNhdmVkQ2FyZEluZGljZXMgPSBPYmplY3Qua2V5cyh1bnNhdmVkQ2hhbmdlc0xpc3QpXG5cbiAgICBpZiAodW5zYXZlZENhcmRJbmRpY2VzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsVXNmbSA9IGNvcmUuZ2V0UmVzcG9uc2VEYXRhKHNjcmlwdHVyZUNvbmZpZz8uZmV0Y2hSZXNwb25zZSlcbiAgICAgIGxldCB1cGRhdGVkQmlibGVVc2ZtID0gb3JpZ2luYWxVc2ZtXG5cbiAgICAgIGZvciAoY29uc3QgY2FyZEluZGV4IG9mIHVuc2F2ZWRDYXJkSW5kaWNlcykge1xuICAgICAgICBjb25zdCBjYXJkTnVtID0gcGFyc2VJbnQoY2FyZEluZGV4KVxuICAgICAgICBjb25zdCB7IGdldENoYW5nZXMgfSA9IHVuc2F2ZWRDaGFuZ2VzTGlzdFtjYXJkTnVtXVxuXG4gICAgICAgIGlmIChnZXRDaGFuZ2VzKSB7XG4gICAgICAgICAgbGV0IG5ld1VzZm1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBuZXdWZXJzZVRleHQsXG4gICAgICAgICAgICByZWYsXG4gICAgICAgICAgICB1cGRhdGVkVmVyc2VPYmplY3RzLFxuICAgICAgICAgIH0gPSBnZXRDaGFuZ2VzKClcblxuICAgICAgICAgIGlmICh1cGRhdGVkVmVyc2VPYmplY3RzICYmIHVwZGF0ZWRCaWJsZVVzZm0pIHsgLy8ganVzdCByZXBsYWNlIHZlcnNlXG4gICAgICAgICAgICBjb25zdCBjaGFwdGVyQ2h1bmtzID0gdXBkYXRlZEJpYmxlVXNmbT8uc3BsaXQoJ1xcXFxjICcpXG4gICAgICAgICAgICBjb25zdCBjaGFwdGVySW5kZXggPSBmaW5kUmVmSW5BcnJheShyZWY/LmNoYXB0ZXIsIGNoYXB0ZXJDaHVua3MpXG5cbiAgICAgICAgICAgIGlmIChjaGFwdGVySW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhcHRlciA9IGNoYXB0ZXJDaHVua3NbY2hhcHRlckluZGV4XVxuICAgICAgICAgICAgICBjb25zdCB2ZXJzZUNodW5rcyA9IGN1cnJlbnRDaGFwdGVyLnNwbGl0KCdcXFxcdiAnKVxuICAgICAgICAgICAgICBjb25zdCB2ZXJzZUluZGV4ID0gZmluZFJlZkluQXJyYXkocmVmPy52ZXJzZSwgdmVyc2VDaHVua3MpXG5cbiAgICAgICAgICAgICAgaWYgKHZlcnNlSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZlcnNlVXNmbSA9IFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMuY29udmVydFZlcnNlRGF0YVRvVVNGTSh1cGRhdGVkVmVyc2VPYmplY3RzKVxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZlcnNlID0gdmVyc2VDaHVua3NbdmVyc2VJbmRleF1cbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzZU51bUxlbiA9IChyZWY/LnZlcnNlICsgJycpLmxlbmd0aFxuICAgICAgICAgICAgICAgIHZlcnNlQ2h1bmtzW3ZlcnNlSW5kZXhdID0gb2xkVmVyc2Uuc3Vic3RyaW5nKDAsIHZlcnNlTnVtTGVuICsgMSkgKyBuZXdWZXJzZVVzZm1cbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDaGFwdGVyID0gdmVyc2VDaHVua3Muam9pbignXFxcXHYgJylcbiAgICAgICAgICAgICAgICBjaGFwdGVyQ2h1bmtzW2NoYXB0ZXJJbmRleF0gPSBuZXdDaGFwdGVyXG4gICAgICAgICAgICAgICAgbmV3VXNmbSA9IGNoYXB0ZXJDaHVua3Muam9pbignXFxcXGMgJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1cGRhdGVkVmVyc2VPYmplY3RzICYmICFuZXdVc2ZtKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IG51bGxcblxuICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICBpZiAobmV3VmVyc2VUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB0YXJnZXRWZXJzZU9iamVjdHMgfSA9IEFsaWdubWVudEhlbHBlcnMudXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UodXBkYXRlZFZlcnNlT2JqZWN0cywgbmV3VmVyc2VUZXh0KVxuICAgICAgICAgICAgICAgIHRhcmdldFZlcnNlT2JqZWN0c18gPSB0YXJnZXRWZXJzZU9iamVjdHNcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRWZXJzZU9iamVjdHNfID0gdXBkYXRlZFZlcnNlT2JqZWN0c1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0Jvb2tKc29uID0gdGFyZ2V0VmVyc2VPYmplY3RzXyAmJiBzY3JpcHR1cmVDb25maWc/LnVwZGF0ZVZlcnNlKHJlZi5jaGFwdGVyLCByZWYudmVyc2UsIHsgdmVyc2VPYmplY3RzOiB0YXJnZXRWZXJzZU9iamVjdHNfIH0pXG4gICAgICAgICAgICB1cGRhdGVkQmlibGVVc2ZtID0gdXNmbWpzLnRvVVNGTShuZXdCb29rSnNvbiwgeyBmb3JjZWROZXdMaW5lczogdHJ1ZSB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZXdVc2ZtKSB7XG4gICAgICAgICAgICB1cGRhdGVkQmlibGVVc2ZtID0gbmV3VXNmbVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBzYXZpbmcgbmV3IFVTRk06ICR7dXBkYXRlZEJpYmxlVXNmbS5zdWJzdHJpbmcoMCwgMTAwKX0uLi5gKVxuICAgICAgc2V0U3RhdGUoeyBzYXZlQ29udGVudDogdXBkYXRlZEJpYmxlVXNmbSwgc3RhcnRTYXZlOiB0cnVlIH0pXG4gICAgfVxuICB9XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzRXF1YWwodmVyc2VzRm9yUmVmLCBzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZikpIHtcbiAgICAgIGNvbnN0IHZlcnNlc0ZvclJlZiA9IHNjcmlwdHVyZUNvbmZpZz8udmVyc2VzRm9yUmVmXG4gICAgICBzZXRTdGF0ZSh7IHZlcnNlc0ZvclJlZiB9KVxuXG4gICAgICBmb3IgKGNvbnN0IHZlcnNlUmVmIG9mIHZlcnNlc0ZvclJlZiB8fCBbXSkge1xuICAgICAgICAvLyBjaGVjayBmb3IgdmVyc2UgcmFuZ2VcbiAgICAgICAgY29uc3QgX3ZlcnNlID0gdmVyc2VSZWYudmVyc2VcblxuICAgICAgICBpZiAoYWRkVmVyc2VSYW5nZSAmJiAodHlwZW9mIF92ZXJzZSA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGlmIChfdmVyc2UuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICAgICAgYWRkVmVyc2VSYW5nZShgJHtzY3JpcHR1cmVDb25maWc/LnJlZmVyZW5jZT8uY2hhcHRlcn06JHtfdmVyc2V9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIFtzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZl0pXG5cbiAgY29uc3QgcmVuZGVyZWRTY3JpcHR1cmVQYW5lcyA9IHZlcnNlc0ZvclJlZj8ubWFwKChfY3VycmVudFZlcnNlRGF0YSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpbml0aWFsVmVyc2VPYmplY3RzID0gX2N1cnJlbnRWZXJzZURhdGE/LnZlcnNlRGF0YT8udmVyc2VPYmplY3RzIHx8IG51bGxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgeyBjaGFwdGVyLCB2ZXJzZSB9ID0gX2N1cnJlbnRWZXJzZURhdGEgfHwge31cbiAgICBjb25zdCBfcmVmZXJlbmNlID0ge1xuICAgICAgLi4ucmVmZXJlbmNlLFxuICAgICAgY2hhcHRlcixcbiAgICAgIHZlcnNlLFxuICAgIH1cbiAgICBjb25zdCBfc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZyA9IHtcbiAgICAgIC4uLnNjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWcsXG4gICAgICBjdXJyZW50SW5kZXg6IGluZGV4LFxuICAgICAgaW5pdGlhbFZlcnNlT2JqZWN0cyxcbiAgICAgIHJlZmVyZW5jZTogX3JlZmVyZW5jZSxcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFNjcmlwdHVyZVBhbmVcbiAgICAgICAgey4uLnNjcmlwdHVyZUNvbmZpZ31cbiAgICAgICAgY29udGVudFN0eWxlPXtjb250ZW50U3R5bGV9XG4gICAgICAgIGN1cnJlbnRJbmRleD17aW5kZXh9XG4gICAgICAgIGRpcmVjdGlvbj17ZGlyZWN0aW9ufVxuICAgICAgICBkaXNhYmxlV29yZFBvcG92ZXI9e2Rpc2FibGVXb3JkUG9wb3Zlcl99XG4gICAgICAgIGZvbnRTaXplPXtmb250U2l6ZX1cbiAgICAgICAgZ2V0TGV4aWNvbkRhdGE9e2dldExleGljb25EYXRhfVxuICAgICAgICBpc05UPXtpc05UX31cbiAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgcmVmU3R5bGU9e3JlZlN0eWxlfVxuICAgICAgICByZWZlcmVuY2U9e19yZWZlcmVuY2V9XG4gICAgICAgIHNhdmluZz17c3RhcnRTYXZlfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHNjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWc9e19zY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnfVxuICAgICAgICBzZXRXb3JkQWxpZ25lclN0YXR1cz17c2V0V29yZEFsaWduZXJTdGF0dXN9XG4gICAgICAgIHNlcnZlcj17c2VydmVyfVxuICAgICAgICB0cmFuc2xhdGU9e3RyYW5zbGF0ZX1cbiAgICAgIC8+XG4gICAgKVxuICB9KVxuXG4gIHJldHVybiAoXG4gICAgPENhcmRcbiAgICAgIGlkPXtgc2NyaXB0dXJlX2NhcmRfJHtjYXJkTnVtfWB9XG4gICAgICB0aXRsZT17c2NyaXB0dXJlTGFiZWx9XG4gICAgICBzZXR0aW5nc1RpdGxlPXtzY3JpcHR1cmVUaXRsZSArICcgU2V0dGluZ3MnfVxuICAgICAgaXRlbXM9e2l0ZW1zfVxuICAgICAgY2xhc3Nlcz17Y2xhc3Nlc31cbiAgICAgIGhlYWRlcnM9e2hlYWRlcnN9XG4gICAgICBmaWx0ZXJzPXtmaWx0ZXJzfVxuICAgICAgZm9udFNpemU9e2ZvbnRTaXplfVxuICAgICAgaXRlbUluZGV4PXtpdGVtSW5kZXh9XG4gICAgICBzZXRGaWx0ZXJzPXtzZXRGaWx0ZXJzfVxuICAgICAgc2V0Rm9udFNpemU9e3NldEZvbnRTaXplfVxuICAgICAgc2V0SXRlbUluZGV4PXtzZXRJdGVtSW5kZXh9XG4gICAgICBtYXJrZG93blZpZXc9e21hcmtkb3duVmlld31cbiAgICAgIHNldE1hcmtkb3duVmlldz17c2V0TWFya2Rvd25WaWV3fVxuICAgICAgZ2V0Q3VzdG9tQ29tcG9uZW50PXtnZXRTY3JpcHR1cmVTZWxlY3Rvcn1cbiAgICAgIGhpZGVNYXJrZG93blRvZ2dsZVxuICAgICAgb25NZW51Q2xvc2U9e29uTWVudUNsb3NlfVxuICAgICAgb25NaW5pbWl6ZT17b25NaW5pbWl6ZSA/ICgpID0+IG9uTWluaW1pemUoaWQpIDogbnVsbH1cbiAgICAgIGVkaXRhYmxlPXtlbmFibGVFZGl0IHx8IGVuYWJsZUFsaWdubWVudH1cbiAgICAgIHNhdmVkPXtzdGFydFNhdmUgfHwgIWhhdmVVbnNhdmVkQ2hhbmdlc31cbiAgICAgIG9uU2F2ZUVkaXQ9e3NhdmVDaGFuZ2VzVG9DbG91ZH1cbiAgICA+XG4gICAgICA8ZGl2IGlkPVwic2NyaXB0dXJlLXBhbmUtbGlzdFwiPlxuICAgICAgICB7cmVuZGVyZWRTY3JpcHR1cmVQYW5lc31cbiAgICAgIDwvZGl2PlxuICAgIDwvQ2FyZD5cbiAgKVxufVxuXG5TY3JpcHR1cmVDYXJkLnByb3BUeXBlcyA9IHtcbiAgLyoqIGh0bWwgaWRlbnRpZmllciB0byB1c2UgZm9yIGNhcmQgKi9cbiAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIE5UIG9yIE9UICovXG4gIGlzTlQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIC8qKiB0aXRsZSBmb3Igc2NyaXB0dXJlIGNhcmQgKi9cbiAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgLyoqIGdldCBsYW5ndWFnZSBkZXRhaWxzICovXG4gIGdldExhbmd1YWdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAvKiogc2NyaXB0dXJlIGNhcmQgbnVtYmVyICgwIHRvIDIgZm9yIGV4YW1wbGUpICovXG4gIGNhcmROdW06IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgLyoqIHJlc291cmNlIG9iamVjdCAqL1xuICByZXNvdXJjZTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAvKiogcmVzb3VyY2UgbGFuZ3VhZ2UgdG8gdXNlICovXG4gICAgbGFuZ3VhZ2VJZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIC8qKiByZXBvIG93bmVyIHN1Y2ggYXMgdW5mb2xkaW5nV29yZCAqL1xuICAgIG93bmVyOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIHJlc291cmNlSWQgdG8gdXNlIChlLmcuIHVnbnQpICovXG4gICAgcmVzb3VyY2VJZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIC8qKiByZXBvIG93bmVyIGZvciBvcmlnaW5hbCBsYW5ndWFnZXMgc3VjaCBhcyB1bmZvbGRpbmdXb3JkICovXG4gICAgb3JpZ2luYWxMYW5ndWFnZU93bmVyOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIH0pLFxuICByZWZlcmVuY2U6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgLyoqIHByb2plY3RJZCAoYm9va0lEKSB0byB1c2UgKi9cbiAgICBwcm9qZWN0SWQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAvKiogY3VycmVudCBjaGFwdGVyIG51bWJlciAqL1xuICAgIGNoYXB0ZXI6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKS5pc1JlcXVpcmVkLFxuICAgIC8qKiBjdXJyZW50IHZlcnNlIG51bWJlciAqL1xuICAgIHZlcnNlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSkuaXNSZXF1aXJlZCxcbiAgfSksXG4gIC8qKiBzZXJ2ZXIgKGUuZy4gJ2h0dHBzOi8vZ2l0LmRvb3I0My5vcmcnKSAqL1xuICBzZXJ2ZXI6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgLyoqIHJlcG8gYnJhbmNoIG9yIHRhZyBzdWNoIGFzIG1hc3RlciAqL1xuICBhcHBSZWY6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgLyoqIGlmIHRydWUgdGhlbiB3b3JkIGRhdGEgaG92ZXIgaXMgc2hvd24gKi9cbiAgZGlzYWJsZVdvcmRQb3BvdmVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqIENTUyBjbGFzc2VzICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKiByZXNvdXJjZUxpbmsgKi9cbiAgcmVzb3VyY2VMaW5rOiBQcm9wVHlwZXMuYW55LFxuICAvKiogdXNlIG1ldGhvZCBmb3IgdXNpbmcgbG9jYWwgc3RvcmFnZSBzcGVjaWZpYyBmb3IgdXNlciAqL1xuICB1c2VVc2VyTG9jYWxTdG9yYWdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAvKiogb3B0aW9uYWwgY2FsbGJhY2sgaWYgZXJyb3IgbG9hZGluZyByZXNvdXJjZSwgcGFyYW1ldGVyIHJldHVybmVkIGFyZTpcbiAgICogICAgKHtzdHJpbmd9IGVycm9yTWVzc2FnZSwge2Jvb2xlYW59IGlzQWNjZXNzRXJyb3IsIHtvYmplY3R9IHJlc291cmNlU3RhdHVzKVxuICAgKiAgICAgIC0gaXNBY2Nlc3NFcnJvciAtIGlzIHRydWUgaWYgdGhpcyB3YXMgYW4gZXJyb3IgdHJ5aW5nIHRvIGFjY2VzcyBmaWxlXG4gICAqICAgICAgLSByZXNvdXJjZVN0YXR1cyAtIGlzIG9iamVjdCBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgcHJvYmxlbXMgZmV0Y2hpbmcgcmVzb3VyY2UgKi9cbiAgb25SZXNvdXJjZUVycm9yOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIG9wdGlvbmFsIGh0dHAgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGZldGNoaW5nIHJlc291cmNlcywgZGVmYXVsdCBpcyAwICh2ZXJ5IGxvbmcgd2FpdCkgKi9cbiAgaHR0cENvbmZpZzogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqIG9wdGlvbmFsIHVybCBmb3IgZ3JlZWsgcmVwbyAqL1xuICBncmVla1JlcG9Vcmw6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBvcHRpb25hbCB1cmwgZm9yIGhlYnJldyByZXBvICovXG4gIGhlYnJld1JlcG9Vcmw6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBmdW5jdGlvbiB0byBnZXQgbGF0ZXN0IGxleGljb24gZGF0YSAqL1xuICBnZXRMZXhpY29uRGF0YTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiBmdW5jdGlvbiB0byBwcmUtbG9hZCBsZXhpY29uIGRhdGEgZm9yIHZlcnNlICovXG4gIGZldGNoR2xvc3Nlc0ZvclZlcnNlOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBsb2NhbGl6YXRpb24gKi9cbiAgdHJhbnNsYXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIGZ1bmN0aW9uIHRvIG1pbmltaXplIHRoZSBjYXJkIChvcHRpb25hbCkgKi9cbiAgb25NaW5pbWl6ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiB1c2VyLW5hbWUgKi9cbiAgbG9nZ2VkSW5Vc2VyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogYXV0aGVudGljYXRpb24gaW5mbyAqL1xuICBhdXRoZW50aWNhdGlvbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqIGZ1bmN0aW9uIHRvIHNldCBzdGF0ZSBpbiBhcHAgdGhhdCB0aGVyZSBhcmUgdW5zYXZlZCBjaGFuZ2VzICovXG4gIHNldFNhdmVkQ2hhbmdlczogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiBpbmRleCBmb3IgY3VycmVudCBib29rIChlLmcuICcwMScgZm9yICdnZW4nKSovXG4gIGJvb2tJbmRleDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIGNhbGxiYWNrIHRvIGluZGljYXRlIHRoYXQgd2UgYXJlIHVzaW5nIGEgdmVyc2UgcmFuZ2UgaGVyZSAqL1xuICBhZGRWZXJzZVJhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIGNhbGxiYWNrIHRvIHVwZGF0ZSB3b3JkIGFsaWduZXIgc3RhdGUgKi9cbiAgc2V0V29yZEFsaWduZXJTdGF0dXM6IFByb3BUeXBlcy5mdW5jLFxufVxuIl19
1383
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1NjcmlwdHVyZUNhcmQvU2NyaXB0dXJlQ2FyZC50c3giXSwibmFtZXMiOlsiUmVhY3QiLCJQcm9wVHlwZXMiLCJjb3JlIiwiU2VsZWN0aW9uc0NvbnRleHRQcm92aWRlciIsInVzZm1qcyIsInVzZUVkaXQiLCJJY29uQnV0dG9uIiwiUnhMaW5rMiIsIlJ4TGlua0JyZWFrMiIsIkNhcmQiLCJFUlJPUl9TVEFURSIsIk1BTklGRVNUX05PVF9MT0FERURfRVJST1IiLCJ1c2VDYXJkU3RhdGUiLCJ1c2VVc2VyQnJhbmNoIiwiZ2V0UXVvdGVNYXRjaGVzSW5Cb29rUmVmIiwiQWxpZ25tZW50SGVscGVycyIsIlVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMiLCJpc0VxdWFsIiwiZ2V0VmVyc2VzIiwiU2NyaXB0dXJlUGFuZSIsIlNjcmlwdHVyZVNlbGVjdG9yIiwidXNlU2NyaXB0dXJlU2V0dGluZ3MiLCJjbGVhbnVwVmVyc2VPYmplY3RzIiwiZml4T2NjdXJyZW5jZSIsImdldFJlc291cmNlTGluayIsImdldFJlc291cmNlTWVzc2FnZSIsImdldFNjcmlwdHVyZVZlcnNpb25TZXR0aW5ncyIsImlzT3JpZ2luYWxCaWJsZSIsImRlbGF5IiwiYXJlTWFwc1RoZVNhbWUiLCJUaXRsZSIsIk5UX09SSUdfTEFORyIsIk9SSUdJTkFMX1NPVVJDRSIsIk9UX09SSUdfTEFORyIsIlZlcnNlU2VsZWN0b3JQb3B1cCIsIktFWV9GT05UX1NJWkVfQkFTRSIsImxhYmVsIiwic3R5bGUiLCJtYXJnaW5Ub3AiLCJ3aWR0aCIsImNvbXBhcmVPYmplY3QiLCJ2ZXJzZVJlZiIsImNoYXB0ZXIiLCJ2ZXJzZSIsInZlcnNlRGF0YSIsInZlcnNlT2JqZWN0cyIsImxlbmd0aCIsImFyZVZlcnNlc1NhbWUiLCJ2ZXJzZXNGb3JSZWYxIiwidmVyc2VzRm9yUmVmMiIsImFyZVNhbWUiLCJpIiwibCIsInZlcnNlMSIsInZlcnNlMiIsIlNjcmlwdHVyZUNhcmQiLCJhcHBSZWYiLCJhdXRoZW50aWNhdGlvbiIsImJvb2tJbmRleCIsImNhcmROdW0iLCJjbGFzc2VzIiwiZGlzYWJsZVdvcmRQb3BvdmVyIiwiZ2V0TGFuZ3VhZ2UiLCJnZXRMZXhpY29uRGF0YSIsImdyZWVrUmVwb1VybCIsImhlYnJld1JlcG9VcmwiLCJodHRwQ29uZmlnIiwiaWQiLCJpc05UIiwibG9nZ2VkSW5Vc2VyIiwib25NaW5pbWl6ZSIsIm9uUmVzb3VyY2VFcnJvciIsIm9yaWdpbmFsU2NyaXB0dXJlQm9va09iamVjdHMiLCJyZWZlcmVuY2UiLCJyZXNvdXJjZSIsIm93bmVyIiwibGFuZ3VhZ2VJZCIsInJlc291cmNlSWQiLCJvcmlnaW5hbExhbmd1YWdlT3duZXIiLCJyZXNvdXJjZUxpbmsiLCJzZWxlY3RlZFF1b3RlIiwic2VydmVyIiwic2V0U2F2ZWRDaGFuZ2VzIiwic2V0V29yZEFsaWduZXJTdGF0dXMiLCJ0cmFuc2xhdGUiLCJ0aXRsZSIsInVzZVVzZXJMb2NhbFN0b3JhZ2UiLCJib29rSWQiLCJwcm9qZWN0SWQiLCJ1c2VTdGF0ZSIsImNoZWNrRm9yRWRpdEJyYW5jaCIsImN1cnJlbnRSZWZlcmVuY2UiLCJlZGl0QnJhbmNoUmVhZHkiLCJoYXZlVW5zYXZlZENoYW5nZXMiLCJsYXN0U2VsZWN0ZWRRdW90ZSIsInJlYWR5Rm9yRmV0Y2giLCJyZWYiLCJzYXZlQ2xpY2tlZCIsInNhdmVDb250ZW50Iiwic2VsZWN0aW9ucyIsIk1hcCIsInNoYSIsInN0YXJ0U2F2ZSIsInVybEVycm9yIiwidXNpbmdVc2VyQnJhbmNoIiwidW5zYXZlZENoYW5nZXNMaXN0IiwidmVyc2VzRm9yUmVmIiwic2hvd0FsaWdubWVudFBvcHVwIiwidmVyc2VTZWxlY3RlZEZvckFsaWdubWVudCIsInZlcnNlc0FsaWdubWVudFN0YXR1cyIsInZlcnNlT2JqZWN0c01hcCIsInN0YXRlIiwic2V0U3RhdGVfIiwiZm9udFNpemUiLCJzZXRGb250U2l6ZSIsImlzTlRfIiwic2V0U3RhdGUiLCJuZXdTdGF0ZSIsInByZXZTdGF0ZSIsImNhY2hlIiwibWF4QWdlIiwibm9DYWNoZSIsInNldFVybEVycm9yIiwiZXJyb3IiLCJ3aG9sZUJvb2siLCJpc05ld1Rlc3RhbWVudCIsInNjcmlwdHVyZUNvbmZpZyIsInNldFNjcmlwdHVyZSIsInNjcmlwdHVyZVNldHRpbmdzIiwic2NyaXB0dXJlVmVyc2lvbkhpc3QiLCJmZXRjaFJlc3BfIiwiZmV0Y2hSZXNwb25zZSIsInJlcG8iLCJyZWZlcmVuY2VfIiwidXNlRWZmZWN0IiwiX3NoYSIsImRhdGEiLCJ1cmwiLCJkb3dubG9hZF91cmwiLCJ2YWxpZEJyYW5jaCIsInBhcnRzIiwic3BsaXQiLCJmZXRjaEJyYW5jaCIsImNvbnNvbGUiLCJsb2ciLCJKU09OIiwic3RyaW5naWZ5IiwiY2FyZFJlc291cmNlSWQiLCJyZWZfIiwiY2FuVXNlRWRpdEJyYW5jaCIsImluY2x1ZGVzIiwiY2FyZElkIiwiYnJhbmNoRGV0ZXJtaW5lZCIsInVzZXJFZGl0QnJhbmNoTmFtZSIsIl91c2luZ1VzZXJCcmFuY2giLCJ3b3JraW5nUmVzb3VyY2VCcmFuY2giLCJzdGFydEVkaXRCcmFuY2giLCJhY3Rpb25zIiwic3RhcnRFZGl0Iiwid29ya2luZ1JlZiIsInNjcmlwdHVyZVRpdGxlIiwicmVzb3VyY2VTdGF0dXMiLCJtZXNzYWdlIiwiaXNBY2Nlc3NFcnJvciIsInZlcnNpb24iLCJ1cGRhdGVUaXRsZSIsImdldFNjcmlwdHVyZVNlbGVjdG9yIiwic2NyaXB0dXJlU2VsZWN0aW9uQ29uZmlnIiwib25NZW51Q2xvc2UiLCJsYW5ndWFnZUlkXyIsImxhbmd1YWdlIiwiZGlyZWN0aW9uIiwiX3JlZmVyZW5jZSIsImlzSGVicmV3IiwiZm9udEZhY3RvciIsInNjYWxlZEZvbnRTaXplIiwiaXRlbXMiLCJoZWFkZXJzIiwiZmlsdGVycyIsIml0ZW1JbmRleCIsIm1hcmtkb3duVmlldyIsInNldEZpbHRlcnMiLCJzZXRJdGVtSW5kZXgiLCJzZXRNYXJrZG93blZpZXciLCJyZWZTdHlsZSIsInVzZU1lbW8iLCJmb250RmFtaWx5IiwiTWF0aCIsInJvdW5kIiwiY29udGVudFN0eWxlIiwic2NyaXB0dXJlTGFiZWwiLCJkaXNhYmxlV29yZFBvcG92ZXJfIiwidXNpbmdPcmlnaW5hbEJpYmxlIiwidW5kZWZpbmVkIiwiZW5hYmxlRWRpdCIsImVuYWJsZUFsaWdubWVudCIsIm9yaWdpbmFsUmVwb1VybCIsInNjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWciLCJjdXJyZW50VmVyc2VSZWYiLCJfc2V0U2F2ZWRDaGFuZ2VzIiwic291cmNlTGFuZ3VhZ2UiLCJ0YXJnZXRMYW5ndWFnZSIsImN1cnJlbnRJbmRleCIsInNhdmVkIiwiZ2V0Q2hhbmdlcyIsImNsZWFyQ2hhbmdlcyIsIl91bnNhdmVkQ2hhbmdlc0xpc3QiLCJoYXNPd25Qcm9wZXJ0eSIsIl9oYXZlVW5zYXZlZENoYW5nZXMiLCJPYmplY3QiLCJrZXlzIiwiZmluZFJlZkluQXJyYXkiLCJmaW5kSXRlbSIsImNodW5rcyIsInJlZkxlbiIsImluZGV4IiwiZmluZEluZGV4IiwiY2h1bmsiLCJpZHgiLCJzdWJzdHJpbmciLCJuZXh0Q2hhciIsImdldEJvb2tOYW1lIiwiYm9va0NhcHMiLCJ0b1VwcGVyQ2FzZSIsImZpbGVwYXRoIiwiY29udGVudCIsImNvbmZpZyIsInRva2VuIiwidGltZW91dCIsInNlcnZlclRpbWVPdXQiLCJkb250Q3JlYXRlQnJhbmNoIiwiYXV0aG9yIiwiYnJhbmNoIiwic2F2ZUVycm9yIiwiaXNTYXZlRXJyb3IiLCJpc0Vycm9yIiwib25TYXZlRWRpdCIsIl9zYXZlRWRpdCIsImluZm8iLCJ0aGVuIiwic3VjY2VzcyIsInVuc2F2ZWRDYXJkSW5kaWNlcyIsImNhcmRJbmRleCIsInJlbG9hZFJlc291cmNlIiwibWVyZ2VWZXJzZU9iamVjdHNJbnRvQmlibGVVc2ZtIiwiYmlibGVVc2ZtIiwidXBkYXRlZFZlcnNlT2JqZWN0cyIsIm5ld1VzZm0iLCJjaGFwdGVyQ2h1bmtzIiwiY2hhcHRlckluZGV4IiwiY3VycmVudENoYXB0ZXIiLCJ2ZXJzZUNodW5rcyIsInZlcnNlSW5kZXgiLCJuZXdWZXJzZVVzZm0iLCJjb252ZXJ0VmVyc2VEYXRhVG9VU0ZNIiwib2xkVmVyc2UiLCJ2ZXJzZU51bUxlbiIsIm5ld0NoYXB0ZXIiLCJqb2luIiwiZ2V0UmVhZHlGb3JTYXZlIiwiY3JlYXRlRWRpdEJyYW5jaCIsIndhcm4iLCJnZXRSZXNwb25zZURhdGEiLCJtZXJnZUZhaWwiLCJwYXJzZUludCIsIm5ld1ZlcnNlVGV4dCIsInRhcmdldFZlcnNlT2JqZWN0c18iLCJ1cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZSIsInRhcmdldFZlcnNlT2JqZWN0cyIsIm5ld0Jvb2tKc29uIiwidXBkYXRlVmVyc2UiLCJ0b1VTRk0iLCJmb3JjZWROZXdMaW5lcyIsIl92ZXJzZXNGb3JSZWYiLCJuZXdTZWxlY3Rpb25zIiwidXBkYXRlU2VsZWN0aW9ucyIsIl9tYXAiLCJvcmlnaW5hbEJvb2tJZCIsImJvb2tWZXJzZU9iamVjdCIsImNoYXB0ZXJzIiwibmV3U2VsZWN0ZWRRdW90ZSIsInF1b3RlIiwib3JpZ2luYWxWZXJzZXMiLCJzdWJzdGl0dXRlIiwic3RhcnRWZXJzZSIsImxhc3RWZXJzZSIsIl92ZXJzZSIsInZlcnNlcyIsInZlcnNlSXRlbSIsInZvIiwiY29uY2F0Iiwic2V0Iiwic3ViUmVmIiwicXVvdGVNYXRjaGVzIiwiYm9va09iamVjdCIsIm9jY3VycmVuY2UiLCJzaXplIiwiZm9yRWFjaCIsIndvcmRzIiwia2V5IiwiX2tleSIsIm1hcCIsIndvcmQiLCJ0ZXh0Iiwibm9ybWFsaXplU3RyaW5nIiwiYm9va3NOb3RTYW1lIiwidXBkYXRlVmVyc2VzQWxpZ25tZW50U3RhdHVzIiwiYWxpZ25lZCIsInJlbmRlcmVkU2NyaXB0dXJlUGFuZXMiLCJfY3VycmVudFZlcnNlRGF0YSIsImluaXRpYWxWZXJzZU9iamVjdHMiLCJfc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZyIsImlzVmVyc2VTZWxlY3RlZEZvckFsaWdubWVudCIsImhhbmRsZUFsaWduQnV0dG9uQ2xpY2siLCJvblJlbmRlclRvb2xiYXIiLCJuZXdJdGVtcyIsImFsbFZlcnNlc0FsaWduZWQiLCJ2YWx1ZXMiLCJldmVyeSIsImFsaWduU3RhdHVzIiwiYWxpZ25JY29uIiwiYWxpZ25CdXR0b25UZXh0IiwicHVzaCIsImN1cnNvciIsInByb3BUeXBlcyIsInN0cmluZyIsImlzUmVxdWlyZWQiLCJvYmplY3QiLCJudW1iZXIiLCJib29sIiwiZnVuYyIsInNoYXBlIiwib25lT2ZUeXBlIiwiYW55Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBS0EsS0FBWixNQUF1QixPQUF2QjtBQUNBLE9BQU8sS0FBS0MsU0FBWixNQUEyQixZQUEzQjtBQUNBLFNBQVNDLElBQVQsRUFBZUMseUJBQWYsUUFBZ0QseUJBQWhEO0FBQ0EsT0FBT0MsTUFBUCxNQUFtQixTQUFuQjtBQUNBLFNBQVNDLE9BQVQsUUFBd0IscUJBQXhCO0FBQ0EsU0FBU0MsVUFBVCxRQUEyQixlQUEzQjtBQUNBLFNBQVNDLE9BQVQsRUFBa0JDLFlBQWxCLFFBQXNDLGdCQUF0QztBQUNBLFNBQ0VDLElBREYsRUFFRUMsV0FGRixFQUdFQyx5QkFIRixFQUlFQyxZQUpGLEVBS0VDLGFBTEYsUUFNTyx1QkFOUCxDLENBT0E7O0FBQ0EsU0FBU0Msd0JBQVQsUUFBeUMsa0JBQXpDO0FBQ0EsU0FBU0MsZ0JBQVQsRUFBMkJDLHlCQUEzQixRQUE0RCxrQkFBNUQ7QUFDQSxPQUFPLEtBQUtDLE9BQVosTUFBeUIsWUFBekI7QUFDQSxTQUFTQyxTQUFULFFBQTBCLHVCQUExQjtBQUNBLFNBQVNDLGFBQVQsRUFBd0JDLGlCQUF4QixRQUFpRCxJQUFqRDtBQUNBLFNBQVNDLG9CQUFULFFBQXFDLGtDQUFyQztBQUNBLFNBQ0VDLG1CQURGLEVBRUVDLGFBRkYsRUFHRUMsZUFIRixFQUlFQyxrQkFKRixFQUtFQywyQkFMRixFQU1FQyxlQU5GLFFBT08sK0JB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QUFBLFVBQVUsRUFBRTNFLFNBQVMsQ0FBQ29VLE1BQVYsQ0FBaUJDLFVBRkw7O0FBR3hCO0FBQ0EzUCxJQUFBQSxLQUFLLEVBQUUxRSxTQUFTLENBQUNvVSxNQUFWLENBQWlCQyxVQUpBOztBQUt4QjtBQUNBelAsSUFBQUEsVUFBVSxFQUFFNUUsU0FBUyxDQUFDb1UsTUFBVixDQUFpQkMsVUFOTDs7QUFPeEI7QUFDQXhQLElBQUFBLHFCQUFxQixFQUFFN0UsU0FBUyxDQUFDb1UsTUFBVixDQUFpQkM7QUFSaEIsR0FBaEIsQ0EvQ2M7O0FBeUR4QjtBQUNBdlAsRUFBQUEsWUFBWSxFQUFFOUUsU0FBUyxDQUFDNFUsR0ExREE7O0FBMkR4QjtBQUNBN1AsRUFBQUEsYUFBYSxFQUFFL0UsU0FBUyxDQUFDc1UsTUE1REQ7O0FBNkR4QjtBQUNBdFAsRUFBQUEsTUFBTSxFQUFFaEYsU0FBUyxDQUFDb1UsTUFBVixDQUFpQkMsVUE5REQ7O0FBK0R4QjtBQUNBcFAsRUFBQUEsZUFBZSxFQUFFakYsU0FBUyxDQUFDeVUsSUFoRUg7O0FBaUV4QjtBQUNBdlAsRUFBQUEsb0JBQW9CLEVBQUVsRixTQUFTLENBQUN5VSxJQWxFUjs7QUFtRXhCO0FBQ0FyUCxFQUFBQSxLQUFLLEVBQUVwRixTQUFTLENBQUNvVSxNQUFWLENBQWlCQyxVQXBFQTs7QUFxRXhCO0FBQ0FsUCxFQUFBQSxTQUFTLEVBQUVuRixTQUFTLENBQUN5VSxJQXRFRzs7QUF1RXhCO0FBQ0FwUCxFQUFBQSxtQkFBbUIsRUFBRXJGLFNBQVMsQ0FBQ3lVLElBQVYsQ0FBZUo7QUF4RVosQ0FBMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJ1xuaW1wb3J0IHsgY29yZSwgU2VsZWN0aW9uc0NvbnRleHRQcm92aWRlciB9IGZyb20gJ3NjcmlwdHVyZS1yZXNvdXJjZXMtcmNsJ1xuaW1wb3J0IHVzZm1qcyBmcm9tICd1c2ZtLWpzJ1xuaW1wb3J0IHsgdXNlRWRpdCB9IGZyb20gJ2dpdGVhLXJlYWN0LXRvb2xraXQnXG5pbXBvcnQgeyBJY29uQnV0dG9uIH0gZnJvbSAnQG11aS9tYXRlcmlhbCdcbmltcG9ydCB7IFJ4TGluazIsIFJ4TGlua0JyZWFrMiB9IGZyb20gJ3JlYWN0LWljb25zL3J4J1xuaW1wb3J0IHtcbiAgQ2FyZCxcbiAgRVJST1JfU1RBVEUsXG4gIE1BTklGRVNUX05PVF9MT0FERURfRVJST1IsXG4gIHVzZUNhcmRTdGF0ZSxcbiAgdXNlVXNlckJyYW5jaCxcbn0gZnJvbSAndHJhbnNsYXRpb24taGVscHMtcmNsJ1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgZ2V0UXVvdGVNYXRjaGVzSW5Cb29rUmVmIH0gZnJvbSAndXctcXVvdGUtaGVscGVycydcbmltcG9ydCB7IEFsaWdubWVudEhlbHBlcnMsIFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMgfSBmcm9tICd3b3JkLWFsaWduZXItcmNsJ1xuaW1wb3J0ICogYXMgaXNFcXVhbCBmcm9tICdkZWVwLWVxdWFsJ1xuaW1wb3J0IHsgZ2V0VmVyc2VzIH0gZnJvbSAnYmlibGUtcmVmZXJlbmNlLXJhbmdlJ1xuaW1wb3J0IHsgU2NyaXB0dXJlUGFuZSwgU2NyaXB0dXJlU2VsZWN0b3IgfSBmcm9tICcuLidcbmltcG9ydCB7IHVzZVNjcmlwdHVyZVNldHRpbmdzIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlU2NyaXB0dXJlU2V0dGluZ3MnXG5pbXBvcnQge1xuICBjbGVhbnVwVmVyc2VPYmplY3RzLFxuICBmaXhPY2N1cnJlbmNlLFxuICBnZXRSZXNvdXJjZUxpbmssXG4gIGdldFJlc291cmNlTWVzc2FnZSxcbiAgZ2V0U2NyaXB0dXJlVmVyc2lvblNldHRpbmdzLFxuICBpc09yaWdpbmFsQmlibGUsXG59IGZyb20gJy4uLy4uL3V0aWxzL1NjcmlwdHVyZVNldHRpbmdzJ1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tICcuLi8uLi91dGlscy9kZWxheSdcbmltcG9ydCB7IGFyZU1hcHNUaGVTYW1lIH0gZnJvbSAnLi4vLi4vdXRpbHMvbWFwcydcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSAnLi4vU2NyaXB0dXJlUGFuZS9zdHlsZWQnXG5pbXBvcnQge1xuICBOVF9PUklHX0xBTkcsXG4gIE9SSUdJTkFMX1NPVVJDRSxcbiAgT1RfT1JJR19MQU5HLFxufSBmcm9tICcuLi8uLi91dGlscydcbmltcG9ydCB7IFZlcnNlU2VsZWN0b3JQb3B1cCB9IGZyb20gJy4uL1ZlcnNlU2VsZWN0b3JQb3B1cCdcblxuY29uc3QgS0VZX0ZPTlRfU0laRV9CQVNFID0gJ3NjcmlwdHVyZVBhbmVGb250U2l6ZV8nXG5jb25zdCBsYWJlbCA9ICdWZXJzaW9uJ1xuY29uc3Qgc3R5bGUgPSB7IG1hcmdpblRvcDogJzE2cHgnLCB3aWR0aDogJzUwMHB4JyB9XG5cbi8qKlxuICogY3JlYXRlIGEgc2hvcnQgY29tcGFyaXNvbiB2ZXJzZSByZWYgb2JqZWN0IHdpdGhvdXQgYWxsIHRoZSB2ZXJzZURhdGFcbiAqIEBwYXJhbSB2ZXJzZVJlZlxuICovXG5mdW5jdGlvbiBjb21wYXJlT2JqZWN0KHZlcnNlUmVmKSB7XG4gIGNvbnN0IHtcbiAgICBjaGFwdGVyLFxuICAgIHZlcnNlLFxuICAgIHZlcnNlRGF0YSxcbiAgfSA9IHZlcnNlUmVmIHx8IHt9XG4gIGNvbnN0IHZlcnNlT2JqZWN0cyA9IHZlcnNlRGF0YT8udmVyc2VPYmplY3RzPy5sZW5ndGggfHwgMFxuICByZXR1cm4ge1xuICAgIGNoYXB0ZXIsXG4gICAgdmVyc2UsXG4gICAgdmVyc2VPYmplY3RzLFxuICB9XG59XG5cbi8qKlxuICogY29tcGFyZSB0d28gdmVyc2UgcmVmcyB0byBzZWUgaWYgdGhleSBhcmUgc3Vic3RhbnRpYWxseSBzaW1pbGFyXG4gKiBAcGFyYW0gdmVyc2VzRm9yUmVmMVxuICogQHBhcmFtIHZlcnNlc0ZvclJlZjJcbiAqL1xuZnVuY3Rpb24gYXJlVmVyc2VzU2FtZSh2ZXJzZXNGb3JSZWYxOiBhbnlbXSwgdmVyc2VzRm9yUmVmMjogYW55W10pIHtcbiAgdmVyc2VzRm9yUmVmMSA9IHZlcnNlc0ZvclJlZjEgfHwgW11cbiAgdmVyc2VzRm9yUmVmMiA9IHZlcnNlc0ZvclJlZjIgfHwgW11cbiAgbGV0IGFyZVNhbWUgPSBmYWxzZVxuXG4gIGlmICh2ZXJzZXNGb3JSZWYxLmxlbmd0aCA9PT0gdmVyc2VzRm9yUmVmMi5sZW5ndGgpIHtcbiAgICBhcmVTYW1lID0gdHJ1ZVxuXG4gICAgZm9yIChsZXQgaSA9IDAsIGw9IHZlcnNlc0ZvclJlZjEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCB2ZXJzZTEgPSBjb21wYXJlT2JqZWN0KHZlcnNlc0ZvclJlZjFbaV0pXG4gICAgICBjb25zdCB2ZXJzZTIgPSBjb21wYXJlT2JqZWN0KHZlcnNlc0ZvclJlZjJbaV0pXG4gICAgICBhcmVTYW1lID0gaXNFcXVhbCh2ZXJzZTEsIHZlcnNlMilcblxuICAgICAgaWYgKCFhcmVTYW1lKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFyZVNhbWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU2NyaXB0dXJlQ2FyZCh7XG4gIGFwcFJlZixcbiAgYXV0aGVudGljYXRpb24sXG4gIGJvb2tJbmRleCxcbiAgY2FyZE51bSxcbiAgY2xhc3NlcyxcbiAgZGlzYWJsZVdvcmRQb3BvdmVyLFxuICBnZXRMYW5ndWFnZSxcbiAgZ2V0TGV4aWNvbkRhdGEsXG4gIGdyZWVrUmVwb1VybCxcbiAgaGVicmV3UmVwb1VybCxcbiAgaHR0cENvbmZpZyxcbiAgaWQsXG4gIGlzTlQsXG4gIGxvZ2dlZEluVXNlcixcbiAgb25NaW5pbWl6ZSxcbiAgb25SZXNvdXJjZUVycm9yLFxuICBvcmlnaW5hbFNjcmlwdHVyZUJvb2tPYmplY3RzLFxuICByZWZlcmVuY2UsXG4gIHJlc291cmNlOiB7XG4gICAgb3duZXIsXG4gICAgbGFuZ3VhZ2VJZCxcbiAgICByZXNvdXJjZUlkLFxuICAgIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcixcbiAgfSxcbiAgcmVzb3VyY2VMaW5rLFxuICBzZWxlY3RlZFF1b3RlLFxuICBzZXJ2ZXIsXG4gIHNldFNhdmVkQ2hhbmdlcyxcbiAgc2V0V29yZEFsaWduZXJTdGF0dXMsXG4gIHRyYW5zbGF0ZSxcbiAgdGl0bGUsXG4gIHVzZVVzZXJMb2NhbFN0b3JhZ2UsXG59KSB7XG4gIGNvbnN0IGJvb2tJZCA9IHJlZmVyZW5jZT8ucHJvamVjdElkXG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVfXSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICBjaGVja0ZvckVkaXRCcmFuY2g6IDAsXG4gICAgY3VycmVudFJlZmVyZW5jZTogbnVsbCxcbiAgICBlZGl0QnJhbmNoUmVhZHk6IGZhbHNlLFxuICAgIGhhdmVVbnNhdmVkQ2hhbmdlczogZmFsc2UsXG4gICAgbGFzdFNlbGVjdGVkUXVvdGU6IG51bGwsXG4gICAgcmVhZHlGb3JGZXRjaDogZmFsc2UsXG4gICAgcmVmOiBhcHBSZWYsXG4gICAgc2F2ZUNsaWNrZWQ6IGZhbHNlLFxuICAgIHNhdmVDb250ZW50OiBudWxsLFxuICAgIHNlbGVjdGlvbnM6IG5ldyBNYXAoKSxcbiAgICBzaGE6IG51bGwsXG4gICAgc3RhcnRTYXZlOiBmYWxzZSxcbiAgICB1cmxFcnJvcjogbnVsbCxcbiAgICB1c2luZ1VzZXJCcmFuY2g6IGZhbHNlLFxuICAgIHVuc2F2ZWRDaGFuZ2VzTGlzdDoge30sXG4gICAgdmVyc2VzRm9yUmVmOiBudWxsLFxuICAgIHNob3dBbGlnbm1lbnRQb3B1cDogZmFsc2UsXG4gICAgdmVyc2VTZWxlY3RlZEZvckFsaWdubWVudDogbnVsbCxcbiAgICB2ZXJzZXNBbGlnbm1lbnRTdGF0dXM6IG51bGwsXG4gICAgdmVyc2VPYmplY3RzTWFwOiBuZXcgTWFwKCksXG4gIH0pXG4gIGNvbnN0IHtcbiAgICBjaGVja0ZvckVkaXRCcmFuY2gsXG4gICAgY3VycmVudFJlZmVyZW5jZSxcbiAgICBlZGl0QnJhbmNoUmVhZHksXG4gICAgaGF2ZVVuc2F2ZWRDaGFuZ2VzLFxuICAgIGxhc3RTZWxlY3RlZFF1b3RlLFxuICAgIHJlYWR5Rm9yRmV0Y2gsXG4gICAgcmVmLFxuICAgIHNhdmVDbGlja2VkLFxuICAgIHNhdmVDb250ZW50LFxuICAgIHNlbGVjdGlvbnMsXG4gICAgc2hhLFxuICAgIHNob3dBbGlnbm1lbnRQb3B1cCxcbiAgICBzdGFydFNhdmUsXG4gICAgdXJsRXJyb3IsXG4gICAgdXNpbmdVc2VyQnJhbmNoLFxuICAgIHVuc2F2ZWRDaGFuZ2VzTGlzdCxcbiAgICB2ZXJzZU9iamVjdHNNYXAsXG4gICAgdmVyc2VTZWxlY3RlZEZvckFsaWdubWVudCxcbiAgICB2ZXJzZXNBbGlnbm1lbnRTdGF0dXMsXG4gICAgdmVyc2VzRm9yUmVmLFxuICB9ID0gc3RhdGVcblxuICBjb25zdCBbZm9udFNpemUsIHNldEZvbnRTaXplXSA9IHVzZVVzZXJMb2NhbFN0b3JhZ2UoS0VZX0ZPTlRfU0laRV9CQVNFICsgY2FyZE51bSwgMTAwKVxuICBjb25zdCBpc05UXyA9IGlzTlQoYm9va0lkKVxuXG4gIGZ1bmN0aW9uIHNldFN0YXRlKG5ld1N0YXRlKSB7XG4gICAgc2V0U3RhdGVfKHByZXZTdGF0ZSA9PiAoeyAuLi5wcmV2U3RhdGUsIC4uLm5ld1N0YXRlIH0pKVxuICB9XG5cbiAgaWYgKHVzaW5nVXNlckJyYW5jaCkge1xuICAgIGh0dHBDb25maWcgPSB7XG4gICAgICAuLi5odHRwQ29uZmlnLFxuICAgICAgY2FjaGU6IHsgbWF4QWdlOiAwIH0sXG4gICAgICBub0NhY2hlOiB0cnVlLFxuICAgIH0gLy8gZGlzYWJsZSBodHRwIGNhY2hpbmdcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBpc05ld1Rlc3RhbWVudCxcbiAgICBzY3JpcHR1cmVDb25maWcsXG4gICAgc2V0U2NyaXB0dXJlLFxuICAgIHNjcmlwdHVyZVNldHRpbmdzLFxuICAgIHNjcmlwdHVyZVZlcnNpb25IaXN0LFxuICB9ID0gdXNlU2NyaXB0dXJlU2V0dGluZ3Moe1xuICAgIGlzTlQsXG4gICAgdGl0bGUsXG4gICAgb3duZXIsXG4gICAgcmVmZXJlbmNlOiBjdXJyZW50UmVmZXJlbmNlIHx8IHJlZmVyZW5jZSxcbiAgICBhcHBSZWY6IHJlZixcbiAgICBzZXJ2ZXIsXG4gICAgY2FyZE51bSxcbiAgICBkaXNhYmxlV29yZFBvcG92ZXIsXG4gICAgZ3JlZWtSZXBvVXJsLFxuICAgIGhlYnJld1JlcG9VcmwsXG4gICAgaHR0cENvbmZpZyxcbiAgICBsYW5ndWFnZUlkLFxuICAgIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcixcbiAgICByZWFkeUZvckZldGNoLFxuICAgIHJlc291cmNlSWQsXG4gICAgcmVzb3VyY2VMaW5rLFxuICAgIHNldFVybEVycm9yOiAoZXJyb3IpID0+IHNldFN0YXRlKHsgdXJsRXJyb3I6IGVycm9yIH0pLFxuICAgIHVzZVVzZXJMb2NhbFN0b3JhZ2UsXG4gICAgd2hvbGVCb29rOiB0cnVlLFxuICB9KVxuXG4gIGNvbnN0IGZldGNoUmVzcF8gPSBzY3JpcHR1cmVDb25maWc/LmZldGNoUmVzcG9uc2VcbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCByZXBvID0gYCR7c2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ubGFuZ3VhZ2VJZH1fJHtzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5wcm9qZWN0SWR9YFxuICBjb25zdCByZWZlcmVuY2VfID0gc2NyaXB0dXJlQ29uZmlnPy5yZWZlcmVuY2UgfHwgbnVsbFxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIGdldCB0aGUgX3NoYSBmcm9tIGxhc3Qgc2NyaXB0dXJlIGRvd25sb2FkXG4gICAgY29uc3QgX3NoYSA9IGZldGNoUmVzcF8/LmRhdGE/LnNoYSB8fCBudWxsXG4gICAgY29uc3QgdXJsID0gZmV0Y2hSZXNwXz8uZGF0YT8uZG93bmxvYWRfdXJsIHx8IG51bGxcbiAgICBsZXQgdmFsaWRCcmFuY2ggPSB0cnVlXG5cbiAgICBpZiAoX3NoYSkgeyAvLyBUUklDS1k6IHNpbmNlIHRoaXMgZmV0Y2ggbWF5IGJlIGRlbGF5ZWQgLSBtYWtlIHN1cmUgaXQgd2FzIGZvciB0aGUgY3VycmVudCBicmFuY2ggYmVmb3JlIHVzaW5nIHRoZSBzaGFcbiAgICAgIGNvbnN0IHBhcnRzID0gKHVybCB8fCAnJykuc3BsaXQoJy8nKVxuICAgICAgY29uc3QgZmV0Y2hCcmFuY2ggPSBwYXJ0cy5sZW5ndGggPiA3ID8gcGFydHNbN10gOiAnJ1xuICAgICAgdmFsaWRCcmFuY2ggPSBmZXRjaEJyYW5jaCA9PT0gcmVmXG4gICAgfVxuXG4gICAgaWYgKHZhbGlkQnJhbmNoICYmIF9zaGEgIT09IHNoYSkge1xuICAgICAgY29uc29sZS5sb2coYFNjcmlwdHVyZUNhcmQ6IGZvciAke3VybH0gJHtKU09OLnN0cmluZ2lmeShyZWZlcmVuY2VfKX0gbmV3IHNoYSBpcyAke19zaGF9YClcbiAgICAgIHNldFN0YXRlKHsgc2hhOiBfc2hhIH0pXG4gICAgfVxuICB9LCBbZmV0Y2hSZXNwX10pXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCBjYXJkUmVzb3VyY2VJZCA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/LnByb2plY3RJZCB8fCByZXNvdXJjZUlkXG4gIC8vIEB0cy1pZ25vcmVcbiAgbGV0IHJlZl8gPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5yZWYgfHwgYXBwUmVmXG4gIGNvbnN0IGNhblVzZUVkaXRCcmFuY2ggPSAhIShsb2dnZWRJblVzZXIgJiYgYXV0aGVudGljYXRpb24gJiYgKHJlc291cmNlSWQgIT09IE9SSUdJTkFMX1NPVVJDRSkgJiYgLy8gVFJJQ0tZIGlmIG5vdCBvcmlnaW5hbCBsYW5ndWFnZSBhbmQgd2UgaGF2ZSBsb2dpbiBkYXRhLCB0aGVuIHdlIGNhbiB1c2UgdGhlIGVkaXQgYnJhbmNoXG4gICAgKChyZWZfID09PSAnbWFzdGVyJykgfHwgKHJlZl8uaW5jbHVkZXMobG9nZ2VkSW5Vc2VyKSkpKSAvLyBhbHNvIG1ha2Ugc3VyZSBub3QgYSB2ZXJzaW9uIHRhZ1xuXG4gIGNvbnN0IHtcbiAgICBzdGF0ZToge1xuICAgICAgYnJhbmNoRGV0ZXJtaW5lZCxcbiAgICAgIHVzZXJFZGl0QnJhbmNoTmFtZSxcbiAgICAgIHVzaW5nVXNlckJyYW5jaDogX3VzaW5nVXNlckJyYW5jaCxcbiAgICAgIHdvcmtpbmdSZXNvdXJjZUJyYW5jaCxcbiAgICB9LFxuICAgIGFjdGlvbnM6IHsgc3RhcnRFZGl0OiBzdGFydEVkaXRCcmFuY2ggfSxcbiAgfSA9IHVzZVVzZXJCcmFuY2goe1xuICAgIGFwcFJlZixcbiAgICBhdXRoZW50aWNhdGlvbjogY2FuVXNlRWRpdEJyYW5jaCA/IGF1dGhlbnRpY2F0aW9uIDogbnVsbCxcbiAgICBib29rSWQsXG4gICAgY2FyZElkOiBpZCxcbiAgICBjYXJkUmVzb3VyY2VJZCxcbiAgICBjaGVja0ZvckVkaXRCcmFuY2gsXG4gICAgbGFuZ3VhZ2VJZCxcbiAgICBsb2dnZWRJblVzZXI6IGNhblVzZUVkaXRCcmFuY2ggPyBsb2dnZWRJblVzZXIgOiBudWxsLFxuICAgIG93bmVyLFxuICAgIG9uUmVzb3VyY2VFcnJvcixcbiAgICBzZXJ2ZXIsXG4gICAgdXNlVXNlckxvY2FsU3RvcmFnZSxcbiAgfSlcblxuICBjb25zdCB3b3JraW5nUmVmID0gY2FuVXNlRWRpdEJyYW5jaCA/IHdvcmtpbmdSZXNvdXJjZUJyYW5jaCA6IGFwcFJlZlxuICBsZXQgc2NyaXB0dXJlVGl0bGVcblxuICBpZiAoIWNhblVzZUVkaXRCcmFuY2ggJiYgIXJlYWR5Rm9yRmV0Y2gpIHsgLy8gaWYgYmlibGUgbm90IGVsaWdpYmxlIGZvciB1c2VyIGJyYW5jaCwgbWFrZSBzdXJlIGl0J3MgcmVhZHlcbiAgICBzZXRTdGF0ZSh7IHJlYWR5Rm9yRmV0Y2g6IHRydWUgfSlcbiAgfVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc29sZS5sb2coYFNjcmlwdHVyZUNhcmQgYm9vayBjaGFuZ2VkYCwgeyBib29rSWQsIG93bmVyLCBsYW5ndWFnZUlkLCByZXNvdXJjZUlkIH0pXG5cbiAgICBpZiAoY2FuVXNlRWRpdEJyYW5jaCkgeyAvLyBpZiBiaWJsZSBlbGlnaWJsZSBmb3IgdXNlciBicmFuY2gsIHJlZnJlc2ggaXRcbiAgICAgIHNldFN0YXRlKHsgcmVhZHlGb3JGZXRjaDogZmFsc2UsIGNoZWNrRm9yRWRpdEJyYW5jaDogY2hlY2tGb3JFZGl0QnJhbmNoICsgMSB9KVxuICAgIH1cbiAgfSwgW2Jvb2tJZCwgb3duZXIsIGxhbmd1YWdlSWQsIHJlc291cmNlSWRdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc0VxdWFsKHJlZmVyZW5jZSwgY3VycmVudFJlZmVyZW5jZSkpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBTY3JpcHR1cmVDYXJkIHJlZmVyZW5jZSBjaGFuZ2VkYCwgcmVmZXJlbmNlKVxuICAgICAgc2V0U3RhdGUoeyBjdXJyZW50UmVmZXJlbmNlOiByZWZlcmVuY2UgfSlcbiAgICB9XG4gIH0sIFtyZWZlcmVuY2VdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHdhaXRpbmcgZm9yIGJyYW5jaCBmZXRjaCB0byBjb21wbGV0ZVxuICAgIGNvbnNvbGUubG9nKGBTY3JpcHR1cmVDYXJkIGJyYW5jaERldGVybWluZWQgaXMgJHticmFuY2hEZXRlcm1pbmVkfSBhbmQgd29ya2luZ1JlZiBpcyAke3dvcmtpbmdSZWZ9IGFuZCByZWFkeUZvckZldGNoIGlzICR7cmVhZHlGb3JGZXRjaH1gKVxuXG4gICAgaWYgKCFyZWFkeUZvckZldGNoICYmIGJyYW5jaERldGVybWluZWQgKSB7XG4gICAgICBzZXRTdGF0ZSh7IHJlYWR5Rm9yRmV0Y2g6IHRydWUsIHJlZjogd29ya2luZ1JlZiB9KVxuICAgIH1cbiAgfSwgW2JyYW5jaERldGVybWluZWRdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHNlbGVjdCBjb3JyZWN0IHdvcmtpbmcgcmVmIC0gY291bGQgYmUgbWFzdGVyLCB1c2VyIGJyYW5jaCwgb3IgcmVsZWFzZVxuICAgIGlmIChfdXNpbmdVc2VyQnJhbmNoICE9PSB1c2luZ1VzZXJCcmFuY2gpIHtcbiAgICAgIHNldFN0YXRlKHsgdXNpbmdVc2VyQnJhbmNoOiBfdXNpbmdVc2VyQnJhbmNoIH0pXG4gICAgfVxuICB9LCBbX3VzaW5nVXNlckJyYW5jaCwgdXNpbmdVc2VyQnJhbmNoXSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyB1cGRhdGUgZGlzcGxheSBzdGF0dXMgaWYgZXJyb3JcbiAgICBjb25zdCBlcnJvciA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2VTdGF0dXM/LltFUlJPUl9TVEFURV1cblxuICAgIGlmIChlcnJvcikgeyAvLyBpZiBlcnJvciB3YXMgZm91bmQgZG8gY2FsbGJhY2tcbiAgICAgIGNvbnN0IHJlc291cmNlU3RhdHVzID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZVN0YXR1c1xuICAgICAgY29uc3QgcmVzb3VyY2VMaW5rID0gZ2V0UmVzb3VyY2VMaW5rKHNjcmlwdHVyZUNvbmZpZylcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnZXRSZXNvdXJjZU1lc3NhZ2UocmVzb3VyY2VTdGF0dXMsIHNlcnZlciwgcmVzb3VyY2VMaW5rLCBpc05UXylcbiAgICAgIGNvbnN0IGlzQWNjZXNzRXJyb3IgPSByZXNvdXJjZVN0YXR1c1tNQU5JRkVTVF9OT1RfTE9BREVEX0VSUk9SXVxuICAgICAgb25SZXNvdXJjZUVycm9yICYmIG9uUmVzb3VyY2VFcnJvcihtZXNzYWdlLCBpc0FjY2Vzc0Vycm9yLCByZXNvdXJjZVN0YXR1cylcbiAgICB9XG4gIH0sIFtzY3JpcHR1cmVDb25maWc/LnJlc291cmNlU3RhdHVzPy5bRVJST1JfU1RBVEVdXSlcblxuICBpZiAoc2NyaXB0dXJlQ29uZmlnLnRpdGxlICYmIHNjcmlwdHVyZUNvbmZpZy52ZXJzaW9uKSB7XG4gICAgc2NyaXB0dXJlVGl0bGUgPSBgJHtzY3JpcHR1cmVDb25maWcudGl0bGV9IHYke3NjcmlwdHVyZUNvbmZpZy52ZXJzaW9ufWBcbiAgICBzY3JpcHR1cmVWZXJzaW9uSGlzdC51cGRhdGVUaXRsZShzY3JpcHR1cmVDb25maWcucmVzb3VyY2VMaW5rLCBzY3JpcHR1cmVUaXRsZSlcbiAgfSBlbHNlIHtcbiAgICBzY3JpcHR1cmVUaXRsZSA9IGBUaXRsZSBtaXNzaW5nIGZyb20gcHJvamVjdCBtYW5pZmVzdGBcbiAgfVxuXG4gIC8qKiBEeW5hbWljYWxseSBjcmVhdGVzIHRoZSBzY3JpcHR1cmUgc2VsZWN0aW9uIGRyb3Bkb3duIHRvIGJlIGluc2VydGVkIGludG8gY2FyZCBzZXR0aW5ncyAqL1xuICBmdW5jdGlvbiBnZXRTY3JpcHR1cmVTZWxlY3RvcigpIHtcbiAgICBjb25zdCBzY3JpcHR1cmVTZWxlY3Rpb25Db25maWcgPSBnZXRTY3JpcHR1cmVWZXJzaW9uU2V0dGluZ3Moe1xuICAgICAgbGFiZWwsXG4gICAgICByZXNvdXJjZUxpbms6IHNjcmlwdHVyZUNvbmZpZy5yZXNvdXJjZUxpbmssXG4gICAgICBzZXRTY3JpcHR1cmUsXG4gICAgICBzY3JpcHR1cmVWZXJzaW9uSGlzdCxcbiAgICB9KVxuXG4gICAgcmV0dXJuIDxTY3JpcHR1cmVTZWxlY3RvciB7Li4uc2NyaXB0dXJlU2VsZWN0aW9uQ29uZmlnfSBzdHlsZT17c3R5bGV9IGVycm9yTWVzc2FnZT17dXJsRXJyb3J9IC8+XG4gIH1cblxuICBmdW5jdGlvbiBvbk1lbnVDbG9zZSgpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhgb25NZW51Q2xvc2UoKWApXG4gICAgc2V0U3RhdGUoeyB1cmxFcnJvcjogbnVsbCB9KVxuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCBsYW5ndWFnZUlkXyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/Lmxhbmd1YWdlSWRcbiAgY29uc3QgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZSh7IGxhbmd1YWdlSWQ6IGxhbmd1YWdlSWRfIH0pXG4gIGNvbnN0IGRpcmVjdGlvbiA9IChsYW5ndWFnZT8uZGlyZWN0aW9uKSB8fCAnbHRyJ1xuICBjb25zdCBfcmVmZXJlbmNlID0gY3VycmVudFJlZmVyZW5jZSB8fCByZWZlcmVuY2VcblxuICBjb25zdCBpc0hlYnJldyA9IChsYW5ndWFnZUlkXyA9PT0gJ2hibycpXG4gIGNvbnN0IGZvbnRGYWN0b3IgPSBpc0hlYnJldyA/IDEuNCA6IDEgLy8gd2UgYXV0b21hdGljYWxseSBzY2FsZSB1cCBmb250IHNpemUgZm9yIEhlYnJld1xuICBjb25zdCBzY2FsZWRGb250U2l6ZSA9IGZvbnRTaXplICogZm9udEZhY3RvclxuXG4gIGNvbnN0IGl0ZW1zID0gbnVsbFxuICBjb25zdCB7XG4gICAgc3RhdGU6IHtcbiAgICAgIGhlYWRlcnMsIGZpbHRlcnMsIGl0ZW1JbmRleCwgbWFya2Rvd25WaWV3LFxuICAgIH0sXG4gICAgYWN0aW9uczoge1xuICAgICAgc2V0RmlsdGVycywgc2V0SXRlbUluZGV4LCBzZXRNYXJrZG93blZpZXcsXG4gICAgfSxcbiAgfSA9IHVzZUNhcmRTdGF0ZSh7IGl0ZW1zIH0pXG5cbiAgY29uc3QgcmVmU3R5bGUgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZm9udEZhbWlseTogJ05vdG8gU2FucycsXG4gICAgZm9udFNpemU6IGAke01hdGgucm91bmQoc2NhbGVkRm9udFNpemUgKiAwLjkpfSVgLFxuICB9KSwgW3NjYWxlZEZvbnRTaXplXSlcblxuICBjb25zdCBjb250ZW50U3R5bGUgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZm9udEZhbWlseTogJ05vdG8gU2FucycsXG4gICAgZm9udFNpemU6IGAke3NjYWxlZEZvbnRTaXplfSVgLFxuICB9KSwgW3NjYWxlZEZvbnRTaXplXSlcblxuICBjb25zdCBzY3JpcHR1cmVMYWJlbCA9IDxUaXRsZT57c2NyaXB0dXJlVGl0bGV9PC9UaXRsZT5cbiAgbGV0IGRpc2FibGVXb3JkUG9wb3Zlcl8gPSBkaXNhYmxlV29yZFBvcG92ZXJcbiAgY29uc3QgdXNpbmdPcmlnaW5hbEJpYmxlID0gaXNPcmlnaW5hbEJpYmxlKHNjcmlwdHVyZUNvbmZpZ1sncmVzb3VyY2UnXT8ucHJvamVjdElkKVxuXG4gIGlmIChkaXNhYmxlV29yZFBvcG92ZXIgPT09IHVuZGVmaW5lZCkgeyAvLyBpZiBub3Qgc3BlY2lmaWVkLCB0aGVuIGRldGVybWluZSBpZiBvcmlnaW5hbCBsYW5ndWFnZSByZXNvdXJjZVxuICAgIGRpc2FibGVXb3JkUG9wb3Zlcl8gPSAhdXNpbmdPcmlnaW5hbEJpYmxlXG4gIH1cblxuICBjb25zdCBlbmFibGVFZGl0ID0gIXVzaW5nT3JpZ2luYWxCaWJsZVxuICBjb25zdCBlbmFibGVBbGlnbm1lbnQgPSAhdXNpbmdPcmlnaW5hbEJpYmxlXG4gIGNvbnN0IG9yaWdpbmFsUmVwb1VybCA9IGlzTmV3VGVzdGFtZW50ID8gZ3JlZWtSZXBvVXJsIDogaGVicmV3UmVwb1VybFxuICBjb25zdCBzY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnID0ge1xuICAgIGF1dGhlbnRpY2F0aW9uOiBjYW5Vc2VFZGl0QnJhbmNoID8gYXV0aGVudGljYXRpb24gOiBudWxsLFxuICAgIGJvb2tJbmRleCxcbiAgICBjdXJyZW50VmVyc2VSZWY6IF9yZWZlcmVuY2UsXG4gICAgZW5hYmxlRWRpdCxcbiAgICBlbmFibGVBbGlnbm1lbnQsXG4gICAgaHR0cENvbmZpZyxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaXNOZXdUZXN0YW1lbnQsXG4gICAgbG9nZ2VkSW5Vc2VyOiBjYW5Vc2VFZGl0QnJhbmNoID8gbG9nZ2VkSW5Vc2VyIDogbnVsbCxcbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9yaWdpbmFsUmVwb1VybCxcbiAgICBzY3JpcHR1cmVDb25maWcsXG4gICAgc2NyaXB0dXJlU2V0dGluZ3MsXG4gICAgc3RhcnRFZGl0QnJhbmNoLFxuICAgIHNldFNhdmVkQ2hhbmdlczogX3NldFNhdmVkQ2hhbmdlcyxcbiAgICBzb3VyY2VMYW5ndWFnZTogaXNOVF8gPyBOVF9PUklHX0xBTkcgOiBPVF9PUklHX0xBTkcsXG4gICAgdGFyZ2V0TGFuZ3VhZ2U6IGxhbmd1YWdlLFxuICAgIHRpdGxlOiBzY3JpcHR1cmVUaXRsZSxcbiAgICB3b3JraW5nUmVzb3VyY2VCcmFuY2g6IHJlZixcbiAgfVxuXG4gIC8qKlxuICAgKiB0aGlzIGdldHMgY2FsbGVkIHdoZW5ldmVyIGEgc2NyaXB0dXJlIHBhbmUgaGFzIGEgY2hhbmdlIGluIHNhdmUgc3RhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGN1cnJlbnRJbmRleFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNhdmVkXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGdldENoYW5nZXMgLSB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciB1c2VyIGNsaWNrcyBzYXZlIGJ1dHRvblxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjbGVhckNoYW5nZXMgLSB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBzYXZlIGhhcyBjb21wbGV0ZWRcbiAgICogQHBhcmFtIHtvYmplY3R9IHN0YXRlIC0gY3VycmVudCBzdGF0ZSBvZiB3b3JkIGFsaWdubWVudC9lZGl0XG4gICAqL1xuICBmdW5jdGlvbiBfc2V0U2F2ZWRDaGFuZ2VzKGN1cnJlbnRJbmRleCwgc2F2ZWQsIHsgZ2V0Q2hhbmdlcyA9IG51bGwsIGNsZWFyQ2hhbmdlcyA9IG51bGwsIHN0YXRlID0gbnVsbCB9KSB7XG4gICAgY29uc3QgX3Vuc2F2ZWRDaGFuZ2VzTGlzdCA9IHsgLi4udW5zYXZlZENoYW5nZXNMaXN0IH1cblxuICAgIGlmIChzYXZlZCkge1xuICAgICAgaWYgKF91bnNhdmVkQ2hhbmdlc0xpc3QuaGFzT3duUHJvcGVydHkoY3VycmVudEluZGV4KSkge1xuICAgICAgICBkZWxldGUgX3Vuc2F2ZWRDaGFuZ2VzTGlzdFtjdXJyZW50SW5kZXhdXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF91bnNhdmVkQ2hhbmdlc0xpc3RbY3VycmVudEluZGV4XSA9IHsgZ2V0Q2hhbmdlcywgY2xlYXJDaGFuZ2VzLCBzdGF0ZSB9IC8vIHVwZGF0ZSB3aXRoIGxhdGVzdFxuICAgIH1cblxuICAgIGNvbnN0IF9oYXZlVW5zYXZlZENoYW5nZXMgPSAhIU9iamVjdC5rZXlzKF91bnNhdmVkQ2hhbmdlc0xpc3QpLmxlbmd0aFxuXG4gICAgaWYgKGhhdmVVbnNhdmVkQ2hhbmdlcyAhPSBfaGF2ZVVuc2F2ZWRDaGFuZ2VzKSB7XG4gICAgICBzZXRTYXZlZENoYW5nZXMgJiYgc2V0U2F2ZWRDaGFuZ2VzKHJlc291cmNlSWQsICFfaGF2ZVVuc2F2ZWRDaGFuZ2VzKVxuICAgICAgc2V0U3RhdGUoeyBoYXZlVW5zYXZlZENoYW5nZXM6IF9oYXZlVW5zYXZlZENoYW5nZXMgfSlcbiAgICB9XG5cbiAgICBpZiAoIWlzRXF1YWwoX3Vuc2F2ZWRDaGFuZ2VzTGlzdCwgdW5zYXZlZENoYW5nZXNMaXN0KSkge1xuICAgICAgc2V0U3RhdGUoeyB1bnNhdmVkQ2hhbmdlc0xpc3Q6IF91bnNhdmVkQ2hhbmdlc0xpc3QgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2VhcmNoIGNoYXB0ZXIgb3IgdmVyc2UgY2h1bmsgdG8gbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGZpbmRJdGVtXG4gICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gZmluZEl0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gY2h1bmtzXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kUmVmSW5BcnJheShmaW5kSXRlbSwgY2h1bmtzKSB7XG4gICAgY29uc3QgcmVmXyA9IGZpbmRJdGVtICsgJydcbiAgICBjb25zdCByZWZMZW4gPSByZWZfLmxlbmd0aFxuICAgIGNvbnN0IGluZGV4ID0gY2h1bmtzLmZpbmRJbmRleCgoY2h1bmssIGlkeCkgPT4ge1xuICAgICAgaWYgKGlkeCA+IDApIHtcbiAgICAgICAgaWYgKGNodW5rLnN1YnN0cmluZygwLCByZWZMZW4pID09PSByZWZfKSB7XG4gICAgICAgICAgY29uc3QgbmV4dENoYXIgPSBjaHVua1tyZWZMZW5dXG5cbiAgICAgICAgICBpZiAoKG5leHRDaGFyID4gJzknKSB8fCAobmV4dENoYXIgPCAnMCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSlcbiAgICByZXR1cm4gaW5kZXhcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJvb2tOYW1lKCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBib29rQ2FwcyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVmZXJlbmNlPy5wcm9qZWN0SWQgPyBzY3JpcHR1cmVDb25maWcucmVmZXJlbmNlLnByb2plY3RJZC50b1VwcGVyQ2FzZSgpIDogJydcbiAgICByZXR1cm4gYCR7Ym9va0luZGV4fS0ke2Jvb2tDYXBzfS51c2ZtYFxuICB9XG5cbiAgY29uc3QgZmlsZXBhdGggPSBnZXRCb29rTmFtZSgpXG5cbiAgLy8ga2VlcCB0cmFjayBvZiB2ZXJzZSBlZGl0IHN0YXRlXG4gIGNvbnN0IHtcbiAgICBlcnJvcjogc2F2ZUVycm9yLFxuICAgIGlzRXJyb3I6IGlzU2F2ZUVycm9yLFxuICAgIG9uU2F2ZUVkaXQsXG4gIH0gPSB1c2VFZGl0KHtcbiAgICBzaGEsXG4gICAgb3duZXIsXG4gICAgY29udGVudDogc2F2ZUNvbnRlbnQsXG4gICAgY29uZmlnOiB7XG4gICAgICBjYWNoZTogeyBtYXhBZ2U6IDAgfSxcbiAgICAgIC4uLmF1dGhlbnRpY2F0aW9uPy5jb25maWcsXG4gICAgICB0b2tlbjogYXV0aGVudGljYXRpb24/LnRva2VuLFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGltZW91dDogaHR0cENvbmZpZz8uc2VydmVyVGltZU91dCB8fCBodHRwQ29uZmlnPy50aW1lb3V0IHx8IDEwMDAwLFxuICAgICAgc2VydmVyLFxuICAgICAgZG9udENyZWF0ZUJyYW5jaDogdHJ1ZSxcbiAgICB9LFxuICAgIGF1dGhvcjogbG9nZ2VkSW5Vc2VyLFxuICAgIHRva2VuOiBhdXRoZW50aWNhdGlvbj8udG9rZW4sXG4gICAgYnJhbmNoOiB3b3JraW5nUmVzb3VyY2VCcmFuY2gsXG4gICAgZmlsZXBhdGgsXG4gICAgcmVwbyxcbiAgfSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyB3aGVuIHdlIGdldCBhIHNhdmUgc2F2ZUVycm9yXG4gICAgaWYgKHNhdmVFcnJvciAmJiBpc1NhdmVFcnJvcikge1xuICAgICAgY29uc29sZS5sb2coYHNhdmUgZXJyb3JgLCBzYXZlRXJyb3IpXG4gICAgICBvblJlc291cmNlRXJyb3IgJiYgb25SZXNvdXJjZUVycm9yKG51bGwsIGZhbHNlLCBudWxsLCBgRXJyb3Igc2F2aW5nICR7bGFuZ3VhZ2VJZF99XyR7cmVzb3VyY2VJZH0gJHtzYXZlRXJyb3J9YCwgdHJ1ZSlcbiAgICB9XG4gIH0sIFtzYXZlRXJyb3IsIGlzU2F2ZUVycm9yXSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyB3aGVuIHN0YXJ0U2F2ZSBnb2VzIHRydWUsIHNhdmUgZWRpdHMgdG8gdXNlciBicmFuY2ggYW5kIHRoZW4gY2xlYXIgc3RhcnRTYXZlXG4gICAgY29uc3QgX3NhdmVFZGl0ID0gYXN5bmMgKCkgPT4geyAvLyBiZWdpbiB1cGxvYWRpbmcgbmV3IFVTRk1cbiAgICAgIGNvbnNvbGUuaW5mbyhgc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBVc2luZyBzaGE6ICR7c2hhfWApXG4gICAgICBhd2FpdCBvblNhdmVFZGl0KHVzZXJFZGl0QnJhbmNoTmFtZSkudGhlbigoc3VjY2VzcykgPT4geyAvLyBwdXNoIGNoYW5nZWQgdG8gc2VydmVyXG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gc2F2ZSBzY3JpcHR1cmUgZWRpdHMgc3VjY2Vzc2ApXG4gICAgICAgICAgY29uc3QgdW5zYXZlZENhcmRJbmRpY2VzID0gT2JqZWN0LmtleXModW5zYXZlZENoYW5nZXNMaXN0KVxuXG4gICAgICAgICAgaWYgKHVuc2F2ZWRDYXJkSW5kaWNlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhcmRJbmRleCBvZiB1bnNhdmVkQ2FyZEluZGljZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBjbGVhckNoYW5nZXMgfSA9IHVuc2F2ZWRDaGFuZ2VzTGlzdFtjYXJkSW5kZXhdXG4gICAgICAgICAgICAgIGNsZWFyQ2hhbmdlcyAmJiBjbGVhckNoYW5nZXMoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBSZWxvYWRpbmcgcmVzb3VyY2UnKVxuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIHN0YXJ0U2F2ZTogZmFsc2UsXG4gICAgICAgICAgICByZWFkeUZvckZldGNoOiB0cnVlLFxuICAgICAgICAgICAgcmVmOiB1c2VyRWRpdEJyYW5jaE5hbWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBkZWxheSg1MDApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgc2NyaXB0dXJlQ29uZmlnPy5yZWxvYWRSZXNvdXJjZShzaGEpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIGVycm9yIGNyZWF0aW5nIGVkaXQgYnJhbmNoJylcbiAgICAgICAgICBzZXRTdGF0ZSh7IHN0YXJ0U2F2ZTogZmFsc2UgfSlcbiAgICAgICAgICBvblJlc291cmNlRXJyb3IgJiYgb25SZXNvdXJjZUVycm9yKG51bGwsIGZhbHNlLCBudWxsLCBgRXJyb3IgY3JlYXRpbmcgZWRpdCBicmFuY2ggJHtsYW5ndWFnZUlkX31fJHtyZXNvdXJjZUlkfWAsIHRydWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0U2F2ZSkge1xuICAgICAgaWYgKCFlZGl0QnJhbmNoUmVhZHkpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCAtIGVkaXQgYnJhbmNoIG5vdCB5ZXQgY3JlYXRlZGApXG4gICAgICB9IGVsc2UgaWYgKCFzaGEpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCAtIHNhdmUgc2hhIG5vdCB5ZXQgcmVhZHlgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCAtIGNhbGxpbmcgX3NhdmVFZGl0KClgKVxuICAgICAgICBfc2F2ZUVkaXQoKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW3N0YXJ0U2F2ZSwgZWRpdEJyYW5jaFJlYWR5LCBzaGFdKVxuXG4gIC8qKlxuICAgKiBjb252ZXJ0IHVwZGF0ZWRWZXJzZU9iamVjdHMgdG8gVVNGTSBhbmQgbWVyZ2UgaW50byB0aGUgYmlibGVVc2ZtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiaWJsZVVzZm0gLSBVU0ZNIG9mIGJpYmxlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZWYgLSByZWZlcmVuY2Ugb2YgdmVyc2UgdG8gbWVyZ2UgaW5cbiAgICogQHBhcmFtIHtvYmplY3RbXX0gdXBkYXRlZFZlcnNlT2JqZWN0cyAtIG5ldyB2ZXJzZSBpbiB2ZXJzZU9iamVjdCBmb3JtYXRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNhcmROdW1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlVmVyc2VPYmplY3RzSW50b0JpYmxlVXNmbShiaWJsZVVzZm0sIHJlZiwgdXBkYXRlZFZlcnNlT2JqZWN0cywgY2FyZE51bTogbnVtYmVyKSB7XG4gICAgbGV0IG5ld1VzZm1cbiAgICBjb25zdCBjaGFwdGVyQ2h1bmtzID0gYmlibGVVc2ZtPy5zcGxpdCgnXFxcXGMgJylcbiAgICBjb25zdCBjaGFwdGVySW5kZXggPSBmaW5kUmVmSW5BcnJheShyZWY/LmNoYXB0ZXIsIGNoYXB0ZXJDaHVua3MpXG5cbiAgICBpZiAoY2hhcHRlckluZGV4ID49IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDaGFwdGVyID0gY2hhcHRlckNodW5rc1tjaGFwdGVySW5kZXhdXG4gICAgICBjb25zdCB2ZXJzZUNodW5rcyA9IGN1cnJlbnRDaGFwdGVyLnNwbGl0KCdcXFxcdiAnKVxuICAgICAgY29uc3QgdmVyc2VJbmRleCA9IGZpbmRSZWZJbkFycmF5KHJlZj8udmVyc2UsIHZlcnNlQ2h1bmtzKVxuXG4gICAgICBpZiAodmVyc2VJbmRleCA+PSAwKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZlcnNlVXNmbSA9IFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMuY29udmVydFZlcnNlRGF0YVRvVVNGTSh1cGRhdGVkVmVyc2VPYmplY3RzKVxuICAgICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkKCR7Y2FyZE51bX0pIC0gbmV3IFVTRk0gZm9yIGNhcmQ6fSAtICR7bmV3VmVyc2VVc2ZtLnN1YnN0cmluZygwLCAxMDApfWApXG4gICAgICAgIGNvbnN0IG9sZFZlcnNlID0gdmVyc2VDaHVua3NbdmVyc2VJbmRleF1cbiAgICAgICAgY29uc3QgdmVyc2VOdW1MZW4gPSAocmVmPy52ZXJzZSArICcnKS5sZW5ndGhcbiAgICAgICAgdmVyc2VDaHVua3NbdmVyc2VJbmRleF0gPSBvbGRWZXJzZS5zdWJzdHJpbmcoMCwgdmVyc2VOdW1MZW4gKyAxKSArIG5ld1ZlcnNlVXNmbVxuICAgICAgICBjb25zdCBuZXdDaGFwdGVyID0gdmVyc2VDaHVua3Muam9pbignXFxcXHYgJylcbiAgICAgICAgY2hhcHRlckNodW5rc1tjaGFwdGVySW5kZXhdID0gbmV3Q2hhcHRlclxuICAgICAgICBuZXdVc2ZtID0gY2hhcHRlckNodW5rcy5qb2luKCdcXFxcYyAnKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3VXNmbVxuICB9XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gZm9yIGVhY2ggdW5zYXZlZCBjaGFuZ2UsIGNhbGwgaW50byBzY3JpcHR1cmVQYW5lIHRvIGdldCBsYXRlc3QgY2hhbmdlcyBmb3IgdmVyc2UgdG8gc2F2ZVxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldFJlYWR5Rm9yU2F2ZSgpIHtcbiAgICAgIGlmIChzYXZlQ2xpY2tlZCkge1xuICAgICAgICBsZXQgY3JlYXRlRWRpdEJyYW5jaCA9ICFfdXNpbmdVc2VyQnJhbmNoXG5cbiAgICAgICAgaWYgKCFjcmVhdGVFZGl0QnJhbmNoKSB7IC8vIGlmIGFscmVhZHkgdXNpbmcgdGhlIHVzZXIgYnJhbmNoXG4gICAgICAgICAgaWYgKHdvcmtpbmdSZXNvdXJjZUJyYW5jaCAhPT0gdXNlckVkaXRCcmFuY2hOYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYHNhdmVDaGFuZ2VzVG9DbG91ZCAtIHN0YXRlIGNvbmZsaWN0IC0gc2hvdWxkIGJlIGluIHVzZXIgYnJhbmNoICR7dXNlckVkaXRCcmFuY2hOYW1lfSwgYnV0IGFjdHVhbGx5IHVzaW5nICR7d29ya2luZ1Jlc291cmNlQnJhbmNofWApXG4gICAgICAgICAgICBjcmVhdGVFZGl0QnJhbmNoID0gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gYWxyZWFkeSB1c2luZyBlZGl0IGJyYW5jaDogJHt3b3JraW5nUmVzb3VyY2VCcmFuY2h9YClcbiAgICAgICAgICAgIHNldFN0YXRlKHsgZWRpdEJyYW5jaFJlYWR5OiB0cnVlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNyZWF0ZUVkaXRCcmFuY2gpIHsgLy8gaWYgbm90IHlldCB1c2luZyB0aGUgdXNlciBicmFuY2gsIGNyZWF0ZSBpdFxuICAgICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQgLSBjcmVhdGluZyBlZGl0IGJyYW5jaGApXG4gICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgZWRpdEJyYW5jaFJlYWR5OiBmYWxzZSxcbiAgICAgICAgICAgIHJlYWR5Rm9yRmV0Y2g6IGZhbHNlLFxuICAgICAgICAgICAgc2hhOiBudWxsLFxuICAgICAgICAgIH0pIC8vIHdlIHdpbGwgbmVlZCBhIG5ldyBzaGEgZm9yIGJvb2svYnJhbmNoXG5cbiAgICAgICAgICBjb25zdCBicmFuY2ggPSBhd2FpdCBzdGFydEVkaXRCcmFuY2goKVxuXG4gICAgICAgICAgaWYgKGJyYW5jaCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCAtIGVkaXQgYnJhbmNoIGNyZWF0ZWRgKVxuICAgICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBlZGl0QnJhbmNoUmVhZHk6IHRydWUsXG4gICAgICAgICAgICAgIHJlYWR5Rm9yRmV0Y2g6IHRydWUsXG4gICAgICAgICAgICAgIHJlZjogYnJhbmNoLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCAtIGZhaWxlZCB0byBjcmVhdGUgZWRpdCBicmFuY2hgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQgLSBnZXR0aW5nIHZlcnNlIGNoYW5nZXNgKVxuICAgICAgICBjb25zdCB1bnNhdmVkQ2FyZEluZGljZXMgPSBPYmplY3Qua2V5cyh1bnNhdmVkQ2hhbmdlc0xpc3QpXG5cbiAgICAgICAgaWYgKHVuc2F2ZWRDYXJkSW5kaWNlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgbGV0IGJpYmxlVXNmbSA9IGNvcmUuZ2V0UmVzcG9uc2VEYXRhKHNjcmlwdHVyZUNvbmZpZz8uZmV0Y2hSZXNwb25zZSlcbiAgICAgICAgICBsZXQgbWVyZ2VGYWlsID0gZmFsc2VcbiAgICAgICAgICBsZXQgY2FyZE51bSA9IDBcblxuICAgICAgICAgIGZvciAoY29uc3QgY2FyZEluZGV4IG9mIHVuc2F2ZWRDYXJkSW5kaWNlcykge1xuICAgICAgICAgICAgY2FyZE51bSA9IHBhcnNlSW50KGNhcmRJbmRleClcbiAgICAgICAgICAgIGNvbnN0IHsgZ2V0Q2hhbmdlcywgc3RhdGUgfSA9IHVuc2F2ZWRDaGFuZ2VzTGlzdFtjYXJkTnVtXVxuXG4gICAgICAgICAgICBpZiAoZ2V0Q2hhbmdlcykge1xuICAgICAgICAgICAgICBsZXQgbmV3VXNmbVxuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHMsXG4gICAgICAgICAgICAgIH0gPSBnZXRDaGFuZ2VzKHN0YXRlKVxuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGVkVmVyc2VPYmplY3RzICYmIGJpYmxlVXNmbSkgeyAvLyBqdXN0IHJlcGxhY2UgdmVyc2VcbiAgICAgICAgICAgICAgICBuZXdVc2ZtID0gbWVyZ2VWZXJzZU9iamVjdHNJbnRvQmlibGVVc2ZtKGJpYmxlVXNmbSwgcmVmLCB1cGRhdGVkVmVyc2VPYmplY3RzLCBjYXJkTnVtKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKG5ld1VzZm0pIHtcbiAgICAgICAgICAgICAgICBiaWJsZVVzZm0gPSBuZXdVc2ZtXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVyZ2VGYWlsID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobWVyZ2VGYWlsKSB7IC8vIGlmIHdlIGZhaWxlZCB0byBtZXJnZSwgZmFsbGJhY2sgdG8gYnJ1dGUgZm9yY2UgdmVyc2Ugb2JqZWN0cyB0byBVU0ZNXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkKCR7Y2FyZE51bX0pIC0gdmVyc2Ugbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gaW5zZXJ0aW5nIHZlcnNlIG9iamVjdGApXG4gICAgICAgICAgICBsZXQgbmV3Qm9va0pzb25cblxuICAgICAgICAgICAgZm9yIChjb25zdCBjYXJkSW5kZXggb2YgdW5zYXZlZENhcmRJbmRpY2VzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNhcmROdW0gPSBwYXJzZUludChjYXJkSW5kZXgpXG4gICAgICAgICAgICAgIGNvbnN0IHsgZ2V0Q2hhbmdlcywgc3RhdGUgfSA9IHVuc2F2ZWRDaGFuZ2VzTGlzdFtjYXJkTnVtXVxuXG4gICAgICAgICAgICAgIGlmIChnZXRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1VzZm1cbiAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICBuZXdWZXJzZVRleHQsXG4gICAgICAgICAgICAgICAgICByZWYsXG4gICAgICAgICAgICAgICAgICB1cGRhdGVkVmVyc2VPYmplY3RzLFxuICAgICAgICAgICAgICAgIH0gPSBnZXRDaGFuZ2VzKHN0YXRlKVxuXG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRWZXJzZU9iamVjdHMgJiYgIW5ld1VzZm0pIHtcbiAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXRWZXJzZU9iamVjdHNfID0gbnVsbFxuXG4gICAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdWZXJzZVRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRhcmdldFZlcnNlT2JqZWN0cyB9ID0gQWxpZ25tZW50SGVscGVycy51cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZSh1cGRhdGVkVmVyc2VPYmplY3RzLCBuZXdWZXJzZVRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IHRhcmdldFZlcnNlT2JqZWN0c1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV3Qm9va0pzb24gPSB0YXJnZXRWZXJzZU9iamVjdHNfICYmIHNjcmlwdHVyZUNvbmZpZz8udXBkYXRlVmVyc2UocmVmLmNoYXB0ZXIsIHJlZi52ZXJzZSwge3ZlcnNlT2JqZWN0czogdGFyZ2V0VmVyc2VPYmplY3RzX30pXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJpYmxlVXNmbSA9IHVzZm1qcy50b1VTRk0obmV3Qm9va0pzb24sIHtmb3JjZWROZXdMaW5lczogdHJ1ZX0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gc2F2aW5nIG5ldyBVU0ZNOiAke2JpYmxlVXNmbS5zdWJzdHJpbmcoMCwgMTAwKX0uLi5gKVxuICAgICAgICAgIHNldFN0YXRlKHtzYXZlQ29udGVudDogYmlibGVVc2ZtLCBzdGFydFNhdmU6IHRydWUsIHNhdmVDbGlja2VkOiBmYWxzZX0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRSZWFkeUZvclNhdmUoKVxuICB9LCBbc2F2ZUNsaWNrZWRdKVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgeyBjaGFwdGVyIH0gPSBfcmVmZXJlbmNlIHx8IHt9XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBfdmVyc2VzRm9yUmVmID0gc2NyaXB0dXJlQ29uZmlnPy52ZXJzZXNGb3JSZWZcbiAgICBsZXQgbmV3U2VsZWN0aW9ucyA9IG5ldyBNYXAoKVxuICAgIGxldCB1cGRhdGVTZWxlY3Rpb25zID0gZmFsc2VcbiAgICBjb25zdCBfbWFwID0gbmV3U2VsZWN0aW9uc1xuICAgIGNvbnN0IG9yaWdpbmFsQm9va0lkID0gb3JpZ2luYWxTY3JpcHR1cmVCb29rT2JqZWN0cz8uYm9va0lkXG4gICAgY29uc3QgYm9va1ZlcnNlT2JqZWN0ID0gb3JpZ2luYWxTY3JpcHR1cmVCb29rT2JqZWN0cz8uY2hhcHRlcnNcbiAgICBsZXQgbmV3U2VsZWN0ZWRRdW90ZSA9IG51bGxcblxuICAgIC8vIGlmIHdlIGhhdmUgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSBzZWxlY3Rpb25zXG4gICAgaWYgKF92ZXJzZXNGb3JSZWY/Lmxlbmd0aCAmJlxuICAgICAgYm9va1ZlcnNlT2JqZWN0ICYmXG4gICAgICAoYm9va0lkID09PSBvcmlnaW5hbEJvb2tJZCkgJiZcbiAgICAgIGJvb2tWZXJzZU9iamVjdFtjaGFwdGVyXSAmJiAvLyB3ZSBuZWVkIHRvIGhhdmUgZGF0YSBmb3IgY2hhcHRlclxuICAgICAgc2VsZWN0ZWRRdW90ZT8ucXVvdGVcbiAgICApIHtcbiAgICAgIC8vIGlmIHF1b3RlIGlzIGRpZmZlcmVudCB0aGFuIGxhc3RcbiAgICAgIGlmICghaXNFcXVhbChsYXN0U2VsZWN0ZWRRdW90ZSwgc2VsZWN0ZWRRdW90ZSkgfHxcbiAgICAgICAgIWlzRXF1YWwodmVyc2VzRm9yUmVmLCBfdmVyc2VzRm9yUmVmKSkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbFZlcnNlcyA9IHt9XG4gICAgICAgIGNvbnN0IHN1YnN0aXR1dGUgPSB7fSAvLyBrZWVwIHRyYWNrIG9mIHZlcnNlIHN1YnN0aXR1dGlvbnNcbiAgICAgICAgbGV0IHN0YXJ0VmVyc2UgPSBfdmVyc2VzRm9yUmVmWzBdLnZlcnNlXG5cbiAgICAgICAgaWYgKHR5cGVvZiBzdGFydFZlcnNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHN0YXJ0VmVyc2UgPSBwYXJzZUludChzdGFydFZlcnNlKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhc3RWZXJzZSA9IHN0YXJ0VmVyc2VcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IF92ZXJzZXNGb3JSZWYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmVyc2VSZWYgPSBfdmVyc2VzRm9yUmVmW2ldXG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgY2hhcHRlcixcbiAgICAgICAgICAgIHZlcnNlLFxuICAgICAgICAgIH0gPSB2ZXJzZVJlZlxuICAgICAgICAgIC8vIFRSSUNLWSAtIHdlIHJlbWFwIHZlcnNlcyBpbiByZWZlcmVuY2UgcmFuZ2UgdG8gYSBsaW5lYXIgc2VyaWVzIG9mIHZlcnNlcyBzbyB2ZXJzZSBzcGFucyBkb24ndCBjaG9rZSBnZXRRdW90ZU1hdGNoZXNJbkJvb2tSZWZcbiAgICAgICAgICBsZXQgX3ZlcnNlID0gc3RhcnRWZXJzZSArIGlcbiAgICAgICAgICBsYXN0VmVyc2UgPSBfdmVyc2VcbiAgICAgICAgICBzdWJzdGl0dXRlW2Ake2NoYXB0ZXJ9OiR7X3ZlcnNlfWBdID0gYCR7Y2hhcHRlcn06JHt2ZXJzZX1gXG5cbiAgICAgICAgICBpZiAoIW9yaWdpbmFsVmVyc2VzW2NoYXB0ZXJdKSB7XG4gICAgICAgICAgICBvcmlnaW5hbFZlcnNlc1tjaGFwdGVyXSA9IHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHZlcnNlT2JqZWN0cyA9IFtdXG5cbiAgICAgICAgICBpZiAoKHR5cGVvZiB2ZXJzZSA9PT0gJ3N0cmluZycpICYmICh2ZXJzZS5pbmNsdWRlcygnLScpKSkge1xuICAgICAgICAgICAgY29uc3QgdmVyc2VzID0gZ2V0VmVyc2VzKGJvb2tWZXJzZU9iamVjdCwgYCR7Y2hhcHRlcn06JHt2ZXJzZX1gKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZlcnNlSXRlbSBvZiB2ZXJzZXMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgdm8gPSB2ZXJzZUl0ZW0udmVyc2VEYXRhLnZlcnNlT2JqZWN0c1xuICAgICAgICAgICAgICB2ZXJzZU9iamVjdHMgPSB2ZXJzZU9iamVjdHMuY29uY2F0KHZvKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2ZXJzZU9iamVjdHMgPSBib29rVmVyc2VPYmplY3RbY2hhcHRlcl1bdmVyc2VdPy52ZXJzZU9iamVjdHNcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmVyc2VPYmplY3RzKSB7XG4gICAgICAgICAgICB2ZXJzZU9iamVjdHMgPSBjbGVhbnVwVmVyc2VPYmplY3RzKHZlcnNlT2JqZWN0cylcbiAgICAgICAgICAgIG9yaWdpbmFsVmVyc2VzW2NoYXB0ZXJdW192ZXJzZV0gPSB7IHZlcnNlT2JqZWN0cyB9XG4gICAgICAgICAgICBfbWFwLnNldChgJHtjaGFwdGVyfToke3ZlcnNlfWAsIHZlcnNlT2JqZWN0cylcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjcmVhdGUgbmV3IHJlZmVyZW5jZSByYW5nZSBmb3IgbmV3IGxpbmVhciB2ZXJzZSByYW5nZVxuICAgICAgICBjb25zdCBbY2hhcHRlcl0gPSBzZWxlY3RlZFF1b3RlPy5yZWZlcmVuY2U/LnNwbGl0KCc6JylcbiAgICAgICAgbGV0IHN1YlJlZiA9IGAke2NoYXB0ZXJ9OiR7c3RhcnRWZXJzZX1gXG5cbiAgICAgICAgaWYgKGxhc3RWZXJzZSAhPSBzdGFydFZlcnNlKSB7XG4gICAgICAgICAgc3ViUmVmICs9IGAtJHtsYXN0VmVyc2V9YFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVvdGVNYXRjaGVzID0gZ2V0UXVvdGVNYXRjaGVzSW5Cb29rUmVmKHtcbiAgICAgICAgICBib29rT2JqZWN0OiBvcmlnaW5hbFZlcnNlcyxcbiAgICAgICAgICByZWY6IHN1YlJlZixcbiAgICAgICAgICBxdW90ZTogc2VsZWN0ZWRRdW90ZT8ucXVvdGUsXG4gICAgICAgICAgb2NjdXJyZW5jZTogc2VsZWN0ZWRRdW90ZT8ub2NjdXJyZW5jZSxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb25zID0gbmV3IE1hcCgpXG5cbiAgICAgICAgaWYgKHF1b3RlTWF0Y2hlcz8uc2l6ZSkge1xuICAgICAgICAgIHF1b3RlTWF0Y2hlcy5mb3JFYWNoKCh3b3Jkcywga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBfa2V5ID0gc3Vic3RpdHV0ZVtrZXldXG5cbiAgICAgICAgICAgIHNlbGVjdGlvbnMuc2V0KF9rZXksIHdvcmRzLm1hcCh3b3JkID0+IChcbiAgICAgICAgICAgICAgeyAuLi53b3JkLCB0ZXh0OiBjb3JlLm5vcm1hbGl6ZVN0cmluZyh3b3JkLnRleHQpIH1cbiAgICAgICAgICAgICkpKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbmV3U2VsZWN0aW9ucyA9IHNlbGVjdGlvbnNcbiAgICAgICAgbmV3U2VsZWN0ZWRRdW90ZSA9IHNlbGVjdGVkUXVvdGVcbiAgICAgICAgdXBkYXRlU2VsZWN0aW9ucyA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBuZXdTdGF0ZTogYW55ID0ge31cblxuICAgIC8vIHVwZGF0ZSBzdGF0ZXMgdGhhdCBoYXZlIGNoYW5nZWRcbiAgICBpZiAoIWFyZU1hcHNUaGVTYW1lKHZlcnNlT2JqZWN0c01hcCwgX21hcCkpIHtcbiAgICAgIG5ld1N0YXRlLnZlcnNlT2JqZWN0c01hcCA9IF9tYXBcbiAgICB9XG5cbiAgICBjb25zdCBib29rc05vdFNhbWUgPSByZWZlcmVuY2U/LnByb2plY3RJZCAhPT0gY3VycmVudFJlZmVyZW5jZT8ucHJvamVjdElkXG5cbiAgICBpZiAoYm9va3NOb3RTYW1lIHx8ICFhcmVWZXJzZXNTYW1lKHZlcnNlc0ZvclJlZiwgX3ZlcnNlc0ZvclJlZikpIHtcbiAgICAgIG5ld1N0YXRlLnZlcnNlc0ZvclJlZiA9IF92ZXJzZXNGb3JSZWZcbiAgICAgIG5ld1N0YXRlLmxhc3RTZWxlY3RlZFF1b3RlID0gbmV3U2VsZWN0ZWRRdW90ZVxuICAgICAgbmV3U3RhdGUuc2VsZWN0aW9ucyA9IG5ld1NlbGVjdGlvbnNcbiAgICB9XG5cbiAgICBpZiAobmV3U2VsZWN0ZWRRdW90ZSkge1xuICAgICAgbmV3U3RhdGUubGFzdFNlbGVjdGVkUXVvdGUgPSBuZXdTZWxlY3RlZFF1b3RlXG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZVNlbGVjdGlvbnMpIHtcbiAgICAgIGlmICghYXJlTWFwc1RoZVNhbWUoc2VsZWN0aW9ucyB8fCAobmV3IE1hcCgpKSwgbmV3U2VsZWN0aW9ucykpIHtcbiAgICAgICAgbmV3U3RhdGUuc2VsZWN0aW9ucyA9IG5ld1NlbGVjdGlvbnNcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMobmV3U3RhdGUpLmxlbmd0aCkge1xuICAgICAgc2V0U3RhdGUobmV3U3RhdGUpXG4gICAgfVxuICB9LCBbb3duZXIsIHJlc291cmNlSWQsIGJvb2tJZCwgbGFuZ3VhZ2VJZF8sIHNjcmlwdHVyZUNvbmZpZz8udmVyc2VzRm9yUmVmLCBvcmlnaW5hbFNjcmlwdHVyZUJvb2tPYmplY3RzLCBzZWxlY3RlZFF1b3RlXSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBjbGVhciBzZXR0aW5ncyBvbiB2ZXJzZSBjaGFuZ2VcbiAgICBzZXRTdGF0ZSh7XG4gICAgICB2ZXJzZXNBbGlnbm1lbnRTdGF0dXM6IG51bGwsXG4gICAgICB1bnNhdmVkQ2hhbmdlc0xpc3Q6IHt9LFxuICAgICAgaGF2ZVVuc2F2ZWRDaGFuZ2VzOiBmYWxzZSxcbiAgICB9KVxuICB9LCBbX3JlZmVyZW5jZV0pXG5cbiAgY29uc3QgdXBkYXRlVmVyc2VzQWxpZ25tZW50U3RhdHVzID0gKHJlZmVyZW5jZSwgYWxpZ25lZCkgPT4ge1xuICAgIHNldFN0YXRlXyhwcmV2U3RhdGUgPT4gKHtcbiAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgIHZlcnNlc0FsaWdubWVudFN0YXR1czogeyAuLi5wcmV2U3RhdGUudmVyc2VzQWxpZ25tZW50U3RhdHVzLCBbYCR7cmVmZXJlbmNlLmNoYXB0ZXJ9OiR7cmVmZXJlbmNlLnZlcnNlfWBdOiBhbGlnbmVkIH0sXG4gICAgfSkpXG4gIH1cblxuICBsZXQgX3ZlcnNlc0ZvclJlZiA9IHNjcmlwdHVyZUNvbmZpZz8udmVyc2VzRm9yUmVmXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoX3ZlcnNlc0ZvclJlZj8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCB7IHJlZmVyZW5jZSwgcmVzb3VyY2VMaW5rIH0gPSBzY3JpcHR1cmVDb25maWcgfHwge31cbiAgICAgIGNvbnNvbGUubG9nKGBTY3JpcHR1cmVDYXJkLl92ZXJzZXNGb3JSZWYgY2hhbmdlZGAsIHsgcmVmZXJlbmNlLCByZXNvdXJjZUxpbmsgfSlcbiAgICB9XG4gIH0sIFtfdmVyc2VzRm9yUmVmXSlcblxuICBpZiAoIV92ZXJzZXNGb3JSZWY/Lmxlbmd0aCkgeyAvLyBpZiBlbXB0eSBvZiByZWZlcmVuY2VzLCBjcmVhdGUgc2luZ2xlIGVtcHR5IHJlZmVyZW5jZVxuICAgIF92ZXJzZXNGb3JSZWYgPSBbeyAuLi5yZWZlcmVuY2UgfV1cbiAgfVxuXG4gIGNvbnN0IHJlbmRlcmVkU2NyaXB0dXJlUGFuZXMgPSBfdmVyc2VzRm9yUmVmPy5tYXAoKF9jdXJyZW50VmVyc2VEYXRhLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGluaXRpYWxWZXJzZU9iamVjdHMgPSBfY3VycmVudFZlcnNlRGF0YT8udmVyc2VEYXRhPy52ZXJzZU9iamVjdHMgfHwgW11cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgeyBjaGFwdGVyLCB2ZXJzZSB9ID0gX2N1cnJlbnRWZXJzZURhdGEgfHwge31cbiAgICBjb25zdCBwcm9qZWN0SWQgPSBjdXJyZW50UmVmZXJlbmNlPy5wcm9qZWN0SWQgfHwgcmVmZXJlbmNlPy5wcm9qZWN0SWRcbiAgICBjb25zdCBfcmVmZXJlbmNlID0ge1xuICAgICAgLi4uX3ZlcnNlc0ZvclJlZixcbiAgICAgIGNoYXB0ZXIsXG4gICAgICB2ZXJzZSxcbiAgICAgIHByb2plY3RJZCxcbiAgICB9XG4gICAgY29uc3QgX3NjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWcgPSB7XG4gICAgICAuLi5zY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnLFxuICAgICAgY3VycmVudEluZGV4OiBpbmRleCxcbiAgICAgIGluaXRpYWxWZXJzZU9iamVjdHMsXG4gICAgICByZWZlcmVuY2U6IF9yZWZlcmVuY2UsXG4gICAgICBpc05ld1Rlc3RhbWVudCxcbiAgICB9XG5cbiAgICBsZXQgaXNWZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50ID0gZmFsc2VcblxuICAgIGlmICh2ZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50KSB7XG4gICAgICBpc1ZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQgPSB2ZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50LmNoYXB0ZXIgPT0gY2hhcHRlciAmJiB2ZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50LnZlcnNlID09IHZlcnNlXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTY3JpcHR1cmVQYW5lXG4gICAgICAgIHsuLi5zY3JpcHR1cmVDb25maWd9XG4gICAgICAgIGNvbnRlbnRTdHlsZT17Y29udGVudFN0eWxlfVxuICAgICAgICBjdXJyZW50SW5kZXg9e2luZGV4fVxuICAgICAgICBkZXRlcm1pbmluZ0JyYW5jaD17IXJlYWR5Rm9yRmV0Y2h9XG4gICAgICAgIGRpcmVjdGlvbj17ZGlyZWN0aW9ufVxuICAgICAgICBkaXNhYmxlV29yZFBvcG92ZXI9e2Rpc2FibGVXb3JkUG9wb3Zlcl99XG4gICAgICAgIGZvbnRTaXplPXtmb250U2l6ZX1cbiAgICAgICAgZ2V0TGV4aWNvbkRhdGE9e2dldExleGljb25EYXRhfVxuICAgICAgICBpc05UPXtpc05UX31cbiAgICAgICAgaXNWZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50PXtpc1ZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnR9XG4gICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgIG9uQWxpZ25tZW50RmluaXNoPXsoKSA9PiBzZXRTdGF0ZSh7IHZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQ6IG51bGwgfSl9XG4gICAgICAgIG9yaWdpbmFsU2NyaXB0dXJlQm9va09iamVjdHM9e29yaWdpbmFsU2NyaXB0dXJlQm9va09iamVjdHN9XG4gICAgICAgIHJlZlN0eWxlPXtyZWZTdHlsZX1cbiAgICAgICAgcmVmZXJlbmNlPXtfcmVmZXJlbmNlfVxuICAgICAgICBzYXZpbmc9e3N0YXJ0U2F2ZX1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnPXtfc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZ31cbiAgICAgICAgc2V0V29yZEFsaWduZXJTdGF0dXM9e3NldFdvcmRBbGlnbmVyU3RhdHVzfVxuICAgICAgICBzZXJ2ZXI9e3NlcnZlcn1cbiAgICAgICAgdHJhbnNsYXRlPXt0cmFuc2xhdGV9XG4gICAgICAgIHVwZGF0ZVZlcnNlc0FsaWdubWVudFN0YXR1cz17dXBkYXRlVmVyc2VzQWxpZ25tZW50U3RhdHVzfVxuICAgICAgLz5cbiAgICApXG4gIH0pXG5cbiAgY29uc3QgaGFuZGxlQWxpZ25CdXR0b25DbGljayA9ICgpID0+IHtcbiAgICBpZiAodmVyc2VzRm9yUmVmPy5sZW5ndGggPiAxKSB7XG4gICAgICBzZXRTdGF0ZSh7IHNob3dBbGlnbm1lbnRQb3B1cDogdHJ1ZSB9KVxuICAgIH0gZWxzZSBpZiAodmVyc2VzRm9yUmVmPy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHNldFN0YXRlKHsgdmVyc2VTZWxlY3RlZEZvckFsaWdubWVudDogdmVyc2VzRm9yUmVmWzBdIH0pXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb25SZW5kZXJUb29sYmFyID0gKHsgaXRlbXMgfSkgPT4ge1xuICAgIGNvbnN0IG5ld0l0ZW1zID0gWy4uLml0ZW1zXVxuXG4gICAgbGV0IGFsbFZlcnNlc0FsaWduZWQgPSBmYWxzZVxuXG4gICAgLy8gQ2hlY2sgaWYgYWxsIHZhbHVlcyBpbiB2ZXJzZXNBbGlnbm1lbnRTdGF0dXMgYXJlIHRydWVcbiAgICBpZiAodmVyc2VzQWxpZ25tZW50U3RhdHVzKSB7XG4gICAgICBhbGxWZXJzZXNBbGlnbmVkID0gT2JqZWN0LnZhbHVlcyh2ZXJzZXNBbGlnbm1lbnRTdGF0dXMpLmV2ZXJ5KGFsaWduU3RhdHVzID0+IGFsaWduU3RhdHVzID09PSB0cnVlKVxuICAgIH1cblxuICAgIGxldCBhbGlnbkljb24gPSBudWxsXG4gICAgbGV0IGFsaWduQnV0dG9uVGV4dCA9ICcnXG5cbiAgICBpZiAoYWxsVmVyc2VzQWxpZ25lZCkge1xuICAgICAgYWxpZ25JY29uID0gPFJ4TGluazIgaWQ9e2B2YWxpZF9pY29uXyR7cmVzb3VyY2VJZH1gfSBjb2xvcj0nI0JCQicvPlxuICAgICAgYWxpZ25CdXR0b25UZXh0ID0gJ0FsaWdubWVudCBpcyBWYWxpZCdcbiAgICB9IGVsc2Uge1xuICAgICAgYWxpZ25JY29uID0gPFJ4TGlua0JyZWFrMiBpZD17YGludmFsaWRfYWxpZ25tZW50X2ljb25fJHtyZXNvdXJjZUlkfWB9IGNvbG9yPScjMDAwJy8+XG4gICAgICBhbGlnbkJ1dHRvblRleHQgPSAnQWxpZ25tZW50IGlzIEludmFsaWQnXG4gICAgfVxuXG4gICAgaWYgKHNldFdvcmRBbGlnbmVyU3RhdHVzICYmIHJlc291cmNlSWQgIT09ICdPUklHSU5BTF9TT1VSQ0UnKSB7XG4gICAgICBuZXdJdGVtcy5wdXNoKFxuICAgICAgICA8SWNvbkJ1dHRvblxuICAgICAgICAgIGlkPXtgYWxpZ25tZW50X2ljb25fJHtyZXNvdXJjZUlkfWB9XG4gICAgICAgICAga2V5PSdjaGVja2luZy1idXR0b24nXG4gICAgICAgICAgb25DbGljaz17aGFuZGxlQWxpZ25CdXR0b25DbGlja31cbiAgICAgICAgICB0aXRsZT17YWxpZ25CdXR0b25UZXh0fVxuICAgICAgICAgIGFyaWEtbGFiZWw9e2FsaWduQnV0dG9uVGV4dH1cbiAgICAgICAgICBzdHlsZT17eyBjdXJzb3I6ICdwb2ludGVyJyB9fVxuICAgICAgICA+XG4gICAgICAgICAge2FsaWduSWNvbn1cbiAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBuZXdJdGVtc1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0aW9uc0NvbnRleHRQcm92aWRlclxuICAgICAgc2VsZWN0aW9ucz17c2VsZWN0aW9uc31cbiAgICAgIG9uU2VsZWN0aW9ucz17bmV3U2VsZWN0aW9ucyA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdvblNlbGVjdGlvbnMnLCBuZXdTZWxlY3Rpb25zKVxuICAgICAgfX1cbiAgICAgIHF1b3RlPXtzZWxlY3RlZFF1b3RlPy5xdW90ZX1cbiAgICAgIG9jY3VycmVuY2U9e2ZpeE9jY3VycmVuY2Uoc2VsZWN0ZWRRdW90ZT8ub2NjdXJyZW5jZSl9XG4gICAgICB2ZXJzZU9iamVjdHNNYXA9e3ZlcnNlT2JqZWN0c01hcH1cbiAgICA+XG4gICAgICA8Q2FyZFxuICAgICAgICBpZD17YHNjcmlwdHVyZV9jYXJkXyR7Y2FyZE51bX1gfVxuICAgICAgICB0aXRsZT17c2NyaXB0dXJlTGFiZWx9XG4gICAgICAgIHNldHRpbmdzVGl0bGU9e3NjcmlwdHVyZVRpdGxlICsgJyBTZXR0aW5ncyd9XG4gICAgICAgIGl0ZW1zPXtpdGVtc31cbiAgICAgICAgY2xhc3Nlcz17Y2xhc3Nlc31cbiAgICAgICAgaGVhZGVycz17aGVhZGVyc31cbiAgICAgICAgZmlsdGVycz17ZmlsdGVyc31cbiAgICAgICAgZm9udFNpemU9e2ZvbnRTaXplfVxuICAgICAgICBpdGVtSW5kZXg9e2l0ZW1JbmRleH1cbiAgICAgICAgc2V0RmlsdGVycz17c2V0RmlsdGVyc31cbiAgICAgICAgc2V0Rm9udFNpemU9e3NldEZvbnRTaXplfVxuICAgICAgICBzZXRJdGVtSW5kZXg9e3NldEl0ZW1JbmRleH1cbiAgICAgICAgbWFya2Rvd25WaWV3PXttYXJrZG93blZpZXd9XG4gICAgICAgIHNldE1hcmtkb3duVmlldz17c2V0TWFya2Rvd25WaWV3fVxuICAgICAgICBnZXRDdXN0b21Db21wb25lbnQ9e2dldFNjcmlwdHVyZVNlbGVjdG9yfVxuICAgICAgICBoaWRlTWFya2Rvd25Ub2dnbGVcbiAgICAgICAgb25NZW51Q2xvc2U9e29uTWVudUNsb3NlfVxuICAgICAgICBvbk1pbmltaXplPXtvbk1pbmltaXplID8gKCkgPT4gb25NaW5pbWl6ZShpZCkgOiBudWxsfVxuICAgICAgICBlZGl0YWJsZT17ZW5hYmxlRWRpdCB8fCBlbmFibGVBbGlnbm1lbnR9XG4gICAgICAgIHNhdmVkPXtzdGFydFNhdmUgfHwgIWhhdmVVbnNhdmVkQ2hhbmdlc31cbiAgICAgICAgb25TYXZlRWRpdD17KCkgPT4gc2V0U3RhdGUoeyBzYXZlQ2xpY2tlZDogdHJ1ZSB9KX1cbiAgICAgICAgb25SZW5kZXJUb29sYmFyPXtvblJlbmRlclRvb2xiYXJ9XG4gICAgICA+XG4gICAgICAgIDxkaXYgaWQ9XCJzY3JpcHR1cmUtcGFuZS1saXN0XCI+XG4gICAgICAgICAge3JlbmRlcmVkU2NyaXB0dXJlUGFuZXN9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9DYXJkPlxuICAgICAgPFZlcnNlU2VsZWN0b3JQb3B1cFxuICAgICAgICByZXNvdXJjZUlkPXtyZXNvdXJjZUlkfVxuICAgICAgICBvcGVuPXtzaG93QWxpZ25tZW50UG9wdXB9XG4gICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFN0YXRlKHsgc2hvd0FsaWdubWVudFBvcHVwOiBmYWxzZSB9KX1cbiAgICAgICAgdmVyc2VzRm9yUmVmPXt2ZXJzZXNGb3JSZWZ9XG4gICAgICAgIHZlcnNlc0FsaWdubWVudFN0YXR1cz17dmVyc2VzQWxpZ25tZW50U3RhdHVzfVxuICAgICAgICBvblZlcnNlU2VsZWN0PXsodmVyc2UpID0+IHNldFN0YXRlKHtcbiAgICAgICAgICB2ZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50OiB2ZXJzZSxcbiAgICAgICAgICBzaG93QWxpZ25tZW50UG9wdXA6IGZhbHNlXG4gICAgICAgIH0pfVxuICAgICAgLz5cbiAgICA8L1NlbGVjdGlvbnNDb250ZXh0UHJvdmlkZXI+XG4gIClcbn1cblxuU2NyaXB0dXJlQ2FyZC5wcm9wVHlwZXMgPSB7XG4gIC8qKiByZXBvIGJyYW5jaCBvciB0YWcgc3VjaCBhcyBtYXN0ZXIgKi9cbiAgYXBwUmVmOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIC8qKiBhdXRoZW50aWNhdGlvbiBpbmZvICovXG4gIGF1dGhlbnRpY2F0aW9uOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKiogaW5kZXggZm9yIGN1cnJlbnQgYm9vayAoZS5nLiAnMDEnIGZvciAnZ2VuJykqL1xuICBib29rSW5kZXg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBzY3JpcHR1cmUgY2FyZCBudW1iZXIgKDAgdG8gMiBmb3IgZXhhbXBsZSkgKi9cbiAgY2FyZE51bTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAvKiogQ1NTIGNsYXNzZXMgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqIGlmIHRydWUgdGhlbiB3b3JkIGRhdGEgaG92ZXIgaXMgc2hvd24gKi9cbiAgZGlzYWJsZVdvcmRQb3BvdmVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqIGdldCBsYW5ndWFnZSBkZXRhaWxzICovXG4gIGdldExhbmd1YWdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAvKiogZnVuY3Rpb24gdG8gZ2V0IGxhdGVzdCBsZXhpY29uIGRhdGEgKi9cbiAgZ2V0TGV4aWNvbkRhdGE6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogb3B0aW9uYWwgdXJsIGZvciBncmVlayByZXBvICovXG4gIGdyZWVrUmVwb1VybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIG9wdGlvbmFsIHVybCBmb3IgaGVicmV3IHJlcG8gKi9cbiAgaGVicmV3UmVwb1VybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIG9wdGlvbmFsIGh0dHAgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGZldGNoaW5nIHJlc291cmNlcywgZGVmYXVsdCBpcyAwICh2ZXJ5IGxvbmcgd2FpdCkgKi9cbiAgaHR0cENvbmZpZzogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqIGh0bWwgaWRlbnRpZmllciB0byB1c2UgZm9yIGNhcmQgKi9cbiAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIE5UIG9yIE9UICovXG4gIGlzTlQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIC8qKiB1c2VyLW5hbWUgKi9cbiAgbG9nZ2VkSW5Vc2VyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogZnVuY3Rpb24gdG8gbWluaW1pemUgdGhlIGNhcmQgKG9wdGlvbmFsKSAqL1xuICBvbk1pbmltaXplOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIG9wdGlvbmFsIGNhbGxiYWNrIGlmIGVycm9yIGxvYWRpbmcgcmVzb3VyY2UsIHBhcmFtZXRlciByZXR1cm5lZCBhcmU6XG4gICAqICAgICh7c3RyaW5nfSBlcnJvck1lc3NhZ2UsIHtib29sZWFufSBpc0FjY2Vzc0Vycm9yLCB7b2JqZWN0fSByZXNvdXJjZVN0YXR1cylcbiAgICogICAgICAtIGlzQWNjZXNzRXJyb3IgLSBpcyB0cnVlIGlmIHRoaXMgd2FzIGFuIGVycm9yIHRyeWluZyB0byBhY2Nlc3MgZmlsZVxuICAgKiAgICAgIC0gcmVzb3VyY2VTdGF0dXMgLSBpcyBvYmplY3QgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHByb2JsZW1zIGZldGNoaW5nIHJlc291cmNlICovXG4gIG9uUmVzb3VyY2VFcnJvcjogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiB0aGUgb3JpZ2luYWwgc2NyaXB0dXJlIGJvb2tPYmplY3RzIGZvciBjdXJyZW50IGJvb2sgKi9cbiAgb3JpZ2luYWxTY3JpcHR1cmVCb29rT2JqZWN0czogUHJvcFR5cGVzLm9iamVjdCxcbiAgcmVmZXJlbmNlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIC8qKiBwcm9qZWN0SWQgKGJvb2tJRCkgdG8gdXNlICovXG4gICAgcHJvamVjdElkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIGN1cnJlbnQgY2hhcHRlciBudW1iZXIgKi9cbiAgICBjaGFwdGVyOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSkuaXNSZXF1aXJlZCxcbiAgICAvKiogY3VycmVudCB2ZXJzZSBudW1iZXIgKi9cbiAgICB2ZXJzZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLmlzUmVxdWlyZWQsXG4gIH0pLFxuICAvKiogcmVzb3VyY2Ugb2JqZWN0ICovXG4gIHJlc291cmNlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIC8qKiByZXNvdXJjZSBsYW5ndWFnZSB0byB1c2UgKi9cbiAgICBsYW5ndWFnZUlkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIHJlcG8gb3duZXIgc3VjaCBhcyB1bmZvbGRpbmdXb3JkICovXG4gICAgb3duZXI6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAvKiogcmVzb3VyY2VJZCB0byB1c2UgKGUuZy4gdWdudCkgKi9cbiAgICByZXNvdXJjZUlkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIHJlcG8gb3duZXIgZm9yIG9yaWdpbmFsIGxhbmd1YWdlcyBzdWNoIGFzIHVuZm9sZGluZ1dvcmQgKi9cbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXI6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgfSksXG4gIC8qKiByZXNvdXJjZUxpbmsgKi9cbiAgcmVzb3VyY2VMaW5rOiBQcm9wVHlwZXMuYW55LFxuICAvKipUaGlzIGlzIGN1cnJlbnRseSBzZWxlY3RlZCBxdW90ZSAqL1xuICBzZWxlY3RlZFF1b3RlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKiogc2VydmVyIChlLmcuICdodHRwczovL2dpdC5kb29yNDMub3JnJykgKi9cbiAgc2VydmVyOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIC8qKiBmdW5jdGlvbiB0byBzZXQgc3RhdGUgaW4gYXBwIHRoYXQgdGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyAqL1xuICBzZXRTYXZlZENoYW5nZXM6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogY2FsbGJhY2sgdG8gdXBkYXRlIHdvcmQgYWxpZ25lciBzdGF0ZSAqL1xuICBzZXRXb3JkQWxpZ25lclN0YXR1czogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiB0aXRsZSBmb3Igc2NyaXB0dXJlIGNhcmQgKi9cbiAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgLyoqIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBsb2NhbGl6YXRpb24gKi9cbiAgdHJhbnNsYXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIHVzZSBtZXRob2QgZm9yIHVzaW5nIGxvY2FsIHN0b3JhZ2Ugc3BlY2lmaWMgZm9yIHVzZXIgKi9cbiAgdXNlVXNlckxvY2FsU3RvcmFnZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbn1cbiJdfQ==