@digitransit-component/digitransit-component-autosuggest-panel 8.4.2 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE-AGPL.txt +661 -0
- package/LICENSE-EUPL.txt +291 -0
- package/README.md +4 -16
- package/index.cjs +7 -0
- package/lib/index.cjs +2 -0
- package/lib/index.cjs.map +1 -0
- package/lib/index.development.cjs +840 -0
- package/lib/index.js +830 -1
- package/lib/index.js.map +1 -1
- package/package.json +24 -9
- package/index.js +0 -7
- package/lib/index.development.js +0 -2
|
@@ -0,0 +1,840 @@
|
|
|
1
|
+
(function (global, factory) {
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('classnames'), require('prop-types'), require('react'), require('react-i18next'), require('react-sortablejs'), require('@digitransit-component/digitransit-component-autosuggest'), require('@digitransit-component/digitransit-component-icon'), require('lodash/isEmpty.js'), require('downshift'), require('i18next')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', 'classnames', 'prop-types', 'react', 'react-i18next', 'react-sortablejs', '@digitransit-component/digitransit-component-autosuggest', '@digitransit-component/digitransit-component-icon', 'lodash/isEmpty.js', 'downshift', 'i18next'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@digitransit-component/digitransit-component-autosuggest-panel"] = {}, global.cx, global.PropTypes, global.React, global.reactI18next, global.reactSortablejs, global.DTAutosuggest, global.Icon, global.isEmpty, global.downshift, global.i18next));
|
|
5
|
+
})(this, (function (exports, cx, PropTypes, React, reactI18next, reactSortablejs, DTAutoSuggest, Icon, isEmpty, downshift, i18next) { 'use strict';
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var cx__default = /*#__PURE__*/_interopDefault(cx);
|
|
10
|
+
var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
|
|
11
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
12
|
+
var DTAutoSuggest__default = /*#__PURE__*/_interopDefault(DTAutoSuggest);
|
|
13
|
+
var Icon__default = /*#__PURE__*/_interopDefault(Icon);
|
|
14
|
+
var isEmpty__default = /*#__PURE__*/_interopDefault(isEmpty);
|
|
15
|
+
|
|
16
|
+
function _typeof(o) {
|
|
17
|
+
"@babel/helpers - typeof";
|
|
18
|
+
|
|
19
|
+
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
|
|
20
|
+
return typeof o;
|
|
21
|
+
} : function (o) {
|
|
22
|
+
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
|
|
23
|
+
}, _typeof(o);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function toPrimitive(t, r) {
|
|
27
|
+
if ("object" != _typeof(t) || !t) return t;
|
|
28
|
+
var e = t[Symbol.toPrimitive];
|
|
29
|
+
if (void 0 !== e) {
|
|
30
|
+
var i = e.call(t, r);
|
|
31
|
+
if ("object" != _typeof(i)) return i;
|
|
32
|
+
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
33
|
+
}
|
|
34
|
+
return ("string" === r ? String : Number)(t);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function toPropertyKey(t) {
|
|
38
|
+
var i = toPrimitive(t, "string");
|
|
39
|
+
return "symbol" == _typeof(i) ? i : i + "";
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function _defineProperty(e, r, t) {
|
|
43
|
+
return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
44
|
+
value: t,
|
|
45
|
+
enumerable: true,
|
|
46
|
+
configurable: true,
|
|
47
|
+
writable: true
|
|
48
|
+
}) : e[r] = t, e;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function _objectWithoutPropertiesLoose(r, e) {
|
|
52
|
+
if (null == r) return {};
|
|
53
|
+
var t = {};
|
|
54
|
+
for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
|
|
55
|
+
if (-1 !== e.indexOf(n)) continue;
|
|
56
|
+
t[n] = r[n];
|
|
57
|
+
}
|
|
58
|
+
return t;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function _objectWithoutProperties(e, t) {
|
|
62
|
+
if (null == e) return {};
|
|
63
|
+
var o,
|
|
64
|
+
r,
|
|
65
|
+
i = _objectWithoutPropertiesLoose(e, t);
|
|
66
|
+
if (Object.getOwnPropertySymbols) {
|
|
67
|
+
var n = Object.getOwnPropertySymbols(e);
|
|
68
|
+
for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);
|
|
69
|
+
}
|
|
70
|
+
return i;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function styleInject(css, ref) {
|
|
74
|
+
if ( ref === void 0 ) ref = {};
|
|
75
|
+
var insertAt = ref.insertAt;
|
|
76
|
+
|
|
77
|
+
if (!css || typeof document === 'undefined') { return; }
|
|
78
|
+
|
|
79
|
+
var head = document.head || document.getElementsByTagName('head')[0];
|
|
80
|
+
var style = document.createElement('style');
|
|
81
|
+
style.type = 'text/css';
|
|
82
|
+
|
|
83
|
+
if (insertAt === 'top') {
|
|
84
|
+
if (head.firstChild) {
|
|
85
|
+
head.insertBefore(style, head.firstChild);
|
|
86
|
+
} else {
|
|
87
|
+
head.appendChild(style);
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
head.appendChild(style);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (style.styleSheet) {
|
|
94
|
+
style.styleSheet.cssText = css;
|
|
95
|
+
} else {
|
|
96
|
+
style.appendChild(document.createTextNode(css));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
var css_248z$1 = ".select_combobox-container__l-gXK {\n background-color: #fff;\n border: solid #888 1px;\n display: flex;\n align-items: center;\n border-radius: 5px;\n height: 50px;\n justify-content: space-between;\n flex-grow: 1;\n}\n.select_combobox-container__l-gXK:focus-within {\n border-color: #007ac9;\n}\n.select_combobox-container__l-gXK .select_left-column__NCDpJ {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.select_combobox-label__QYe0V {\n font-size: 12px;\n line-height: 20px;\n color: #666;\n letter-spacing: -0.48px;\n margin-left: 12px;\n margin-top: 4px;\n}\n\n.select_container__U5yMR {\n position: relative;\n width: 100%;\n height: 100%;\n}\n.select_container__U5yMR > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 100%;\n cursor: pointer;\n}\n.select_container__U5yMR .select_suggestion__7in7q {\n font-size: 15px;\n line-height: 49px;\n height: 50px;\n padding: 0 0 0 12px;\n letter-spacing: -0.6px;\n color: #333;\n font-weight: 500;\n}\n.select_container__U5yMR .select_suggestionHighlighted__HV-5T {\n font-size: 15px;\n font-weight: 500;\n background: #f2f5f7;\n}\n.select_container__U5yMR .select_suggestionsContainerOpen__SzPE6 {\n position: absolute;\n background-color: #fff;\n z-index: 20;\n max-height: 250px;\n overflow-x: hidden;\n overflow-y: scroll;\n border-radius: 5px;\n box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.06);\n border: 1px rgba(0, 0, 0, 0.1) solid;\n top: calc(100% + 4px);\n left: 0;\n width: 100%;\n list-style-type: none;\n padding: 0;\n margin: 0;\n}\n.select_container__U5yMR .select_suggestionsContainerOpen__SzPE6 ul {\n padding: 0;\n margin: 0;\n}\n.select_container__U5yMR .select_suggestionsContainerOpen__SzPE6 li:not(:last-child) {\n border-bottom: 1px solid #ddd;\n}\n.select_container__U5yMR .select_input__tiwn5 {\n appearance: none;\n margin: -4px 0 0 0;\n padding-left: 12px;\n border: none;\n height: 26px;\n}\n.select_container__U5yMR .select_input__tiwn5:focus {\n outline: none;\n border: none;\n box-shadow: none;\n background: #fff;\n}\n.select_container__U5yMR .select_input__tiwn5:read-only {\n cursor: pointer;\n background: #fff;\n}\n.select_container__U5yMR .select_input__tiwn5 {\n background: #fff;\n font-weight: 500;\n box-shadow: none;\n font-size: 15px;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.33;\n letter-spacing: -0.6px;\n color: #333;\n}";
|
|
101
|
+
var styles$1 = {"combobox-container":"select_combobox-container__l-gXK","left-column":"select_left-column__NCDpJ","combobox-label":"select_combobox-label__QYe0V","container":"select_container__U5yMR","suggestion":"select_suggestion__7in7q","suggestionHighlighted":"select_suggestionHighlighted__HV-5T","suggestionsContainerOpen":"select_suggestionsContainerOpen__SzPE6","input":"select_input__tiwn5"};
|
|
102
|
+
styleInject(css_248z$1);
|
|
103
|
+
|
|
104
|
+
const Select = ({
|
|
105
|
+
value,
|
|
106
|
+
options,
|
|
107
|
+
onSlackTimeSelected,
|
|
108
|
+
viaPointIndex,
|
|
109
|
+
id,
|
|
110
|
+
label,
|
|
111
|
+
icon
|
|
112
|
+
}) => {
|
|
113
|
+
const labelId = `${id}-label`;
|
|
114
|
+
const selectedItem = options.find(option => option.value === value);
|
|
115
|
+
const {
|
|
116
|
+
isOpen,
|
|
117
|
+
getToggleButtonProps,
|
|
118
|
+
getMenuProps,
|
|
119
|
+
getItemProps,
|
|
120
|
+
getLabelProps,
|
|
121
|
+
highlightedIndex
|
|
122
|
+
} = downshift.useSelect({
|
|
123
|
+
selectedItem,
|
|
124
|
+
items: options,
|
|
125
|
+
labelId,
|
|
126
|
+
id,
|
|
127
|
+
itemToString: item => item.displayName,
|
|
128
|
+
onSelectedItemChange: ({
|
|
129
|
+
selectedItem: newItem
|
|
130
|
+
}) => {
|
|
131
|
+
onSlackTimeSelected(newItem.value, viaPointIndex);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
return /*#__PURE__*/React__default.default.createElement("div", {
|
|
135
|
+
className: styles$1['combobox-container']
|
|
136
|
+
}, /*#__PURE__*/React__default.default.createElement("div", {
|
|
137
|
+
className: styles$1.container
|
|
138
|
+
}, /*#__PURE__*/React__default.default.createElement("div", getToggleButtonProps(), /*#__PURE__*/React__default.default.createElement("span", {
|
|
139
|
+
className: styles$1['left-column']
|
|
140
|
+
}, /*#__PURE__*/React__default.default.createElement("label", Object.assign({}, getLabelProps(), {
|
|
141
|
+
className: styles$1['combobox-label']
|
|
142
|
+
}), label), /*#__PURE__*/React__default.default.createElement("div", {
|
|
143
|
+
className: styles$1.input
|
|
144
|
+
}, /*#__PURE__*/React__default.default.createElement("span", null, selectedItem.displayName))), icon), /*#__PURE__*/React__default.default.createElement("ul", Object.assign({
|
|
145
|
+
className: cx__default.default(styles$1.suggestionsContainerOpen, !isOpen && 'hidden')
|
|
146
|
+
}, getMenuProps()), isOpen && options.map((option, index) => /*#__PURE__*/React__default.default.createElement("li", Object.assign({
|
|
147
|
+
key: option.value,
|
|
148
|
+
className: cx__default.default(styles$1.suggestion, index === highlightedIndex && styles$1.suggestionHighlighted)
|
|
149
|
+
}, getItemProps({
|
|
150
|
+
index
|
|
151
|
+
})), /*#__PURE__*/React__default.default.createElement("span", null, option.displayName))))));
|
|
152
|
+
};
|
|
153
|
+
process.env.NODE_ENV !== "production" ? Select.propTypes = {
|
|
154
|
+
value: PropTypes__default.default.number.isRequired,
|
|
155
|
+
onSlackTimeSelected: PropTypes__default.default.func.isRequired,
|
|
156
|
+
options: PropTypes__default.default.arrayOf(PropTypes__default.default.shape({
|
|
157
|
+
displayName: PropTypes__default.default.string.isRequired,
|
|
158
|
+
value: PropTypes__default.default.number.isRequired
|
|
159
|
+
}).isRequired).isRequired,
|
|
160
|
+
id: PropTypes__default.default.string.isRequired,
|
|
161
|
+
label: PropTypes__default.default.node.isRequired,
|
|
162
|
+
icon: PropTypes__default.default.node.isRequired,
|
|
163
|
+
viaPointIndex: PropTypes__default.default.number.isRequired
|
|
164
|
+
} : void 0;
|
|
165
|
+
|
|
166
|
+
const translations = {
|
|
167
|
+
de: {
|
|
168
|
+
translation: {
|
|
169
|
+
'add-via-button-label': 'Füge Zwischenziel hinzu',
|
|
170
|
+
'add-via-duration-button-label': 'Setze Umsteigezeit für Zwischenziel {{index}}',
|
|
171
|
+
'add-via-duration-button-label-close': 'Schließe Umsteigezeit-Auswahl für Zwischenziel {{index}}',
|
|
172
|
+
'add-via-duration-button-label-open': 'Öffne Umsteigezeit-Auswahl für Zwischenziel {{index}}',
|
|
173
|
+
'minute-short': 'min',
|
|
174
|
+
'remove-via-button-label': 'Entferne Zwischenziel {{index}}',
|
|
175
|
+
'swap-order-button-label': 'Tausche Start mit Ziel',
|
|
176
|
+
'via-point': 'Zwischenziel',
|
|
177
|
+
'via-point-index': 'Zwischenziel {{index}}',
|
|
178
|
+
'viapoint-slack-amount': 'Umsteigezeit'
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
en: {
|
|
182
|
+
translation: {
|
|
183
|
+
'add-via-button-label': 'Add via point',
|
|
184
|
+
'add-via-duration-button-label': 'Set stop duration at via point {{index}}',
|
|
185
|
+
'add-via-duration-button-label-close': 'Close stop duration selector at via point {{index}}',
|
|
186
|
+
'add-via-duration-button-label-open': 'Open stop duration selector at via point {{index}}',
|
|
187
|
+
'minute-short': 'min',
|
|
188
|
+
'remove-via-button-label': 'Remove via point {{index}}',
|
|
189
|
+
'swap-order-button-label': 'Reverse origin and destination',
|
|
190
|
+
'via-point': 'Via point',
|
|
191
|
+
'via-point-index': 'Via point {{index}}',
|
|
192
|
+
'viapoint-slack-amount': 'Stop duration'
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
fi: {
|
|
196
|
+
translation: {
|
|
197
|
+
'add-via-button-label': 'Lisää välipiste',
|
|
198
|
+
'add-via-duration-button-label': 'Aseta välipisteelle {{index}} pysähdyksen kesto',
|
|
199
|
+
'add-via-duration-button-label-close': 'Avaa välipisteen {{index}} pysähdyksen kesto valitsin',
|
|
200
|
+
'add-via-duration-button-label-open': 'Sulje välipisteen {{index}} pysähdyksen kesto valitsin',
|
|
201
|
+
'minute-short': 'min',
|
|
202
|
+
'remove-via-button-label': 'Poista välipiste {{index}}',
|
|
203
|
+
'swap-order-button-label': 'Käännä reitin suunta vastakkaiseksi',
|
|
204
|
+
'via-point': 'Välipiste',
|
|
205
|
+
'via-point-index': 'Välipiste {{index}}',
|
|
206
|
+
'viapoint-slack-amount': 'Pysähdyksen kesto'
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
pl: {
|
|
210
|
+
translation: {
|
|
211
|
+
'add-via-button-label': 'Dodaj punkt pośredni',
|
|
212
|
+
'add-via-duration-button-label': 'Wybierz czas postoju dla punktu {{index}}',
|
|
213
|
+
'add-via-duration-button-label-close': 'Zamknij wybornik czasu postoju w punkcie {{index}}',
|
|
214
|
+
'add-via-duration-button-label-open': 'Otwórz wybornik czasu postoju w punkcie {{index}}',
|
|
215
|
+
'minute-short': 'min.',
|
|
216
|
+
'remove-via-button-label': 'Usuń punkt pośredni {{index}}',
|
|
217
|
+
'swap-order-button-label': 'Odwróć początek i cel',
|
|
218
|
+
'via-point': 'Punkt pośredni',
|
|
219
|
+
'via-point-index': 'Punkt pośredni {{index}}',
|
|
220
|
+
'viapoint-slack-amount': 'Czas postoju'
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
sv: {
|
|
224
|
+
translation: {
|
|
225
|
+
'add-via-button-label': 'Lägg till viapunkt',
|
|
226
|
+
'add-via-duration-button-label': 'Ställ in varaktighet för viapunkten {{index}}',
|
|
227
|
+
'add-via-duration-button-label-close': 'Stäng väljaren för varaktighet vid via-punkten {{index}}',
|
|
228
|
+
'add-via-duration-button-label-open': 'Öppna väljaren för varaktighet vid via-punkten {{index}}',
|
|
229
|
+
'minute-short': 'min',
|
|
230
|
+
'remove-via-button-label': 'Ta bort viapunkt {{index}}',
|
|
231
|
+
'swap-order-button-label': 'Sväng ruttens riktning till den motsatta',
|
|
232
|
+
'via-point': 'Via punkt',
|
|
233
|
+
'via-point-index': 'Via punkt {{index}}',
|
|
234
|
+
'viapoint-slack-amount': 'Stoppets varaktighet'
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
const i18n = i18next.createInstance({
|
|
240
|
+
fallbackLng: 'fi',
|
|
241
|
+
// debug: true,
|
|
242
|
+
resources: translations,
|
|
243
|
+
defaultNS: 'translation',
|
|
244
|
+
react: {
|
|
245
|
+
useSuspense: true
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
i18n.init();
|
|
249
|
+
|
|
250
|
+
var css_248z = ".styles_autosuggest-panel__GEaoJ {\n width: 100%;\n}\n\n.styles_autosuggest-searchpanel-text__7O850 {\n font-size: 24px;\n font-weight: var(--font-weight-medium);\n letter-spacing: -0.8px;\n color: #333;\n line-height: 1;\n margin-bottom: 17px;\n margin-top: unset;\n}\n@media screen and (min-width: 768px) {\n .styles_autosuggest-searchpanel-text__7O850 {\n letter-spacing: -0.8px;\n line-height: 27px;\n margin-bottom: 21px;\n }\n}\n\n.styles_origin-input-container__yfozN,\n.styles_destination-input-container__kJPky {\n display: flex;\n flex: 1 0 100%;\n}\n.styles_origin-input-container__yfozN input[type=text],\n.styles_destination-input-container__kJPky input[type=text] {\n margin: 0;\n}\n\n.styles_row__MvzsR {\n display: flex;\n flex-direction: row;\n}\n\n.styles_viapoints-container__fukkW {\n display: flex;\n flex-direction: column;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE {\n display: flex;\n flex: 1 0 100%;\n min-height: 50px;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE:first-child {\n margin-top: 6px;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE:not(:first-child) {\n margin-top: 3px;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE:last-child {\n margin-bottom: 6px;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE .styles_light-gray-background__0vkzM {\n display: flex;\n padding: 3px 0;\n flex-direction: column;\n background: #f2f5f7;\n border-radius: 5px;\n width: 100%;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE .styles_light-gray-background__0vkzM .styles_viapoint-before__J1O3f {\n display: flex;\n min-width: 27px;\n justify-content: center;\n align-items: center;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE .styles_light-gray-background__0vkzM .styles_viapoint-before__J1O3f svg {\n fill: #888;\n height: 20px;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE .styles_light-gray-background__0vkzM .styles_viapoint-input-container__fEQi9 {\n display: flex;\n align-items: center;\n width: 100%;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE .styles_light-gray-background__0vkzM .styles_viapoint-input-container__fEQi9 input[type=text] {\n margin: 0;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE .styles_light-gray-background__0vkzM .styles_viapoint-input-container__fEQi9.styles_viapoint-1__s2wSB > div.styles_viapoint__UnOwm {\n z-index: 15;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE .styles_light-gray-background__0vkzM .styles_viapoint-input-container__fEQi9.styles_viapoint-2__JNsq8 > div.styles_viapoint__UnOwm {\n z-index: 14;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE .styles_light-gray-background__0vkzM .styles_viapoint-input-container__fEQi9.styles_viapoint-3__tv7Qy > div.styles_viapoint__UnOwm {\n z-index: 13;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE .styles_light-gray-background__0vkzM .styles_viapoint-input-container__fEQi9.styles_viapoint-4__v0tfs > div.styles_viapoint__UnOwm {\n z-index: 12;\n}\n.styles_viapoints-container__fukkW .styles_viapoint-container__O-xAE .styles_light-gray-background__0vkzM .styles_viapoint-input-container__fEQi9.styles_viapoint-5__luT-- > div.styles_viapoint__UnOwm {\n z-index: 11;\n}\n\n.styles_viapoint-slack-time__dV527 {\n font-size: 13px;\n font-weight: normal;\n letter-spacing: -0.36px;\n color: #333;\n padding-left: 27px;\n padding-top: 12px;\n padding-bottom: 10px;\n}\n\n.styles_select-wrapper__zaWty {\n display: flex;\n height: 50px;\n margin-top: 9px;\n padding-left: 27px;\n padding-right: 47px;\n}\n\n.styles_via-point-button-container__kUBm7 {\n display: flex;\n}\n.styles_via-point-button-container__kUBm7 > div:nth-child(1) {\n order: 1;\n border-left: none;\n}\n.styles_via-point-button-container__kUBm7 > div:nth-child(2) {\n order: 2;\n border-left: 1px solid rgba(151, 151, 151, 0.2);\n}\n\n.styles_input-viapoint-slack-container__-LDqu {\n display: flex;\n flex-direction: column;\n}\n\n.styles_itinerary-search-control__1KyCb {\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n max-height: 50px;\n min-width: var(--width);\n}\n.styles_itinerary-search-control__1KyCb + .styles_itinerary-search-control__1KyCb {\n border-left: 1px solid rgba(151, 151, 151, 0.2);\n}\n.styles_itinerary-search-control__1KyCb .styles_opposite__BE7K1 {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n min-width: 40px;\n cursor: pointer;\n}\n.styles_itinerary-search-control__1KyCb .styles_opposite__BE7K1 svg {\n width: 19px;\n height: 17px;\n}\n.styles_itinerary-search-control__1KyCb .styles_add-via-point__7E6zU {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n min-width: 40px;\n cursor: pointer;\n}\n.styles_itinerary-search-control__1KyCb .styles_add-via-point__7E6zU svg {\n width: 20px;\n height: 22px;\n}\n.styles_itinerary-search-control__1KyCb .styles_add-via-point-slack__kddhr {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n min-width: 47px;\n cursor: pointer;\n}\n.styles_itinerary-search-control__1KyCb .styles_add-via-point-slack__kddhr svg {\n width: 18px;\n height: 19px;\n}\n.styles_itinerary-search-control__1KyCb .styles_remove-via-point__1oWx- {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n max-height: 44px;\n min-width: 40px;\n cursor: pointer;\n}\n.styles_itinerary-search-control__1KyCb .styles_remove-via-point__1oWx- svg {\n width: 14px;\n height: 14px;\n}\n\n.styles_combobox-icon__fhYvA {\n color: var(--color);\n border-left: solid #888 1px;\n height: 35px;\n}\n.styles_combobox-icon__fhYvA.styles_time-input-icon__L2TcV {\n padding: 9px 13px 0 13px;\n}\n.styles_combobox-icon__fhYvA.styles_time-input-icon__L2TcV svg {\n width: 18px;\n height: 19px;\n}\n\n.styles_rectangle-container__4Vtuo {\n display: block;\n position: relative;\n height: 9px;\n z-index: 19;\n}\n.styles_rectangle-container__4Vtuo .styles_rectangle__s-y7y {\n position: absolute;\n width: 4px;\n height: 25px;\n border-radius: 2px;\n background-color: #ddd;\n margin-left: 25px;\n margin-top: -9px;\n}\n\n.styles_search-panel-whitespace__RefGL {\n min-width: 40px;\n}";
|
|
251
|
+
var styles = {"autosuggest-panel":"styles_autosuggest-panel__GEaoJ","autosuggest-searchpanel-text":"styles_autosuggest-searchpanel-text__7O850","origin-input-container":"styles_origin-input-container__yfozN","destination-input-container":"styles_destination-input-container__kJPky","row":"styles_row__MvzsR","viapoints-container":"styles_viapoints-container__fukkW","viapoint-container":"styles_viapoint-container__O-xAE","light-gray-background":"styles_light-gray-background__0vkzM","viapoint-before":"styles_viapoint-before__J1O3f","viapoint-input-container":"styles_viapoint-input-container__fEQi9","viapoint-1":"styles_viapoint-1__s2wSB","viapoint":"styles_viapoint__UnOwm","viapoint-2":"styles_viapoint-2__JNsq8","viapoint-3":"styles_viapoint-3__tv7Qy","viapoint-4":"styles_viapoint-4__v0tfs","viapoint-5":"styles_viapoint-5__luT--","viapoint-slack-time":"styles_viapoint-slack-time__dV527","select-wrapper":"styles_select-wrapper__zaWty","via-point-button-container":"styles_via-point-button-container__kUBm7","input-viapoint-slack-container":"styles_input-viapoint-slack-container__-LDqu","itinerary-search-control":"styles_itinerary-search-control__1KyCb","opposite":"styles_opposite__BE7K1","add-via-point":"styles_add-via-point__7E6zU","add-via-point-slack":"styles_add-via-point-slack__kddhr","remove-via-point":"styles_remove-via-point__1oWx-","combobox-icon":"styles_combobox-icon__fhYvA","time-input-icon":"styles_time-input-icon__L2TcV","rectangle-container":"styles_rectangle-container__4Vtuo","rectangle":"styles_rectangle__s-y7y","search-panel-whitespace":"styles_search-panel-whitespace__RefGL"};
|
|
252
|
+
styleInject(css_248z);
|
|
253
|
+
|
|
254
|
+
const _excluded = ["children", "className", "enabled", "onClick", "onKeyPress", "wide"];
|
|
255
|
+
const getEmptyViaPointPlaceHolder = () => ({});
|
|
256
|
+
const isViaPointEmpty = viaPoint => {
|
|
257
|
+
if (viaPoint === undefined || isEmpty__default.default(viaPoint)) {
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
const keys = Object.keys(viaPoint);
|
|
261
|
+
return keys.length === 1 || keys.length === 2 && keys.includes('locationSlack');
|
|
262
|
+
};
|
|
263
|
+
const ItinerarySearchControl = _ref => {
|
|
264
|
+
let {
|
|
265
|
+
children,
|
|
266
|
+
className,
|
|
267
|
+
enabled,
|
|
268
|
+
onClick,
|
|
269
|
+
onKeyPress,
|
|
270
|
+
wide
|
|
271
|
+
} = _ref,
|
|
272
|
+
rest = _objectWithoutProperties(_ref, _excluded);
|
|
273
|
+
return /*#__PURE__*/React__default.default.createElement("div", {
|
|
274
|
+
className: styles['itinerary-search-control'],
|
|
275
|
+
style: {
|
|
276
|
+
'--width': wide ? '47px' : '40px'
|
|
277
|
+
}
|
|
278
|
+
}, onClick && enabled && /*#__PURE__*/React__default.default.createElement("div", Object.assign({}, rest, {
|
|
279
|
+
className: className,
|
|
280
|
+
onClick: onClick,
|
|
281
|
+
onKeyPress: onKeyPress,
|
|
282
|
+
role: "button",
|
|
283
|
+
tabIndex: "0"
|
|
284
|
+
}), children));
|
|
285
|
+
};
|
|
286
|
+
const updateViaPointSlack = (activeViaPointSlacks, updatedViaPointIndex, viaPointRemoved = false) => {
|
|
287
|
+
const foundAtIndex = activeViaPointSlacks.indexOf(updatedViaPointIndex);
|
|
288
|
+
if (foundAtIndex > -1) {
|
|
289
|
+
activeViaPointSlacks.splice(foundAtIndex, 1);
|
|
290
|
+
}
|
|
291
|
+
return viaPointRemoved ? activeViaPointSlacks.map(value => value > updatedViaPointIndex ? value - 1 : value) : activeViaPointSlacks;
|
|
292
|
+
};
|
|
293
|
+
const isKeyboardSelectionEvent = event => {
|
|
294
|
+
const space = [13, ' ', 'Spacebar'];
|
|
295
|
+
const enter = [32, 'Enter'];
|
|
296
|
+
const key = event && (event.key || event.which || event.keyCode) || '';
|
|
297
|
+
if (!key || !space.concat(enter).includes(key)) {
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
event.preventDefault();
|
|
301
|
+
return true;
|
|
302
|
+
};
|
|
303
|
+
const value = location => location && location.address || location && location.gps && location.ready && 'Nykyinen sijainti' || '';
|
|
304
|
+
const getLocationType = location => location && location.gps === true ? 'position' : 'location';
|
|
305
|
+
const getSlackTimeOptions = t => {
|
|
306
|
+
const timeOptions = [];
|
|
307
|
+
for (let i = 0; i <= 9; i++) {
|
|
308
|
+
const valueInMinutes = i * 10;
|
|
309
|
+
timeOptions.push({
|
|
310
|
+
displayName: `${valueInMinutes} ${t('minute-short')}`,
|
|
311
|
+
value: valueInMinutes * 60
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
return timeOptions;
|
|
315
|
+
};
|
|
316
|
+
process.env.NODE_ENV !== "production" ? ItinerarySearchControl.propTypes = {
|
|
317
|
+
children: PropTypes__default.default.node,
|
|
318
|
+
className: PropTypes__default.default.string.isRequired,
|
|
319
|
+
enabled: PropTypes__default.default.bool.isRequired,
|
|
320
|
+
onClick: PropTypes__default.default.func.isRequired,
|
|
321
|
+
onKeyPress: PropTypes__default.default.func.isRequired,
|
|
322
|
+
wide: PropTypes__default.default.bool
|
|
323
|
+
} : void 0;
|
|
324
|
+
ItinerarySearchControl.defaultProps = {
|
|
325
|
+
children: undefined,
|
|
326
|
+
wide: false
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Panel that renders two DTAutosuggest search fields, including viapoint handling
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* const searchContext = {
|
|
334
|
+
* isPeliasLocationAware: false // true / false does Let Pelias suggest based on current user location
|
|
335
|
+
* minimalRegexp: undefined // used for testing min. regexp. For example: new RegExp('.{2,}'),
|
|
336
|
+
* lineRegexp: undefined // identify searches for route numbers/labels: bus | train | metro. For example: new RegExp(
|
|
337
|
+
* // '(^[0-9]+[a-z]?$|^[yuleapinkrtdz]$|(^m[12]?b?$))',
|
|
338
|
+
* // 'i',
|
|
339
|
+
* // ),
|
|
340
|
+
* URL_PELIAS: '' // url for pelias searches
|
|
341
|
+
* feedIDs: ['HSL', 'HSLLautta'] // FeedId's like [HSL, HSLLautta]
|
|
342
|
+
* geocodingSources: ['oa','osm','nlsfi'] // sources for geocoding
|
|
343
|
+
* geocodingSearchParams; {} // Searchparmas fro geocoding
|
|
344
|
+
* getFavouriteLocations: () => ({}), // Function that returns array of favourite locations.
|
|
345
|
+
* getFavouriteStops: () => ({}), // Function that returns array of favourite stops.
|
|
346
|
+
* getLanguage: () => ({}), // Function that returns current language.
|
|
347
|
+
* getFavouriteRoutes: () => ({}), // Function that returns array of favourite routes.
|
|
348
|
+
* getPositions: () => ({}), // Function that returns user's geolocation.
|
|
349
|
+
* getRoutesQuery: () => ({}), // Function that returns query for fetching routes.
|
|
350
|
+
* getStopAndStationsQuery: () => ({}), // Function that fetches favourite stops and stations from graphql API.
|
|
351
|
+
* getFavouriteRoutesQuery: () => ({}), // Function that returns query for fetching favourite routes.
|
|
352
|
+
* getFavouriteVehicleRentalStations: () => ({}), // Function that returns favourite bike rental station.
|
|
353
|
+
* getFavouriteVehicleRentalStationsQuery: () => ({}), // Function that returns query for fetching favourite bike rental stations.
|
|
354
|
+
* startLocationWatch: () => ({}), // Function that locates users geolocation.
|
|
355
|
+
* saveSearch: () => ({}), // Function that saves search to old searches store.
|
|
356
|
+
* clearOldSearches: () => ({}), // Function that clears old searches store.
|
|
357
|
+
* getFutureRoutes: () => ({}), // Function that return future routes
|
|
358
|
+
* saveFutureRoute: () => ({}), // Function that saves a future route
|
|
359
|
+
* clearFutureRoutes: () => ({}), // Function that clears future routes
|
|
360
|
+
* };
|
|
361
|
+
*
|
|
362
|
+
* const origin = {
|
|
363
|
+
* lat: 60.169196,
|
|
364
|
+
* lon: 24.957674,
|
|
365
|
+
* address: 'Aleksanterinkatu, Helsinki',
|
|
366
|
+
* set: true,
|
|
367
|
+
* ready: true,
|
|
368
|
+
* }
|
|
369
|
+
*
|
|
370
|
+
* const destination = {
|
|
371
|
+
* lat: 60.199093,
|
|
372
|
+
* lon: 24.940536,
|
|
373
|
+
* address: 'Opastinsilta 6, Helsinki',
|
|
374
|
+
* set: true,
|
|
375
|
+
* ready: true,
|
|
376
|
+
* }
|
|
377
|
+
* onSelect(item, id) {
|
|
378
|
+
* return null; // Define what to do when a suggestion is being selected. None by default.
|
|
379
|
+
* }
|
|
380
|
+
* onClear(id) {
|
|
381
|
+
* return null; // Define what to do when a suggestion is being selected. None by default.
|
|
382
|
+
* }
|
|
383
|
+
* const getAutoSuggestIcons: {
|
|
384
|
+
* // Called for every city bike station rendered as a search suggestion. Should return the icon and
|
|
385
|
+
* // color used for that station. Two icons are available, 'citybike-stop-digitransit' anditybike-stop-digitransit-secondary'.
|
|
386
|
+
* citybikes: station => {
|
|
387
|
+
* return ['citybike-stop-digitransit', '#f2b62d'];
|
|
388
|
+
* }
|
|
389
|
+
* }
|
|
390
|
+
* const targets = ['Locations', 'Stops', 'Routes']; // Defines what you are searching. all available options are Locations, Stops, Routes, VehicleRentalStations, FutureRoutes, MapPosition and CurrentPosition. Leave empty to search all targets.
|
|
391
|
+
* const sources = ['Favourite', 'History', 'Datasource'] // Defines where you are searching. all available are: Favourite, History (previously searched searches), and Datasource. Leave empty to use all sources.
|
|
392
|
+
* <DTAutosuggestPanel
|
|
393
|
+
* appElement={appElement} // Required. Root element's id. Needed for react-modal component.
|
|
394
|
+
* origin={origin} // Selected origin point
|
|
395
|
+
* destination={destination} // Selected destination point
|
|
396
|
+
* originPlaceHolder={'Give origin'} // Optional Give string shown initially inside origin search field
|
|
397
|
+
* destinationPlaceHolder={'Give destination'} // Optional Give string shown initally inside destination search field
|
|
398
|
+
* initialViaPoints={[]} // Optional. If showViapointControl is set to true, pass initial via points to the panel. Currently no default implementation is given.
|
|
399
|
+
* updateViaPoints={() => return []} // Optional. If showViapointControl is set to true, define how to update your via point list with this function. Currenlty no default implementation is given.
|
|
400
|
+
* swapOrder={() => return null} // Optional. If showSwapControl is set to true, define how to swap order of your points (origin, destination, viapoints). Currently no default implementation is given.
|
|
401
|
+
* searchContext={searchContext}
|
|
402
|
+
* getAutoSuggestIcons={getAutoSuggestIcons}
|
|
403
|
+
* onSelect={this.onSelect}
|
|
404
|
+
* onClear={this.onClear}
|
|
405
|
+
* lang="fi" // Define language fi sv or en.
|
|
406
|
+
* addAnalyticsEvent={null} // Optional. you can record an analytics event if you wish. if passed, component will pass an category, action, name parameters to addAnalyticsEvent
|
|
407
|
+
* disableAutoFocus={false} // Optional. use this to disable autofocus completely from DTAutosuggestPanel
|
|
408
|
+
* sources={sources}
|
|
409
|
+
* targets={targets}
|
|
410
|
+
* isMobile // Optional. Defaults to false. Whether to use mobile search.
|
|
411
|
+
* originMobileLabel="Origin label" // Optional. Custom label text for origin field on mobile.
|
|
412
|
+
* destinationMobileLabel="Destination label" // Optional. Custom label text for destination field on mobile.
|
|
413
|
+
* handleFocusChange={() => {}} // Optional. If defined overrides default onFocusChange behaviour
|
|
414
|
+
* showSwapControl={false} // Optional.
|
|
415
|
+
* showViapointControl={false} // Optional.
|
|
416
|
+
*/
|
|
417
|
+
|
|
418
|
+
const locationShape = process.env.NODE_ENV !== "production" ? PropTypes__default.default.shape({
|
|
419
|
+
address: PropTypes__default.default.string,
|
|
420
|
+
lat: PropTypes__default.default.number,
|
|
421
|
+
lon: PropTypes__default.default.number,
|
|
422
|
+
locationSlack: PropTypes__default.default.number
|
|
423
|
+
}) : {};
|
|
424
|
+
class DTAutosuggestPanel extends React__default.default.Component {
|
|
425
|
+
constructor(props) {
|
|
426
|
+
super(props);
|
|
427
|
+
_defineProperty(this, "storeReference", ref => {
|
|
428
|
+
this.setState(prevState => ({
|
|
429
|
+
refs: [...prevState.refs, ref]
|
|
430
|
+
}));
|
|
431
|
+
});
|
|
432
|
+
_defineProperty(this, "handleFocusChange", () => {
|
|
433
|
+
const {
|
|
434
|
+
destination
|
|
435
|
+
} = this.props;
|
|
436
|
+
if (!destination || !destination.lat) {
|
|
437
|
+
this.state.refs[1].focus();
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
_defineProperty(this, "updateViaPoints", viaPoints => {
|
|
441
|
+
if (viaPoints.length === 0) {
|
|
442
|
+
this.props.updateViaPoints([]);
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
this.props.updateViaPoints(viaPoints.filter(vp => !isViaPointEmpty(vp)));
|
|
446
|
+
});
|
|
447
|
+
_defineProperty(this, "handleToggleViaPointSlackClick", viaPointIndex => {
|
|
448
|
+
const {
|
|
449
|
+
activeSlackInputs
|
|
450
|
+
} = this.state;
|
|
451
|
+
this.setState({
|
|
452
|
+
activeSlackInputs: activeSlackInputs.includes(viaPointIndex) ? updateViaPointSlack(activeSlackInputs, viaPointIndex) : activeSlackInputs.concat([viaPointIndex])
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
_defineProperty(this, "handleViaPointSlackTimeSelected", (slackTimeInSeconds, i) => {
|
|
456
|
+
if (this.props.addAnalyticsEvent) {
|
|
457
|
+
this.props.addAnalyticsEvent({
|
|
458
|
+
action: 'EditViaPointStopDuration',
|
|
459
|
+
category: 'ItinerarySettings',
|
|
460
|
+
name: slackTimeInSeconds / 60
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
const {
|
|
464
|
+
viaPoints
|
|
465
|
+
} = this.props;
|
|
466
|
+
viaPoints[i].locationSlack = Number.parseInt(slackTimeInSeconds, 10);
|
|
467
|
+
this.updateViaPoints(viaPoints);
|
|
468
|
+
});
|
|
469
|
+
_defineProperty(this, "handleViaPointLocationSelected", (viaPointLocation, i) => {
|
|
470
|
+
this.props.handleViaPointLocationSelected(viaPointLocation, i);
|
|
471
|
+
});
|
|
472
|
+
_defineProperty(this, "handleRemoveViaPointClick", viaPointIndex => {
|
|
473
|
+
if (this.props.addAnalyticsEvent) {
|
|
474
|
+
this.props.addAnalyticsEvent({
|
|
475
|
+
action: 'RemoveJourneyViaPoint',
|
|
476
|
+
category: 'ItinerarySettings',
|
|
477
|
+
name: null
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
const {
|
|
481
|
+
activeSlackInputs
|
|
482
|
+
} = this.state;
|
|
483
|
+
const {
|
|
484
|
+
viaPoints
|
|
485
|
+
} = this.props;
|
|
486
|
+
viaPoints.splice(viaPointIndex, 1);
|
|
487
|
+
this.setState({
|
|
488
|
+
activeSlackInputs: updateViaPointSlack(activeSlackInputs, viaPointIndex, true)
|
|
489
|
+
}, () => this.updateViaPoints(viaPoints));
|
|
490
|
+
});
|
|
491
|
+
_defineProperty(this, "handleAddViaPointClick", () => {
|
|
492
|
+
if (this.props.addAnalyticsEvent) {
|
|
493
|
+
this.props.addAnalyticsEvent({
|
|
494
|
+
action: 'AddJourneyViaPoint',
|
|
495
|
+
category: 'ItinerarySettings',
|
|
496
|
+
name: 'QuickSettingsButton'
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
const {
|
|
500
|
+
viaPoints
|
|
501
|
+
} = this.props;
|
|
502
|
+
viaPoints.push(getEmptyViaPointPlaceHolder());
|
|
503
|
+
// We need to update the state so that placeHolder will show up in panel.
|
|
504
|
+
// eslint-disable-next-line react/no-access-state-in-setstate
|
|
505
|
+
this.setState(this.state);
|
|
506
|
+
});
|
|
507
|
+
_defineProperty(this, "handleSwapOrderClick", () => {
|
|
508
|
+
if (this.props.addAnalyticsEvent) {
|
|
509
|
+
this.props.addAnalyticsEvent({
|
|
510
|
+
action: 'SwitchJourneyStartAndEndPointOrder',
|
|
511
|
+
category: 'ItinerarySettings',
|
|
512
|
+
name: null
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
const {
|
|
516
|
+
viaPoints
|
|
517
|
+
} = this.props;
|
|
518
|
+
viaPoints.reverse();
|
|
519
|
+
this.props.swapOrder();
|
|
520
|
+
});
|
|
521
|
+
_defineProperty(this, "getSlackDisplay", slackInSeconds => `${slackInSeconds / 60} ${this.props.t('minute-short', {
|
|
522
|
+
lng: this.props.lang
|
|
523
|
+
})}`);
|
|
524
|
+
this.state = {
|
|
525
|
+
activeSlackInputs: [],
|
|
526
|
+
refs: []
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
render() {
|
|
530
|
+
const {
|
|
531
|
+
origin,
|
|
532
|
+
searchPanelText,
|
|
533
|
+
searchContext,
|
|
534
|
+
disableAutoFocus,
|
|
535
|
+
viaPoints,
|
|
536
|
+
originMobileLabel,
|
|
537
|
+
destinationMobileLabel,
|
|
538
|
+
fontWeights,
|
|
539
|
+
onFocusChange,
|
|
540
|
+
showSwapControl,
|
|
541
|
+
showViapointControl,
|
|
542
|
+
t,
|
|
543
|
+
lang: lng
|
|
544
|
+
} = this.props;
|
|
545
|
+
const {
|
|
546
|
+
primary
|
|
547
|
+
} = this.props.colors;
|
|
548
|
+
const {
|
|
549
|
+
activeSlackInputs
|
|
550
|
+
} = this.state;
|
|
551
|
+
const slackTime = getSlackTimeOptions(t);
|
|
552
|
+
const defaultSlackTimeValue = 0;
|
|
553
|
+
const getViaPointSlackTimeOrDefault = (viaPoint, defaultValue = defaultSlackTimeValue) => viaPoint && viaPoint.locationSlack || defaultValue;
|
|
554
|
+
const isViaPointSlackTimeInputActive = index => activeSlackInputs.includes(index);
|
|
555
|
+
return /*#__PURE__*/React__default.default.createElement("div", {
|
|
556
|
+
className: cx__default.default(styles['autosuggest-panel'], this.props.isMobile && "small"),
|
|
557
|
+
style: {
|
|
558
|
+
'--color': primary,
|
|
559
|
+
'--font-weight-medium': fontWeights.medium
|
|
560
|
+
}
|
|
561
|
+
}, ' ', searchPanelText ? /*#__PURE__*/React__default.default.createElement("div", null, /*#__PURE__*/React__default.default.createElement("h1", {
|
|
562
|
+
className: styles['autosuggest-searchpanel-text']
|
|
563
|
+
}, ' ', searchPanelText)) : null, /*#__PURE__*/React__default.default.createElement("div", {
|
|
564
|
+
className: styles['origin-input-container']
|
|
565
|
+
}, /*#__PURE__*/React__default.default.createElement(DTAutoSuggest__default.default, {
|
|
566
|
+
appElement: this.props.appElement,
|
|
567
|
+
icon: "originEllipse",
|
|
568
|
+
id: "origin",
|
|
569
|
+
autoFocus: disableAutoFocus === true ? false : !this.props.isMobile && !origin?.lat,
|
|
570
|
+
storeRef: this.storeReference,
|
|
571
|
+
refPoint: this.props.refPoint,
|
|
572
|
+
className: getLocationType(origin),
|
|
573
|
+
placeholder: this.props.originPlaceHolder,
|
|
574
|
+
value: value(origin),
|
|
575
|
+
searchContext: searchContext,
|
|
576
|
+
getAutoSuggestIcons: this.props.getAutoSuggestIcons,
|
|
577
|
+
onSelect: this.props.onSelect,
|
|
578
|
+
onClear: this.props.onClear,
|
|
579
|
+
focusChange: onFocusChange || this.handleFocusChange,
|
|
580
|
+
lang: this.props.lang,
|
|
581
|
+
sources: this.props.sources,
|
|
582
|
+
targets: this.props.targets,
|
|
583
|
+
filterResults: this.props.filterResults,
|
|
584
|
+
isMobile: this.props.isMobile,
|
|
585
|
+
colors: this.props.colors,
|
|
586
|
+
mobileLabel: originMobileLabel,
|
|
587
|
+
fontWeights: this.props.fontWeights,
|
|
588
|
+
modeSet: this.props.modeSet,
|
|
589
|
+
showScroll: this.props.showScroll,
|
|
590
|
+
isEmbedded: this.props.isEmbedded
|
|
591
|
+
}), (showSwapControl || showViapointControl) && /*#__PURE__*/React__default.default.createElement(ItinerarySearchControl, {
|
|
592
|
+
className: styles.opposite,
|
|
593
|
+
enabled: showSwapControl,
|
|
594
|
+
onClick: () => this.handleSwapOrderClick(),
|
|
595
|
+
onKeyPress: e => isKeyboardSelectionEvent(e) && this.handleSwapOrderClick(),
|
|
596
|
+
"aria-label": t('swap-order-button-label', {
|
|
597
|
+
lng
|
|
598
|
+
})
|
|
599
|
+
}, /*#__PURE__*/React__default.default.createElement(Icon__default.default, {
|
|
600
|
+
img: "opposite",
|
|
601
|
+
color: primary
|
|
602
|
+
}))), viaPoints.length === 0 && /*#__PURE__*/React__default.default.createElement("div", {
|
|
603
|
+
className: styles['rectangle-container']
|
|
604
|
+
}, /*#__PURE__*/React__default.default.createElement("div", {
|
|
605
|
+
className: styles.rectangle
|
|
606
|
+
})), /*#__PURE__*/React__default.default.createElement(reactSortablejs.ReactSortable, {
|
|
607
|
+
className: styles['viapoints-container'],
|
|
608
|
+
list: viaPoints,
|
|
609
|
+
handle: `.${styles['viapoint-before']}`,
|
|
610
|
+
animation: 200,
|
|
611
|
+
disabled: viaPoints.length <= 1,
|
|
612
|
+
setList: items => {
|
|
613
|
+
const newViaPoints = items.filter(vp => !isViaPointEmpty(vp));
|
|
614
|
+
if (newViaPoints.length > 0) {
|
|
615
|
+
this.props.updateViaPoints(newViaPoints);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}, viaPoints.map((o, i) => /*#__PURE__*/React__default.default.createElement("div", {
|
|
619
|
+
className: cx__default.default(styles['viapoint-container']),
|
|
620
|
+
key: `viapoint-${i}` // eslint-disable-line
|
|
621
|
+
}, /*#__PURE__*/React__default.default.createElement("div", {
|
|
622
|
+
className: styles['light-gray-background']
|
|
623
|
+
}, /*#__PURE__*/React__default.default.createElement("div", {
|
|
624
|
+
className: styles.row
|
|
625
|
+
}, /*#__PURE__*/React__default.default.createElement("div", {
|
|
626
|
+
className: styles['viapoint-before'],
|
|
627
|
+
style: viaPoints.length > 1 ? {
|
|
628
|
+
cursor: 'move'
|
|
629
|
+
} : {}
|
|
630
|
+
}, viaPoints.length > 1 && /*#__PURE__*/React__default.default.createElement(Icon__default.default, {
|
|
631
|
+
img: "ellipsis",
|
|
632
|
+
rotate: 90,
|
|
633
|
+
color: primary
|
|
634
|
+
})), /*#__PURE__*/React__default.default.createElement("div", {
|
|
635
|
+
className: `${styles['viapoint-input-container']} ${styles[`viapoint-${i + 1}`]}`
|
|
636
|
+
}, /*#__PURE__*/React__default.default.createElement(DTAutoSuggest__default.default, {
|
|
637
|
+
appElement: this.props.appElement,
|
|
638
|
+
icon: "mapMarker",
|
|
639
|
+
id: "via-point",
|
|
640
|
+
ariaLabel: t('via-point-index', {
|
|
641
|
+
index: i + 1,
|
|
642
|
+
lng
|
|
643
|
+
}),
|
|
644
|
+
autoFocus: disableAutoFocus === true ? false : !this.props.isMobile,
|
|
645
|
+
placeholder: "via-point",
|
|
646
|
+
className: "viapoint",
|
|
647
|
+
searchContext: searchContext,
|
|
648
|
+
refPoint: this.props.refPoint,
|
|
649
|
+
value: o && o.address || '',
|
|
650
|
+
onSelect: this.props.onSelect,
|
|
651
|
+
onClear: this.props.onClear,
|
|
652
|
+
handleViaPoints: item => this.handleViaPointLocationSelected(item, i),
|
|
653
|
+
lang: this.props.lang,
|
|
654
|
+
sources: this.props.sources,
|
|
655
|
+
targets: this.props.targets,
|
|
656
|
+
filterResults: this.props.filterResults,
|
|
657
|
+
getAutoSuggestIcons: this.props.getAutoSuggestIcons,
|
|
658
|
+
isMobile: this.props.isMobile,
|
|
659
|
+
fontWeights: this.props.fontWeights,
|
|
660
|
+
modeSet: this.props.modeSet,
|
|
661
|
+
colors: this.props.colors,
|
|
662
|
+
showScroll: this.props.showScroll
|
|
663
|
+
})), this.props.showSlackControl && /*#__PURE__*/React__default.default.createElement(ItinerarySearchControl, {
|
|
664
|
+
className: styles['add-via-point-slack'],
|
|
665
|
+
enabled: this.props.showViapointControl,
|
|
666
|
+
onClick: () => this.handleToggleViaPointSlackClick(i),
|
|
667
|
+
onKeyPress: e => isKeyboardSelectionEvent(e) && this.handleToggleViaPointSlackClick(i),
|
|
668
|
+
"aria-label": t(isViaPointSlackTimeInputActive(i) ? 'add-via-duration-button-label-open' : 'add-via-duration-button-label-close', {
|
|
669
|
+
index: i + 1,
|
|
670
|
+
lng
|
|
671
|
+
}),
|
|
672
|
+
wide: true
|
|
673
|
+
}, /*#__PURE__*/React__default.default.createElement(Icon__default.default, {
|
|
674
|
+
img: "time",
|
|
675
|
+
color: primary
|
|
676
|
+
}))), !isViaPointSlackTimeInputActive(i) && viaPoints[i] && viaPoints[i].locationSlack > 0 && /*#__PURE__*/React__default.default.createElement("span", {
|
|
677
|
+
className: styles['viapoint-slack-time']
|
|
678
|
+
}, `${t('viapoint-slack-amount', {
|
|
679
|
+
lng
|
|
680
|
+
})}: ${this.getSlackDisplay(viaPoints[i].locationSlack)}`), /*#__PURE__*/React__default.default.createElement("div", {
|
|
681
|
+
className: cx__default.default(styles['input-viapoint-slack-container'], !isViaPointSlackTimeInputActive(i) && "collapsed")
|
|
682
|
+
}, /*#__PURE__*/React__default.default.createElement("div", {
|
|
683
|
+
className: styles['select-wrapper']
|
|
684
|
+
}, /*#__PURE__*/React__default.default.createElement(Select, {
|
|
685
|
+
id: `viapoint-slack-${i}`,
|
|
686
|
+
label: t('viapoint-slack-amount', {
|
|
687
|
+
lng
|
|
688
|
+
}),
|
|
689
|
+
options: slackTime,
|
|
690
|
+
value: getViaPointSlackTimeOrDefault(viaPoints[i]),
|
|
691
|
+
viaPointIndex: i,
|
|
692
|
+
icon: /*#__PURE__*/React__default.default.createElement("span", {
|
|
693
|
+
className: `${styles['combobox-icon']} ${styles['time-input-icon']}`
|
|
694
|
+
}, /*#__PURE__*/React__default.default.createElement(Icon__default.default, {
|
|
695
|
+
img: "time",
|
|
696
|
+
color: primary
|
|
697
|
+
})),
|
|
698
|
+
onSlackTimeSelected: this.handleViaPointSlackTimeSelected
|
|
699
|
+
})))), /*#__PURE__*/React__default.default.createElement(ItinerarySearchControl, {
|
|
700
|
+
className: styles['remove-via-point'],
|
|
701
|
+
enabled: this.props.showViapointControl,
|
|
702
|
+
onClick: () => this.handleRemoveViaPointClick(i),
|
|
703
|
+
onKeyPress: e => isKeyboardSelectionEvent(e) && this.handleRemoveViaPointClick(i),
|
|
704
|
+
"aria-label": t('remove-via-button-label', {
|
|
705
|
+
index: i + 1,
|
|
706
|
+
lng
|
|
707
|
+
})
|
|
708
|
+
}, /*#__PURE__*/React__default.default.createElement(Icon__default.default, {
|
|
709
|
+
img: "trash",
|
|
710
|
+
color: primary
|
|
711
|
+
}))))), /*#__PURE__*/React__default.default.createElement("div", {
|
|
712
|
+
className: styles['destination-input-container']
|
|
713
|
+
}, /*#__PURE__*/React__default.default.createElement(DTAutoSuggest__default.default, {
|
|
714
|
+
appElement: this.props.appElement,
|
|
715
|
+
icon: "mapMarker",
|
|
716
|
+
id: "destination",
|
|
717
|
+
autoFocus: disableAutoFocus === true ? false : !this.props.isMobile && !Number.isNaN(origin?.lat),
|
|
718
|
+
storeRef: this.storeReference,
|
|
719
|
+
placeholder: this.props.destinationPlaceHolder,
|
|
720
|
+
className: getLocationType(this.props.destination),
|
|
721
|
+
getAutoSuggestIcons: this.props.getAutoSuggestIcons,
|
|
722
|
+
searchContext: searchContext,
|
|
723
|
+
onSelect: this.props.onSelect,
|
|
724
|
+
onClear: this.props.onClear,
|
|
725
|
+
refPoint: this.props.refPoint,
|
|
726
|
+
value: value(this.props.destination),
|
|
727
|
+
lang: this.props.lang,
|
|
728
|
+
sources: this.props.sources,
|
|
729
|
+
targets: this.props.targets,
|
|
730
|
+
filterResults: this.props.filterResults,
|
|
731
|
+
isMobile: this.props.isMobile,
|
|
732
|
+
mobileLabel: destinationMobileLabel,
|
|
733
|
+
fontWeights: this.props.fontWeights,
|
|
734
|
+
modeSet: this.props.modeSet,
|
|
735
|
+
colors: this.props.colors,
|
|
736
|
+
showScroll: this.props.showScroll,
|
|
737
|
+
isEmbedded: this.props.isEmbedded
|
|
738
|
+
}), (showSwapControl || showViapointControl) && /*#__PURE__*/React__default.default.createElement(ItinerarySearchControl, {
|
|
739
|
+
className: cx__default.default(styles['add-via-point'], styles.more, viaPoints.length > 4 && "collapsed"),
|
|
740
|
+
enabled: showViapointControl && viaPoints.length === 0,
|
|
741
|
+
onClick: () => this.handleAddViaPointClick(),
|
|
742
|
+
onKeyPress: e => isKeyboardSelectionEvent(e) && this.handleAddViaPointClick(),
|
|
743
|
+
"aria-label": t('add-via-button-label', {
|
|
744
|
+
lng
|
|
745
|
+
})
|
|
746
|
+
}, /*#__PURE__*/React__default.default.createElement(Icon__default.default, {
|
|
747
|
+
img: "viapoint",
|
|
748
|
+
width: 1.25,
|
|
749
|
+
height: 1.375,
|
|
750
|
+
color: primary
|
|
751
|
+
}))));
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
_defineProperty(DTAutosuggestPanel, "defaultProps", {
|
|
755
|
+
origin: undefined,
|
|
756
|
+
destination: undefined,
|
|
757
|
+
viaPoints: [],
|
|
758
|
+
originPlaceHolder: 'give-origin',
|
|
759
|
+
destinationPlaceHolder: 'give-destination',
|
|
760
|
+
swapOrder: undefined,
|
|
761
|
+
updateViaPoints: () => {},
|
|
762
|
+
searchPanelText: undefined,
|
|
763
|
+
sources: [],
|
|
764
|
+
targets: [],
|
|
765
|
+
filterResults: undefined,
|
|
766
|
+
onClear: undefined,
|
|
767
|
+
getAutoSuggestIcons: undefined,
|
|
768
|
+
refPoint: undefined,
|
|
769
|
+
addAnalyticsEvent: undefined,
|
|
770
|
+
disableAutoFocus: false,
|
|
771
|
+
isMobile: false,
|
|
772
|
+
handleViaPointLocationSelected: undefined,
|
|
773
|
+
originMobileLabel: null,
|
|
774
|
+
destinationMobileLabel: null,
|
|
775
|
+
modeSet: undefined,
|
|
776
|
+
colors: Icon.defaultColors,
|
|
777
|
+
fontWeights: {
|
|
778
|
+
medium: 500
|
|
779
|
+
},
|
|
780
|
+
showScroll: false,
|
|
781
|
+
onFocusChange: undefined,
|
|
782
|
+
isEmbedded: false,
|
|
783
|
+
showSwapControl: false,
|
|
784
|
+
showViapointControl: false,
|
|
785
|
+
showSlackControl: false
|
|
786
|
+
});
|
|
787
|
+
process.env.NODE_ENV !== "production" ? DTAutosuggestPanel.propTypes = {
|
|
788
|
+
appElement: PropTypes__default.default.string.isRequired,
|
|
789
|
+
origin: locationShape,
|
|
790
|
+
destination: locationShape,
|
|
791
|
+
originPlaceHolder: PropTypes__default.default.string,
|
|
792
|
+
destinationPlaceHolder: PropTypes__default.default.string,
|
|
793
|
+
viaPoints: PropTypes__default.default.arrayOf(locationShape),
|
|
794
|
+
updateViaPoints: PropTypes__default.default.func,
|
|
795
|
+
handleViaPointLocationSelected: PropTypes__default.default.func,
|
|
796
|
+
swapOrder: PropTypes__default.default.func,
|
|
797
|
+
searchPanelText: PropTypes__default.default.string,
|
|
798
|
+
searchContext: PropTypes__default.default.shape({
|
|
799
|
+
URL_PELIAS: PropTypes__default.default.string
|
|
800
|
+
}).isRequired,
|
|
801
|
+
onSelect: PropTypes__default.default.func.isRequired,
|
|
802
|
+
onClear: PropTypes__default.default.func,
|
|
803
|
+
addAnalyticsEvent: PropTypes__default.default.func,
|
|
804
|
+
lang: PropTypes__default.default.string.isRequired,
|
|
805
|
+
disableAutoFocus: PropTypes__default.default.bool,
|
|
806
|
+
sources: PropTypes__default.default.arrayOf(PropTypes__default.default.string),
|
|
807
|
+
targets: PropTypes__default.default.arrayOf(PropTypes__default.default.string),
|
|
808
|
+
filterResults: PropTypes__default.default.func,
|
|
809
|
+
isMobile: PropTypes__default.default.bool,
|
|
810
|
+
originMobileLabel: PropTypes__default.default.string,
|
|
811
|
+
destinationMobileLabel: PropTypes__default.default.string,
|
|
812
|
+
refPoint: locationShape,
|
|
813
|
+
modeSet: PropTypes__default.default.string,
|
|
814
|
+
colors: PropTypes__default.default.objectOf(PropTypes__default.default.string),
|
|
815
|
+
getAutoSuggestIcons: PropTypes__default.default.objectOf(PropTypes__default.default.func),
|
|
816
|
+
fontWeights: PropTypes__default.default.shape({
|
|
817
|
+
medium: PropTypes__default.default.number
|
|
818
|
+
}),
|
|
819
|
+
showScroll: PropTypes__default.default.bool,
|
|
820
|
+
onFocusChange: PropTypes__default.default.func,
|
|
821
|
+
isEmbedded: PropTypes__default.default.bool,
|
|
822
|
+
showSwapControl: PropTypes__default.default.bool,
|
|
823
|
+
showViapointControl: PropTypes__default.default.bool,
|
|
824
|
+
showSlackControl: PropTypes__default.default.bool,
|
|
825
|
+
t: PropTypes__default.default.func.isRequired
|
|
826
|
+
} : void 0;
|
|
827
|
+
const DTAutosuggestPanelWithTranslation = reactI18next.withTranslation()(DTAutosuggestPanel);
|
|
828
|
+
var index = props => {
|
|
829
|
+
return /*#__PURE__*/React__default.default.createElement(reactI18next.I18nextProvider, {
|
|
830
|
+
i18n: i18n
|
|
831
|
+
}, /*#__PURE__*/React__default.default.createElement(DTAutosuggestPanelWithTranslation, props));
|
|
832
|
+
};
|
|
833
|
+
|
|
834
|
+
exports.default = index;
|
|
835
|
+
exports.getEmptyViaPointPlaceHolder = getEmptyViaPointPlaceHolder;
|
|
836
|
+
|
|
837
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
838
|
+
|
|
839
|
+
}));
|
|
840
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZGV2ZWxvcG1lbnQuY2pzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJpbWl0aXZlLmpzIiwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJvcGVydHlLZXkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanMiLCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllcy5qcyIsIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1pbmplY3QvZGlzdC9zdHlsZS1pbmplY3QuZXMuanMiLCIuLi9zcmMvaGVscGVycy9TZWxlY3QuanN4IiwiLi4vc3JjL2hlbHBlcnMvdHJhbnNsYXRpb25zLmpzIiwiLi4vc3JjL2hlbHBlcnMvaTE4bi5qcyIsIi4uL3NyYy9pbmRleC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvO1xuICB9IDogZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbztcbiAgfSwgX3R5cGVvZihvKTtcbn1cbmV4cG9ydCB7IF90eXBlb2YgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuZnVuY3Rpb24gdG9QcmltaXRpdmUodCwgcikge1xuICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDtcbiAgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cbmV4cG9ydCB7IHRvUHJpbWl0aXZlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCB0b1ByaW1pdGl2ZSBmcm9tIFwiLi90b1ByaW1pdGl2ZS5qc1wiO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5leHBvcnQgeyB0b1Byb3BlcnR5S2V5IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkge1xuICByZXR1cm4gKHIgPSB0b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHtcbiAgICB2YWx1ZTogdCxcbiAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIHdyaXRhYmxlOiAhMFxuICB9KSA6IGVbcl0gPSB0LCBlO1xufVxuZXhwb3J0IHsgX2RlZmluZVByb3BlcnR5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShyLCBlKSB7XG4gIGlmIChudWxsID09IHIpIHJldHVybiB7fTtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgbiBpbiByKSBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSkge1xuICAgIGlmICgtMSAhPT0gZS5pbmRleE9mKG4pKSBjb250aW51ZTtcbiAgICB0W25dID0gcltuXTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmV4cG9ydCB7IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiLi9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzXCI7XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoZSwgdCkge1xuICBpZiAobnVsbCA9PSBlKSByZXR1cm4ge307XG4gIHZhciBvLFxuICAgIHIsXG4gICAgaSA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoZSwgdCk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuICAgIGZvciAociA9IDA7IHIgPCBuLmxlbmd0aDsgcisrKSBvID0gbltyXSwgLTEgPT09IHQuaW5kZXhPZihvKSAmJiB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIG8pICYmIChpW29dID0gZVtvXSk7XG4gIH1cbiAgcmV0dXJuIGk7XG59XG5leHBvcnQgeyBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIHN0eWxlSW5qZWN0KGNzcywgcmVmKSB7XG4gIGlmICggcmVmID09PSB2b2lkIDAgKSByZWYgPSB7fTtcbiAgdmFyIGluc2VydEF0ID0gcmVmLmluc2VydEF0O1xuXG4gIGlmICghY3NzIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuOyB9XG5cbiAgdmFyIGhlYWQgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XG4gIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHN0eWxlLnR5cGUgPSAndGV4dC9jc3MnO1xuXG4gIGlmIChpbnNlcnRBdCA9PT0gJ3RvcCcpIHtcbiAgICBpZiAoaGVhZC5maXJzdENoaWxkKSB7XG4gICAgICBoZWFkLmluc2VydEJlZm9yZShzdHlsZSwgaGVhZC5maXJzdENoaWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICB9XG5cbiAgaWYgKHN0eWxlLnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgc3R5bGVJbmplY3Q7XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGN4IGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVNlbGVjdCB9IGZyb20gJ2Rvd25zaGlmdCc7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vc2VsZWN0LnNjc3MnO1xuXG5jb25zdCBTZWxlY3QgPSAoe1xuICB2YWx1ZSxcbiAgb3B0aW9ucyxcbiAgb25TbGFja1RpbWVTZWxlY3RlZCxcbiAgdmlhUG9pbnRJbmRleCxcbiAgaWQsXG4gIGxhYmVsLFxuICBpY29uLFxufSkgPT4ge1xuICBjb25zdCBsYWJlbElkID0gYCR7aWR9LWxhYmVsYDtcbiAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gb3B0aW9ucy5maW5kKG9wdGlvbiA9PiBvcHRpb24udmFsdWUgPT09IHZhbHVlKTtcblxuICBjb25zdCB7XG4gICAgaXNPcGVuLFxuICAgIGdldFRvZ2dsZUJ1dHRvblByb3BzLFxuICAgIGdldE1lbnVQcm9wcyxcbiAgICBnZXRJdGVtUHJvcHMsXG4gICAgZ2V0TGFiZWxQcm9wcyxcbiAgICBoaWdobGlnaHRlZEluZGV4LFxuICB9ID0gdXNlU2VsZWN0KHtcbiAgICBzZWxlY3RlZEl0ZW0sXG4gICAgaXRlbXM6IG9wdGlvbnMsXG4gICAgbGFiZWxJZCxcbiAgICBpZCxcbiAgICBpdGVtVG9TdHJpbmc6IGl0ZW0gPT4gaXRlbS5kaXNwbGF5TmFtZSxcbiAgICBvblNlbGVjdGVkSXRlbUNoYW5nZTogKHsgc2VsZWN0ZWRJdGVtOiBuZXdJdGVtIH0pID0+IHtcbiAgICAgIG9uU2xhY2tUaW1lU2VsZWN0ZWQobmV3SXRlbS52YWx1ZSwgdmlhUG9pbnRJbmRleCk7XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzWydjb21ib2JveC1jb250YWluZXInXX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmNvbnRhaW5lcn0+XG4gICAgICAgIDxkaXYgey4uLmdldFRvZ2dsZUJ1dHRvblByb3BzKCl9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzWydsZWZ0LWNvbHVtbiddfT5cbiAgICAgICAgICAgIDxsYWJlbCB7Li4uZ2V0TGFiZWxQcm9wcygpfSBjbGFzc05hbWU9e3N0eWxlc1snY29tYm9ib3gtbGFiZWwnXX0+XG4gICAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmlucHV0fT5cbiAgICAgICAgICAgICAgPHNwYW4+e3NlbGVjdGVkSXRlbS5kaXNwbGF5TmFtZX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2ljb259XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dWxcbiAgICAgICAgICBjbGFzc05hbWU9e2N4KFtzdHlsZXMuc3VnZ2VzdGlvbnNDb250YWluZXJPcGVuLCAhaXNPcGVuICYmICdoaWRkZW4nXSl9XG4gICAgICAgICAgey4uLmdldE1lbnVQcm9wcygpfVxuICAgICAgICA+XG4gICAgICAgICAge2lzT3BlbiAmJlxuICAgICAgICAgICAgb3B0aW9ucy5tYXAoKG9wdGlvbiwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAga2V5PXtvcHRpb24udmFsdWV9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeChbXG4gICAgICAgICAgICAgICAgICBzdHlsZXMuc3VnZ2VzdGlvbixcbiAgICAgICAgICAgICAgICAgIGluZGV4ID09PSBoaWdobGlnaHRlZEluZGV4ICYmIHN0eWxlcy5zdWdnZXN0aW9uSGlnaGxpZ2h0ZWQsXG4gICAgICAgICAgICAgICAgXSl9XG4gICAgICAgICAgICAgICAgey4uLmdldEl0ZW1Qcm9wcyh7IGluZGV4IH0pfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4+e29wdGlvbi5kaXNwbGF5TmFtZX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuU2VsZWN0LnByb3BUeXBlcyA9IHtcbiAgdmFsdWU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgb25TbGFja1RpbWVTZWxlY3RlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb3B0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoXG4gICAgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGRpc3BsYXlOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgICB2YWx1ZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAgIH0pLmlzUmVxdWlyZWQsXG4gICkuaXNSZXF1aXJlZCxcbiAgaWQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgbGFiZWw6IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG4gIGljb246IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG4gIHZpYVBvaW50SW5kZXg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdDtcbiIsImNvbnN0IHRyYW5zbGF0aW9ucyA9IHtcbiAgZGU6IHtcbiAgICB0cmFuc2xhdGlvbjoge1xuICAgICAgJ2FkZC12aWEtYnV0dG9uLWxhYmVsJzogJ0bDvGdlIFp3aXNjaGVuemllbCBoaW56dScsXG4gICAgICAnYWRkLXZpYS1kdXJhdGlvbi1idXR0b24tbGFiZWwnOlxuICAgICAgICAnU2V0emUgVW1zdGVpZ2V6ZWl0IGbDvHIgWndpc2NoZW56aWVsIHt7aW5kZXh9fScsXG4gICAgICAnYWRkLXZpYS1kdXJhdGlvbi1idXR0b24tbGFiZWwtY2xvc2UnOlxuICAgICAgICAnU2NobGllw59lIFVtc3RlaWdlemVpdC1BdXN3YWhsIGbDvHIgWndpc2NoZW56aWVsIHt7aW5kZXh9fScsXG4gICAgICAnYWRkLXZpYS1kdXJhdGlvbi1idXR0b24tbGFiZWwtb3Blbic6XG4gICAgICAgICfDlmZmbmUgVW1zdGVpZ2V6ZWl0LUF1c3dhaGwgZsO8ciBad2lzY2hlbnppZWwge3tpbmRleH19JyxcbiAgICAgICdtaW51dGUtc2hvcnQnOiAnbWluJyxcbiAgICAgICdyZW1vdmUtdmlhLWJ1dHRvbi1sYWJlbCc6ICdFbnRmZXJuZSBad2lzY2hlbnppZWwge3tpbmRleH19JyxcbiAgICAgICdzd2FwLW9yZGVyLWJ1dHRvbi1sYWJlbCc6ICdUYXVzY2hlIFN0YXJ0IG1pdCBaaWVsJyxcbiAgICAgICd2aWEtcG9pbnQnOiAnWndpc2NoZW56aWVsJyxcbiAgICAgICd2aWEtcG9pbnQtaW5kZXgnOiAnWndpc2NoZW56aWVsIHt7aW5kZXh9fScsXG4gICAgICAndmlhcG9pbnQtc2xhY2stYW1vdW50JzogJ1Vtc3RlaWdlemVpdCcsXG4gICAgfSxcbiAgfSxcbiAgZW46IHtcbiAgICB0cmFuc2xhdGlvbjoge1xuICAgICAgJ2FkZC12aWEtYnV0dG9uLWxhYmVsJzogJ0FkZCB2aWEgcG9pbnQnLFxuICAgICAgJ2FkZC12aWEtZHVyYXRpb24tYnV0dG9uLWxhYmVsJzpcbiAgICAgICAgJ1NldCBzdG9wIGR1cmF0aW9uIGF0IHZpYSBwb2ludCB7e2luZGV4fX0nLFxuICAgICAgJ2FkZC12aWEtZHVyYXRpb24tYnV0dG9uLWxhYmVsLWNsb3NlJzpcbiAgICAgICAgJ0Nsb3NlIHN0b3AgZHVyYXRpb24gc2VsZWN0b3IgYXQgdmlhIHBvaW50IHt7aW5kZXh9fScsXG4gICAgICAnYWRkLXZpYS1kdXJhdGlvbi1idXR0b24tbGFiZWwtb3Blbic6XG4gICAgICAgICdPcGVuIHN0b3AgZHVyYXRpb24gc2VsZWN0b3IgYXQgdmlhIHBvaW50IHt7aW5kZXh9fScsXG4gICAgICAnbWludXRlLXNob3J0JzogJ21pbicsXG4gICAgICAncmVtb3ZlLXZpYS1idXR0b24tbGFiZWwnOiAnUmVtb3ZlIHZpYSBwb2ludCB7e2luZGV4fX0nLFxuICAgICAgJ3N3YXAtb3JkZXItYnV0dG9uLWxhYmVsJzogJ1JldmVyc2Ugb3JpZ2luIGFuZCBkZXN0aW5hdGlvbicsXG4gICAgICAndmlhLXBvaW50JzogJ1ZpYSBwb2ludCcsXG4gICAgICAndmlhLXBvaW50LWluZGV4JzogJ1ZpYSBwb2ludCB7e2luZGV4fX0nLFxuICAgICAgJ3ZpYXBvaW50LXNsYWNrLWFtb3VudCc6ICdTdG9wIGR1cmF0aW9uJyxcbiAgICB9LFxuICB9LFxuICBmaToge1xuICAgIHRyYW5zbGF0aW9uOiB7XG4gICAgICAnYWRkLXZpYS1idXR0b24tbGFiZWwnOiAnTGlzw6TDpCB2w6RsaXBpc3RlJyxcbiAgICAgICdhZGQtdmlhLWR1cmF0aW9uLWJ1dHRvbi1sYWJlbCc6XG4gICAgICAgICdBc2V0YSB2w6RsaXBpc3RlZWxsZSB7e2luZGV4fX0gcHlzw6RoZHlrc2VuIGtlc3RvJyxcbiAgICAgICdhZGQtdmlhLWR1cmF0aW9uLWJ1dHRvbi1sYWJlbC1jbG9zZSc6XG4gICAgICAgICdBdmFhIHbDpGxpcGlzdGVlbiB7e2luZGV4fX0gcHlzw6RoZHlrc2VuIGtlc3RvIHZhbGl0c2luJyxcbiAgICAgICdhZGQtdmlhLWR1cmF0aW9uLWJ1dHRvbi1sYWJlbC1vcGVuJzpcbiAgICAgICAgJ1N1bGplIHbDpGxpcGlzdGVlbiB7e2luZGV4fX0gcHlzw6RoZHlrc2VuIGtlc3RvIHZhbGl0c2luJyxcbiAgICAgICdtaW51dGUtc2hvcnQnOiAnbWluJyxcbiAgICAgICdyZW1vdmUtdmlhLWJ1dHRvbi1sYWJlbCc6ICdQb2lzdGEgdsOkbGlwaXN0ZSB7e2luZGV4fX0nLFxuICAgICAgJ3N3YXAtb3JkZXItYnV0dG9uLWxhYmVsJzogJ0vDpMOkbm7DpCByZWl0aW4gc3V1bnRhIHZhc3Rha2thaXNla3NpJyxcbiAgICAgICd2aWEtcG9pbnQnOiAnVsOkbGlwaXN0ZScsXG4gICAgICAndmlhLXBvaW50LWluZGV4JzogJ1bDpGxpcGlzdGUge3tpbmRleH19JyxcbiAgICAgICd2aWFwb2ludC1zbGFjay1hbW91bnQnOiAnUHlzw6RoZHlrc2VuIGtlc3RvJyxcbiAgICB9LFxuICB9LFxuICBwbDoge1xuICAgIHRyYW5zbGF0aW9uOiB7XG4gICAgICAnYWRkLXZpYS1idXR0b24tbGFiZWwnOiAnRG9kYWogcHVua3QgcG/Fm3JlZG5pJyxcbiAgICAgICdhZGQtdmlhLWR1cmF0aW9uLWJ1dHRvbi1sYWJlbCc6XG4gICAgICAgICdXeWJpZXJ6IGN6YXMgcG9zdG9qdSBkbGEgcHVua3R1IHt7aW5kZXh9fScsXG4gICAgICAnYWRkLXZpYS1kdXJhdGlvbi1idXR0b24tbGFiZWwtY2xvc2UnOlxuICAgICAgICAnWmFta25paiB3eWJvcm5payBjemFzdSBwb3N0b2p1IHcgcHVua2NpZSB7e2luZGV4fX0nLFxuICAgICAgJ2FkZC12aWEtZHVyYXRpb24tYnV0dG9uLWxhYmVsLW9wZW4nOlxuICAgICAgICAnT3R3w7NyeiB3eWJvcm5payBjemFzdSBwb3N0b2p1IHcgcHVua2NpZSB7e2luZGV4fX0nLFxuICAgICAgJ21pbnV0ZS1zaG9ydCc6ICdtaW4uJyxcbiAgICAgICdyZW1vdmUtdmlhLWJ1dHRvbi1sYWJlbCc6ICdVc3XFhCBwdW5rdCBwb8WbcmVkbmkge3tpbmRleH19JyxcbiAgICAgICdzd2FwLW9yZGVyLWJ1dHRvbi1sYWJlbCc6ICdPZHdyw7PEhyBwb2N6xIV0ZWsgaSBjZWwnLFxuICAgICAgJ3ZpYS1wb2ludCc6ICdQdW5rdCBwb8WbcmVkbmknLFxuICAgICAgJ3ZpYS1wb2ludC1pbmRleCc6ICdQdW5rdCBwb8WbcmVkbmkge3tpbmRleH19JyxcbiAgICAgICd2aWFwb2ludC1zbGFjay1hbW91bnQnOiAnQ3phcyBwb3N0b2p1JyxcbiAgICB9LFxuICB9LFxuICBzdjoge1xuICAgIHRyYW5zbGF0aW9uOiB7XG4gICAgICAnYWRkLXZpYS1idXR0b24tbGFiZWwnOiAnTMOkZ2cgdGlsbCB2aWFwdW5rdCcsXG4gICAgICAnYWRkLXZpYS1kdXJhdGlvbi1idXR0b24tbGFiZWwnOlxuICAgICAgICAnU3TDpGxsIGluIHZhcmFrdGlnaGV0IGbDtnIgdmlhcHVua3RlbiB7e2luZGV4fX0nLFxuICAgICAgJ2FkZC12aWEtZHVyYXRpb24tYnV0dG9uLWxhYmVsLWNsb3NlJzpcbiAgICAgICAgJ1N0w6RuZyB2w6RsamFyZW4gZsO2ciB2YXJha3RpZ2hldCB2aWQgdmlhLXB1bmt0ZW4ge3tpbmRleH19JyxcbiAgICAgICdhZGQtdmlhLWR1cmF0aW9uLWJ1dHRvbi1sYWJlbC1vcGVuJzpcbiAgICAgICAgJ8OWcHBuYSB2w6RsamFyZW4gZsO2ciB2YXJha3RpZ2hldCB2aWQgdmlhLXB1bmt0ZW4ge3tpbmRleH19JyxcbiAgICAgICdtaW51dGUtc2hvcnQnOiAnbWluJyxcbiAgICAgICdyZW1vdmUtdmlhLWJ1dHRvbi1sYWJlbCc6ICdUYSBib3J0IHZpYXB1bmt0IHt7aW5kZXh9fScsXG4gICAgICAnc3dhcC1vcmRlci1idXR0b24tbGFiZWwnOiAnU3bDpG5nIHJ1dHRlbnMgcmlrdG5pbmcgdGlsbCBkZW4gbW90c2F0dGEnLFxuICAgICAgJ3ZpYS1wb2ludCc6ICdWaWEgcHVua3QnLFxuICAgICAgJ3ZpYS1wb2ludC1pbmRleCc6ICdWaWEgcHVua3Qge3tpbmRleH19JyxcbiAgICAgICd2aWFwb2ludC1zbGFjay1hbW91bnQnOiAnU3RvcHBldHMgdmFyYWt0aWdoZXQnLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCB0cmFuc2xhdGlvbnM7XG4iLCJpbXBvcnQgeyBjcmVhdGVJbnN0YW5jZSB9IGZyb20gJ2kxOG5leHQnO1xuaW1wb3J0IHRyYW5zbGF0aW9ucyBmcm9tICcuL3RyYW5zbGF0aW9ucyc7XG5cbmNvbnN0IGkxOG4gPSBjcmVhdGVJbnN0YW5jZSh7XG4gIGZhbGxiYWNrTG5nOiAnZmknLFxuICAvLyBkZWJ1ZzogdHJ1ZSxcbiAgcmVzb3VyY2VzOiB0cmFuc2xhdGlvbnMsXG4gIGRlZmF1bHROUzogJ3RyYW5zbGF0aW9uJyxcbiAgcmVhY3Q6IHtcbiAgICB1c2VTdXNwZW5zZTogdHJ1ZSxcbiAgfSxcbn0pO1xuXG5pMThuLmluaXQoKTtcblxuZXhwb3J0IGRlZmF1bHQgaTE4bjtcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IGN4IGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBJMThuZXh0UHJvdmlkZXIsIHdpdGhUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnO1xuaW1wb3J0IHsgUmVhY3RTb3J0YWJsZSB9IGZyb20gJ3JlYWN0LXNvcnRhYmxlanMnO1xuaW1wb3J0IERUQXV0b1N1Z2dlc3QgZnJvbSAnQGRpZ2l0cmFuc2l0LWNvbXBvbmVudC9kaWdpdHJhbnNpdC1jb21wb25lbnQtYXV0b3N1Z2dlc3QnO1xuaW1wb3J0IEljb24sIHtcbiAgZGVmYXVsdENvbG9ycyxcbn0gZnJvbSAnQGRpZ2l0cmFuc2l0LWNvbXBvbmVudC9kaWdpdHJhbnNpdC1jb21wb25lbnQtaWNvbic7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvaXNFbXB0eS5qcyc7XG5pbXBvcnQgU2VsZWN0IGZyb20gJy4vaGVscGVycy9TZWxlY3QnO1xuaW1wb3J0IGkxOG4gZnJvbSAnLi9oZWxwZXJzL2kxOG4nO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL2hlbHBlcnMvc3R5bGVzLnNjc3MnO1xuXG5leHBvcnQgY29uc3QgZ2V0RW1wdHlWaWFQb2ludFBsYWNlSG9sZGVyID0gKCkgPT4gKHt9KTtcblxuY29uc3QgaXNWaWFQb2ludEVtcHR5ID0gdmlhUG9pbnQgPT4ge1xuICBpZiAodmlhUG9pbnQgPT09IHVuZGVmaW5lZCB8fCBpc0VtcHR5KHZpYVBvaW50KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2aWFQb2ludCk7XG4gIHJldHVybiAoXG4gICAga2V5cy5sZW5ndGggPT09IDEgfHwgKGtleXMubGVuZ3RoID09PSAyICYmIGtleXMuaW5jbHVkZXMoJ2xvY2F0aW9uU2xhY2snKSlcbiAgKTtcbn07XG5cbmNvbnN0IEl0aW5lcmFyeVNlYXJjaENvbnRyb2wgPSAoe1xuICBjaGlsZHJlbixcbiAgY2xhc3NOYW1lLFxuICBlbmFibGVkLFxuICBvbkNsaWNrLFxuICBvbktleVByZXNzLFxuICB3aWRlLFxuICAuLi5yZXN0XG59KSA9PiAoXG4gIDxkaXZcbiAgICBjbGFzc05hbWU9e3N0eWxlc1snaXRpbmVyYXJ5LXNlYXJjaC1jb250cm9sJ119XG4gICAgc3R5bGU9e3sgJy0td2lkdGgnOiB3aWRlID8gJzQ3cHgnIDogJzQwcHgnIH19XG4gID5cbiAgICB7b25DbGljayAmJiBlbmFibGVkICYmIChcbiAgICAgIDxkaXZcbiAgICAgICAgey4uLnJlc3R9XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICBvbktleVByZXNzPXtvbktleVByZXNzfVxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiSW5kZXg9XCIwXCJcbiAgICAgID5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9kaXY+XG4gICAgKX1cbiAgPC9kaXY+XG4pO1xuXG5jb25zdCB1cGRhdGVWaWFQb2ludFNsYWNrID0gKFxuICBhY3RpdmVWaWFQb2ludFNsYWNrcyxcbiAgdXBkYXRlZFZpYVBvaW50SW5kZXgsXG4gIHZpYVBvaW50UmVtb3ZlZCA9IGZhbHNlLFxuKSA9PiB7XG4gIGNvbnN0IGZvdW5kQXRJbmRleCA9IGFjdGl2ZVZpYVBvaW50U2xhY2tzLmluZGV4T2YodXBkYXRlZFZpYVBvaW50SW5kZXgpO1xuICBpZiAoZm91bmRBdEluZGV4ID4gLTEpIHtcbiAgICBhY3RpdmVWaWFQb2ludFNsYWNrcy5zcGxpY2UoZm91bmRBdEluZGV4LCAxKTtcbiAgfVxuICByZXR1cm4gdmlhUG9pbnRSZW1vdmVkXG4gICAgPyBhY3RpdmVWaWFQb2ludFNsYWNrcy5tYXAodmFsdWUgPT5cbiAgICAgICAgdmFsdWUgPiB1cGRhdGVkVmlhUG9pbnRJbmRleCA/IHZhbHVlIC0gMSA6IHZhbHVlLFxuICAgICAgKVxuICAgIDogYWN0aXZlVmlhUG9pbnRTbGFja3M7XG59O1xuXG5jb25zdCBpc0tleWJvYXJkU2VsZWN0aW9uRXZlbnQgPSBldmVudCA9PiB7XG4gIGNvbnN0IHNwYWNlID0gWzEzLCAnICcsICdTcGFjZWJhciddO1xuICBjb25zdCBlbnRlciA9IFszMiwgJ0VudGVyJ107XG4gIGNvbnN0IGtleSA9IChldmVudCAmJiAoZXZlbnQua2V5IHx8IGV2ZW50LndoaWNoIHx8IGV2ZW50LmtleUNvZGUpKSB8fCAnJztcbiAgaWYgKCFrZXkgfHwgIXNwYWNlLmNvbmNhdChlbnRlcikuaW5jbHVkZXMoa2V5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmNvbnN0IHZhbHVlID0gbG9jYXRpb24gPT5cbiAgKGxvY2F0aW9uICYmIGxvY2F0aW9uLmFkZHJlc3MpIHx8XG4gIChsb2NhdGlvbiAmJiBsb2NhdGlvbi5ncHMgJiYgbG9jYXRpb24ucmVhZHkgJiYgJ055a3lpbmVuIHNpamFpbnRpJykgfHxcbiAgJyc7XG5cbmNvbnN0IGdldExvY2F0aW9uVHlwZSA9IGxvY2F0aW9uID0+XG4gIGxvY2F0aW9uICYmIGxvY2F0aW9uLmdwcyA9PT0gdHJ1ZSA/ICdwb3NpdGlvbicgOiAnbG9jYXRpb24nO1xuXG5jb25zdCBnZXRTbGFja1RpbWVPcHRpb25zID0gdCA9PiB7XG4gIGNvbnN0IHRpbWVPcHRpb25zID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IDk7IGkrKykge1xuICAgIGNvbnN0IHZhbHVlSW5NaW51dGVzID0gaSAqIDEwO1xuICAgIHRpbWVPcHRpb25zLnB1c2goe1xuICAgICAgZGlzcGxheU5hbWU6IGAke3ZhbHVlSW5NaW51dGVzfSAke3QoJ21pbnV0ZS1zaG9ydCcpfWAsXG4gICAgICB2YWx1ZTogdmFsdWVJbk1pbnV0ZXMgKiA2MCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdGltZU9wdGlvbnM7XG59O1xuXG5JdGluZXJhcnlTZWFyY2hDb250cm9sLnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgZW5hYmxlZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25LZXlQcmVzczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgd2lkZTogUHJvcFR5cGVzLmJvb2wsXG59O1xuXG5JdGluZXJhcnlTZWFyY2hDb250cm9sLmRlZmF1bHRQcm9wcyA9IHtcbiAgY2hpbGRyZW46IHVuZGVmaW5lZCxcbiAgd2lkZTogZmFsc2UsXG59O1xuXG4vKipcbiAqIFBhbmVsIHRoYXQgcmVuZGVycyB0d28gRFRBdXRvc3VnZ2VzdCBzZWFyY2ggZmllbGRzLCBpbmNsdWRpbmcgdmlhcG9pbnQgaGFuZGxpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2VhcmNoQ29udGV4dCA9IHtcbiAqICAgaXNQZWxpYXNMb2NhdGlvbkF3YXJlOiBmYWxzZSAvLyB0cnVlIC8gZmFsc2UgZG9lcyBMZXQgUGVsaWFzIHN1Z2dlc3QgYmFzZWQgb24gY3VycmVudCB1c2VyIGxvY2F0aW9uXG4gKiAgIG1pbmltYWxSZWdleHA6IHVuZGVmaW5lZCAvLyB1c2VkIGZvciB0ZXN0aW5nIG1pbi4gcmVnZXhwLiBGb3IgZXhhbXBsZTogbmV3IFJlZ0V4cCgnLnsyLH0nKSxcbiAqICAgbGluZVJlZ2V4cDogdW5kZWZpbmVkIC8vICBpZGVudGlmeSBzZWFyY2hlcyBmb3Igcm91dGUgbnVtYmVycy9sYWJlbHM6IGJ1cyB8IHRyYWluIHwgbWV0cm8uIEZvciBleGFtcGxlOiBuZXcgUmVnRXhwKFxuICogICAgLy8gICAnKF5bMC05XStbYS16XT8kfF5beXVsZWFwaW5rcnRkel0kfChebVsxMl0/Yj8kKSknLFxuICogICAgLy8gICdpJyxcbiAqICAgIC8vICApLFxuICogICBVUkxfUEVMSUFTOiAnJyAvLyB1cmwgZm9yIHBlbGlhcyBzZWFyY2hlc1xuICogICBmZWVkSURzOiBbJ0hTTCcsICdIU0xMYXV0dGEnXSAvLyBGZWVkSWQncyBsaWtlICBbSFNMLCBIU0xMYXV0dGFdXG4gKiAgIGdlb2NvZGluZ1NvdXJjZXM6IFsnb2EnLCdvc20nLCdubHNmaSddICAvLyBzb3VyY2VzIGZvciBnZW9jb2RpbmdcbiAqICAgZ2VvY29kaW5nU2VhcmNoUGFyYW1zOyB7fSAgLy8gU2VhcmNocGFybWFzIGZybyBnZW9jb2RpbmdcbiAqICAgZ2V0RmF2b3VyaXRlTG9jYXRpb25zOiAoKSA9PiAoe30pLCAgICAvLyBGdW5jdGlvbiB0aGF0IHJldHVybnMgYXJyYXkgb2YgZmF2b3VyaXRlIGxvY2F0aW9ucy5cbiAqICAgZ2V0RmF2b3VyaXRlU3RvcHM6ICgpID0+ICh7fSksICAgICAgICAvLyBGdW5jdGlvbiB0aGF0IHJldHVybnMgYXJyYXkgb2YgZmF2b3VyaXRlIHN0b3BzLlxuICogICBnZXRMYW5ndWFnZTogKCkgPT4gKHt9KSwgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBjdXJyZW50IGxhbmd1YWdlLlxuICogICBnZXRGYXZvdXJpdGVSb3V0ZXM6ICgpID0+ICh7fSksICAgICAgIC8vIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhcnJheSBvZiBmYXZvdXJpdGUgcm91dGVzLlxuICogICBnZXRQb3NpdGlvbnM6ICgpID0+ICh7fSksICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB1c2VyJ3MgZ2VvbG9jYXRpb24uXG4gKiAgIGdldFJvdXRlc1F1ZXJ5OiAoKSA9PiAoe30pLCAgICAgICAgICAgLy8gRnVuY3Rpb24gdGhhdCByZXR1cm5zIHF1ZXJ5IGZvciBmZXRjaGluZyByb3V0ZXMuXG4gKiAgIGdldFN0b3BBbmRTdGF0aW9uc1F1ZXJ5OiAoKSA9PiAoe30pLCAgLy8gRnVuY3Rpb24gdGhhdCBmZXRjaGVzIGZhdm91cml0ZSBzdG9wcyBhbmQgc3RhdGlvbnMgZnJvbSBncmFwaHFsIEFQSS5cbiAqICAgZ2V0RmF2b3VyaXRlUm91dGVzUXVlcnk6ICgpID0+ICh7fSksICAvLyBGdW5jdGlvbiB0aGF0IHJldHVybnMgcXVlcnkgZm9yIGZldGNoaW5nIGZhdm91cml0ZSByb3V0ZXMuXG4gKiAgIGdldEZhdm91cml0ZVZlaGljbGVSZW50YWxTdGF0aW9uczogKCkgPT4gKHt9KSwgIC8vIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBmYXZvdXJpdGUgYmlrZSByZW50YWwgc3RhdGlvbi5cbiAqICAgZ2V0RmF2b3VyaXRlVmVoaWNsZVJlbnRhbFN0YXRpb25zUXVlcnk6ICgpID0+ICh7fSksIC8vIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBxdWVyeSBmb3IgZmV0Y2hpbmcgZmF2b3VyaXRlIGJpa2UgcmVudGFsIHN0YXRpb25zLlxuICogICBzdGFydExvY2F0aW9uV2F0Y2g6ICgpID0+ICh7fSksICAgICAgIC8vIEZ1bmN0aW9uIHRoYXQgbG9jYXRlcyB1c2VycyBnZW9sb2NhdGlvbi5cbiAqICAgc2F2ZVNlYXJjaDogKCkgPT4gKHt9KSwgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiB0aGF0IHNhdmVzIHNlYXJjaCB0byBvbGQgc2VhcmNoZXMgc3RvcmUuXG4gKiAgIGNsZWFyT2xkU2VhcmNoZXM6ICgpID0+ICh7fSksICAgICAgICAgLy8gRnVuY3Rpb24gdGhhdCBjbGVhcnMgb2xkIHNlYXJjaGVzIHN0b3JlLlxuICogICBnZXRGdXR1cmVSb3V0ZXM6ICgpID0+ICh7fSksICAgICAgICAgIC8vIEZ1bmN0aW9uIHRoYXQgcmV0dXJuIGZ1dHVyZSByb3V0ZXNcbiAqICAgc2F2ZUZ1dHVyZVJvdXRlOiAoKSA9PiAoe30pLCAgICAgICAgICAvLyBGdW5jdGlvbiB0aGF0IHNhdmVzIGEgZnV0dXJlIHJvdXRlXG4gKiAgIGNsZWFyRnV0dXJlUm91dGVzOiAoKSA9PiAoe30pLCAgICAgICAgLy8gRnVuY3Rpb24gdGhhdCBjbGVhcnMgZnV0dXJlIHJvdXRlc1xuICogfTtcbiAqXG4gKiBjb25zdCBvcmlnaW4gPSB7XG4gKiAgbGF0OiA2MC4xNjkxOTYsXG4gKiAgbG9uOiAyNC45NTc2NzQsXG4gKiAgYWRkcmVzczogJ0FsZWtzYW50ZXJpbmthdHUsIEhlbHNpbmtpJyxcbiAqICBzZXQ6IHRydWUsXG4gKiAgcmVhZHk6IHRydWUsXG4gKiB9XG4gKlxuICogY29uc3QgZGVzdGluYXRpb24gPSB7XG4gKiAgIGxhdDogNjAuMTk5MDkzLFxuICogICBsb246IDI0Ljk0MDUzNixcbiAqICAgYWRkcmVzczogJ09wYXN0aW5zaWx0YSA2LCBIZWxzaW5raScsXG4gKiAgIHNldDogdHJ1ZSxcbiAqICAgcmVhZHk6IHRydWUsXG4gKiB9XG4gKiBvblNlbGVjdChpdGVtLCBpZCkge1xuICogIHJldHVybiBudWxsOyAgLy8gRGVmaW5lIHdoYXQgdG8gZG8gd2hlbiBhIHN1Z2dlc3Rpb24gaXMgYmVpbmcgc2VsZWN0ZWQuIE5vbmUgYnkgZGVmYXVsdC5cbiAqICB9XG4gKiBvbkNsZWFyKGlkKSB7XG4gKiAgcmV0dXJuIG51bGw7ICAvLyBEZWZpbmUgd2hhdCB0byBkbyB3aGVuIGEgc3VnZ2VzdGlvbiBpcyBiZWluZyBzZWxlY3RlZC4gTm9uZSBieSBkZWZhdWx0LlxuICogfVxuICogY29uc3QgZ2V0QXV0b1N1Z2dlc3RJY29uczoge1xuICogICAvLyBDYWxsZWQgZm9yIGV2ZXJ5IGNpdHkgYmlrZSBzdGF0aW9uIHJlbmRlcmVkIGFzIGEgc2VhcmNoIHN1Z2dlc3Rpb24uIFNob3VsZCByZXR1cm4gdGhlIGljb24gYW5kXG4gKiAgIC8vIGNvbG9yIHVzZWQgZm9yIHRoYXQgc3RhdGlvbi4gVHdvIGljb25zIGFyZSBhdmFpbGFibGUsICdjaXR5YmlrZS1zdG9wLWRpZ2l0cmFuc2l0JyBhbmRpdHliaWtlLXN0b3AtZGlnaXRyYW5zaXQtc2Vjb25kYXJ5Jy5cbiAqICAgY2l0eWJpa2VzOiBzdGF0aW9uID0+IHtcbiAqICAgICAgcmV0dXJuIFsnY2l0eWJpa2Utc3RvcC1kaWdpdHJhbnNpdCcsICcjZjJiNjJkJ107XG4gKiAgIH1cbiAqIH1cbiAqIGNvbnN0IHRhcmdldHMgPSBbJ0xvY2F0aW9ucycsICdTdG9wcycsICdSb3V0ZXMnXTsgLy8gRGVmaW5lcyB3aGF0IHlvdSBhcmUgc2VhcmNoaW5nLiBhbGwgYXZhaWxhYmxlIG9wdGlvbnMgYXJlIExvY2F0aW9ucywgU3RvcHMsIFJvdXRlcywgVmVoaWNsZVJlbnRhbFN0YXRpb25zLCBGdXR1cmVSb3V0ZXMsIE1hcFBvc2l0aW9uIGFuZCBDdXJyZW50UG9zaXRpb24uIExlYXZlIGVtcHR5IHRvIHNlYXJjaCBhbGwgdGFyZ2V0cy5cbiAqIGNvbnN0IHNvdXJjZXMgPSBbJ0Zhdm91cml0ZScsICdIaXN0b3J5JywgJ0RhdGFzb3VyY2UnXSAvLyBEZWZpbmVzIHdoZXJlIHlvdSBhcmUgc2VhcmNoaW5nLiBhbGwgYXZhaWxhYmxlIGFyZTogRmF2b3VyaXRlLCBIaXN0b3J5IChwcmV2aW91c2x5IHNlYXJjaGVkIHNlYXJjaGVzKSwgYW5kIERhdGFzb3VyY2UuIExlYXZlIGVtcHR5IHRvIHVzZSBhbGwgc291cmNlcy5cbiAqIDxEVEF1dG9zdWdnZXN0UGFuZWxcbiAqICAgIGFwcEVsZW1lbnQ9e2FwcEVsZW1lbnR9IC8vIFJlcXVpcmVkLiBSb290IGVsZW1lbnQncyBpZC4gTmVlZGVkIGZvciByZWFjdC1tb2RhbCBjb21wb25lbnQuXG4gKiAgICBvcmlnaW49e29yaWdpbn0gLy8gU2VsZWN0ZWQgb3JpZ2luIHBvaW50XG4gKiAgICBkZXN0aW5hdGlvbj17ZGVzdGluYXRpb259IC8vIFNlbGVjdGVkIGRlc3RpbmF0aW9uIHBvaW50XG4gKiAgICBvcmlnaW5QbGFjZUhvbGRlcj17J0dpdmUgb3JpZ2luJ30gLy8gT3B0aW9uYWwgR2l2ZSBzdHJpbmcgc2hvd24gaW5pdGlhbGx5IGluc2lkZSBvcmlnaW4gc2VhcmNoIGZpZWxkXG4gKiAgICBkZXN0aW5hdGlvblBsYWNlSG9sZGVyPXsnR2l2ZSBkZXN0aW5hdGlvbid9IC8vIE9wdGlvbmFsIEdpdmUgc3RyaW5nIHNob3duIGluaXRhbGx5IGluc2lkZSBkZXN0aW5hdGlvbiBzZWFyY2ggZmllbGRcbiAqICAgIGluaXRpYWxWaWFQb2ludHM9e1tdfSAvLyBPcHRpb25hbC4gIElmIHNob3dWaWFwb2ludENvbnRyb2wgaXMgc2V0IHRvIHRydWUsIHBhc3MgaW5pdGlhbCB2aWEgcG9pbnRzIHRvIHRoZSBwYW5lbC4gQ3VycmVudGx5IG5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZ2l2ZW4uXG4gKiAgICB1cGRhdGVWaWFQb2ludHM9eygpID0+IHJldHVybiBbXX0gLy8gT3B0aW9uYWwuIElmIHNob3dWaWFwb2ludENvbnRyb2wgaXMgc2V0IHRvIHRydWUsIGRlZmluZSBob3cgdG8gdXBkYXRlIHlvdXIgdmlhIHBvaW50IGxpc3Qgd2l0aCB0aGlzIGZ1bmN0aW9uLiBDdXJyZW5sdHkgbm8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBnaXZlbi5cbiAqICAgIHN3YXBPcmRlcj17KCkgPT4gcmV0dXJuIG51bGx9IC8vIE9wdGlvbmFsLiBJZiBzaG93U3dhcENvbnRyb2wgaXMgc2V0IHRvIHRydWUsIGRlZmluZSBob3cgdG8gc3dhcCBvcmRlciBvZiB5b3VyIHBvaW50cyAob3JpZ2luLCBkZXN0aW5hdGlvbiwgdmlhcG9pbnRzKS4gQ3VycmVudGx5IG5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZ2l2ZW4uXG4gKiAgICBzZWFyY2hDb250ZXh0PXtzZWFyY2hDb250ZXh0fVxuICogICAgZ2V0QXV0b1N1Z2dlc3RJY29ucz17Z2V0QXV0b1N1Z2dlc3RJY29uc31cbiAqICAgIG9uU2VsZWN0PXt0aGlzLm9uU2VsZWN0fVxuICogICAgb25DbGVhcj17dGhpcy5vbkNsZWFyfVxuICogICAgbGFuZz1cImZpXCIgLy8gRGVmaW5lIGxhbmd1YWdlIGZpIHN2IG9yIGVuLlxuICogICAgYWRkQW5hbHl0aWNzRXZlbnQ9e251bGx9IC8vIE9wdGlvbmFsLiB5b3UgY2FuIHJlY29yZCBhbiBhbmFseXRpY3MgZXZlbnQgaWYgeW91IHdpc2guIGlmIHBhc3NlZCwgY29tcG9uZW50IHdpbGwgcGFzcyBhbiBjYXRlZ29yeSwgYWN0aW9uLCBuYW1lIHBhcmFtZXRlcnMgdG8gYWRkQW5hbHl0aWNzRXZlbnRcbiAqICAgIGRpc2FibGVBdXRvRm9jdXM9e2ZhbHNlfSAvLyBPcHRpb25hbC4gdXNlIHRoaXMgdG8gZGlzYWJsZSBhdXRvZm9jdXMgY29tcGxldGVseSBmcm9tIERUQXV0b3N1Z2dlc3RQYW5lbFxuICogICAgc291cmNlcz17c291cmNlc31cbiAqICAgIHRhcmdldHM9e3RhcmdldHN9XG4gKiAgICBpc01vYmlsZSAgLy8gT3B0aW9uYWwuIERlZmF1bHRzIHRvIGZhbHNlLiBXaGV0aGVyIHRvIHVzZSBtb2JpbGUgc2VhcmNoLlxuICogICAgb3JpZ2luTW9iaWxlTGFiZWw9XCJPcmlnaW4gbGFiZWxcIiAvLyBPcHRpb25hbC4gQ3VzdG9tIGxhYmVsIHRleHQgZm9yIG9yaWdpbiBmaWVsZCBvbiBtb2JpbGUuXG4gKiAgICBkZXN0aW5hdGlvbk1vYmlsZUxhYmVsPVwiRGVzdGluYXRpb24gbGFiZWxcIiAvLyBPcHRpb25hbC4gQ3VzdG9tIGxhYmVsIHRleHQgZm9yIGRlc3RpbmF0aW9uIGZpZWxkIG9uIG1vYmlsZS5cbiAqICAgIGhhbmRsZUZvY3VzQ2hhbmdlPXsoKSA9PiB7fX0gLy8gT3B0aW9uYWwuIElmIGRlZmluZWQgb3ZlcnJpZGVzIGRlZmF1bHQgb25Gb2N1c0NoYW5nZSBiZWhhdmlvdXJcbiAqICAgIHNob3dTd2FwQ29udHJvbD17ZmFsc2V9IC8vIE9wdGlvbmFsLlxuICogICAgc2hvd1ZpYXBvaW50Q29udHJvbD17ZmFsc2V9IC8vIE9wdGlvbmFsLlxuICovXG5cbmNvbnN0IGxvY2F0aW9uU2hhcGUgPSBQcm9wVHlwZXMuc2hhcGUoe1xuICBhZGRyZXNzOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBsYXQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIGxvbjogUHJvcFR5cGVzLm51bWJlcixcbiAgbG9jYXRpb25TbGFjazogUHJvcFR5cGVzLm51bWJlcixcbn0pO1xuXG5jbGFzcyBEVEF1dG9zdWdnZXN0UGFuZWwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGFwcEVsZW1lbnQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICBvcmlnaW46IGxvY2F0aW9uU2hhcGUsXG4gICAgZGVzdGluYXRpb246IGxvY2F0aW9uU2hhcGUsXG4gICAgb3JpZ2luUGxhY2VIb2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZGVzdGluYXRpb25QbGFjZUhvbGRlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB2aWFQb2ludHM6IFByb3BUeXBlcy5hcnJheU9mKGxvY2F0aW9uU2hhcGUpLFxuICAgIHVwZGF0ZVZpYVBvaW50czogUHJvcFR5cGVzLmZ1bmMsXG4gICAgaGFuZGxlVmlhUG9pbnRMb2NhdGlvblNlbGVjdGVkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzd2FwT3JkZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIHNlYXJjaFBhbmVsVGV4dDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBzZWFyY2hDb250ZXh0OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgVVJMX1BFTElBUzogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB9KS5pc1JlcXVpcmVkLFxuICAgIG9uU2VsZWN0OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIG9uQ2xlYXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIGFkZEFuYWx5dGljc0V2ZW50OiBQcm9wVHlwZXMuZnVuYyxcbiAgICBsYW5nOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgZGlzYWJsZUF1dG9Gb2N1czogUHJvcFR5cGVzLmJvb2wsXG4gICAgc291cmNlczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gICAgdGFyZ2V0czogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gICAgZmlsdGVyUmVzdWx0czogUHJvcFR5cGVzLmZ1bmMsXG4gICAgaXNNb2JpbGU6IFByb3BUeXBlcy5ib29sLFxuICAgIG9yaWdpbk1vYmlsZUxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGRlc3RpbmF0aW9uTW9iaWxlTGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgcmVmUG9pbnQ6IGxvY2F0aW9uU2hhcGUsXG4gICAgbW9kZVNldDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjb2xvcnM6IFByb3BUeXBlcy5vYmplY3RPZihQcm9wVHlwZXMuc3RyaW5nKSxcbiAgICBnZXRBdXRvU3VnZ2VzdEljb25zOiBQcm9wVHlwZXMub2JqZWN0T2YoUHJvcFR5cGVzLmZ1bmMpLFxuICAgIGZvbnRXZWlnaHRzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgbWVkaXVtOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIH0pLFxuICAgIHNob3dTY3JvbGw6IFByb3BUeXBlcy5ib29sLFxuICAgIG9uRm9jdXNDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAgIGlzRW1iZWRkZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIHNob3dTd2FwQ29udHJvbDogUHJvcFR5cGVzLmJvb2wsXG4gICAgc2hvd1ZpYXBvaW50Q29udHJvbDogUHJvcFR5cGVzLmJvb2wsXG4gICAgc2hvd1NsYWNrQ29udHJvbDogUHJvcFR5cGVzLmJvb2wsXG4gICAgdDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgfTtcblxuICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIG9yaWdpbjogdW5kZWZpbmVkLFxuICAgIGRlc3RpbmF0aW9uOiB1bmRlZmluZWQsXG4gICAgdmlhUG9pbnRzOiBbXSxcbiAgICBvcmlnaW5QbGFjZUhvbGRlcjogJ2dpdmUtb3JpZ2luJyxcbiAgICBkZXN0aW5hdGlvblBsYWNlSG9sZGVyOiAnZ2l2ZS1kZXN0aW5hdGlvbicsXG4gICAgc3dhcE9yZGVyOiB1bmRlZmluZWQsXG4gICAgdXBkYXRlVmlhUG9pbnRzOiAoKSA9PiB7fSxcbiAgICBzZWFyY2hQYW5lbFRleHQ6IHVuZGVmaW5lZCxcbiAgICBzb3VyY2VzOiBbXSxcbiAgICB0YXJnZXRzOiBbXSxcbiAgICBmaWx0ZXJSZXN1bHRzOiB1bmRlZmluZWQsXG4gICAgb25DbGVhcjogdW5kZWZpbmVkLFxuICAgIGdldEF1dG9TdWdnZXN0SWNvbnM6IHVuZGVmaW5lZCxcbiAgICByZWZQb2ludDogdW5kZWZpbmVkLFxuICAgIGFkZEFuYWx5dGljc0V2ZW50OiB1bmRlZmluZWQsXG4gICAgZGlzYWJsZUF1dG9Gb2N1czogZmFsc2UsXG4gICAgaXNNb2JpbGU6IGZhbHNlLFxuICAgIGhhbmRsZVZpYVBvaW50TG9jYXRpb25TZWxlY3RlZDogdW5kZWZpbmVkLFxuICAgIG9yaWdpbk1vYmlsZUxhYmVsOiBudWxsLFxuICAgIGRlc3RpbmF0aW9uTW9iaWxlTGFiZWw6IG51bGwsXG4gICAgbW9kZVNldDogdW5kZWZpbmVkLFxuICAgIGNvbG9yczogZGVmYXVsdENvbG9ycyxcbiAgICBmb250V2VpZ2h0czoge1xuICAgICAgbWVkaXVtOiA1MDAsXG4gICAgfSxcbiAgICBzaG93U2Nyb2xsOiBmYWxzZSxcbiAgICBvbkZvY3VzQ2hhbmdlOiB1bmRlZmluZWQsXG4gICAgaXNFbWJlZGRlZDogZmFsc2UsXG4gICAgc2hvd1N3YXBDb250cm9sOiBmYWxzZSxcbiAgICBzaG93VmlhcG9pbnRDb250cm9sOiBmYWxzZSxcbiAgICBzaG93U2xhY2tDb250cm9sOiBmYWxzZSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgYWN0aXZlU2xhY2tJbnB1dHM6IFtdLFxuICAgICAgcmVmczogW10sXG4gICAgfTtcbiAgfVxuXG4gIHN0b3JlUmVmZXJlbmNlID0gcmVmID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHByZXZTdGF0ZSA9PiAoeyByZWZzOiBbLi4ucHJldlN0YXRlLnJlZnMsIHJlZl0gfSkpO1xuICB9O1xuXG4gIGhhbmRsZUZvY3VzQ2hhbmdlID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVzdGluYXRpb24gfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKCFkZXN0aW5hdGlvbiB8fCAhZGVzdGluYXRpb24ubGF0KSB7XG4gICAgICB0aGlzLnN0YXRlLnJlZnNbMV0uZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlVmlhUG9pbnRzID0gdmlhUG9pbnRzID0+IHtcbiAgICBpZiAodmlhUG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5wcm9wcy51cGRhdGVWaWFQb2ludHMoW10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByb3BzLnVwZGF0ZVZpYVBvaW50cyh2aWFQb2ludHMuZmlsdGVyKHZwID0+ICFpc1ZpYVBvaW50RW1wdHkodnApKSk7XG4gIH07XG5cbiAgaGFuZGxlVG9nZ2xlVmlhUG9pbnRTbGFja0NsaWNrID0gdmlhUG9pbnRJbmRleCA9PiB7XG4gICAgY29uc3QgeyBhY3RpdmVTbGFja0lucHV0cyB9ID0gdGhpcy5zdGF0ZTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGFjdGl2ZVNsYWNrSW5wdXRzOiBhY3RpdmVTbGFja0lucHV0cy5pbmNsdWRlcyh2aWFQb2ludEluZGV4KVxuICAgICAgICA/IHVwZGF0ZVZpYVBvaW50U2xhY2soYWN0aXZlU2xhY2tJbnB1dHMsIHZpYVBvaW50SW5kZXgpXG4gICAgICAgIDogYWN0aXZlU2xhY2tJbnB1dHMuY29uY2F0KFt2aWFQb2ludEluZGV4XSksXG4gICAgfSk7XG4gIH07XG5cbiAgaGFuZGxlVmlhUG9pbnRTbGFja1RpbWVTZWxlY3RlZCA9IChzbGFja1RpbWVJblNlY29uZHMsIGkpID0+IHtcbiAgICBpZiAodGhpcy5wcm9wcy5hZGRBbmFseXRpY3NFdmVudCkge1xuICAgICAgdGhpcy5wcm9wcy5hZGRBbmFseXRpY3NFdmVudCh7XG4gICAgICAgIGFjdGlvbjogJ0VkaXRWaWFQb2ludFN0b3BEdXJhdGlvbicsXG4gICAgICAgIGNhdGVnb3J5OiAnSXRpbmVyYXJ5U2V0dGluZ3MnLFxuICAgICAgICBuYW1lOiBzbGFja1RpbWVJblNlY29uZHMgLyA2MCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IHZpYVBvaW50cyB9ID0gdGhpcy5wcm9wcztcbiAgICB2aWFQb2ludHNbaV0ubG9jYXRpb25TbGFjayA9IE51bWJlci5wYXJzZUludChzbGFja1RpbWVJblNlY29uZHMsIDEwKTtcbiAgICB0aGlzLnVwZGF0ZVZpYVBvaW50cyh2aWFQb2ludHMpO1xuICB9O1xuXG4gIGhhbmRsZVZpYVBvaW50TG9jYXRpb25TZWxlY3RlZCA9ICh2aWFQb2ludExvY2F0aW9uLCBpKSA9PiB7XG4gICAgdGhpcy5wcm9wcy5oYW5kbGVWaWFQb2ludExvY2F0aW9uU2VsZWN0ZWQodmlhUG9pbnRMb2NhdGlvbiwgaSk7XG4gIH07XG5cbiAgaGFuZGxlUmVtb3ZlVmlhUG9pbnRDbGljayA9IHZpYVBvaW50SW5kZXggPT4ge1xuICAgIGlmICh0aGlzLnByb3BzLmFkZEFuYWx5dGljc0V2ZW50KSB7XG4gICAgICB0aGlzLnByb3BzLmFkZEFuYWx5dGljc0V2ZW50KHtcbiAgICAgICAgYWN0aW9uOiAnUmVtb3ZlSm91cm5leVZpYVBvaW50JyxcbiAgICAgICAgY2F0ZWdvcnk6ICdJdGluZXJhcnlTZXR0aW5ncycsXG4gICAgICAgIG5hbWU6IG51bGwsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBhY3RpdmVTbGFja0lucHV0cyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IHZpYVBvaW50cyB9ID0gdGhpcy5wcm9wcztcbiAgICB2aWFQb2ludHMuc3BsaWNlKHZpYVBvaW50SW5kZXgsIDEpO1xuICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICB7XG4gICAgICAgIGFjdGl2ZVNsYWNrSW5wdXRzOiB1cGRhdGVWaWFQb2ludFNsYWNrKFxuICAgICAgICAgIGFjdGl2ZVNsYWNrSW5wdXRzLFxuICAgICAgICAgIHZpYVBvaW50SW5kZXgsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICAoKSA9PiB0aGlzLnVwZGF0ZVZpYVBvaW50cyh2aWFQb2ludHMpLFxuICAgICk7XG4gIH07XG5cbiAgaGFuZGxlQWRkVmlhUG9pbnRDbGljayA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5wcm9wcy5hZGRBbmFseXRpY3NFdmVudCkge1xuICAgICAgdGhpcy5wcm9wcy5hZGRBbmFseXRpY3NFdmVudCh7XG4gICAgICAgIGFjdGlvbjogJ0FkZEpvdXJuZXlWaWFQb2ludCcsXG4gICAgICAgIGNhdGVnb3J5OiAnSXRpbmVyYXJ5U2V0dGluZ3MnLFxuICAgICAgICBuYW1lOiAnUXVpY2tTZXR0aW5nc0J1dHRvbicsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyB2aWFQb2ludHMgfSA9IHRoaXMucHJvcHM7XG4gICAgdmlhUG9pbnRzLnB1c2goZ2V0RW1wdHlWaWFQb2ludFBsYWNlSG9sZGVyKCkpO1xuICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzdGF0ZSBzbyB0aGF0IHBsYWNlSG9sZGVyIHdpbGwgc2hvdyB1cCBpbiBwYW5lbC5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYWNjZXNzLXN0YXRlLWluLXNldHN0YXRlXG4gICAgdGhpcy5zZXRTdGF0ZSh0aGlzLnN0YXRlKTtcbiAgfTtcblxuICBoYW5kbGVTd2FwT3JkZXJDbGljayA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5wcm9wcy5hZGRBbmFseXRpY3NFdmVudCkge1xuICAgICAgdGhpcy5wcm9wcy5hZGRBbmFseXRpY3NFdmVudCh7XG4gICAgICAgIGFjdGlvbjogJ1N3aXRjaEpvdXJuZXlTdGFydEFuZEVuZFBvaW50T3JkZXInLFxuICAgICAgICBjYXRlZ29yeTogJ0l0aW5lcmFyeVNldHRpbmdzJyxcbiAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IHZpYVBvaW50cyB9ID0gdGhpcy5wcm9wcztcbiAgICB2aWFQb2ludHMucmV2ZXJzZSgpO1xuICAgIHRoaXMucHJvcHMuc3dhcE9yZGVyKCk7XG4gIH07XG5cbiAgZ2V0U2xhY2tEaXNwbGF5ID0gc2xhY2tJblNlY29uZHMgPT5cbiAgICBgJHtzbGFja0luU2Vjb25kcyAvIDYwfSAke3RoaXMucHJvcHMudCgnbWludXRlLXNob3J0Jywge1xuICAgICAgbG5nOiB0aGlzLnByb3BzLmxhbmcsXG4gICAgfSl9YDtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgb3JpZ2luLFxuICAgICAgc2VhcmNoUGFuZWxUZXh0LFxuICAgICAgc2VhcmNoQ29udGV4dCxcbiAgICAgIGRpc2FibGVBdXRvRm9jdXMsXG4gICAgICB2aWFQb2ludHMsXG4gICAgICBvcmlnaW5Nb2JpbGVMYWJlbCxcbiAgICAgIGRlc3RpbmF0aW9uTW9iaWxlTGFiZWwsXG4gICAgICBmb250V2VpZ2h0cyxcbiAgICAgIG9uRm9jdXNDaGFuZ2UsXG4gICAgICBzaG93U3dhcENvbnRyb2wsXG4gICAgICBzaG93VmlhcG9pbnRDb250cm9sLFxuICAgICAgdCxcbiAgICAgIGxhbmc6IGxuZyxcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IHByaW1hcnkgfSA9IHRoaXMucHJvcHMuY29sb3JzO1xuICAgIGNvbnN0IHsgYWN0aXZlU2xhY2tJbnB1dHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3Qgc2xhY2tUaW1lID0gZ2V0U2xhY2tUaW1lT3B0aW9ucyh0KTtcbiAgICBjb25zdCBkZWZhdWx0U2xhY2tUaW1lVmFsdWUgPSAwO1xuICAgIGNvbnN0IGdldFZpYVBvaW50U2xhY2tUaW1lT3JEZWZhdWx0ID0gKFxuICAgICAgdmlhUG9pbnQsXG4gICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0U2xhY2tUaW1lVmFsdWUsXG4gICAgKSA9PiAodmlhUG9pbnQgJiYgdmlhUG9pbnQubG9jYXRpb25TbGFjaykgfHwgZGVmYXVsdFZhbHVlO1xuICAgIGNvbnN0IGlzVmlhUG9pbnRTbGFja1RpbWVJbnB1dEFjdGl2ZSA9IGluZGV4ID0+XG4gICAgICBhY3RpdmVTbGFja0lucHV0cy5pbmNsdWRlcyhpbmRleCk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjeChbXG4gICAgICAgICAgc3R5bGVzWydhdXRvc3VnZ2VzdC1wYW5lbCddLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNtYWxsOiB0aGlzLnByb3BzLmlzTW9iaWxlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICctLWNvbG9yJzogcHJpbWFyeSxcbiAgICAgICAgICAnLS1mb250LXdlaWdodC1tZWRpdW0nOiBmb250V2VpZ2h0cy5tZWRpdW0sXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHsnICd9XG4gICAgICAgIHtzZWFyY2hQYW5lbFRleHQgPyAoXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9e3N0eWxlc1snYXV0b3N1Z2dlc3Qtc2VhcmNocGFuZWwtdGV4dCddfT5cbiAgICAgICAgICAgICAgeycgJ31cbiAgICAgICAgICAgICAge3NlYXJjaFBhbmVsVGV4dH1cbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzWydvcmlnaW4taW5wdXQtY29udGFpbmVyJ119PlxuICAgICAgICAgIDxEVEF1dG9TdWdnZXN0XG4gICAgICAgICAgICBhcHBFbGVtZW50PXt0aGlzLnByb3BzLmFwcEVsZW1lbnR9XG4gICAgICAgICAgICBpY29uPVwib3JpZ2luRWxsaXBzZVwiXG4gICAgICAgICAgICBpZD1cIm9yaWdpblwiXG4gICAgICAgICAgICBhdXRvRm9jdXM9e1xuICAgICAgICAgICAgICBkaXNhYmxlQXV0b0ZvY3VzID09PSB0cnVlXG4gICAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICAgIDogIXRoaXMucHJvcHMuaXNNb2JpbGUgJiYgIW9yaWdpbj8ubGF0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdG9yZVJlZj17dGhpcy5zdG9yZVJlZmVyZW5jZX1cbiAgICAgICAgICAgIHJlZlBvaW50PXt0aGlzLnByb3BzLnJlZlBvaW50fVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtnZXRMb2NhdGlvblR5cGUob3JpZ2luKX1cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPXt0aGlzLnByb3BzLm9yaWdpblBsYWNlSG9sZGVyfVxuICAgICAgICAgICAgdmFsdWU9e3ZhbHVlKG9yaWdpbil9XG4gICAgICAgICAgICBzZWFyY2hDb250ZXh0PXtzZWFyY2hDb250ZXh0fVxuICAgICAgICAgICAgZ2V0QXV0b1N1Z2dlc3RJY29ucz17dGhpcy5wcm9wcy5nZXRBdXRvU3VnZ2VzdEljb25zfVxuICAgICAgICAgICAgb25TZWxlY3Q9e3RoaXMucHJvcHMub25TZWxlY3R9XG4gICAgICAgICAgICBvbkNsZWFyPXt0aGlzLnByb3BzLm9uQ2xlYXJ9XG4gICAgICAgICAgICBmb2N1c0NoYW5nZT17b25Gb2N1c0NoYW5nZSB8fCB0aGlzLmhhbmRsZUZvY3VzQ2hhbmdlfVxuICAgICAgICAgICAgbGFuZz17dGhpcy5wcm9wcy5sYW5nfVxuICAgICAgICAgICAgc291cmNlcz17dGhpcy5wcm9wcy5zb3VyY2VzfVxuICAgICAgICAgICAgdGFyZ2V0cz17dGhpcy5wcm9wcy50YXJnZXRzfVxuICAgICAgICAgICAgZmlsdGVyUmVzdWx0cz17dGhpcy5wcm9wcy5maWx0ZXJSZXN1bHRzfVxuICAgICAgICAgICAgaXNNb2JpbGU9e3RoaXMucHJvcHMuaXNNb2JpbGV9XG4gICAgICAgICAgICBjb2xvcnM9e3RoaXMucHJvcHMuY29sb3JzfVxuICAgICAgICAgICAgbW9iaWxlTGFiZWw9e29yaWdpbk1vYmlsZUxhYmVsfVxuICAgICAgICAgICAgZm9udFdlaWdodHM9e3RoaXMucHJvcHMuZm9udFdlaWdodHN9XG4gICAgICAgICAgICBtb2RlU2V0PXt0aGlzLnByb3BzLm1vZGVTZXR9XG4gICAgICAgICAgICBzaG93U2Nyb2xsPXt0aGlzLnByb3BzLnNob3dTY3JvbGx9XG4gICAgICAgICAgICBpc0VtYmVkZGVkPXt0aGlzLnByb3BzLmlzRW1iZWRkZWR9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7KHNob3dTd2FwQ29udHJvbCB8fCBzaG93VmlhcG9pbnRDb250cm9sKSAmJiAoXG4gICAgICAgICAgICA8SXRpbmVyYXJ5U2VhcmNoQ29udHJvbFxuICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5vcHBvc2l0ZX1cbiAgICAgICAgICAgICAgZW5hYmxlZD17c2hvd1N3YXBDb250cm9sfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLmhhbmRsZVN3YXBPcmRlckNsaWNrKCl9XG4gICAgICAgICAgICAgIG9uS2V5UHJlc3M9e2UgPT5cbiAgICAgICAgICAgICAgICBpc0tleWJvYXJkU2VsZWN0aW9uRXZlbnQoZSkgJiYgdGhpcy5oYW5kbGVTd2FwT3JkZXJDbGljaygpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD17dCgnc3dhcC1vcmRlci1idXR0b24tbGFiZWwnLCB7IGxuZyB9KX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEljb24gaW1nPVwib3Bwb3NpdGVcIiBjb2xvcj17cHJpbWFyeX0gLz5cbiAgICAgICAgICAgIDwvSXRpbmVyYXJ5U2VhcmNoQ29udHJvbD5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAge3ZpYVBvaW50cy5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbJ3JlY3RhbmdsZS1jb250YWluZXInXX0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnJlY3RhbmdsZX0gLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAgPFJlYWN0U29ydGFibGVcbiAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlc1sndmlhcG9pbnRzLWNvbnRhaW5lciddfVxuICAgICAgICAgIGxpc3Q9e3ZpYVBvaW50c31cbiAgICAgICAgICBoYW5kbGU9e2AuJHtzdHlsZXNbJ3ZpYXBvaW50LWJlZm9yZSddfWB9XG4gICAgICAgICAgYW5pbWF0aW9uPXsyMDB9XG4gICAgICAgICAgZGlzYWJsZWQ9e3ZpYVBvaW50cy5sZW5ndGggPD0gMX1cbiAgICAgICAgICBzZXRMaXN0PXtpdGVtcyA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdWaWFQb2ludHMgPSBpdGVtcy5maWx0ZXIodnAgPT4gIWlzVmlhUG9pbnRFbXB0eSh2cCkpO1xuICAgICAgICAgICAgaWYgKG5ld1ZpYVBvaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvcHMudXBkYXRlVmlhUG9pbnRzKG5ld1ZpYVBvaW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHt2aWFQb2ludHMubWFwKChvLCBpKSA9PiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goc3R5bGVzWyd2aWFwb2ludC1jb250YWluZXInXSl9XG4gICAgICAgICAgICAgIGtleT17YHZpYXBvaW50LSR7aX1gfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbJ2xpZ2h0LWdyYXktYmFja2dyb3VuZCddfT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnJvd30+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzWyd2aWFwb2ludC1iZWZvcmUnXX1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3ZpYVBvaW50cy5sZW5ndGggPiAxID8geyBjdXJzb3I6ICdtb3ZlJyB9IDoge319XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt2aWFQb2ludHMubGVuZ3RoID4gMSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPEljb24gaW1nPVwiZWxsaXBzaXNcIiByb3RhdGU9ezkwfSBjb2xvcj17cHJpbWFyeX0gLz5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KFxuICAgICAgICAgICAgICAgICAgICAgIGAke3N0eWxlc1sndmlhcG9pbnQtaW5wdXQtY29udGFpbmVyJ119ICR7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXNbYHZpYXBvaW50LSR7aSArIDF9YF1cbiAgICAgICAgICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPERUQXV0b1N1Z2dlc3RcbiAgICAgICAgICAgICAgICAgICAgICBhcHBFbGVtZW50PXt0aGlzLnByb3BzLmFwcEVsZW1lbnR9XG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj1cIm1hcE1hcmtlclwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ2aWEtcG9pbnRcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD17dCgndmlhLXBvaW50LWluZGV4Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGkgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG5nLFxuICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgIGF1dG9Gb2N1cz17XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQXV0b0ZvY3VzID09PSB0cnVlID8gZmFsc2UgOiAhdGhpcy5wcm9wcy5pc01vYmlsZVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInZpYS1wb2ludFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidmlhcG9pbnRcIlxuICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaENvbnRleHQ9e3NlYXJjaENvbnRleHR9XG4gICAgICAgICAgICAgICAgICAgICAgcmVmUG9pbnQ9e3RoaXMucHJvcHMucmVmUG9pbnR9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9eyhvICYmIG8uYWRkcmVzcykgfHwgJyd9XG4gICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Q9e3RoaXMucHJvcHMub25TZWxlY3R9XG4gICAgICAgICAgICAgICAgICAgICAgb25DbGVhcj17dGhpcy5wcm9wcy5vbkNsZWFyfVxuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVZpYVBvaW50cz17aXRlbSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVWaWFQb2ludExvY2F0aW9uU2VsZWN0ZWQoaXRlbSwgaSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgbGFuZz17dGhpcy5wcm9wcy5sYW5nfVxuICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9e3RoaXMucHJvcHMuc291cmNlc31cbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzPXt0aGlzLnByb3BzLnRhcmdldHN9XG4gICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUmVzdWx0cz17dGhpcy5wcm9wcy5maWx0ZXJSZXN1bHRzfVxuICAgICAgICAgICAgICAgICAgICAgIGdldEF1dG9TdWdnZXN0SWNvbnM9e3RoaXMucHJvcHMuZ2V0QXV0b1N1Z2dlc3RJY29uc31cbiAgICAgICAgICAgICAgICAgICAgICBpc01vYmlsZT17dGhpcy5wcm9wcy5pc01vYmlsZX1cbiAgICAgICAgICAgICAgICAgICAgICBmb250V2VpZ2h0cz17dGhpcy5wcm9wcy5mb250V2VpZ2h0c31cbiAgICAgICAgICAgICAgICAgICAgICBtb2RlU2V0PXt0aGlzLnByb3BzLm1vZGVTZXR9XG4gICAgICAgICAgICAgICAgICAgICAgY29sb3JzPXt0aGlzLnByb3BzLmNvbG9yc31cbiAgICAgICAgICAgICAgICAgICAgICBzaG93U2Nyb2xsPXt0aGlzLnByb3BzLnNob3dTY3JvbGx9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnNob3dTbGFja0NvbnRyb2wgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8SXRpbmVyYXJ5U2VhcmNoQ29udHJvbFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzWydhZGQtdmlhLXBvaW50LXNsYWNrJ119XG4gICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZD17dGhpcy5wcm9wcy5zaG93VmlhcG9pbnRDb250cm9sfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMuaGFuZGxlVG9nZ2xlVmlhUG9pbnRTbGFja0NsaWNrKGkpfVxuICAgICAgICAgICAgICAgICAgICAgIG9uS2V5UHJlc3M9e2UgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzS2V5Ym9hcmRTZWxlY3Rpb25FdmVudChlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUb2dnbGVWaWFQb2ludFNsYWNrQ2xpY2soaSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17dChcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVmlhUG9pbnRTbGFja1RpbWVJbnB1dEFjdGl2ZShpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdhZGQtdmlhLWR1cmF0aW9uLWJ1dHRvbi1sYWJlbC1vcGVuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdhZGQtdmlhLWR1cmF0aW9uLWJ1dHRvbi1sYWJlbC1jbG9zZScsXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGluZGV4OiBpICsgMSwgbG5nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICB3aWRlXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8SWNvbiBpbWc9XCJ0aW1lXCIgY29sb3I9e3ByaW1hcnl9IC8+XG4gICAgICAgICAgICAgICAgICAgIDwvSXRpbmVyYXJ5U2VhcmNoQ29udHJvbD5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgeyFpc1ZpYVBvaW50U2xhY2tUaW1lSW5wdXRBY3RpdmUoaSkgJiZcbiAgICAgICAgICAgICAgICAgIHZpYVBvaW50c1tpXSAmJlxuICAgICAgICAgICAgICAgICAgdmlhUG9pbnRzW2ldLmxvY2F0aW9uU2xhY2sgPiAwICYmIChcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXNbJ3ZpYXBvaW50LXNsYWNrLXRpbWUnXX0+e2Ake3QoXG4gICAgICAgICAgICAgICAgICAgICAgJ3ZpYXBvaW50LXNsYWNrLWFtb3VudCcsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG5nLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICl9OiAke3RoaXMuZ2V0U2xhY2tEaXNwbGF5KFxuICAgICAgICAgICAgICAgICAgICAgIHZpYVBvaW50c1tpXS5sb2NhdGlvblNsYWNrLFxuICAgICAgICAgICAgICAgICAgICApfWB9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KHN0eWxlc1snaW5wdXQtdmlhcG9pbnQtc2xhY2stY29udGFpbmVyJ10sIHtcbiAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VkOiAhaXNWaWFQb2ludFNsYWNrVGltZUlucHV0QWN0aXZlKGkpLFxuICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1snc2VsZWN0LXdyYXBwZXInXX0+XG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBpZD17YHZpYXBvaW50LXNsYWNrLSR7aX1gfVxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXt0KCd2aWFwb2ludC1zbGFjay1hbW91bnQnLCB7IGxuZyB9KX1cbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtzbGFja1RpbWV9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2dldFZpYVBvaW50U2xhY2tUaW1lT3JEZWZhdWx0KHZpYVBvaW50c1tpXSl9XG4gICAgICAgICAgICAgICAgICAgICAgdmlhUG9pbnRJbmRleD17aX1cbiAgICAgICAgICAgICAgICAgICAgICBpY29uPXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7c3R5bGVzWydjb21ib2JveC1pY29uJ119ICR7c3R5bGVzWyd0aW1lLWlucHV0LWljb24nXX1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8SWNvbiBpbWc9XCJ0aW1lXCIgY29sb3I9e3ByaW1hcnl9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIG9uU2xhY2tUaW1lU2VsZWN0ZWQ9e3RoaXMuaGFuZGxlVmlhUG9pbnRTbGFja1RpbWVTZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPEl0aW5lcmFyeVNlYXJjaENvbnRyb2xcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlc1sncmVtb3ZlLXZpYS1wb2ludCddfVxuICAgICAgICAgICAgICAgIGVuYWJsZWQ9e3RoaXMucHJvcHMuc2hvd1ZpYXBvaW50Q29udHJvbH1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLmhhbmRsZVJlbW92ZVZpYVBvaW50Q2xpY2soaSl9XG4gICAgICAgICAgICAgICAgb25LZXlQcmVzcz17ZSA9PlxuICAgICAgICAgICAgICAgICAgaXNLZXlib2FyZFNlbGVjdGlvbkV2ZW50KGUpICYmXG4gICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJlbW92ZVZpYVBvaW50Q2xpY2soaSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17dCgncmVtb3ZlLXZpYS1idXR0b24tbGFiZWwnLCB7XG4gICAgICAgICAgICAgICAgICBpbmRleDogaSArIDEsXG4gICAgICAgICAgICAgICAgICBsbmcsXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8SWNvbiBpbWc9XCJ0cmFzaFwiIGNvbG9yPXtwcmltYXJ5fSAvPlxuICAgICAgICAgICAgICA8L0l0aW5lcmFyeVNlYXJjaENvbnRyb2w+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9SZWFjdFNvcnRhYmxlPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzWydkZXN0aW5hdGlvbi1pbnB1dC1jb250YWluZXInXX0+XG4gICAgICAgICAgPERUQXV0b1N1Z2dlc3RcbiAgICAgICAgICAgIGFwcEVsZW1lbnQ9e3RoaXMucHJvcHMuYXBwRWxlbWVudH1cbiAgICAgICAgICAgIGljb249XCJtYXBNYXJrZXJcIlxuICAgICAgICAgICAgaWQ9XCJkZXN0aW5hdGlvblwiXG4gICAgICAgICAgICBhdXRvRm9jdXM9e1xuICAgICAgICAgICAgICBkaXNhYmxlQXV0b0ZvY3VzID09PSB0cnVlXG4gICAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICAgIDogIXRoaXMucHJvcHMuaXNNb2JpbGUgJiYgIU51bWJlci5pc05hTihvcmlnaW4/LmxhdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JlUmVmPXt0aGlzLnN0b3JlUmVmZXJlbmNlfVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3RoaXMucHJvcHMuZGVzdGluYXRpb25QbGFjZUhvbGRlcn1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Z2V0TG9jYXRpb25UeXBlKHRoaXMucHJvcHMuZGVzdGluYXRpb24pfVxuICAgICAgICAgICAgZ2V0QXV0b1N1Z2dlc3RJY29ucz17dGhpcy5wcm9wcy5nZXRBdXRvU3VnZ2VzdEljb25zfVxuICAgICAgICAgICAgc2VhcmNoQ29udGV4dD17c2VhcmNoQ29udGV4dH1cbiAgICAgICAgICAgIG9uU2VsZWN0PXt0aGlzLnByb3BzLm9uU2VsZWN0fVxuICAgICAgICAgICAgb25DbGVhcj17dGhpcy5wcm9wcy5vbkNsZWFyfVxuICAgICAgICAgICAgcmVmUG9pbnQ9e3RoaXMucHJvcHMucmVmUG9pbnR9XG4gICAgICAgICAgICB2YWx1ZT17dmFsdWUodGhpcy5wcm9wcy5kZXN0aW5hdGlvbil9XG4gICAgICAgICAgICBsYW5nPXt0aGlzLnByb3BzLmxhbmd9XG4gICAgICAgICAgICBzb3VyY2VzPXt0aGlzLnByb3BzLnNvdXJjZXN9XG4gICAgICAgICAgICB0YXJnZXRzPXt0aGlzLnByb3BzLnRhcmdldHN9XG4gICAgICAgICAgICBmaWx0ZXJSZXN1bHRzPXt0aGlzLnByb3BzLmZpbHRlclJlc3VsdHN9XG4gICAgICAgICAgICBpc01vYmlsZT17dGhpcy5wcm9wcy5pc01vYmlsZX1cbiAgICAgICAgICAgIG1vYmlsZUxhYmVsPXtkZXN0aW5hdGlvbk1vYmlsZUxhYmVsfVxuICAgICAgICAgICAgZm9udFdlaWdodHM9e3RoaXMucHJvcHMuZm9udFdlaWdodHN9XG4gICAgICAgICAgICBtb2RlU2V0PXt0aGlzLnByb3BzLm1vZGVTZXR9XG4gICAgICAgICAgICBjb2xvcnM9e3RoaXMucHJvcHMuY29sb3JzfVxuICAgICAgICAgICAgc2hvd1Njcm9sbD17dGhpcy5wcm9wcy5zaG93U2Nyb2xsfVxuICAgICAgICAgICAgaXNFbWJlZGRlZD17dGhpcy5wcm9wcy5pc0VtYmVkZGVkfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgeyhzaG93U3dhcENvbnRyb2wgfHwgc2hvd1ZpYXBvaW50Q29udHJvbCkgJiYgKFxuICAgICAgICAgICAgPEl0aW5lcmFyeVNlYXJjaENvbnRyb2xcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeChzdHlsZXNbJ2FkZC12aWEtcG9pbnQnXSwgc3R5bGVzLm1vcmUsIHtcbiAgICAgICAgICAgICAgICBjb2xsYXBzZWQ6IHZpYVBvaW50cy5sZW5ndGggPiA0LFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgZW5hYmxlZD17c2hvd1ZpYXBvaW50Q29udHJvbCAmJiB2aWFQb2ludHMubGVuZ3RoID09PSAwfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLmhhbmRsZUFkZFZpYVBvaW50Q2xpY2soKX1cbiAgICAgICAgICAgICAgb25LZXlQcmVzcz17ZSA9PlxuICAgICAgICAgICAgICAgIGlzS2V5Ym9hcmRTZWxlY3Rpb25FdmVudChlKSAmJiB0aGlzLmhhbmRsZUFkZFZpYVBvaW50Q2xpY2soKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoJ2FkZC12aWEtYnV0dG9uLWxhYmVsJywgeyBsbmcgfSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxJY29uXG4gICAgICAgICAgICAgICAgaW1nPVwidmlhcG9pbnRcIlxuICAgICAgICAgICAgICAgIHdpZHRoPXsxLjI1fVxuICAgICAgICAgICAgICAgIGhlaWdodD17MS4zNzV9XG4gICAgICAgICAgICAgICAgY29sb3I9e3ByaW1hcnl9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L0l0aW5lcmFyeVNlYXJjaENvbnRyb2w+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmNvbnN0IERUQXV0b3N1Z2dlc3RQYW5lbFdpdGhUcmFuc2xhdGlvbiA9IHdpdGhUcmFuc2xhdGlvbigpKERUQXV0b3N1Z2dlc3RQYW5lbCk7XG5cbmV4cG9ydCBkZWZhdWx0IHByb3BzID0+IHtcbiAgcmV0dXJuIChcbiAgICA8STE4bmV4dFByb3ZpZGVyIGkxOG49e2kxOG59PlxuICAgICAgPERUQXV0b3N1Z2dlc3RQYW5lbFdpdGhUcmFuc2xhdGlvbiB7Li4ucHJvcHN9IC8+XG4gICAgPC9JMThuZXh0UHJvdmlkZXI+XG4gICk7XG59O1xuIl0sIm5hbWVzIjpbIm9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJTZWxlY3QiLCJ2YWx1ZSIsIm9wdGlvbnMiLCJvblNsYWNrVGltZVNlbGVjdGVkIiwidmlhUG9pbnRJbmRleCIsImlkIiwibGFiZWwiLCJpY29uIiwibGFiZWxJZCIsInNlbGVjdGVkSXRlbSIsImZpbmQiLCJvcHRpb24iLCJpc09wZW4iLCJnZXRUb2dnbGVCdXR0b25Qcm9wcyIsImdldE1lbnVQcm9wcyIsImdldEl0ZW1Qcm9wcyIsImdldExhYmVsUHJvcHMiLCJoaWdobGlnaHRlZEluZGV4IiwidXNlU2VsZWN0IiwiaXRlbXMiLCJpdGVtVG9TdHJpbmciLCJpdGVtIiwiZGlzcGxheU5hbWUiLCJvblNlbGVjdGVkSXRlbUNoYW5nZSIsIm5ld0l0ZW0iLCJSZWFjdCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJzdHlsZXMiLCJjb250YWluZXIiLCJPYmplY3QiLCJhc3NpZ24iLCJpbnB1dCIsImN4Iiwic3VnZ2VzdGlvbnNDb250YWluZXJPcGVuIiwibWFwIiwiaW5kZXgiLCJrZXkiLCJzdWdnZXN0aW9uIiwic3VnZ2VzdGlvbkhpZ2hsaWdodGVkIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsImZ1bmMiLCJhcnJheU9mIiwic2hhcGUiLCJzdHJpbmciLCJub2RlIiwidHJhbnNsYXRpb25zIiwiZGUiLCJ0cmFuc2xhdGlvbiIsImVuIiwiZmkiLCJwbCIsInN2IiwiaTE4biIsImNyZWF0ZUluc3RhbmNlIiwiZmFsbGJhY2tMbmciLCJyZXNvdXJjZXMiLCJkZWZhdWx0TlMiLCJyZWFjdCIsInVzZVN1c3BlbnNlIiwiaW5pdCIsImdldEVtcHR5VmlhUG9pbnRQbGFjZUhvbGRlciIsImlzVmlhUG9pbnRFbXB0eSIsInZpYVBvaW50IiwidW5kZWZpbmVkIiwiaXNFbXB0eSIsImtleXMiLCJsZW5ndGgiLCJpbmNsdWRlcyIsIkl0aW5lcmFyeVNlYXJjaENvbnRyb2wiLCJfcmVmIiwiY2hpbGRyZW4iLCJlbmFibGVkIiwib25DbGljayIsIm9uS2V5UHJlc3MiLCJ3aWRlIiwicmVzdCIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsInN0eWxlIiwicm9sZSIsInRhYkluZGV4IiwidXBkYXRlVmlhUG9pbnRTbGFjayIsImFjdGl2ZVZpYVBvaW50U2xhY2tzIiwidXBkYXRlZFZpYVBvaW50SW5kZXgiLCJ2aWFQb2ludFJlbW92ZWQiLCJmb3VuZEF0SW5kZXgiLCJpbmRleE9mIiwic3BsaWNlIiwiaXNLZXlib2FyZFNlbGVjdGlvbkV2ZW50IiwiZXZlbnQiLCJzcGFjZSIsImVudGVyIiwid2hpY2giLCJrZXlDb2RlIiwiY29uY2F0IiwicHJldmVudERlZmF1bHQiLCJsb2NhdGlvbiIsImFkZHJlc3MiLCJncHMiLCJyZWFkeSIsImdldExvY2F0aW9uVHlwZSIsImdldFNsYWNrVGltZU9wdGlvbnMiLCJ0IiwidGltZU9wdGlvbnMiLCJpIiwidmFsdWVJbk1pbnV0ZXMiLCJwdXNoIiwiYm9vbCIsImRlZmF1bHRQcm9wcyIsImxvY2F0aW9uU2hhcGUiLCJsYXQiLCJsb24iLCJsb2NhdGlvblNsYWNrIiwiRFRBdXRvc3VnZ2VzdFBhbmVsIiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eSIsInJlZiIsInNldFN0YXRlIiwicHJldlN0YXRlIiwicmVmcyIsImRlc3RpbmF0aW9uIiwic3RhdGUiLCJmb2N1cyIsInZpYVBvaW50cyIsInVwZGF0ZVZpYVBvaW50cyIsImZpbHRlciIsInZwIiwiYWN0aXZlU2xhY2tJbnB1dHMiLCJzbGFja1RpbWVJblNlY29uZHMiLCJhZGRBbmFseXRpY3NFdmVudCIsImFjdGlvbiIsImNhdGVnb3J5IiwibmFtZSIsIk51bWJlciIsInBhcnNlSW50IiwidmlhUG9pbnRMb2NhdGlvbiIsImhhbmRsZVZpYVBvaW50TG9jYXRpb25TZWxlY3RlZCIsInJldmVyc2UiLCJzd2FwT3JkZXIiLCJzbGFja0luU2Vjb25kcyIsImxuZyIsImxhbmciLCJyZW5kZXIiLCJvcmlnaW4iLCJzZWFyY2hQYW5lbFRleHQiLCJzZWFyY2hDb250ZXh0IiwiZGlzYWJsZUF1dG9Gb2N1cyIsIm9yaWdpbk1vYmlsZUxhYmVsIiwiZGVzdGluYXRpb25Nb2JpbGVMYWJlbCIsImZvbnRXZWlnaHRzIiwib25Gb2N1c0NoYW5nZSIsInNob3dTd2FwQ29udHJvbCIsInNob3dWaWFwb2ludENvbnRyb2wiLCJwcmltYXJ5IiwiY29sb3JzIiwic2xhY2tUaW1lIiwiZGVmYXVsdFNsYWNrVGltZVZhbHVlIiwiZ2V0VmlhUG9pbnRTbGFja1RpbWVPckRlZmF1bHQiLCJkZWZhdWx0VmFsdWUiLCJpc1ZpYVBvaW50U2xhY2tUaW1lSW5wdXRBY3RpdmUiLCJpc01vYmlsZSIsIm1lZGl1bSIsIkRUQXV0b1N1Z2dlc3QiLCJhcHBFbGVtZW50IiwiYXV0b0ZvY3VzIiwic3RvcmVSZWYiLCJzdG9yZVJlZmVyZW5jZSIsInJlZlBvaW50IiwicGxhY2Vob2xkZXIiLCJvcmlnaW5QbGFjZUhvbGRlciIsImdldEF1dG9TdWdnZXN0SWNvbnMiLCJvblNlbGVjdCIsIm9uQ2xlYXIiLCJmb2N1c0NoYW5nZSIsImhhbmRsZUZvY3VzQ2hhbmdlIiwic291cmNlcyIsInRhcmdldHMiLCJmaWx0ZXJSZXN1bHRzIiwibW9iaWxlTGFiZWwiLCJtb2RlU2V0Iiwic2hvd1Njcm9sbCIsImlzRW1iZWRkZWQiLCJvcHBvc2l0ZSIsImhhbmRsZVN3YXBPcmRlckNsaWNrIiwiZSIsIkljb24iLCJpbWciLCJjb2xvciIsInJlY3RhbmdsZSIsIlJlYWN0U29ydGFibGUiLCJsaXN0IiwiaGFuZGxlIiwiYW5pbWF0aW9uIiwiZGlzYWJsZWQiLCJzZXRMaXN0IiwibmV3VmlhUG9pbnRzIiwibyIsInJvdyIsImN1cnNvciIsInJvdGF0ZSIsImFyaWFMYWJlbCIsImhhbmRsZVZpYVBvaW50cyIsInNob3dTbGFja0NvbnRyb2wiLCJoYW5kbGVUb2dnbGVWaWFQb2ludFNsYWNrQ2xpY2siLCJnZXRTbGFja0Rpc3BsYXkiLCJoYW5kbGVWaWFQb2ludFNsYWNrVGltZVNlbGVjdGVkIiwiaGFuZGxlUmVtb3ZlVmlhUG9pbnRDbGljayIsImlzTmFOIiwiZGVzdGluYXRpb25QbGFjZUhvbGRlciIsIm1vcmUiLCJoYW5kbGVBZGRWaWFQb2ludENsaWNrIiwid2lkdGgiLCJoZWlnaHQiLCJkZWZhdWx0Q29sb3JzIiwiVVJMX1BFTElBUyIsIm9iamVjdE9mIiwiRFRBdXRvc3VnZ2VzdFBhbmVsV2l0aFRyYW5zbGF0aW9uIiwid2l0aFRyYW5zbGF0aW9uIiwiSTE4bmV4dFByb3ZpZGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7RUFBQSxTQUFTLE9BQU8sQ0FBQyxDQUFDLEVBQUU7RUFDcEIsRUFBRSx5QkFBeUI7O0VBRTNCLEVBQUUsT0FBTyxPQUFPLEdBQUcsVUFBVSxJQUFJLE9BQU8sTUFBTSxJQUFJLFFBQVEsSUFBSSxPQUFPLE1BQU0sQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLEVBQUU7RUFDcEcsSUFBSSxPQUFPLE9BQU8sQ0FBQztFQUNuQixFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRTtFQUNuQixJQUFJLE9BQU8sQ0FBQyxJQUFJLFVBQVUsSUFBSSxPQUFPLE1BQU0sSUFBSSxDQUFDLENBQUMsV0FBVyxLQUFLLE1BQU0sSUFBSSxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVMsR0FBRyxRQUFRLEdBQUcsT0FBTyxDQUFDO0VBQ3ZILEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7RUFDZjs7RUNQQSxTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzNCLEVBQUUsSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztFQUM1QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO0VBQy9CLEVBQUUsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO0VBQ3BCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBYyxDQUFDO0VBQ3JDLElBQUksSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztFQUN4QyxJQUFJLE1BQU0sSUFBSSxTQUFTLENBQUMsOENB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
|