vgapp 0.1.4 → 0.1.6

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/build/vgapp.js CHANGED
@@ -1,4155 +1,3 @@
1
- var vg;
2
- /******/ (() => { // webpackBootstrap
3
- /******/ "use strict";
4
- /******/ var __webpack_modules__ = ({
5
-
6
- /***/ "./app/modules/base-module.js":
7
- /*!************************************!*\
8
- !*** ./app/modules/base-module.js ***!
9
- \************************************/
10
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11
-
12
- __webpack_require__.r(__webpack_exports__);
13
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
14
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
15
- /* harmony export */ });
16
- /* harmony import */ var _utils_js_functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/js/functions */ "./app/utils/js/functions.js");
17
- /* harmony import */ var _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/js/dom/selectors */ "./app/utils/js/dom/selectors.js");
18
- /* harmony import */ var _utils_js_dom_data__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/js/dom/data */ "./app/utils/js/dom/data.js");
19
- /* harmony import */ var _utils_js_components_params__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/js/components/params */ "./app/utils/js/components/params.js");
20
- /* harmony import */ var _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/js/dom/event */ "./app/utils/js/dom/event.js");
21
- /* harmony import */ var _module_fn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./module-fn */ "./app/modules/module-fn.js");
22
- /* harmony import */ var _utils_js_components_animation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/js/components/animation */ "./app/utils/js/components/animation.js");
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
- class BaseModule {
31
- constructor(element) {
32
- if (!element) return;
33
- this._element = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].find(element);
34
- if (!this._element) {
35
- throw new Error('Товарищ! Первый параметр не должен быть пустым!');
36
- }
37
- this._params = {};
38
- _utils_js_dom_data__WEBPACK_IMPORTED_MODULE_2__["default"].set(this._element, this.constructor.NAME_KEY, this);
39
- }
40
- _getParams(element, params) {
41
- return new _utils_js_components_params__WEBPACK_IMPORTED_MODULE_3__["default"](params, element).get();
42
- }
43
- dispose() {
44
- _utils_js_dom_data__WEBPACK_IMPORTED_MODULE_2__["default"].remove(this._element, this.constructor.NAME_KEY);
45
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__["default"].off(this._element, this.constructor.EVENT_KEY);
46
- for (const propertyName of Object.getOwnPropertyNames(this)) {
47
- this[propertyName] = null;
48
- }
49
- }
50
- _route(callback) {
51
- const _this = this;
52
- let $content = null;
53
- const setData = data => {
54
- if ($content) $content.innerHTML = data;
55
- };
56
- if (!_this._params.hasOwnProperty('ajax')) {
57
- return;
58
- }
59
- if (!_this._params.ajax.route) {
60
- return;
61
- }
62
- if (!'method' in _this._params.ajax) {
63
- _this._params.ajax.method = 'get';
64
- }
65
- if ('target' in _this._params.ajax && _this._params.ajax.target) {
66
- $content = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].find(_this._params.ajax.target);
67
- }
68
- if ('loader' in _this._params.ajax && _this._params.ajax.loader) {
69
- setData('<div class="vg-loader"></div>');
70
- }
71
- _module_fn__WEBPACK_IMPORTED_MODULE_5__.Ajax[_this._params.ajax.method](_this._params.ajax.route, _this._params.ajax.data || {}, function (status, data) {
72
- setData(data.response);
73
- (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_0__.execute)(callback, [status, data]);
74
- });
75
- }
76
- _dismissElement() {
77
- let cross = (0,_module_fn__WEBPACK_IMPORTED_MODULE_5__.getSVG)('cross'),
78
- button = this._element.querySelector('.vg-btn-close');
79
- if (button) {
80
- let svg = button.querySelector('svg');
81
- if (!svg) button.insertAdjacentHTML('beforeend', cross);
82
- }
83
- }
84
- _queueCallback(callback, element, isAnimated = true, timeOutMs) {
85
- (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_0__.executeAfterTransition)(callback, element, isAnimated, timeOutMs);
86
- }
87
- _animation(element, key, params = {}) {
88
- new _utils_js_components_animation__WEBPACK_IMPORTED_MODULE_6__["default"](element, key, params);
89
- }
90
- static getInstance(element) {
91
- return _utils_js_dom_data__WEBPACK_IMPORTED_MODULE_2__["default"].get(_utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].find(element), this.NAME_KEY);
92
- }
93
- static getOrCreateInstance(element, params = {}) {
94
- return this.getInstance(element) || new this(element, !(0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_0__.isEmptyObj)(params) ? params : {});
95
- }
96
- static get DATA_KEY() {
97
- return `vg.${this.NAME}`;
98
- }
99
- static get EVENT_KEY() {
100
- return `.${this.DATA_KEY}`;
101
- }
102
- }
103
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BaseModule);
104
-
105
- /***/ }),
106
-
107
- /***/ "./app/modules/module-fn.js":
108
- /*!**********************************!*\
109
- !*** ./app/modules/module-fn.js ***!
110
- \**********************************/
111
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
112
-
113
- __webpack_require__.r(__webpack_exports__);
114
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
115
- /* harmony export */ Ajax: () => (/* binding */ Ajax),
116
- /* harmony export */ dismissTrigger: () => (/* binding */ dismissTrigger),
117
- /* harmony export */ getSVG: () => (/* binding */ getSVG)
118
- /* harmony export */ });
119
- /* harmony import */ var _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/js/dom/event */ "./app/utils/js/dom/event.js");
120
- /* harmony import */ var _utils_js_functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/js/functions */ "./app/utils/js/functions.js");
121
- /* harmony import */ var _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/js/dom/selectors */ "./app/utils/js/dom/selectors.js");
122
-
123
-
124
-
125
-
126
- /**
127
- * Тут собраны вспомогательные скрипты для работы модулей
128
- */
129
-
130
- /**
131
- * Набор svg элементов
132
- * @param name
133
- * @returns {*|{}}
134
- */
135
- const getSVG = name => {
136
- const svg = {
137
- error: '<svg viewBox="0 0 87 87" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="ui-success" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="Group-2" transform="translate(2.000000, 2.000000)"><circle id="Oval-2" stroke="rgba(252, 191, 191, .5)" stroke-width="4" cx="41.5" cy="41.5" r="41.5"></circle><circle class="ui-error-circle" stroke="#F74444" stroke-width="4" cx="41.5" cy="41.5" r="41.5"></circle><path class="ui-error-line1" d="M22.244224,22 L60.4279902,60.1837662" id="Line" stroke="#F74444" stroke-width="3" stroke-linecap="square"></path><path class="ui-error-line2" d="M60.755776,21 L23.244224,59.8443492" id="Line" stroke="#F74444" stroke-width="3" stroke-linecap="square"></path></g></g></svg>',
138
- success: '<svg viewBox="0 0 87 87" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="ui-error" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="Group-3" transform="translate(2.000000, 2.000000)"><circle id="Oval-2" stroke="rgba(117, 183, 152, 0.4)" stroke-width="4" cx="41.5" cy="41.5" r="41.5"></circle><circle class="ui-success-circle" id="Oval-2" stroke="#A5DC86" stroke-width="4" cx="41.5" cy="41.5" r="41.5"></circle><polyline class="ui-success-path" id="Path-2" stroke="#A5DC86" stroke-width="4" points="19 38.8036813 31.1020744 54.8046875 63.299221 28"></polyline></g></g></svg>',
139
- waiting: '<svg viewBox="0 0 87 87" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="ui-waiting" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="Group-3" transform="translate(2.000000, 2.000000)"><circle id="Oval-2" stroke="rgba(255, 218, 106, 0.4)" stroke-width="4" cx="41.5" cy="41.5" r="41.5"></circle><circle class="ui-waiting-circle" id="Oval-2" stroke="#ffda6a" stroke-width="4" cx="41.5" cy="41.5" r="41.5"></circle><path class="ui-waiting-line1" d="M43 63C54.598 63 64 53.598 64 42C64 30.402 54.598 21 43 21C31.402 21 22 30.402 22 42C22 53.598 31.402 63 43 63Z" stroke-width="3" stroke="#ffda6a" stroke-linecap="round" stroke-linejoin="round"/><path class="ui-waiting-line2" d="M40.6667 32.6641V44.3307H52.3334" stroke="#ffda6a" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></g></g></svg>',
140
- dots: '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-three-dots-vertical" viewBox="0 0 16 16"><path d="M9.5 13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"/></svg>',
141
- cross: '<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 224.512 224.512" xml:space="preserve"><g><polygon points="224.507,6.997 217.521,0 112.256,105.258 6.998,0 0.005,6.997 105.263,112.254 0.005,217.512 6.998,224.512 112.256,119.24 217.521,224.512 224.507,217.512 119.249,112.254 "/></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g></svg>'
142
- };
143
- return svg[name] ?? {};
144
- };
145
-
146
- /**
147
- * Вешаем событие "Закрыть" на все модалки, сайдбары и т.п.
148
- * @param module
149
- * @param method
150
- */
151
- const dismissTrigger = (module, method = 'hide') => {
152
- const clickEvent = `click.dismiss.${module.EVENT_KEY}`;
153
- const name = module.NAME;
154
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_0__["default"].on(document, clickEvent, `[data-vg-dismiss="${name}"]`, function (event) {
155
- if (['A', 'AREA'].includes(this.tagName)) {
156
- event.preventDefault();
157
- }
158
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.isDisabled)(this)) return;
159
- const target = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_2__["default"].getSelectorFromElement(this) || this.closest(`.vg-${name}`);
160
- const instance = module.getOrCreateInstance(target);
161
- instance[method]();
162
- });
163
- };
164
-
165
- /**
166
- * AJAX REQUEST
167
- * @type {{post: ajax.post, get: ajax.get, x: ((function(): (XMLHttpRequest))|*), send: ajax.send}}
168
- */
169
- const Ajax = {
170
- x: function () {
171
- if (typeof XMLHttpRequest !== 'undefined') {
172
- return new XMLHttpRequest();
173
- }
174
- let versions = ["MSXML2.XmlHttp.6.0", "MSXML2.XmlHttp.5.0", "MSXML2.XmlHttp.4.0", "MSXML2.XmlHttp.3.0", "MSXML2.XmlHttp.2.0", "Microsoft.XmlHttp"];
175
- let xhr;
176
- for (let i = 0; i < versions.length; i++) {
177
- try {
178
- xhr = new ActiveXObject(versions[i]);
179
- break;
180
- } catch (e) {}
181
- }
182
- return xhr;
183
- },
184
- send: function (url, callback, method, data, async) {
185
- if (async === undefined) {
186
- async = true;
187
- }
188
- let x = Ajax.x();
189
- x.open(method, url, async);
190
- x.setRequestHeader("X-Requested-With", "XMLHttpRequest");
191
- x.onreadystatechange = function () {
192
- if (x.readyState === 4) {
193
- switch (x.status) {
194
- case 200:
195
- callback('success', {
196
- text: x.statusText,
197
- response: x.responseText,
198
- code: x.status
199
- });
200
- break;
201
- default:
202
- callback('error', {
203
- text: x.statusText,
204
- response: x.responseText,
205
- code: x.status
206
- });
207
- break;
208
- }
209
- }
210
- };
211
- x.send(data);
212
- },
213
- get: function (url, data, callback, async) {
214
- let query = [];
215
- if (!(0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.isEmptyObj)(data)) {
216
- for (let key of data) {
217
- query.push(encodeURIComponent(key[0]) + '=' + encodeURIComponent(key[1]));
218
- }
219
- }
220
- Ajax.send(url + (query.length ? '?' + query.join('&') : ''), callback, 'GET', null, async);
221
- },
222
- post: function (url, data, callback, async) {
223
- Ajax.send(url, callback, 'POST', data, async);
224
- }
225
- };
226
-
227
-
228
- /***/ }),
229
-
230
- /***/ "./app/modules/vgcollapse/js/vgcollapse.js":
231
- /*!*************************************************!*\
232
- !*** ./app/modules/vgcollapse/js/vgcollapse.js ***!
233
- \*************************************************/
234
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
235
-
236
- __webpack_require__.r(__webpack_exports__);
237
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
238
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
239
- /* harmony export */ });
240
- /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../base-module */ "./app/modules/base-module.js");
241
- /* harmony import */ var _utils_js_functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/js/functions */ "./app/utils/js/functions.js");
242
- /* harmony import */ var _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/js/dom/event */ "./app/utils/js/dom/event.js");
243
- /* harmony import */ var _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../utils/js/dom/selectors */ "./app/utils/js/dom/selectors.js");
244
- /* harmony import */ var _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/js/dom/manipulator */ "./app/utils/js/dom/manipulator.js");
245
-
246
-
247
-
248
-
249
-
250
-
251
- /**
252
- * Constants
253
- */
254
- const NAME = 'collapse';
255
- const NAME_KEY = 'vg.collapse';
256
- const CLASS_NAME_SHOW = 'show';
257
- const CLASS_NAME_COLLAPSE = 'vg-collapse';
258
- const CLASS_NAME_COLLAPSING = 'vg-collapsing';
259
- const CLASS_NAME_COLLAPSED = 'vg-collapsed';
260
- const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
261
- const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="collapse"]';
262
- const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
263
- const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
264
- const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
265
- const EVENT_KEY_SHOW = `${NAME_KEY}.show`;
266
- const EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;
267
- const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
268
- class VGCollapse extends _base_module__WEBPACK_IMPORTED_MODULE_0__["default"] {
269
- constructor(element, params = {}) {
270
- super(element, params);
271
- this._params = this._getParams(element, (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.mergeDeepObject)({
272
- toggle: true,
273
- parent: null,
274
- ajax: {
275
- route: '',
276
- target: '',
277
- method: 'get'
278
- }
279
- }, params));
280
- this._isTransitioning = false;
281
- this._triggerArray = [];
282
- const toggleList = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].findAll(SELECTOR_DATA_TOGGLE);
283
- for (const elem of toggleList) {
284
- const selector = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].getSelectorFromElement(elem);
285
- const filterElement = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].findAll(selector).filter(foundElement => foundElement === this._element);
286
- if (selector !== null && filterElement.length) {
287
- this._triggerArray.push(elem);
288
- }
289
- }
290
- this._initializeChildren();
291
- if (!this._params.parent) {
292
- this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
293
- }
294
- if (this._params.toggle) {
295
- this.toggle();
296
- }
297
- }
298
- static get NAME() {
299
- return NAME;
300
- }
301
- static get NAME_KEY() {
302
- return NAME_KEY;
303
- }
304
- toggle(relatedTarget) {
305
- return !this._isShown() ? this.show(relatedTarget) : this.hide();
306
- }
307
- show() {
308
- const _this = this;
309
- if (_this._isTransitioning || _this._isShown()) return;
310
- let activeChildren = [];
311
- if (_this._params.parent) {
312
- activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => VGCollapse.getOrCreateInstance(element, {
313
- toggle: false
314
- }));
315
- }
316
- if (activeChildren.length && activeChildren[0]._isTransitioning) return;
317
- const startEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(_this._element, EVENT_KEY_SHOW);
318
- if (startEvent.defaultPrevented) return;
319
- for (const activeInstance of activeChildren) {
320
- activeInstance.hide();
321
- }
322
- _this._element.classList.remove(CLASS_NAME_COLLAPSE);
323
- _this._element.classList.add(CLASS_NAME_COLLAPSING);
324
- _this._element.style.height = 0;
325
- _this._addAriaAndCollapsedClass(_this._triggerArray, true);
326
- _this._isTransitioning = true;
327
- _this._route();
328
- const complete = () => {
329
- _this._isTransitioning = false;
330
- _this._element.classList.remove(CLASS_NAME_COLLAPSING);
331
- _this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
332
- _this._element.style.height = '';
333
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(_this._element, EVENT_KEY_SHOWN);
334
- };
335
- _this._queueCallback(complete, _this._element, true);
336
- const scrollSize = `scrollHeight`;
337
- _this._element.style.height = `${_this._element[scrollSize]}px`;
338
- }
339
- hide() {
340
- const _this = this;
341
- if (_this._isTransitioning || !_this._isShown()) return;
342
- const startEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(_this._element, EVENT_KEY_HIDE);
343
- if (startEvent.defaultPrevented) return;
344
- _this._element.style.height = `${this._element.getBoundingClientRect().height}px`;
345
- (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.reflow)(_this._element);
346
- _this._element.classList.add(CLASS_NAME_COLLAPSING);
347
- _this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
348
- for (const trigger of _this._triggerArray) {
349
- const element = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].getElementFromSelector(trigger);
350
- if (element && !_this._isShown(element)) {
351
- _this._addAriaAndCollapsedClass([trigger], false);
352
- }
353
- }
354
- _this._isTransitioning = true;
355
- const complete = () => {
356
- _this._isTransitioning = false;
357
- _this._element.classList.remove(CLASS_NAME_COLLAPSING);
358
- _this._element.classList.add(CLASS_NAME_COLLAPSE);
359
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(_this._element, EVENT_KEY_HIDDEN);
360
- };
361
- _this._element.style.height = '';
362
- _this._queueCallback(complete, _this._element, true);
363
- }
364
- dispose() {
365
- super.dispose();
366
- }
367
- _isShown(element = this._element) {
368
- return element.classList.contains(CLASS_NAME_SHOW);
369
- }
370
- _addAriaAndCollapsedClass(triggerArray, isOpen) {
371
- if (!triggerArray.length) {
372
- return;
373
- }
374
- for (const element of triggerArray) {
375
- this._changeStateButton(element, isOpen);
376
- }
377
- }
378
- _initializeChildren() {
379
- if (!this._params.parent) return;
380
- const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE);
381
- for (const element of children) {
382
- const selected = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].getElementFromSelector(element);
383
- if (selected) {
384
- this._addAriaAndCollapsedClass([element], this._isShown(selected));
385
- }
386
- }
387
- }
388
- _getFirstLevelChildren(selector) {
389
- const children = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].find(CLASS_NAME_DEEPER_CHILDREN, this._params.parent);
390
- return _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].find(selector, this._params.parent).filter(element => !children.includes(element));
391
- }
392
- _changeStateButton(element, isOpen) {
393
- element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
394
- element.setAttribute('aria-expanded', isOpen);
395
- element.innerHTML = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_4__.Manipulator.get(element, `data-${isOpen ? 'hide' : 'show'}-text`) || element.innerHTML;
396
- }
397
- }
398
-
399
- /**
400
- * Data API implementation
401
- */
402
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
403
- if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
404
- event.preventDefault();
405
- }
406
- _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].getMultipleElementsFromSelector(this).forEach(function (element) {
407
- VGCollapse.getOrCreateInstance(element, {
408
- toggle: false
409
- }).toggle();
410
- });
411
- });
412
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (VGCollapse);
413
-
414
- /***/ }),
415
-
416
- /***/ "./app/modules/vgdropdown/js/vgdropdown.js":
417
- /*!*************************************************!*\
418
- !*** ./app/modules/vgdropdown/js/vgdropdown.js ***!
419
- \*************************************************/
420
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
421
-
422
- __webpack_require__.r(__webpack_exports__);
423
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
424
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
425
- /* harmony export */ });
426
- /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../base-module */ "./app/modules/base-module.js");
427
- /* harmony import */ var _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/js/dom/event */ "./app/utils/js/dom/event.js");
428
- /* harmony import */ var _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/js/dom/selectors */ "./app/utils/js/dom/selectors.js");
429
- /* harmony import */ var _utils_js_functions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../utils/js/functions */ "./app/utils/js/functions.js");
430
- /* harmony import */ var _utils_js_components_placement__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/js/components/placement */ "./app/utils/js/components/placement.js");
431
-
432
-
433
-
434
-
435
-
436
- const NAME = 'dropdown';
437
- const NAME_KEY = 'vg.dropdown';
438
- const CLASS_NAME_SHOW = 'show';
439
- const CLASS_NAME_FADE = 'fade';
440
- const TARGET_CONTAINER = 'vg-dropdown-content';
441
- const PARENT_CONTAINER = 'vg-dropdown';
442
- const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="dropdown"]';
443
- const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
444
- const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
445
- const EVENT_KEY_SHOW = `${NAME_KEY}.show`;
446
- const EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;
447
- const EVENT_KEYUP_DATA_API = `keyup.${NAME_KEY}.data.api`;
448
- const EVENT_KEYDOWN_DATA_API = `keydown.${NAME_KEY}.data.api`;
449
- const EVENT_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
450
- const EVENT_MOUSEOVER_DATA_API = `mouseover.${NAME_KEY}.data.api`;
451
- const EVENT_MOUSEOUT_DATA_API = `mouseout.${NAME_KEY}.data.api`;
452
- class VGDropdown extends _base_module__WEBPACK_IMPORTED_MODULE_0__["default"] {
453
- constructor(element, params) {
454
- super(element, params);
455
- let defaultParams = {
456
- offset: [0, 2],
457
- over: false,
458
- backdrop: true,
459
- overflow: true,
460
- keyboard: true,
461
- placement: 'bottom',
462
- timeoutAnimation: 350,
463
- hover: false,
464
- ajax: {
465
- route: '',
466
- target: '',
467
- method: 'get'
468
- },
469
- animation: {
470
- enable: false,
471
- in: 'animate__flipInY',
472
- out: 'animate__flipOutY',
473
- delay: 800
474
- }
475
- };
476
- if ('offset' in params && Array.isArray(params.offset)) {
477
- defaultParams.offset = params.offset;
478
- }
479
- this._params = this._getParams(element, (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_3__.mergeDeepObject)(defaultParams, params));
480
- this._parent = this._element.parentNode;
481
- this._drop = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_2__["default"].find('.' + TARGET_CONTAINER, this._parent);
482
- this._isPlacement = false;
483
- this._params.animation.delay = !this._params.animation.enable ? 0 : this._params.animation.delay;
484
- this._animation(this._drop, VGDropdown.NAME_KEY, this._params.animation);
485
- }
486
- static get NAME() {
487
- return NAME;
488
- }
489
- static get NAME_KEY() {
490
- return NAME_KEY;
491
- }
492
- toggle() {
493
- return this._isShown() ? this.hide() : this.show();
494
- }
495
- show() {
496
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_3__.isDisabled)(this._element) || this._isShown()) return;
497
- const relatedTarget = {
498
- relatedTarget: this._element
499
- };
500
- const showEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].trigger(this._element, EVENT_KEY_SHOW, relatedTarget);
501
- if (showEvent.defaultPrevented) return;
502
- if ('ontouchstart' in document.documentElement) {
503
- for (const element of [].concat(...document.body.children)) {
504
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].on(element, 'mouseover', _utils_js_functions__WEBPACK_IMPORTED_MODULE_3__.noop);
505
- }
506
- }
507
- this._route();
508
- this._element.setAttribute('aria-expanded', true);
509
- this._element.classList.add(CLASS_NAME_SHOW);
510
- this._drop.classList.add(CLASS_NAME_SHOW);
511
- this._setPlacement();
512
- const completeCallBack = () => {
513
- this._drop.classList.add(CLASS_NAME_FADE);
514
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].trigger(this._element, EVENT_KEY_SHOWN, relatedTarget);
515
- };
516
- this._queueCallback(completeCallBack, this._drop, true, 50);
517
- }
518
- hide() {
519
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_3__.isDisabled)(this._element) || !this._isShown()) {
520
- return;
521
- }
522
- const relatedTarget = {
523
- relatedTarget: this._element
524
- };
525
- this._completeHide(relatedTarget);
526
- }
527
- dispose() {
528
- return super.dispose();
529
- }
530
- _isShown() {
531
- return this._element.classList.contains(CLASS_NAME_SHOW);
532
- }
533
- _completeHide(relatedTarget) {
534
- const hideEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].trigger(this._element, EVENT_KEY_HIDE, relatedTarget);
535
- if (hideEvent.defaultPrevented) {
536
- return;
537
- }
538
- if ('ontouchstart' in document.documentElement) {
539
- for (const element of [].concat(...document.body.children)) {
540
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].off(element, 'mouseover', _utils_js_functions__WEBPACK_IMPORTED_MODULE_3__.noop);
541
- }
542
- }
543
- this._drop.classList.remove(CLASS_NAME_FADE);
544
- this._element.classList.remove(CLASS_NAME_SHOW);
545
- this._element.setAttribute('aria-expanded', 'false');
546
- setTimeout(() => {
547
- const completeCallback = () => {
548
- this._drop.classList.remove(CLASS_NAME_SHOW);
549
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].trigger(this._element, EVENT_KEY_HIDDEN, relatedTarget);
550
- };
551
- this._queueCallback(completeCallback, this._parent, true, 10);
552
- }, this._params.animation.delay);
553
- }
554
-
555
- // TODO class Placement isn't done
556
- _setPlacement() {
557
- const _this = this;
558
- if (!_this._isPlacement) {
559
- let placement = new _utils_js_components_placement__WEBPACK_IMPORTED_MODULE_4__["default"]({
560
- element: this._parent,
561
- drop: this._drop
562
- })._getPlacement();
563
- if (placement.isFixed) {
564
- _this._drop.style.position = 'fixed';
565
- _this._drop.style.transform = 'translateY(-20%)'; // todo this is костыль поfixить
566
- }
567
- _this._drop.style.left = placement.left + 'px';
568
- _this._drop.style.top = placement.top + 'px';
569
- }
570
- if (_this._params.offset) {
571
- _this._drop.style.paddingTop = _this._params.offset[1] + 'px';
572
- _this._drop.style.paddingRight = _this._params.offset[0] + 'px';
573
- }
574
- _this._isPlacement = true;
575
- }
576
- static init(element, params = {}) {
577
- const instance = VGDropdown.getOrCreateInstance(element, params);
578
- if (instance._params.hover) {
579
- let currentElem = null;
580
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].on(instance._parent, EVENT_MOUSEOVER_DATA_API, function (event) {
581
- if (currentElem) return;
582
- VGDropdown.hideOpenToggles(event);
583
- let target = event.target.closest('.' + PARENT_CONTAINER);
584
- if (!target) return;
585
- if (!instance._parent.contains(target)) return;
586
- currentElem = target;
587
- instance.show();
588
- });
589
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].on(instance._parent, EVENT_MOUSEOUT_DATA_API, function (event) {
590
- if (!currentElem) return;
591
- let relatedTarget = event.relatedTarget;
592
- while (relatedTarget) {
593
- if (relatedTarget === currentElem) return;
594
- relatedTarget = relatedTarget.parentNode;
595
- }
596
- currentElem = null;
597
- instance._completeHide({
598
- relatedTarget: instance._element
599
- });
600
- });
601
- } else {
602
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].on(document, EVENT_KEYUP_DATA_API, SELECTOR_DATA_TOGGLE, VGDropdown.keydownHandler);
603
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].on(document, EVENT_KEYDOWN_DATA_API, '.' + TARGET_CONTAINER, VGDropdown.keydownHandler);
604
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].on(document, EVENT_KEYUP_DATA_API, VGDropdown.clearDrops);
605
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].on(document, EVENT_CLICK_DATA_API, VGDropdown.clearDrops);
606
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].on(element, EVENT_CLICK_DATA_API, function (event) {
607
- event.preventDefault();
608
- instance.toggle();
609
- });
610
- }
611
- }
612
- static hideOpenToggles(event) {
613
- const openToggles = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_2__["default"].findAll('[data-vg-toggle="dropdown"]:not(.disabled):not(:disabled).show');
614
- for (const toggle of openToggles) {
615
- const context = VGDropdown.getInstance(toggle);
616
- if (!context) {
617
- continue;
618
- }
619
- if (event.target.closest('.' + TARGET_CONTAINER) === context._drop) {
620
- return;
621
- }
622
- const composedPath = event.composedPath();
623
- if (composedPath.includes(context._element)) {
624
- continue;
625
- }
626
- const relatedTarget = {
627
- relatedTarget: context._element
628
- };
629
- if (event.type === 'click') {
630
- relatedTarget.clickEvent = event;
631
- }
632
- context._completeHide(relatedTarget);
633
- }
634
- }
635
- static keydownHandler(event) {
636
- const isInput = /input|textarea/i.test(event.target.tagName);
637
- const isEscapeEvent = event.key === 'Escape';
638
- const isUpOrDownEvent = ['ArrowUp', 'ArrowDown'].includes(event.key);
639
- if (!isUpOrDownEvent && !isEscapeEvent) {
640
- return;
641
- }
642
- if (isInput && !isEscapeEvent) {
643
- return;
644
- }
645
- event.preventDefault();
646
- const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_2__["default"].find(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode);
647
- const instance = VGDropdown.getOrCreateInstance(getToggleButton);
648
- if (isUpOrDownEvent) {
649
- event.stopPropagation();
650
- instance.show();
651
- return;
652
- }
653
- if (instance._isShown()) {
654
- event.stopPropagation();
655
- instance.hide();
656
- getToggleButton.focus();
657
- }
658
- }
659
- static clearDrops(event) {
660
- if (event.button === 2 || event.type === 'keyup' && event.key !== 'Tab') {
661
- return;
662
- }
663
- VGDropdown.hideOpenToggles(event);
664
- }
665
- }
666
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (VGDropdown);
667
-
668
- /***/ }),
669
-
670
- /***/ "./app/modules/vgformsender/js/vgformsender.js":
671
- /*!*****************************************************!*\
672
- !*** ./app/modules/vgformsender/js/vgformsender.js ***!
673
- \*****************************************************/
674
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
675
-
676
- __webpack_require__.r(__webpack_exports__);
677
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
678
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
679
- /* harmony export */ });
680
- /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../base-module */ "./app/modules/base-module.js");
681
- /* harmony import */ var _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/js/dom/manipulator */ "./app/utils/js/dom/manipulator.js");
682
- /* harmony import */ var _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/js/dom/event */ "./app/utils/js/dom/event.js");
683
- /* harmony import */ var _vgmodal_js_vgmodal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../vgmodal/js/vgmodal */ "./app/modules/vgmodal/js/vgmodal.js");
684
- /* harmony import */ var _utils_js_functions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/js/functions */ "./app/utils/js/functions.js");
685
- /* harmony import */ var _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../utils/js/dom/selectors */ "./app/utils/js/dom/selectors.js");
686
- /* harmony import */ var _vgcollapse_js_vgcollapse__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../vgcollapse/js/vgcollapse */ "./app/modules/vgcollapse/js/vgcollapse.js");
687
- /* harmony import */ var _module_fn__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../module-fn */ "./app/modules/module-fn.js");
688
- /* harmony import */ var _utils_js_components_backdrop__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../utils/js/components/backdrop */ "./app/utils/js/components/backdrop.js");
689
-
690
-
691
-
692
-
693
-
694
-
695
-
696
-
697
-
698
-
699
- /**
700
- * Constants
701
- */
702
- const NAME = 'form-sender';
703
- const NAME_KEY = 'vg.fs';
704
-
705
- /**
706
- * Constants Events
707
- */
708
- const EVENT_KEY_SUCCESS = 'vg.fs.success';
709
- const EVENT_KEY_ERROR = 'vg.fs.error';
710
- const EVENT_KEY_BEFORE = 'vg.fs.before';
711
- const EVENT_SUBMIT_DATA_API = `submit.${NAME_KEY}.data.api`;
712
- class VGFormSender extends _base_module__WEBPACK_IMPORTED_MODULE_0__["default"] {
713
- constructor(element, params = {}) {
714
- super(element, params);
715
- this._params = this._getParams(element, (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.mergeDeepObject)({
716
- redirect: '',
717
- validate: false,
718
- submit: false,
719
- fields: [],
720
- alert: {
721
- enabled: true,
722
- type: 'modal'
723
- },
724
- ajax: {
725
- route: '',
726
- target: '',
727
- method: 'get'
728
- },
729
- classes: {
730
- general: 'vg-form-sender',
731
- alertCollapse: 'vg-form-sender-collapse',
732
- alertModal: 'vg-form-sender-modal',
733
- validation: 'needs-validation',
734
- wasValidate: 'was-validated'
735
- }
736
- }, params));
737
- this._params.ajax.route = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.get(this._element, 'action').toLowerCase();
738
- this._params.ajax.method = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.get(this._element, 'method').toLowerCase();
739
- this._button = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_5__["default"].find('[type="submit"]', this._element) || _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_5__["default"].find('[form="' + this._element.id + '"]') || null;
740
- this._params.isBtnText = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.get(this._element, 'data-btn-text') !== 'false';
741
- this._params.isJsonParse = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.get(this._element, 'data-json-parse') !== 'false';
742
- this._params.isShowPass = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.get(this._element, 'data-show-pass') === 'true';
743
- }
744
- static get NAME() {
745
- return NAME;
746
- }
747
- static get NAME_KEY() {
748
- return NAME_KEY;
749
- }
750
- build() {
751
- this._element.classList.add(this._params.classes.general);
752
- if (this._params.validate) {
753
- _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.set(this._element, 'novalidate', '');
754
- this._element.classList.add(this._params.classes.validation);
755
- }
756
-
757
- // TODO сделать добавление глаза если есть ввод пароля
758
-
759
- return this;
760
- }
761
- request(data, event) {
762
- const _this = this;
763
- _this._alertBefore();
764
- _this._params.ajax.data = data;
765
- _this._route(function (status, data) {
766
- _this._element.classList.remove('was-validated');
767
- if (_this._params.alert.enabled) {
768
- if (typeof status === 'string' && status === 'error') {
769
- _this._alertError(event, data);
770
- } else if (typeof status === 'string' && status === 'success') {
771
- _this._alertSuccess(event, data);
772
- }
773
- }
774
- if (_this._params.redirect) {
775
- window.location.href = _this._params.redirect;
776
- }
777
- });
778
- }
779
- _alertBefore() {
780
- const _this = this;
781
- if (_this._params.alert.type === 'collapse') {
782
- [...document.getElementsByClassName(_this._params.classes.alertCollapse)].forEach(function (element) {
783
- if (element && element.classList.contains('show')) {
784
- _vgcollapse_js_vgcollapse__WEBPACK_IMPORTED_MODULE_6__["default"].getOrCreateInstance(element, {
785
- toggle: false
786
- }).hide();
787
- }
788
- });
789
- }
790
- _this._statusButton('before');
791
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(_this._element, EVENT_KEY_BEFORE, _this);
792
- }
793
- _alertError(event, data) {
794
- const _this = this;
795
- _this._statusButton('after');
796
- _this._jsonParse(data, 'error');
797
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(_this._element, EVENT_KEY_ERROR, [event, _this, data]);
798
- }
799
- _alertSuccess(event, data) {
800
- const _this = this;
801
- _this._statusButton('after');
802
- _this._jsonParse(data, 'success');
803
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(_this._element, EVENT_KEY_SUCCESS, [event, _this, data]);
804
- }
805
- _statusButton(status) {
806
- const _this = this;
807
- if (!_this._button) return;
808
- let btnSubmitText = _this._button,
809
- btnText = {
810
- send: 'Отправляем...',
811
- text: 'Отправить'
812
- };
813
- if (_utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.has(_this._button, 'data-spinner') && status === 'before') {
814
- _this._button.insertAdjacentHTML('afterbegin', '<span class="spinner-border spinner-border-sm me-2"></span>');
815
- }
816
- if (_utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.has(_this._button, 'data-text')) {
817
- btnText.text = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.get(_this._button, 'data-text');
818
- } else {
819
- let $btnText = _this._button.querySelector('[data-text]');
820
- if ($btnText) {
821
- btnText.text = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.get($btnText, 'data-text');
822
- btnSubmitText = $btnText;
823
- }
824
- }
825
- if (_utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.has(_this._button, 'data-text-send')) {
826
- btnText.send = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.get(_this._button, 'data-text-send');
827
- } else {
828
- let $btnTextSend = _this._button.querySelector('[data-text-send]');
829
- if ($btnTextSend) {
830
- btnText.send = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.get($btnTextSend, 'data-text-send');
831
- btnSubmitText = $btnTextSend;
832
- }
833
- }
834
- if (status === 'before') {
835
- if (_this._params.isBtnText) {
836
- btnSubmitText.innerHTML = btnText.send;
837
- }
838
- _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.set(_this._button, 'disabled', 'disabled');
839
- }
840
- if (status === 'after') {
841
- if (_this._params.isBtnText) {
842
- btnSubmitText.innerHTML = btnText.text;
843
- }
844
- _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.remove(_this._button, 'disabled');
845
- let spinner = _this._button.querySelector('.spinner-border');
846
- if (spinner) spinner.remove();
847
- }
848
- }
849
- _jsonParse(data, status) {
850
- const _this = this;
851
- if (_this._params.isJsonParse && typeof data === 'string') {
852
- let parserData = {};
853
- try {
854
- parserData = JSON.parse(data);
855
- _this.alert(parserData, status);
856
- } catch (e) {
857
- _this.alert(data, status);
858
- }
859
- } else {
860
- _this.alert(data, status);
861
- }
862
- }
863
- alert(data, status) {
864
- const _this = this;
865
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.isObject)(data)) {
866
- if ('code' in data && data.code && data.code === 200) {
867
- if ('response' in data && data.response) {
868
- let response = (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.normalizeData)(data.response);
869
- if (typeof response === 'string') {
870
- if (response.indexOf("Parse error") !== -1 || response.indexOf("syntax error") !== -1) {
871
- status = 'error';
872
- data = {
873
- response: {
874
- title: 'Error',
875
- message: 'Something went wrong, please repeat later'
876
- },
877
- text: 'Something went wrong, please repeat later'
878
- };
879
- }
880
- } else {
881
- if ('errors' in response && (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.normalizeData)(response.errors)) {
882
- status = (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.normalizeData)(response.errors) ? 'error' : 'success';
883
- }
884
- }
885
- }
886
- }
887
- }
888
- if (!_this._params.alert.enabled) {
889
- return;
890
- }
891
- if (_this._params.alert.type === 'modal') {
892
- _this._alertModal(data, status);
893
- }
894
- if (_this._params.alert.type === 'collapse') {
895
- _this._alertCollapse(data, status);
896
- }
897
- }
898
- _alertModal(data, status) {
899
- const _this = this;
900
-
901
- // Есть ли открытые модалки, закрываем
902
- [...document.getElementsByClassName('modal')].forEach(function (element) {
903
- if (element && element.classList.contains('show')) {
904
- let mBS = bootstrap.Modal.getOrCreateInstance(element);
905
- mBS.hide();
906
- }
907
- });
908
- [...document.getElementsByClassName('vg-modal')].forEach(function (element) {
909
- if (element && element.classList.contains('show')) {
910
- const mVG = _vgmodal_js_vgmodal__WEBPACK_IMPORTED_MODULE_3__["default"].getOrCreateInstance(element);
911
- mVG.hide();
912
- }
913
- });
914
- let id = _this._params.classes.general + '-' + (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.makeRandomString)();
915
- let $modal = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_5__["default"].find('.' + _this._params.classes.alertModal);
916
- if ($modal) $modal.remove();
917
- setTimeout(() => {
918
- _vgmodal_js_vgmodal__WEBPACK_IMPORTED_MODULE_3__["default"].init(id, {
919
- classes: {
920
- alert: _this._params.classes.alertModal
921
- }
922
- }, function (self) {
923
- let element = self._element;
924
- element.classList.add(_this._params.classes.alertModal);
925
- let $body = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_5__["default"].find('.vg-modal-body', element);
926
- if ($body) $body.append(_this.setDataRelationStatus(element, status, data, 'modal'));
927
- self.toggle();
928
- });
929
- }, 800);
930
- }
931
- _alertCollapse(data, status) {
932
- const _this = this;
933
- let $collapse = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_5__["default"].find('.' + _this._params.classes.alertCollapse);
934
- if (!$collapse) {
935
- $collapse = document.createElement('div');
936
- $collapse.classList.add(_this._params.classes.alertCollapse);
937
- $collapse.classList.add('vg-collapse');
938
- $collapse.id = _this._params.classes.general + '-' + (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.makeRandomString)();
939
- $collapse.append(_this.setDataRelationStatus($collapse, status, data, 'collapse'));
940
- _this._element.prepend($collapse);
941
- }
942
- _vgcollapse_js_vgcollapse__WEBPACK_IMPORTED_MODULE_6__["default"].getOrCreateInstance($collapse, {
943
- toggle: false
944
- }).toggle();
945
- }
946
- setDataRelationStatus($element, status, data, type) {
947
- let $alert = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_5__["default"].find('.vg-alert-' + status, $element);
948
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.isObject)(data)) {
949
- if (status === 'error') {
950
- if ('code' in data && data.code !== 200) {
951
- if ('text' in data && !data.text) {
952
- data.text = 'Something went wrong, please repeat later';
953
- switch (data.code) {
954
- case 400:
955
- data.text = 'Bad Request';
956
- break;
957
- case 401:
958
- data.text = 'Unauthorized';
959
- break;
960
- case 403:
961
- data.text = 'Unauthorized';
962
- break;
963
- case 413:
964
- data.text = 'Forbidden';
965
- break;
966
- case 404:
967
- data.text = 'Not Found';
968
- break;
969
- case 422:
970
- data.text = 'Unprocessable Entity';
971
- break;
972
- case 500:
973
- data.text = 'Internal Server Error';
974
- break;
975
- case 504:
976
- data.text = 'Gateway Timeout';
977
- break;
978
- }
979
- }
980
- }
981
- }
982
- if ('response' in data) {
983
- let response = (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.normalizeData)(data.response),
984
- title = '',
985
- txt = '',
986
- code = '';
987
- if (typeof response !== 'string') {
988
- if (!('view' in response)) {
989
- if ('title' in response) title = response.title;
990
- if (status === 'error' && data.code !== 200) {
991
- code = ' ' + data.text + ' (' + data.code + ')';
992
- }
993
- txt += '<h4 class="vg-alert-content--title">' + title + code + '</h4>';
994
- if ('message' in response) {
995
- txt += '<div class="vg-alert-content--message">' + response.message + '</div>';
996
- }
997
- if ('errors' in response) {
998
- let errors = (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.normalizeData)(response.errors) || null;
999
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.isObject)(errors)) {
1000
- for (const error in errors) {
1001
- if (Array.isArray(errors[error])) {
1002
- errors[error].forEach(function (t) {
1003
- txt += '<div>' + t + '</div>';
1004
- });
1005
- } else {
1006
- txt = '<div>' + errors[error] + '</div>';
1007
- }
1008
- }
1009
- }
1010
- }
1011
- data = {
1012
- view: txt
1013
- };
1014
- }
1015
- } else {
1016
- data.view = response;
1017
- }
1018
- }
1019
- }
1020
- if (!$alert) {
1021
- $alert = document.createElement('div');
1022
- $alert.classList.add('vg-alert', 'vg-alert-' + status, 'vg-alert-' + type);
1023
- let content = document.createElement('div');
1024
- content.classList.add('vg-alert-content');
1025
- let icon = document.createElement('div');
1026
- icon.classList.add('vg-alert-content--icon');
1027
- let i = document.createElement('i');
1028
- i.innerHTML = (0,_module_fn__WEBPACK_IMPORTED_MODULE_7__.getSVG)(status);
1029
- icon.append(i);
1030
- content.append(icon);
1031
- let text = document.createElement('div');
1032
- text.classList.add('vg-alert-content--text');
1033
- text.innerHTML = data.view;
1034
- content.append(text);
1035
- $alert.append(content);
1036
- } else {
1037
- let text = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_5__["default"].find('.vg-alert-content--text', $alert);
1038
- text.innerHTML = data.view;
1039
- }
1040
- return $alert;
1041
- }
1042
-
1043
- /**
1044
- * Инициализация
1045
- * @param element
1046
- * @param params
1047
- */
1048
- static init(element, params = {}) {
1049
- const instance = VGFormSender.getOrCreateInstance(element, params);
1050
- instance.build();
1051
- }
1052
- }
1053
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].on(document, EVENT_SUBMIT_DATA_API, function (event) {
1054
- if (!_utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.has(event.target, 'data-vgformsender')) {
1055
- return;
1056
- }
1057
- const instance = VGFormSender.getOrCreateInstance(event.target, {});
1058
- if (!instance) {
1059
- return;
1060
- }
1061
- if (instance._params.validate) {
1062
- if (!instance._element.checkValidity()) {
1063
- event.preventDefault();
1064
- event.stopPropagation();
1065
- instance._element.classList.add(instance._params.classes.wasValidate);
1066
- return false;
1067
- }
1068
- }
1069
- const collectData = function (data, fields) {
1070
- for (let name in fields) {
1071
- if (typeof fields[name] === 'object') {
1072
- for (let key in fields[name]) {
1073
- let arr = Object.keys(fields[name][key]).map(function (i) {
1074
- return fields[name][key][i];
1075
- });
1076
- data.append(name, arr);
1077
- }
1078
- } else {
1079
- data.append(name, fields[name]);
1080
- }
1081
- }
1082
- return data;
1083
- };
1084
- if (!instance._params.submit) {
1085
- event.preventDefault();
1086
- let data = new FormData(instance._element);
1087
-
1088
- // TODO доделать
1089
- /*if (Array.isArray(instance._params.ajax.fields) && instance._params.ajax.fields.length) {
1090
- data = collectData(data, instance._params.ajax.fields);
1091
- }*/
1092
-
1093
- return instance.request(data, event);
1094
- }
1095
- });
1096
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (VGFormSender);
1097
-
1098
- /***/ }),
1099
-
1100
- /***/ "./app/modules/vglawcookie/js/vglawcookie.js":
1101
- /*!***************************************************!*\
1102
- !*** ./app/modules/vglawcookie/js/vglawcookie.js ***!
1103
- \***************************************************/
1104
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1105
-
1106
- __webpack_require__.r(__webpack_exports__);
1107
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1108
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1109
- /* harmony export */ });
1110
- /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../base-module */ "./app/modules/base-module.js");
1111
- /* harmony import */ var _utils_js_functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/js/functions */ "./app/utils/js/functions.js");
1112
- /* harmony import */ var _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/js/dom/event */ "./app/utils/js/dom/event.js");
1113
- /* harmony import */ var _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../utils/js/dom/selectors */ "./app/utils/js/dom/selectors.js");
1114
- /* harmony import */ var _utils_js_dom_cookie__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/js/dom/cookie */ "./app/utils/js/dom/cookie.js");
1115
- /* harmony import */ var _module_fn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../module-fn */ "./app/modules/module-fn.js");
1116
-
1117
-
1118
-
1119
-
1120
-
1121
-
1122
-
1123
- /**
1124
- * Constants
1125
- */
1126
- const NAME = 'lawcookie';
1127
- const NAME_KEY = 'vg.lawcookie';
1128
- const CLASS_NAME_SHOW = 'show';
1129
- const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
1130
- const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
1131
- const EVENT_KEY_SHOW = `${NAME_KEY}.show`;
1132
- const EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;
1133
- const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="lawcookie"]';
1134
- const SELECTOR_DATA_TOGGLE_CLEAR = '[data-vg-toggle="lawcookie-clear"]';
1135
- const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
1136
- class VGLawCookie extends _base_module__WEBPACK_IMPORTED_MODULE_0__["default"] {
1137
- static sParams = {};
1138
- constructor(element, params = {}) {
1139
- super(element, params);
1140
- this._params = this._getParams(element, (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.mergeDeepObject)({
1141
- storage: 'local',
1142
- // cookie or local
1143
- delay: 500,
1144
- cookie: {
1145
- name: 'lawCookie',
1146
- value: 'yes',
1147
- attributes: {}
1148
- },
1149
- animation: {
1150
- enable: true,
1151
- in: 'animate__fadeInUp',
1152
- out: 'animate__fadeOutDown',
1153
- delay: 800
1154
- },
1155
- ajax: {
1156
- route: '',
1157
- target: '',
1158
- method: 'get'
1159
- }
1160
- }, params));
1161
- VGLawCookie.sParams = this._params;
1162
- this._params.animation.delay = !this._params.animation.enable ? 0 : this._params.animation.delay;
1163
- this._animation(this._element, VGLawCookie.NAME_KEY, this._params.animation);
1164
- }
1165
- static get NAME() {
1166
- return NAME;
1167
- }
1168
- static get NAME_KEY() {
1169
- return NAME_KEY;
1170
- }
1171
- toggle() {
1172
- return !this._isShown() ? this.show() : this.hide();
1173
- }
1174
- _isShown() {
1175
- return this.storage().get();
1176
- }
1177
- show() {
1178
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.isDisabled)(this._element)) return;
1179
- const showEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(this._element, EVENT_KEY_SHOW, {});
1180
- if (showEvent.defaultPrevented) return;
1181
- this._element.classList.add(CLASS_NAME_SHOW);
1182
- const completeCallBack = () => {
1183
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(this._element, EVENT_KEY_SHOWN, {});
1184
- };
1185
- this._queueCallback(completeCallBack, this._element, true, this._params.delay);
1186
- }
1187
- hide() {
1188
- const hideEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(this._element, EVENT_KEY_HIDE);
1189
- if (hideEvent.defaultPrevented) return;
1190
- setTimeout(() => {
1191
- this._element.classList.remove(CLASS_NAME_SHOW);
1192
- const completeCallback = () => _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(this._element, EVENT_KEY_HIDDEN);
1193
- this._queueCallback(completeCallback, this._element, true);
1194
- }, this._params.animation.delay);
1195
- }
1196
- storage() {
1197
- this._storage = {
1198
- isCookie: this._params.storage === 'cookie',
1199
- storage: this._params.storage === 'cookie' ? _utils_js_dom_cookie__WEBPACK_IMPORTED_MODULE_4__["default"] : localStorage,
1200
- name: this._params.cookie.name,
1201
- value: this._params.cookie.value,
1202
- attributes: this._params.cookie.attributes
1203
- };
1204
- return this;
1205
- }
1206
- get() {
1207
- if (this._storage.isCookie) {
1208
- return this._storage.storage.get(this._storage.name);
1209
- } else {
1210
- return this._storage.storage.getItem(this._storage.name);
1211
- }
1212
- }
1213
- set() {
1214
- if (this._storage.isCookie) {
1215
- this._storage.storage.set(this._storage.name, this._storage.value, this._storage.attributes);
1216
- } else {
1217
- this._storage.storage.setItem(this._storage.name, this._storage.value);
1218
- }
1219
- }
1220
- dispose() {
1221
- super.dispose();
1222
- }
1223
- static reset() {
1224
- _utils_js_dom_cookie__WEBPACK_IMPORTED_MODULE_4__["default"].remove(VGLawCookie.sParams.cookie.name);
1225
- localStorage.clear();
1226
- location.reload();
1227
- }
1228
-
1229
- /**
1230
- * Инициализация
1231
- * @param element
1232
- * @param params
1233
- */
1234
- static init(element, params = {}) {
1235
- const instance = VGLawCookie.getOrCreateInstance(element, params);
1236
- instance.toggle();
1237
- }
1238
- }
1239
- (0,_module_fn__WEBPACK_IMPORTED_MODULE_5__.dismissTrigger)(VGLawCookie);
1240
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
1241
- if (['A', 'AREA'].includes(this.tagName)) {
1242
- event.preventDefault();
1243
- }
1244
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.isDisabled)(this)) return;
1245
- const element = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].find('#vg-lawcookie');
1246
- if (!element) return;
1247
- const instance = VGLawCookie.getOrCreateInstance(element);
1248
- instance.storage().set();
1249
- instance.hide();
1250
- });
1251
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CLEAR, function (event) {
1252
- if (['A', 'AREA'].includes(this.tagName)) {
1253
- event.preventDefault();
1254
- }
1255
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.isDisabled)(this)) return;
1256
- const element = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].find('#vg-lawcookie');
1257
- if (!element) return;
1258
- const instance = VGLawCookie.getOrCreateInstance(element);
1259
- instance.dispose();
1260
- location.reload();
1261
- });
1262
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (VGLawCookie);
1263
-
1264
- /***/ }),
1265
-
1266
- /***/ "./app/modules/vgmodal/js/vgmodal.js":
1267
- /*!*******************************************!*\
1268
- !*** ./app/modules/vgmodal/js/vgmodal.js ***!
1269
- \*******************************************/
1270
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1271
-
1272
- __webpack_require__.r(__webpack_exports__);
1273
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1274
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1275
- /* harmony export */ });
1276
- /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../base-module */ "./app/modules/base-module.js");
1277
- /* harmony import */ var _utils_js_components_scrollbar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/js/components/scrollbar */ "./app/utils/js/components/scrollbar.js");
1278
- /* harmony import */ var _utils_js_components_backdrop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/js/components/backdrop */ "./app/utils/js/components/backdrop.js");
1279
- /* harmony import */ var _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../utils/js/dom/selectors */ "./app/utils/js/dom/selectors.js");
1280
- /* harmony import */ var _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/js/dom/event */ "./app/utils/js/dom/event.js");
1281
- /* harmony import */ var _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../utils/js/dom/manipulator */ "./app/utils/js/dom/manipulator.js");
1282
- /* harmony import */ var _utils_js_functions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../utils/js/functions */ "./app/utils/js/functions.js");
1283
- /* harmony import */ var _module_fn__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../module-fn */ "./app/modules/module-fn.js");
1284
- /* harmony import */ var _utils_js_components_params__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../utils/js/components/params */ "./app/utils/js/components/params.js");
1285
-
1286
-
1287
-
1288
-
1289
-
1290
-
1291
-
1292
-
1293
-
1294
-
1295
- /**
1296
- * Constants
1297
- */
1298
- const NAME = 'modal';
1299
- const NAME_KEY = 'vg.modal';
1300
- const ESCAPE_KEY = 'Escape';
1301
- const OPEN_SELECTOR = '.vg-modal.show';
1302
- const SELECTOR_DIALOG = '.vg-modal-dialog';
1303
- const SELECTOR_MODAL_BODY = '.vg-modal-body';
1304
- const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="modal"]';
1305
- const CLASS_NAME_OPEN = 'vg-modal-open';
1306
- const CLASS_NAME_SHOW = 'show';
1307
- const CLASS_NAME_FADE = 'fade';
1308
- const CLASS_NAME_STATIC = 'vg-modal-static';
1309
- const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
1310
- const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
1311
- const EVENT_KEY_SHOW = `${NAME_KEY}.show`;
1312
- const EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;
1313
- const EVENT_KEY_RESIZE = `${NAME_KEY}.resize`;
1314
- const EVENT_KEY_KEYDOWN_DISMISS = `keydown.dismiss.${NAME_KEY}`;
1315
- const EVENT_KEY_HIDE_PREVENTED = `hidePrevented.${NAME_KEY}`;
1316
- const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
1317
- const EVENT_KEY_MOUSEDOWN_DISMISS = `mousedown.dismiss${NAME_KEY}`;
1318
- const EVENT_KEY_CLICK_DISMISS = `click.dismiss${NAME_KEY}`;
1319
- class VGModal extends _base_module__WEBPACK_IMPORTED_MODULE_0__["default"] {
1320
- constructor(element, params = {}) {
1321
- super(element, params);
1322
- this._params = this._getParams(element, (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_6__.mergeDeepObject)({
1323
- backdrop: true,
1324
- focus: true,
1325
- keyboard: true,
1326
- fields: [],
1327
- ajax: {
1328
- route: '',
1329
- target: '',
1330
- method: 'get',
1331
- loader: false
1332
- },
1333
- animation: {
1334
- enable: false,
1335
- in: 'animate__rollIn',
1336
- out: 'animate__rollOut',
1337
- delay: 800
1338
- },
1339
- classes: {
1340
- general: 'vg-modal',
1341
- dialog: 'vg-modal-dialog',
1342
- content: 'vg-modal-content',
1343
- header: 'vg-modal-header',
1344
- title: 'vg-modal-title',
1345
- body: 'vg-modal-body',
1346
- footer: 'vg-modal-footer'
1347
- }
1348
- }, params));
1349
- this._button = null;
1350
- this._dialog = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].find(SELECTOR_DIALOG, this._element);
1351
- this._isShown = false;
1352
- this._isTransitioning = false;
1353
- this._scrollBar = new _utils_js_components_scrollbar__WEBPACK_IMPORTED_MODULE_1__["default"]();
1354
- this._addEventListeners();
1355
- this._dismissElement();
1356
- this._params.animation.delay = !this._params.animation.enable ? 0 : this._params.animation.delay;
1357
- this._animation(this._element, VGModal.NAME_KEY, this._params.animation);
1358
- }
1359
- static get NAME() {
1360
- return NAME;
1361
- }
1362
- static get NAME_KEY() {
1363
- return NAME_KEY;
1364
- }
1365
- static init(element, params, callback) {
1366
- VGModal.build(element, params, callback);
1367
- }
1368
- static build(id, params, callback) {
1369
- if (typeof id !== "string") return;
1370
- let _element = document.createElement('div');
1371
- _element.classList.add('vg-modal', 'fade');
1372
- _element.id = id;
1373
- let dialog = document.createElement('div');
1374
- dialog.classList.add('vg-modal-dialog');
1375
- let content = document.createElement('div');
1376
- content.classList.add('vg-modal-content');
1377
- let btnClose = document.createElement('button');
1378
- _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_5__.Manipulator.set(btnClose, 'type', 'button');
1379
- _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_5__.Manipulator.set(btnClose, 'data-vg-dismiss', 'modal');
1380
- _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_5__.Manipulator.set(btnClose, 'data-vg-target', '#' + id);
1381
- _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_5__.Manipulator.set(btnClose, 'aria-label', 'close');
1382
- btnClose.classList.add('vg-btn-close');
1383
- content.append(btnClose);
1384
- let body = document.createElement('div');
1385
- body.classList.add('vg-modal-body');
1386
- content.append(body);
1387
- dialog.append(content);
1388
- _element.append(dialog);
1389
- document.body.append(_element);
1390
- const modal = VGModal.getOrCreateInstance(_element, params);
1391
- (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_6__.execute)(callback, [modal]);
1392
- }
1393
- toggle(relatedTarget) {
1394
- return !this._isShown ? this.show(relatedTarget) : this.hide();
1395
- }
1396
- show(relatedTarget) {
1397
- const _this = this;
1398
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_6__.isDisabled)(_this._element)) return;
1399
- this._params = this._getParams(relatedTarget, this._params);
1400
- this._route();
1401
- const showEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__["default"].trigger(this._element, EVENT_KEY_SHOW, {
1402
- relatedTarget
1403
- });
1404
- if (showEvent.defaultPrevented) return;
1405
- this._isShown = true;
1406
- this._isTransitioning = true;
1407
- this._scrollBar.hide();
1408
- document.body.classList.add(CLASS_NAME_OPEN);
1409
- this._addFieldsInModal(relatedTarget);
1410
- this._adjustDialog();
1411
- _utils_js_components_backdrop__WEBPACK_IMPORTED_MODULE_2__["default"].show(() => this._showElement(relatedTarget));
1412
- }
1413
- hide() {
1414
- if (!this._isShown || this._isTransitioning) return;
1415
- const hideEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__["default"].trigger(this._element, EVENT_KEY_HIDE);
1416
- if (hideEvent.defaultPrevented) return;
1417
- this._isShown = false;
1418
- this._isTransitioning = true;
1419
- setTimeout(() => {
1420
- this._element.classList.remove(CLASS_NAME_SHOW);
1421
- this._queueCallback(() => this._hideModal(), this._element, this._isAnimatedFade());
1422
- }, this._params.animation.delay);
1423
- }
1424
- _hideModal() {
1425
- this._element.style.display = 'none';
1426
- this._element.setAttribute('aria-hidden', true);
1427
- this._element.removeAttribute('aria-modal');
1428
- this._element.removeAttribute('role');
1429
- this._isTransitioning = false;
1430
- _utils_js_components_backdrop__WEBPACK_IMPORTED_MODULE_2__["default"].hide(() => {
1431
- document.body.classList.remove(CLASS_NAME_OPEN);
1432
- this._resetAdjustments();
1433
- this._scrollBar.reset();
1434
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__["default"].trigger(this._element, EVENT_KEY_HIDDEN);
1435
- });
1436
- }
1437
- _showElement(relatedTarget) {
1438
- if (!document.body.contains(this._element)) {
1439
- document.body.append(this._element);
1440
- }
1441
- this._element.style.display = 'block';
1442
- this._element.removeAttribute('aria-hidden');
1443
- this._element.setAttribute('aria-modal', true);
1444
- this._element.setAttribute('role', 'dialog');
1445
- this._element.scrollTop = 0;
1446
- const modalBody = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].find(SELECTOR_MODAL_BODY, this._dialog);
1447
- if (modalBody) {
1448
- modalBody.scrollTop = 0;
1449
- }
1450
- (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_6__.reflow)(this._element);
1451
- this._element.classList.add(CLASS_NAME_SHOW);
1452
- const transitionComplete = () => {
1453
- this._isTransitioning = false;
1454
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__["default"].trigger(this._element, EVENT_KEY_SHOWN, {
1455
- relatedTarget
1456
- });
1457
- };
1458
- this._queueCallback(transitionComplete, this._dialog, this._isAnimatedFade());
1459
- }
1460
- _isAnimatedFade() {
1461
- return this._element.classList.contains(CLASS_NAME_FADE);
1462
- }
1463
- _adjustDialog() {
1464
- const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
1465
- const scrollbarWidth = this._scrollBar.getWidth();
1466
- const isBodyOverflowing = scrollbarWidth > 0;
1467
- if (isBodyOverflowing && !isModalOverflowing) {
1468
- const property = (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_6__.isRTL)() ? 'paddingLeft' : 'paddingRight';
1469
- this._element.style[property] = `${scrollbarWidth}px`;
1470
- }
1471
- if (!isBodyOverflowing && isModalOverflowing) {
1472
- const property = (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_6__.isRTL)() ? 'paddingRight' : 'paddingLeft';
1473
- this._element.style[property] = `${scrollbarWidth}px`;
1474
- }
1475
- }
1476
- _resetAdjustments() {
1477
- this._element.style.paddingLeft = '';
1478
- this._element.style.paddingRight = '';
1479
- }
1480
- _addEventListeners() {
1481
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__["default"].on(this._element, EVENT_KEY_KEYDOWN_DISMISS, event => {
1482
- if (event.key !== ESCAPE_KEY) return;
1483
- if (this._params.keyboard) {
1484
- this.hide();
1485
- return;
1486
- }
1487
- this._triggerBackdropTransition();
1488
- });
1489
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__["default"].on(window, EVENT_KEY_RESIZE, () => {
1490
- if (this._isShown && !this._isTransitioning) this._adjustDialog();
1491
- });
1492
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__["default"].on(this._element, EVENT_KEY_MOUSEDOWN_DISMISS, event => {
1493
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__["default"].one(this._element, EVENT_KEY_CLICK_DISMISS, event2 => {
1494
- if (this._element !== event.target || this._element !== event2.target) return;
1495
- if (this._params.backdrop === 'static') {
1496
- this._triggerBackdropTransition();
1497
- return;
1498
- }
1499
- if (this._params.backdrop) {
1500
- this.hide();
1501
- }
1502
- });
1503
- });
1504
- }
1505
- _triggerBackdropTransition() {
1506
- const hideEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__["default"].trigger(this._element, EVENT_KEY_HIDE_PREVENTED);
1507
- if (hideEvent.defaultPrevented) return;
1508
- const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
1509
- const initialOverflowY = this._element.style.overflowY;
1510
- if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) return;
1511
- if (!isModalOverflowing) this._element.style.overflowY = 'hidden';
1512
- this._element.classList.add(CLASS_NAME_STATIC);
1513
- this._queueCallback(() => {
1514
- this._element.classList.remove(CLASS_NAME_STATIC);
1515
- this._queueCallback(() => {
1516
- this._element.style.overflowY = initialOverflowY;
1517
- }, this._dialog);
1518
- }, this._dialog);
1519
- }
1520
- _addFieldsInModal(relatedTarget) {
1521
- this._params = this._getParams(relatedTarget, this._params);
1522
- if (!this._params.fields.length) return;
1523
- this._params.fields.forEach(function (item) {
1524
- if (!'name' in item && !'value' in item) return;
1525
- let elements = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].findAll('[data-' + item.name + ']');
1526
- if (!elements.length) return;
1527
- for (const elm of elements) {
1528
- switch (elm.tagName) {
1529
- case 'INPUT':
1530
- elm.value = item.value;
1531
- break;
1532
- case 'IMG':
1533
- _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_5__.Manipulator.set(elm, 'src', item.value);
1534
- break;
1535
- default:
1536
- elm.innerHTML = item.value;
1537
- }
1538
- }
1539
- });
1540
- }
1541
- }
1542
- (0,_module_fn__WEBPACK_IMPORTED_MODULE_7__.dismissTrigger)(VGModal);
1543
-
1544
- /**
1545
- * Data API implementation
1546
- */
1547
-
1548
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__["default"].on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
1549
- const target = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].getElementFromSelector(this);
1550
- if (['A', 'AREA'].includes(this.tagName)) event.preventDefault();
1551
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_4__["default"].one(target, EVENT_KEY_SHOW, showEvent => {
1552
- if (showEvent.defaultPrevented) return;
1553
- });
1554
- const alreadyOpen = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].find(OPEN_SELECTOR);
1555
- if (alreadyOpen) VGModal.getInstance(alreadyOpen).hide();
1556
- const data = VGModal.getOrCreateInstance(target);
1557
- data.toggle(this);
1558
- });
1559
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (VGModal);
1560
-
1561
- /***/ }),
1562
-
1563
- /***/ "./app/modules/vgnav/js/vgnav.js":
1564
- /*!***************************************!*\
1565
- !*** ./app/modules/vgnav/js/vgnav.js ***!
1566
- \***************************************/
1567
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1568
-
1569
- __webpack_require__.r(__webpack_exports__);
1570
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1571
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1572
- /* harmony export */ });
1573
- /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../base-module */ "./app/modules/base-module.js");
1574
- /* harmony import */ var _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/js/dom/selectors */ "./app/utils/js/dom/selectors.js");
1575
- /* harmony import */ var _utils_js_components_responsive__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/js/components/responsive */ "./app/utils/js/components/responsive.js");
1576
- /* harmony import */ var _module_fn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../module-fn */ "./app/modules/module-fn.js");
1577
- /* harmony import */ var _utils_js_functions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/js/functions */ "./app/utils/js/functions.js");
1578
- /* harmony import */ var _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../utils/js/dom/event */ "./app/utils/js/dom/event.js");
1579
- /* harmony import */ var _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../utils/js/dom/manipulator */ "./app/utils/js/dom/manipulator.js");
1580
-
1581
-
1582
-
1583
-
1584
-
1585
-
1586
-
1587
-
1588
- /**
1589
- * Constants
1590
- */
1591
- const NAME = 'nav';
1592
- const NAME_KEY = 'vg.nav';
1593
-
1594
- /**
1595
- * Constants Classes
1596
- */
1597
- const CLASS_NAME_SHOW = 'show';
1598
- const CLASS_NAME_FADE = 'fade';
1599
- const CLASS_NAME_ACTIVE = 'active';
1600
- const SELECTOR_DATA_TOGGLE = '.vg-nav a';
1601
-
1602
- /**
1603
- * Constants Events
1604
- */
1605
- const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
1606
- const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
1607
- const EVENT_KEY_SHOW = `${NAME_KEY}.show`;
1608
- const EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;
1609
- const EVENT_MOUSEOVER_DATA_API = `mouseover.${NAME_KEY}.data.api`;
1610
- const EVENT_MOUSEOUT_DATA_API = `mouseout.${NAME_KEY}.data.api`;
1611
- const EVENT_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
1612
- const EVENT_KEYUP_DATA_API = `keyup.${NAME_KEY}.data.api`;
1613
- const EVENT_RESIZE_DATA_API = `resize.${NAME_KEY}.data.api`;
1614
- class VGNav extends _base_module__WEBPACK_IMPORTED_MODULE_0__["default"] {
1615
- constructor(element, params = {}) {
1616
- super(element);
1617
- this._params = this._getParams(element, (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.mergeDeepObject)({
1618
- breakpoint: false,
1619
- placement: 'horizontal',
1620
- classes: {
1621
- hamburgerActive: 'vg-nav-hamburger-active',
1622
- hamburgerAlways: 'vg-nav-hamburger-always',
1623
- hamburger: 'vg-nav-hamburger',
1624
- container: 'vg-nav-container',
1625
- wrapper: 'vg-nav-wrapper',
1626
- active: 'vg-nav-active',
1627
- expand: 'vg-nav-expand',
1628
- cloned: 'vg-nav-cloned',
1629
- hover: 'vg-nav-hover',
1630
- flip: 'vg-nav-flip',
1631
- XXXL: 'vg-nav-xxxl',
1632
- XXL: 'vg-nav-xxl',
1633
- XL: 'vg-nav-xl',
1634
- LG: 'vg-nav-lg',
1635
- MD: 'vg-nav-md',
1636
- SM: 'vg-nav-sm',
1637
- XS: 'vg-nav-xs'
1638
- },
1639
- expand: true,
1640
- hover: false,
1641
- position: true,
1642
- collapse: true,
1643
- toggle: '<span class="default"></span>',
1644
- hamburger: {
1645
- enable: true,
1646
- always: false,
1647
- title: '',
1648
- body: null
1649
- },
1650
- callback: _utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.noop,
1651
- animation: true,
1652
- timeoutAnimation: 300,
1653
- ajax: {
1654
- route: '',
1655
- target: '',
1656
- method: 'get'
1657
- }
1658
- }, params));
1659
- this._navigation = null;
1660
- this.navigation = '.' + this._params.classes.wrapper;
1661
- this.movedLinks = [];
1662
- this.$links = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].findAll('.' + this._params.classes.wrapper + ' > li', this.navigation);
1663
- if (this._params.animation === false) {
1664
- this._params.timeoutAnimation = 10;
1665
- }
1666
- }
1667
- static get NAME() {
1668
- return NAME;
1669
- }
1670
- static get NAME_KEY() {
1671
- return NAME_KEY;
1672
- }
1673
- get navigation() {
1674
- return this._navigation;
1675
- }
1676
- set navigation(el) {
1677
- let elm = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].find(el, this._element);
1678
- if (!elm) return;
1679
- this._navigation = elm;
1680
- }
1681
- build() {
1682
- if (!this.navigation) return;
1683
- let params = this._params;
1684
-
1685
- // Вешаем основные классы
1686
- this._element.classList.add(params.classes.container);
1687
- this._element.classList.add('vg-nav-' + params.placement);
1688
-
1689
- // Если нужно оставить список меню или установить медиа точку
1690
- if (!params.breakpoint) {
1691
- params.expand = false;
1692
- }
1693
- if (!params.hamburger.always) {
1694
- if (!params.breakpoint || !params.expand) {
1695
- this._element.classList.add(params.classes.expand);
1696
- } else if (params.breakpoint !== false) {
1697
- this._element.classList.add('vg-nav-' + params.breakpoint);
1698
- }
1699
- } else {
1700
- this._element.classList.add(params.classes.hamburgerAlways);
1701
- }
1702
-
1703
- // Меню срабатывает при наведении, если это не мобильное устройство
1704
- if (params.hover) {
1705
- this._element.classList.add(params.classes.hover);
1706
- if (_utils_js_components_responsive__WEBPACK_IMPORTED_MODULE_2__["default"].checkMobileOrTablet()) {
1707
- this._element.classList.remove(params.classes.hover);
1708
- }
1709
- }
1710
-
1711
- // Устанавливаем гамбургер, если его нет в разметке
1712
- if (params.expand && !params.hamburger.body) {
1713
- let isHamburger = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].find('.' + params.classes.hamburger, this._element);
1714
- if (isHamburger === null) {
1715
- let mTitle = '',
1716
- hamburger = '<span class="' + params.classes.hamburger + '--lines"><span></span><span></span><span></span></span>';
1717
- if (params.hamburger.title) {
1718
- mTitle = '<span class="' + params.classes.hamburger + '--title">' + params.hamburger.title + '</span>';
1719
- }
1720
- if (params.hamburger.body !== null) {
1721
- hamburger = params.hamburger.body;
1722
- }
1723
- this._element.insertAdjacentHTML('afterbegin', '<a href="#sidebar-nav" class="' + params.classes.hamburger + '" data-vg-toggle="sidebar">' + mTitle + hamburger + '</a>');
1724
- }
1725
- }
1726
-
1727
- // Устанавливаем указатель переключателя
1728
- if (params.toggle) {
1729
- let $dropdown_a = [..._utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].findAll('.dropdown-mega > a, .dropdown > a', this._element)],
1730
- toggle = '<span class="toggle">' + params.toggle + '</span>';
1731
- if ($dropdown_a.length) {
1732
- $dropdown_a.forEach(function (elem) {
1733
- if (!elem.querySelector('.toggle') && !elem.closest('.dots')) {
1734
- elem.setAttribute('aria-expanded', 'false');
1735
- elem.insertAdjacentHTML('beforeend', toggle);
1736
- }
1737
- });
1738
- }
1739
- }
1740
- if (params.collapse && _utils_js_components_responsive__WEBPACK_IMPORTED_MODULE_2__["default"].check(this) && params.placement !== 'vertical') {
1741
- setCollapse(this);
1742
- }
1743
- if ('afterInit' in this._params.callback) {
1744
- (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.execute)(this._params.callback.afterInit, [this]);
1745
- }
1746
-
1747
- /**
1748
- * Функция сворачивания
1749
- * TODO Придумать что то с мега меню, которое уходит в подменю
1750
- * TODO Так же есть косяки при ресайзе
1751
- */
1752
- function setCollapse(_this) {
1753
- let width_navigation_responsive = _this.navigation.clientWidth,
1754
- width_all_links_responsive = 0,
1755
- $dots = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].find('.dots', _this.navigation),
1756
- _dots = (0,_module_fn__WEBPACK_IMPORTED_MODULE_3__.getSVG)('dots');
1757
- if (_this.$links.length) {
1758
- if ($dots) {
1759
- width_all_links_responsive = $dots.clientWidth;
1760
- } else {
1761
- let $a = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].find('a', _this.$links[0]),
1762
- $linkStyle = getComputedStyle($a),
1763
- paddingLeft = (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.normalizeData)($linkStyle.paddingLeft.slice(0, -2)),
1764
- paddingRight = (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.normalizeData)($linkStyle.paddingRight.slice(0, -2)),
1765
- padding = paddingLeft + paddingRight;
1766
-
1767
- // TODO не совсем верно, но мы точно знаем ширину точек в svg - 16px
1768
- width_all_links_responsive = padding + 16;
1769
- }
1770
- for (let $link of _this.$links) {
1771
- let width = $link.getBoundingClientRect().width;
1772
- width_all_links_responsive = width_all_links_responsive + width;
1773
- if (width_navigation_responsive < width_all_links_responsive) {
1774
- _this.movedLinks.push($link);
1775
- $link.remove();
1776
- } else {
1777
- if (_this.movedLinks.length) {
1778
- if ($dots) {
1779
- _this.navigation.insertBefore(_this.movedLinks[0], $dots);
1780
- } else {
1781
- _this.navigation.appendChild(_this.movedLinks[0]);
1782
- }
1783
- _this.movedLinks.splice(0, 1);
1784
- }
1785
- }
1786
- }
1787
- if (_this.movedLinks.length) {
1788
- if (!$dots) {
1789
- _this.navigation.insertAdjacentHTML('beforeend', '<li class="dropdown dots">' + '<a href="#" aria-expanded="false">' + _dots + '</a></li>');
1790
- }
1791
- } else {
1792
- if ($dots) {
1793
- $dots.remove();
1794
- }
1795
- }
1796
- let $d = _this.navigation.querySelector('.dots');
1797
- if ($d && _this.movedLinks.length) {
1798
- let $dropdown = $d.querySelector('ul');
1799
- if ($dropdown) {
1800
- for (let link of _this.movedLinks) {
1801
- $dropdown.prepend(link);
1802
- }
1803
- } else {
1804
- let $dropdown = document.createElement('ul');
1805
- $dropdown.classList.add('dropdown-content');
1806
- $dropdown.classList.add('right');
1807
- for (let link of _this.movedLinks) {
1808
- $dropdown.prepend(link);
1809
- }
1810
- $d.appendChild($dropdown);
1811
- }
1812
- }
1813
- }
1814
- }
1815
- }
1816
- show(relatedTarget) {
1817
- let target = relatedTarget.relatedTarget;
1818
- if (!target || (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.isDisabled)(target)) {
1819
- return;
1820
- }
1821
- if (!target.closest('.dropdown-content')) {
1822
- target.classList.add('first');
1823
- }
1824
- const showEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_5__["default"].trigger(target, EVENT_KEY_SHOW, {
1825
- relatedTarget
1826
- });
1827
- if (showEvent.defaultPrevented) return;
1828
- let drop = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].find('.dropdown-content', target),
1829
- link = target.firstElementChild;
1830
- if (link) link.setAttribute('aria-expanded', 'true');
1831
- drop.classList.add(CLASS_NAME_SHOW);
1832
- target.classList.add(CLASS_NAME_ACTIVE);
1833
- setDropPosition(drop);
1834
- const completeCallBack = () => {
1835
- drop.classList.add(CLASS_NAME_FADE);
1836
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_5__["default"].trigger(target, EVENT_KEY_SHOWN, relatedTarget);
1837
- };
1838
- this._queueCallback(completeCallBack, drop, true, 50);
1839
-
1840
- /**
1841
- *
1842
- * @param $drop
1843
- */
1844
- function setDropPosition($drop) {
1845
- let {
1846
- width,
1847
- right
1848
- } = $drop.getBoundingClientRect(),
1849
- window_width = window.innerWidth;
1850
- let N_right = window_width - right - width;
1851
- $drop.classList.remove('right');
1852
- $drop.classList.remove('left');
1853
- let $parent = $drop.closest('li'),
1854
- $ul = $parent.querySelectorAll('ul');
1855
- if (N_right > width) {
1856
- for (const $el of $ul) {
1857
- $el.classList.add('left');
1858
- }
1859
- } else {
1860
- for (const $el of $ul) {
1861
- $el.classList.add('right');
1862
- }
1863
- }
1864
- }
1865
- }
1866
- hide(relatedTarget) {
1867
- const _this = this;
1868
- if ('ontouchstart' in document.documentElement) {
1869
- for (const element of [].concat(...document.body.children)) {
1870
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_5__["default"].off(element, 'mouseover', _utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.noop);
1871
- }
1872
- }
1873
- let element = relatedTarget.relatedTarget;
1874
- if ('elm' in relatedTarget && relatedTarget.elm) {
1875
- element = relatedTarget.elm;
1876
- }
1877
- if (element) {
1878
- const hideEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_5__["default"].trigger(element, EVENT_KEY_HIDE);
1879
- if (hideEvent.defaultPrevented) return;
1880
- element.classList.remove(CLASS_NAME_ACTIVE);
1881
- if (element.classList.contains('first')) {
1882
- element.classList.remove('first');
1883
- }
1884
- [..._utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].findAll('.' + CLASS_NAME_SHOW, element)].forEach(function (el, index) {
1885
- el.classList.remove(CLASS_NAME_FADE);
1886
- let parent = el.closest('.dropdown');
1887
- if (parent.classList.contains(CLASS_NAME_ACTIVE)) {
1888
- parent.classList.remove(CLASS_NAME_ACTIVE);
1889
- }
1890
- let link = el.previousElementSibling;
1891
- if (link) link.setAttribute('aria-expanded', 'false');
1892
- if (index === 0) {
1893
- const completeCallback = () => {
1894
- el.classList.remove(CLASS_NAME_SHOW);
1895
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_5__["default"].trigger(el, EVENT_KEY_HIDDEN, relatedTarget);
1896
- };
1897
- _this._queueCallback(completeCallback, el, true, 500);
1898
- }
1899
- });
1900
- }
1901
- }
1902
-
1903
- /**
1904
- * TODO если на странице несколько навигаций, то есть косяки
1905
- * @param element
1906
- * @param params
1907
- */
1908
- static init(element, params = {}) {
1909
- const instance = VGNav.getOrCreateInstance(element, params);
1910
- instance.build();
1911
- let drops = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].findAll('.dropdown', instance._navigation);
1912
- if (instance._params.hover) {
1913
- [...drops].forEach(function (el) {
1914
- let currentElem = null;
1915
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_5__["default"].on(el, EVENT_MOUSEOVER_DATA_API, function (event) {
1916
- if (currentElem) return;
1917
- VGNav.hideOpenDrops(event);
1918
- let target = event.target.closest('.dropdown');
1919
- if (!target) return;
1920
- if (!instance.navigation.contains(target)) return;
1921
- currentElem = target;
1922
- let relatedTarget = {
1923
- relatedTarget: target
1924
- };
1925
- instance.show(relatedTarget);
1926
- });
1927
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_5__["default"].on(el, EVENT_MOUSEOUT_DATA_API, function (event) {
1928
- if (!currentElem) return;
1929
- let relatedTarget = event.relatedTarget.closest('.dropdown'),
1930
- elm = currentElem;
1931
- while (relatedTarget) {
1932
- if (relatedTarget === currentElem) return;
1933
- relatedTarget = relatedTarget.parentNode;
1934
- }
1935
- currentElem = null;
1936
- instance.hide({
1937
- relatedTarget: relatedTarget,
1938
- elm: elm
1939
- });
1940
- });
1941
- });
1942
- } else {
1943
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_5__["default"].on(document, EVENT_KEYUP_DATA_API, VGNav.clearDrops);
1944
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_5__["default"].on(document, EVENT_CLICK_DATA_API, VGNav.clearDrops);
1945
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_5__["default"].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
1946
- if (!_utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_6__.Manipulator.has(this, 'aria-expanded')) {
1947
- return;
1948
- }
1949
- if ('click' in instance._params.callback) {
1950
- (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.execute)(instance._params.callback.click, [this]);
1951
- }
1952
- event.preventDefault();
1953
- let self = this.closest('.vg-nav'),
1954
- isFirst = self.querySelector('.first');
1955
- let target = this.closest('.dropdown');
1956
- if (!target) return;
1957
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.isDisabled)(target) && !(0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_4__.isVisible)(target)) {
1958
- return;
1959
- }
1960
- if (isFirst && this.closest('.first')) {
1961
- if (target.classList.contains('active')) {
1962
- instance.hide({
1963
- relatedTarget: target
1964
- });
1965
- return;
1966
- }
1967
- } else {
1968
- [..._utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].findAll('.active', self)].forEach(function (el) {
1969
- if (el && el !== target) {
1970
- instance.hide({
1971
- relatedTarget: el
1972
- });
1973
- }
1974
- });
1975
- }
1976
- instance.show({
1977
- relatedTarget: target
1978
- });
1979
- });
1980
- }
1981
- const vgNavSidebar = document.getElementById('sidebar-nav');
1982
- let hamburger = instance._element.querySelector('.' + instance._params.classes.hamburger);
1983
- if (vgNavSidebar && hamburger) {
1984
- vgNavSidebar.addEventListener('vg.sidebar.show', function () {
1985
- hamburger.classList.add(instance._params.classes.hamburgerActive);
1986
- });
1987
- vgNavSidebar.addEventListener('vg.sidebar.hide', function () {
1988
- hamburger.classList.remove(instance._params.classes.hamburgerActive);
1989
- });
1990
- }
1991
- }
1992
- static clearDrops(event) {
1993
- if (event.button === 2 || event.type === 'keyup' && event.key !== 'Tab') {
1994
- return;
1995
- }
1996
- VGNav.hideOpenDrops(event);
1997
- }
1998
- static hideOpenDrops(event) {
1999
- const openToggles = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].findAll('.dropdown:not(.disabled):not(:disabled).active');
2000
- for (const toggle of openToggles) {
2001
- const context = VGNav.getInstance(toggle.closest('.vg-nav'));
2002
- if (!context) continue;
2003
- if (event.target.closest('.first')) {
2004
- return;
2005
- }
2006
- const relatedTarget = {
2007
- relatedTarget: toggle
2008
- };
2009
- if (event.type === 'click') {
2010
- relatedTarget.clickEvent = event;
2011
- }
2012
- context.hide(relatedTarget);
2013
- }
2014
- }
2015
- }
2016
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_5__["default"].on(window, EVENT_RESIZE_DATA_API, function (event) {
2017
- const instance = VGNav.getOrCreateInstance('.vg-nav', {});
2018
- instance.build();
2019
- });
2020
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (VGNav);
2021
-
2022
- /***/ }),
2023
-
2024
- /***/ "./app/modules/vgrollup/js/vgrollup.js":
2025
- /*!*********************************************!*\
2026
- !*** ./app/modules/vgrollup/js/vgrollup.js ***!
2027
- \*********************************************/
2028
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2029
-
2030
- __webpack_require__.r(__webpack_exports__);
2031
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2032
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2033
- /* harmony export */ });
2034
- /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../base-module */ "./app/modules/base-module.js");
2035
- /* harmony import */ var _utils_js_functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/js/functions */ "./app/utils/js/functions.js");
2036
- /* harmony import */ var _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/js/dom/event */ "./app/utils/js/dom/event.js");
2037
- /* harmony import */ var _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../utils/js/dom/selectors */ "./app/utils/js/dom/selectors.js");
2038
- /* harmony import */ var _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/js/dom/manipulator */ "./app/utils/js/dom/manipulator.js");
2039
-
2040
-
2041
-
2042
-
2043
-
2044
-
2045
- /**
2046
- * Constants
2047
- */
2048
- const NAME = 'rollup';
2049
- const NAME_KEY = 'vg.rollup';
2050
- const CLASS_NAME_SHOW = 'show';
2051
- const CLASS_NAME_HIDE = 'd-none';
2052
- const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="rollup"]';
2053
- const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
2054
- const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
2055
- const EVENT_KEY_SHOW = `${NAME_KEY}.show`;
2056
- const EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;
2057
- const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
2058
- class VGRollup extends _base_module__WEBPACK_IMPORTED_MODULE_0__["default"] {
2059
- constructor(element, params = {}) {
2060
- super(element, params);
2061
- this._params = this._getParams(element, (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.mergeDeepObject)({}, params));
2062
- }
2063
- static get NAME() {
2064
- return NAME;
2065
- }
2066
- static get NAME_KEY() {
2067
- return NAME_KEY;
2068
- }
2069
- build() {}
2070
- toggle(relatedTarget) {
2071
- return !this._isShown() ? this.show(relatedTarget) : this.hide();
2072
- }
2073
- show(relatedTarget) {}
2074
- _isShown() {
2075
- return this._element.classList.contains(CLASS_NAME_SHOW);
2076
- }
2077
-
2078
- /**
2079
- * Инициализация
2080
- * @param element
2081
- * @param params
2082
- */
2083
- static init(element, params = {}) {
2084
- const instance = VGRollup.getOrCreateInstance(element, params);
2085
- instance.toggle();
2086
- }
2087
- }
2088
-
2089
- /**
2090
- * Data API implementation
2091
- */
2092
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
2093
- const target = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_3__["default"].getElementFromSelector(this);
2094
- if (!target) return;
2095
- if (['A', 'AREA'].includes(this.tagName)) {
2096
- event.preventDefault();
2097
- }
2098
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.isDisabled)(this)) {
2099
- return;
2100
- }
2101
- this.setAttribute('aria-expanded', true);
2102
- const data = VGRollup.getOrCreateInstance(target);
2103
- data.toggle(this);
2104
- });
2105
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (VGRollup);
2106
-
2107
- /***/ }),
2108
-
2109
- /***/ "./app/modules/vgselect/js/vgselect.js":
2110
- /*!*********************************************!*\
2111
- !*** ./app/modules/vgselect/js/vgselect.js ***!
2112
- \*********************************************/
2113
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2114
-
2115
- __webpack_require__.r(__webpack_exports__);
2116
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2117
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2118
- /* harmony export */ });
2119
- /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../base-module */ "./app/modules/base-module.js");
2120
- /* harmony import */ var _utils_js_functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/js/functions */ "./app/utils/js/functions.js");
2121
- /* harmony import */ var _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/js/dom/manipulator */ "./app/utils/js/dom/manipulator.js");
2122
- /* harmony import */ var _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../utils/js/dom/event */ "./app/utils/js/dom/event.js");
2123
-
2124
-
2125
-
2126
-
2127
-
2128
- /**
2129
- * Constants
2130
- */
2131
- const NAME = 'select';
2132
- const NAME_KEY = 'vg.select';
2133
- const CLASS_NAME_CONTAINER = 'vg-select';
2134
- const CLASS_NAME_DROPDOWN = 'vg-select-dropdown';
2135
- const CLASS_NAME_LIST = 'vg-select-list';
2136
- const CLASS_NAME_OPTION = 'vg-select-list--option';
2137
- const CLASS_NAME_OPTGROUP = 'vg-select-list--optgroup';
2138
- const CLASS_NAME_OPTGROUP_TITLE = 'vg-select-list--optgroup-title';
2139
- const CLASS_NAME_CURRENT = 'vg-select-current';
2140
- const CLASS_NAME_SEARCH = 'vg-select-search';
2141
- const CLASS_NAME_SELECTED = 'selected';
2142
- const EVENT_KEY_CHANGE = `${NAME_KEY}.change`;
2143
- let observerTimout;
2144
- class VGSelect extends _base_module__WEBPACK_IMPORTED_MODULE_0__["default"] {
2145
- constructor(element, params = {}) {
2146
- super(element, params);
2147
- this._params = this._getParams(element, (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.mergeDeepObject)({
2148
- search: false
2149
- }, params));
2150
- }
2151
- static get NAME() {
2152
- return NAME;
2153
- }
2154
- static get NAME_KEY() {
2155
- return NAME_KEY;
2156
- }
2157
- build(isRebuild, elm = null) {
2158
- const _this = this;
2159
- let element = this._element;
2160
- if (elm) element = elm;
2161
- if (element.dataset?.inited === 'true' && !isRebuild) {
2162
- return;
2163
- } else if (isRebuild) {
2164
- _this.destroy(element);
2165
- }
2166
- element.parentElement.style.position = 'relative';
2167
- let option_selected = element.options[element.selectedIndex].innerText,
2168
- options = element.options;
2169
-
2170
- // Создаем основной элемент с классами селекта
2171
- let classes = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_2__.Manipulator.get(element, 'class'),
2172
- select = document.createElement('div');
2173
- classes = classes.split(' ');
2174
- for (const _class of classes) {
2175
- select.classList.add(_class);
2176
- }
2177
- if (_utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_2__.Manipulator.has(element, 'disabled')) select.classList.add('disabled');
2178
- let elData = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_2__.Manipulator.get(element);
2179
- if (!(0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.isEmptyObj)(elData)) {
2180
- for (const key of Object.keys(elData)) {
2181
- _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_2__.Manipulator.set(select, 'data-' + key, elData[key]);
2182
- }
2183
- }
2184
-
2185
- // Создаем элемент с отображением выбранного варианта
2186
- let current = document.createElement('div');
2187
- current.classList.add(CLASS_NAME_CURRENT);
2188
- current.innerText = option_selected.trim();
2189
- select.append(current);
2190
-
2191
- // Создаем элемент выпадающего списка
2192
- let dropdown = document.createElement('div');
2193
- dropdown.classList.add(CLASS_NAME_DROPDOWN);
2194
- select.append(dropdown);
2195
-
2196
- // Создаем список и варианты селекта
2197
- let list = document.createElement('ul');
2198
- list.classList.add(CLASS_NAME_LIST);
2199
- let optGroup = element.querySelectorAll('optgroup');
2200
- if (optGroup.length) {
2201
- let isSelected = false;
2202
- [...optGroup].forEach(function (el) {
2203
- let olOptGroup = document.createElement('ol');
2204
- olOptGroup.classList.add(CLASS_NAME_OPTGROUP);
2205
- let liLabel = document.createElement('li');
2206
- liLabel.innerHTML = el.label.trim();
2207
- liLabel.classList.add(CLASS_NAME_OPTGROUP_TITLE);
2208
- olOptGroup.prepend(liLabel);
2209
- let optGroupOptions = el.querySelectorAll('option');
2210
- createLi(optGroupOptions, olOptGroup, isSelected);
2211
- list.append(olOptGroup);
2212
- isSelected = true;
2213
- });
2214
- } else {
2215
- let isSelected = false;
2216
- createLi(options, list, isSelected);
2217
- }
2218
- function createLi(options, list, isSelected) {
2219
- let i = 0;
2220
- for (const option of options) {
2221
- let li = document.createElement('li');
2222
- li.innerHTML = option.innerHTML.trim().replace(/<\/[^>]+(>|$)/g, "");
2223
- li.dataset.value = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_2__.Manipulator.get(option, 'value');
2224
- li.classList.add(CLASS_NAME_OPTION);
2225
- let liData = _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_2__.Manipulator.get(option);
2226
- if (!(0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.isEmptyObj)(liData)) {
2227
- for (const key of Object.keys(liData)) {
2228
- _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_2__.Manipulator.set(li, 'data-' + key, liData[key]);
2229
- }
2230
- }
2231
- if (i === element.selectedIndex && !isSelected) {
2232
- li.classList.add('selected');
2233
- }
2234
- if (_utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_2__.Manipulator.has(option, 'disabled')) li.classList.add('disabled');
2235
- if (_utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_2__.Manipulator.has(option, 'hidden')) li.classList.add('hidden');
2236
- list.append(li);
2237
- i++;
2238
- }
2239
- }
2240
- dropdown.append(list);
2241
-
2242
- // Добавляем все созданный контейнер после селекта
2243
- element.insertAdjacentElement('afterend', select);
2244
-
2245
- // помечаем элемент инициализированным
2246
- element.dataset.inited = 'true';
2247
- if (_this._params.search) {
2248
- this.search(select);
2249
- }
2250
- this._addEventListeners(select);
2251
- }
2252
- destroy(select) {
2253
- let element = select.nextElementSibling;
2254
- if (element) {
2255
- if (element.classList.contains(CLASS_NAME_CONTAINER)) {
2256
- element.remove();
2257
- select.selectedIndex = 0;
2258
- [...select.querySelectorAll('option')].forEach(function (el, index) {
2259
- if (el.hasAttribute('selected')) {
2260
- select.selectedIndex = index;
2261
- }
2262
- });
2263
- }
2264
- }
2265
- }
2266
- refresh(select) {
2267
- const _this = this;
2268
- let observer = new MutationObserver(() => {
2269
- clearTimeout(observerTimout);
2270
- observerTimout = setTimeout(() => {
2271
- _this.build(true, select);
2272
- }, 100);
2273
- });
2274
- observer.observe(select, {
2275
- attributeFilter: ['disabled', 'required', 'style', 'hidden'],
2276
- childList: true,
2277
- subtree: true,
2278
- characterDataOldValue: true
2279
- });
2280
- }
2281
- search(select) {
2282
- const _this = this;
2283
- let dropdown = select.querySelector('.' + CLASS_NAME_DROPDOWN);
2284
- let search_container = document.createElement('div');
2285
- search_container.classList.add(CLASS_NAME_SEARCH);
2286
- let input = document.createElement('input');
2287
- input.setAttribute('name', 'vg-select-search');
2288
- input.setAttribute('type', 'text');
2289
- input.setAttribute('placeholder', 'Поиск...');
2290
- search_container.append(input);
2291
- dropdown.prepend(search_container);
2292
- search_container.querySelector('[name=vg-select-search]').addEventListener('keyup', e => {
2293
- e.preventDefault();
2294
- let el = e.target;
2295
- let selectList = el?.closest('.' + CLASS_NAME_DROPDOWN).querySelector('.' + CLASS_NAME_LIST);
2296
- if (selectList) {
2297
- let options = [...selectList.querySelectorAll('.' + CLASS_NAME_OPTION)],
2298
- optionsGroup = [...selectList.querySelectorAll('.' + CLASS_NAME_OPTGROUP)],
2299
- value = el?.value;
2300
- options = options.concat(optionsGroup);
2301
- for (const option of options) {
2302
- _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_2__.Manipulator.show(option);
2303
- }
2304
- if (value.length) {
2305
- value = value.trim();
2306
- value = value.toLowerCase();
2307
- value = (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.transliterate)(value, true);
2308
- for (const option of options) {
2309
- let text = option.innerText.toLowerCase();
2310
- if (text.indexOf(value) === -1) _utils_js_dom_manipulator__WEBPACK_IMPORTED_MODULE_2__.Manipulator.hide(option);
2311
- }
2312
- }
2313
- }
2314
- });
2315
- }
2316
- dispose() {
2317
- super.dispose();
2318
- }
2319
- _addEventListeners(select) {
2320
- const _this = this;
2321
- select.querySelector('.' + CLASS_NAME_CURRENT).onclick = function (e) {
2322
- let el = e.target,
2323
- container = el.closest('.' + CLASS_NAME_CONTAINER);
2324
- let selects = document.querySelectorAll('.' + CLASS_NAME_CONTAINER);
2325
- if (selects.length) {
2326
- for (const els of selects) {
2327
- if (els !== container) {
2328
- els?.classList.remove('show');
2329
- }
2330
- }
2331
- }
2332
- if (container.classList.contains('show')) {
2333
- container.classList.remove('show');
2334
- } else {
2335
- container.classList.add('show');
2336
- if (_this._params.search) {
2337
- let input = container.querySelector('input');
2338
- if (input) input.focus();
2339
- }
2340
- }
2341
- return false;
2342
- };
2343
- select.querySelectorAll('.' + CLASS_NAME_OPTION).forEach(option => {
2344
- option.addEventListener('click', e => {
2345
- e.preventDefault();
2346
- let el = e.target;
2347
- if (!el.classList.contains('disabled')) {
2348
- let container = el.closest('.' + CLASS_NAME_CONTAINER),
2349
- options = container.querySelectorAll('.' + CLASS_NAME_OPTION);
2350
- if (options.length) {
2351
- for (const option of options) {
2352
- option.classList.remove('selected');
2353
- }
2354
- }
2355
- el.classList.add('selected');
2356
- container.querySelector('.' + CLASS_NAME_CURRENT).innerText = el.innerText;
2357
- container.classList.remove('show');
2358
- let select = container.previousSibling;
2359
- select.value = el.dataset.value;
2360
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_3__["default"].trigger(select, EVENT_KEY_CHANGE);
2361
- }
2362
- });
2363
- });
2364
- window.addEventListener('click', function (e) {
2365
- if (!e?.target.closest('.' + CLASS_NAME_CONTAINER)) {
2366
- let selects = document.querySelectorAll('.' + CLASS_NAME_CONTAINER);
2367
- if (selects.length) {
2368
- for (const el of selects) {
2369
- el?.classList.remove('show');
2370
- }
2371
- }
2372
- }
2373
- });
2374
- [...document.querySelectorAll('form')].forEach(function (form) {
2375
- form.addEventListener("reset", function () {
2376
- form.querySelectorAll('select.vg-select').forEach(function (select) {
2377
- VGSelect.init(select, {}, true);
2378
- });
2379
- });
2380
- });
2381
- }
2382
-
2383
- /**
2384
- * Инициализация
2385
- * @param element
2386
- * @param params
2387
- * @param isRebuild
2388
- */
2389
- static init(element, params = {}, isRebuild = false) {
2390
- const instance = VGSelect.getOrCreateInstance(element, params);
2391
- instance.build(isRebuild);
2392
- }
2393
- }
2394
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (VGSelect);
2395
-
2396
- /***/ }),
2397
-
2398
- /***/ "./app/modules/vgsidebar/js/vgsidebar.js":
2399
- /*!***********************************************!*\
2400
- !*** ./app/modules/vgsidebar/js/vgsidebar.js ***!
2401
- \***********************************************/
2402
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2403
-
2404
- __webpack_require__.r(__webpack_exports__);
2405
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2406
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2407
- /* harmony export */ });
2408
- /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../base-module */ "./app/modules/base-module.js");
2409
- /* harmony import */ var _utils_js_functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/js/functions */ "./app/utils/js/functions.js");
2410
- /* harmony import */ var _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/js/dom/event */ "./app/utils/js/dom/event.js");
2411
- /* harmony import */ var _module_fn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../module-fn */ "./app/modules/module-fn.js");
2412
- /* harmony import */ var _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/js/dom/selectors */ "./app/utils/js/dom/selectors.js");
2413
- /* harmony import */ var _utils_js_components_backdrop__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../utils/js/components/backdrop */ "./app/utils/js/components/backdrop.js");
2414
- /* harmony import */ var _utils_js_components_overflow__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../utils/js/components/overflow */ "./app/utils/js/components/overflow.js");
2415
-
2416
-
2417
-
2418
-
2419
-
2420
-
2421
-
2422
-
2423
- /**
2424
- * Constants
2425
- */
2426
- const NAME = 'sidebar';
2427
- const NAME_KEY = 'vg.sidebar';
2428
- const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="sidebar"]';
2429
- const CLASS_NAME_SHOW = 'show';
2430
- const CLASS_NAME_OPEN = 'vg-sidebar-open';
2431
- const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
2432
- const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
2433
- const EVENT_KEY_SHOW = `${NAME_KEY}.show`;
2434
- const EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;
2435
- const EVENT_KEY_KEYDOWN_DISMISS = `keydown.dismiss.${NAME_KEY}`;
2436
- const EVENT_KEY_HIDE_PREVENTED = `hidePrevented.${NAME_KEY}`;
2437
- const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
2438
- class VGSidebar extends _base_module__WEBPACK_IMPORTED_MODULE_0__["default"] {
2439
- constructor(element, params = {}) {
2440
- super(element, params);
2441
- this._params = this._getParams(element, (0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.mergeDeepObject)({
2442
- backdrop: true,
2443
- overflow: true,
2444
- keyboard: true,
2445
- animation: {
2446
- enable: false,
2447
- in: 'animate__rollIn',
2448
- out: 'animate__rollOut',
2449
- delay: 800
2450
- },
2451
- ajax: {
2452
- route: '',
2453
- target: '',
2454
- method: 'get'
2455
- }
2456
- }, params));
2457
- this._addEventListeners();
2458
- this._dismissElement();
2459
- this._params.animation.delay = !this._params.animation.enable ? 0 : this._params.animation.delay;
2460
- this._animation(this._element, VGSidebar.NAME_KEY, this._params.animation);
2461
- }
2462
- static get NAME() {
2463
- return NAME;
2464
- }
2465
- static get NAME_KEY() {
2466
- return NAME_KEY;
2467
- }
2468
- toggle(relatedTarget) {
2469
- return !this._isShown() ? this.show(relatedTarget) : this.hide();
2470
- }
2471
- show(relatedTarget) {
2472
- const _this = this;
2473
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.isDisabled)(_this._element)) return;
2474
- _this._params = _this._getParams(relatedTarget, _this._params);
2475
- _this._route();
2476
- const showEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(_this._element, EVENT_KEY_SHOW, {
2477
- relatedTarget
2478
- });
2479
- if (showEvent.defaultPrevented) return;
2480
- if (_this._params.backdrop) {
2481
- _utils_js_components_backdrop__WEBPACK_IMPORTED_MODULE_5__["default"].show();
2482
- }
2483
- if (_this._params.overflow) {
2484
- _utils_js_components_overflow__WEBPACK_IMPORTED_MODULE_6__["default"].append();
2485
- }
2486
- _this._element.classList.add(CLASS_NAME_SHOW);
2487
- document.body.classList.add(CLASS_NAME_OPEN);
2488
- const completeCallBack = () => {
2489
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].on(_utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_4__["default"].find('.vg-backdrop'), 'mousedown.vg.backdrop', function () {
2490
- _this.hide();
2491
- });
2492
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(_this._element, EVENT_KEY_SHOWN, {
2493
- relatedTarget
2494
- });
2495
- };
2496
- _this._queueCallback(completeCallBack, _this._element, true, 50);
2497
- }
2498
- hide() {
2499
- const _this = this;
2500
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.isDisabled)(_this._element)) return;
2501
- const hideEvent = _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(this._element, EVENT_KEY_HIDE);
2502
- if (hideEvent.defaultPrevented) return;
2503
- if (_this._params.backdrop) {
2504
- _utils_js_components_backdrop__WEBPACK_IMPORTED_MODULE_5__["default"].hide(function () {
2505
- if (_this._params.overflow) {
2506
- _utils_js_components_overflow__WEBPACK_IMPORTED_MODULE_6__["default"].destroy();
2507
- }
2508
- });
2509
- }
2510
- if (_this._params.overflow) {
2511
- _utils_js_components_overflow__WEBPACK_IMPORTED_MODULE_6__["default"].destroy();
2512
- }
2513
- setTimeout(() => {
2514
- _this._element.setAttribute('aria-expanded', false);
2515
- _this._element.classList.remove(CLASS_NAME_SHOW);
2516
- const completeCallback = () => {
2517
- document.body.classList.remove(CLASS_NAME_OPEN);
2518
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(this._element, EVENT_KEY_HIDDEN);
2519
- };
2520
- this._queueCallback(completeCallback, this._element, true);
2521
- }, this._params.animation.delay);
2522
- }
2523
- dispose() {
2524
- super.dispose();
2525
- }
2526
- _isShown() {
2527
- return this._element.classList.contains(CLASS_NAME_SHOW);
2528
- }
2529
- _addEventListeners() {
2530
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].on(document, EVENT_KEY_KEYDOWN_DISMISS, event => {
2531
- if (event.key !== 'Escape') return;
2532
- if (this._params.keyboard) {
2533
- this.hide();
2534
- return;
2535
- }
2536
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].trigger(this._element, EVENT_KEY_HIDE_PREVENTED);
2537
- });
2538
- }
2539
- }
2540
- (0,_module_fn__WEBPACK_IMPORTED_MODULE_3__.dismissTrigger)(VGSidebar);
2541
-
2542
- /**
2543
- * Data API implementation
2544
- */
2545
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
2546
- const target = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_4__["default"].getElementFromSelector(this);
2547
- if (['A', 'AREA'].includes(this.tagName)) {
2548
- event.preventDefault();
2549
- }
2550
- if ((0,_utils_js_functions__WEBPACK_IMPORTED_MODULE_1__.isDisabled)(this)) {
2551
- return;
2552
- }
2553
- this.setAttribute('aria-expanded', true);
2554
- _utils_js_dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].one(target, EVENT_KEY_HIDDEN, () => {
2555
- //if (isVisible(this)) this.focus();
2556
- this.setAttribute('aria-expanded', false);
2557
- });
2558
- const alreadyOpen = _utils_js_dom_selectors__WEBPACK_IMPORTED_MODULE_4__["default"].find('.vg-sidebar.show');
2559
- if (alreadyOpen && alreadyOpen !== target) {
2560
- VGSidebar.getInstance(alreadyOpen).hide();
2561
- }
2562
- const data = VGSidebar.getOrCreateInstance(target);
2563
- data.toggle(this);
2564
- });
2565
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (VGSidebar);
2566
-
2567
- /***/ }),
2568
-
2569
- /***/ "./app/utils/js/components/animation.js":
2570
- /*!**********************************************!*\
2571
- !*** ./app/utils/js/components/animation.js ***!
2572
- \**********************************************/
2573
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2574
-
2575
- __webpack_require__.r(__webpack_exports__);
2576
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2577
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2578
- /* harmony export */ });
2579
- /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../functions */ "./app/utils/js/functions.js");
2580
- /* harmony import */ var _dom_event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom/event */ "./app/utils/js/dom/event.js");
2581
-
2582
-
2583
-
2584
- /**
2585
- * Классы для анимаций смотрим здесь
2586
- * https://animate.style/
2587
- *
2588
- * Работает с модулями у которых есть события show, hide, hidden
2589
- */
2590
- class Animation {
2591
- constructor(element, key, params = {}) {
2592
- this._params = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.mergeDeepObject)({
2593
- enable: false,
2594
- in: 'animate__backInUp',
2595
- out: 'animate__backOutUp',
2596
- delay: 0
2597
- }, params);
2598
- this.classes = {
2599
- animated: 'animate__animated'
2600
- };
2601
- if (!this._params.enable) return;
2602
- if (!(0,_functions__WEBPACK_IMPORTED_MODULE_0__.isElement)(element)) return;
2603
- this._element = element;
2604
- this._name_key = key;
2605
- if (!this._element.classList.contains(this.classes.animated)) {
2606
- this._element.classList.add(this.classes.animated);
2607
- }
2608
- this._triggers();
2609
- }
2610
- _triggers() {
2611
- _dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].on(this._element, this._name_key + '.show', () => {
2612
- this._element.classList.remove(this._params.out);
2613
- this._element.classList.add(this._params.in);
2614
- });
2615
- _dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].on(this._element, this._name_key + '.hide', () => {
2616
- this._element.classList.remove(this._params.in);
2617
- this._element.classList.add(this._params.out);
2618
- });
2619
- _dom_event__WEBPACK_IMPORTED_MODULE_1__["default"].on(this._element, this._name_key + '.hidden', () => {
2620
- this._element.classList.remove(this._params.out);
2621
- });
2622
- }
2623
- }
2624
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Animation);
2625
-
2626
- /***/ }),
2627
-
2628
- /***/ "./app/utils/js/components/backdrop.js":
2629
- /*!*********************************************!*\
2630
- !*** ./app/utils/js/components/backdrop.js ***!
2631
- \*********************************************/
2632
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2633
-
2634
- __webpack_require__.r(__webpack_exports__);
2635
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2636
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2637
- /* harmony export */ });
2638
- /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../functions */ "./app/utils/js/functions.js");
2639
- /* harmony import */ var _dom_selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom/selectors */ "./app/utils/js/dom/selectors.js");
2640
- /* harmony import */ var _dom_event__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom/event */ "./app/utils/js/dom/event.js");
2641
- /* harmony import */ var _overflow__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./overflow */ "./app/utils/js/components/overflow.js");
2642
-
2643
-
2644
-
2645
-
2646
- const NAME = 'backdrop';
2647
- const CLASS_NAME = 'vg-backdrop';
2648
- const CLASS_NAME_FADE = 'fade';
2649
- const EVENT_MOUSEDOWN = `mousedown.vg.${NAME}`;
2650
- let backdrop_delay = 500;
2651
- class Backdrop {
2652
- static show(callback) {
2653
- Backdrop._append();
2654
- (0,_functions__WEBPACK_IMPORTED_MODULE_0__.execute)(callback);
2655
- }
2656
- static hide(callback) {
2657
- Backdrop._destroy();
2658
- (0,_functions__WEBPACK_IMPORTED_MODULE_0__.execute)(callback);
2659
- }
2660
- static _append() {
2661
- if (_dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].find('.' + CLASS_NAME)) {
2662
- return false;
2663
- }
2664
- let backdrop = document.createElement('div');
2665
- backdrop.classList.add(CLASS_NAME);
2666
- document.body.append(backdrop);
2667
- setTimeout(() => {
2668
- backdrop.classList.add(CLASS_NAME_FADE);
2669
- }, 50);
2670
- _dom_event__WEBPACK_IMPORTED_MODULE_2__["default"].on(backdrop, EVENT_MOUSEDOWN, () => {
2671
- Backdrop.hide();
2672
- _overflow__WEBPACK_IMPORTED_MODULE_3__["default"].destroy();
2673
- });
2674
- }
2675
- static _destroy() {
2676
- let element = _dom_selectors__WEBPACK_IMPORTED_MODULE_1__["default"].find('.' + CLASS_NAME);
2677
- if (!element) return;
2678
- element.classList.remove(CLASS_NAME_FADE);
2679
- setTimeout(() => {
2680
- element.remove();
2681
- }, backdrop_delay);
2682
- }
2683
- }
2684
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Backdrop);
2685
-
2686
- /***/ }),
2687
-
2688
- /***/ "./app/utils/js/components/overflow.js":
2689
- /*!*********************************************!*\
2690
- !*** ./app/utils/js/components/overflow.js ***!
2691
- \*********************************************/
2692
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2693
-
2694
- __webpack_require__.r(__webpack_exports__);
2695
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2696
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2697
- /* harmony export */ });
2698
- /* harmony import */ var _dom_manipulator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom/manipulator */ "./app/utils/js/dom/manipulator.js");
2699
-
2700
-
2701
- /**
2702
- * Класс Overflow
2703
- * Запрещает скроллинг и убирает его, компенсируя отступом
2704
- */
2705
-
2706
- class Overflow {
2707
- static append() {
2708
- document.body.style.paddingRight = getWidth() + 'px';
2709
- document.body.style.overflow = 'hidden';
2710
- function getWidth() {
2711
- const documentWidth = document.documentElement.clientWidth;
2712
- return Math.abs(window.innerWidth - documentWidth);
2713
- }
2714
- }
2715
- static destroy() {
2716
- document.body.style.overflow = '';
2717
- document.body.style.paddingRight = '';
2718
- let styles = _dom_manipulator__WEBPACK_IMPORTED_MODULE_0__.Manipulator.get(document.body, 'style');
2719
- if (!styles) _dom_manipulator__WEBPACK_IMPORTED_MODULE_0__.Manipulator.remove(document.body, 'style');
2720
- }
2721
- }
2722
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Overflow);
2723
-
2724
- /***/ }),
2725
-
2726
- /***/ "./app/utils/js/components/params.js":
2727
- /*!*******************************************!*\
2728
- !*** ./app/utils/js/components/params.js ***!
2729
- \*******************************************/
2730
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2731
-
2732
- __webpack_require__.r(__webpack_exports__);
2733
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2734
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2735
- /* harmony export */ });
2736
- /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../functions */ "./app/utils/js/functions.js");
2737
- /* harmony import */ var _dom_manipulator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom/manipulator */ "./app/utils/js/dom/manipulator.js");
2738
-
2739
-
2740
- class Params {
2741
- constructor(params, element = null) {
2742
- this._params = this.merge(params, element);
2743
- }
2744
- get() {
2745
- return this._params;
2746
- }
2747
- fromElement(element) {
2748
- return (0,_functions__WEBPACK_IMPORTED_MODULE_0__.isElement)(element) ? _dom_manipulator__WEBPACK_IMPORTED_MODULE_1__.Manipulator.get(element) : {};
2749
- }
2750
- merge(params, element) {
2751
- let mParams = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.mergeDeepObject)(params, this.fromElement(element));
2752
- for (let key in mParams) {
2753
- if (key.indexOf('-') !== -1) {
2754
- let keys = key.split('-'),
2755
- value = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.normalizeData)(mParams[key]);
2756
- if (keys[0] in mParams) {
2757
- if (keys[1] in mParams[keys[0]]) {
2758
- mParams[keys[0]][keys[1]] = value;
2759
- }
2760
- }
2761
- delete mParams[key];
2762
- }
2763
- }
2764
- if ('params' in mParams) {
2765
- mParams = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.mergeDeepObject)(mParams, mParams.params);
2766
- delete mParams.params;
2767
- }
2768
- return mParams;
2769
- }
2770
- }
2771
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Params);
2772
-
2773
- /***/ }),
2774
-
2775
- /***/ "./app/utils/js/components/placement.js":
2776
- /*!**********************************************!*\
2777
- !*** ./app/utils/js/components/placement.js ***!
2778
- \**********************************************/
2779
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2780
-
2781
- __webpack_require__.r(__webpack_exports__);
2782
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2783
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2784
- /* harmony export */ });
2785
- /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../functions */ "./app/utils/js/functions.js");
2786
-
2787
-
2788
- /**
2789
- * Класс Placement, определяет и устанавливает местоположение элемента на странице.
2790
- * TODO класс не дописан
2791
- */
2792
-
2793
- class Placement {
2794
- constructor(arg = {}) {
2795
- this.params = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.mergeDeepObject)({
2796
- element: null,
2797
- drop: null
2798
- }, arg);
2799
- }
2800
- _getPlacement() {
2801
- const _this = this;
2802
- const _parent = self => {
2803
- let parent = self.parentNode,
2804
- overflow = getComputedStyle(parent).overflow;
2805
- if (parent.tagName !== 'BODY') {
2806
- if (overflow === 'visible') {
2807
- _parent(parent);
2808
- } else {
2809
- return parent;
2810
- }
2811
- } else {
2812
- return null;
2813
- }
2814
- };
2815
- let isFixed = false,
2816
- top,
2817
- left,
2818
- bounds = _this.params.drop.getBoundingClientRect(),
2819
- parent = _this.params.element.getBoundingClientRect();
2820
- if (_parent(_this.params.element)) {
2821
- isFixed = true;
2822
- top = bounds.top;
2823
- left = bounds.left;
2824
- } else {
2825
- let styles = getComputedStyle(_this.params.drop);
2826
- top = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.normalizeData)(styles.top.slice(0, -2));
2827
- left = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.normalizeData)(styles.left.slice(0, -2));
2828
- }
2829
- if (bounds.left + bounds.width > window.innerWidth) {
2830
- left = parent.width - bounds.width;
2831
- }
2832
- return {
2833
- isFixed: isFixed,
2834
- top: top,
2835
- left: left
2836
- };
2837
- }
2838
- }
2839
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Placement);
2840
-
2841
- /***/ }),
2842
-
2843
- /***/ "./app/utils/js/components/responsive.js":
2844
- /*!***********************************************!*\
2845
- !*** ./app/utils/js/components/responsive.js ***!
2846
- \***********************************************/
2847
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2848
-
2849
- __webpack_require__.r(__webpack_exports__);
2850
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2851
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2852
- /* harmony export */ });
2853
- /**
2854
- * Класс Responsive, работает по таким же медиа точкам, что и bootstrap
2855
- * и определяет на тач устройства.
2856
- */
2857
-
2858
- class Responsive {
2859
- constructor() {
2860
- this.breakpoints = {
2861
- xs: 0,
2862
- sm: 576,
2863
- md: 768,
2864
- lg: 992,
2865
- xl: 1200,
2866
- xxl: 1400,
2867
- xxxl: 1600
2868
- };
2869
- }
2870
-
2871
- /**
2872
- * Если наша ширина экрана совпадает с диапазоном который указан в модуле выдаем true, иначе false
2873
- * @param module
2874
- * @returns {boolean}
2875
- */
2876
- static check(module) {
2877
- let instance = new this();
2878
- return instance.define(module);
2879
- }
2880
-
2881
- /**
2882
- * Проверяет на тач устройства. TODO не совсем правильно, надо сделать по-другому
2883
- * @returns {boolean}
2884
- */
2885
- static checkMobileOrTablet() {
2886
- let check = false;
2887
- (function (a) {
2888
- if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.slice(0, 4))) {
2889
- check = true;
2890
- }
2891
- })(navigator.userAgent || navigator.vendor || window.opera);
2892
- return check;
2893
- }
2894
- define(module) {
2895
- let windowWidth = window.innerWidth,
2896
- responsive_size = this._checkResponsiveClass(module),
2897
- breakpoints = this.breakpoints,
2898
- point = Object.keys(breakpoints).find(key => breakpoints[key] === responsive_size);
2899
- let keys = Object.keys(breakpoints),
2900
- loc = keys.indexOf(point);
2901
- return windowWidth >= breakpoints[keys[loc + 1]];
2902
- }
2903
- _checkResponsiveClass(module) {
2904
- let element = module._element,
2905
- params = module._params,
2906
- current_responsive_size = 0;
2907
- if (element.classList.contains(params.classes.XXXL)) {
2908
- current_responsive_size = this.breakpoints.xxxl;
2909
- } else if (element.classList.contains(params.classes.XXL)) {
2910
- current_responsive_size = this.breakpoints.xxl;
2911
- } else if (element.classList.contains(params.classes.XL)) {
2912
- current_responsive_size = this.breakpoints.xl;
2913
- } else if (element.classList.contains(params.classes.LG)) {
2914
- current_responsive_size = this.breakpoints.lg;
2915
- } else if (element.classList.contains(params.classes.MD)) {
2916
- current_responsive_size = this.breakpoints.md;
2917
- } else if (element.classList.contains(params.classes.SM)) {
2918
- current_responsive_size = this.breakpoints.sm;
2919
- } else if (element.classList.contains(params.classes.XS)) {
2920
- current_responsive_size = this.breakpoints.xs;
2921
- } else {
2922
- current_responsive_size = this.breakpoints.xs;
2923
- }
2924
- return current_responsive_size;
2925
- }
2926
- }
2927
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Responsive);
2928
-
2929
- /***/ }),
2930
-
2931
- /***/ "./app/utils/js/components/scrollbar.js":
2932
- /*!**********************************************!*\
2933
- !*** ./app/utils/js/components/scrollbar.js ***!
2934
- \**********************************************/
2935
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2936
-
2937
- __webpack_require__.r(__webpack_exports__);
2938
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2939
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2940
- /* harmony export */ });
2941
- /* harmony import */ var _dom_manipulator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom/manipulator */ "./app/utils/js/dom/manipulator.js");
2942
- /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../functions */ "./app/utils/js/functions.js");
2943
- /* harmony import */ var _dom_selectors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom/selectors */ "./app/utils/js/dom/selectors.js");
2944
- /**
2945
- * --------------------------------------------------------------------------
2946
- * Bootstrap util/scrollBar.js
2947
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2948
- * --------------------------------------------------------------------------
2949
- */
2950
-
2951
-
2952
-
2953
-
2954
-
2955
- /**
2956
- * Constants
2957
- */
2958
-
2959
- const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
2960
- const SELECTOR_STICKY_CONTENT = '.sticky-top';
2961
- const PROPERTY_PADDING = 'padding-right';
2962
- const PROPERTY_MARGIN = 'margin-right';
2963
-
2964
- /**
2965
- * Class definition
2966
- */
2967
-
2968
- class ScrollBarHelper {
2969
- constructor() {
2970
- this._element = document.body;
2971
- }
2972
-
2973
- // Public
2974
- getWidth() {
2975
- // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
2976
- const documentWidth = document.documentElement.clientWidth;
2977
- return Math.abs(window.innerWidth - documentWidth);
2978
- }
2979
- hide() {
2980
- const width = this.getWidth();
2981
- this._disableOverFlow();
2982
- // give padding to element to balance the hidden scrollbar width
2983
- this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
2984
- // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
2985
- this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
2986
- this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);
2987
- }
2988
- reset() {
2989
- this._resetElementAttributes(this._element, 'overflow');
2990
- this._resetElementAttributes(this._element, PROPERTY_PADDING);
2991
- this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
2992
- this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
2993
- }
2994
- isOverflowing() {
2995
- return this.getWidth() > 0;
2996
- }
2997
-
2998
- // Private
2999
- _disableOverFlow() {
3000
- this._saveInitialAttribute(this._element, 'overflow');
3001
- this._element.style.overflow = 'hidden';
3002
- }
3003
- _setElementAttributes(selector, styleProperty, callback) {
3004
- const scrollbarWidth = this.getWidth();
3005
- const manipulationCallBack = element => {
3006
- if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
3007
- return;
3008
- }
3009
- this._saveInitialAttribute(element, styleProperty);
3010
- const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
3011
- element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);
3012
- };
3013
- this._applyManipulationCallback(selector, manipulationCallBack);
3014
- }
3015
- _saveInitialAttribute(element, styleProperty) {
3016
- const actualValue = element.style.getPropertyValue(styleProperty);
3017
- if (actualValue) {
3018
- _dom_manipulator__WEBPACK_IMPORTED_MODULE_0__.Manipulator.get(element, styleProperty, actualValue);
3019
- }
3020
- }
3021
- _resetElementAttributes(selector, styleProperty) {
3022
- const manipulationCallBack = element => {
3023
- const value = _dom_manipulator__WEBPACK_IMPORTED_MODULE_0__.Manipulator.get(element, styleProperty);
3024
- // We only want to remove the property if the value is `null`; the value can also be zero
3025
- if (value === null) {
3026
- element.style.removeProperty(styleProperty);
3027
- return;
3028
- }
3029
- _dom_manipulator__WEBPACK_IMPORTED_MODULE_0__.Manipulator.remove(element, styleProperty);
3030
- element.style.setProperty(styleProperty, value);
3031
- };
3032
- this._applyManipulationCallback(selector, manipulationCallBack);
3033
- }
3034
- _applyManipulationCallback(selector, callBack) {
3035
- if ((0,_functions__WEBPACK_IMPORTED_MODULE_1__.isElement)(selector)) {
3036
- callBack(selector);
3037
- return;
3038
- }
3039
- for (const sel of _dom_selectors__WEBPACK_IMPORTED_MODULE_2__["default"].findAll(selector, this._element)) {
3040
- callBack(sel);
3041
- }
3042
- }
3043
- }
3044
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ScrollBarHelper);
3045
-
3046
- /***/ }),
3047
-
3048
- /***/ "./app/utils/js/dom/cookie.js":
3049
- /*!************************************!*\
3050
- !*** ./app/utils/js/dom/cookie.js ***!
3051
- \************************************/
3052
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3053
-
3054
- __webpack_require__.r(__webpack_exports__);
3055
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3056
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
3057
- /* harmony export */ });
3058
- /*! js-cookie v3.0.1 | MIT */
3059
-
3060
- function assign(target) {
3061
- for (let i = 1; i < arguments.length; i++) {
3062
- let source = arguments[i];
3063
- for (let key in source) {
3064
- target[key] = source[key];
3065
- }
3066
- }
3067
- return target;
3068
- }
3069
- let defaultConverter = {
3070
- read: function (value) {
3071
- if (value[0] === '"') {
3072
- value = value.slice(1, -1);
3073
- }
3074
- return value.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent);
3075
- },
3076
- write: function (value) {
3077
- return encodeURIComponent(value).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, decodeURIComponent);
3078
- }
3079
- };
3080
- function init(converter, defaultAttributes) {
3081
- function set(key, value, attributes) {
3082
- if (typeof document === 'undefined') {
3083
- return;
3084
- }
3085
- attributes = assign({}, defaultAttributes, attributes);
3086
- if (typeof attributes.expires === 'number') {
3087
- attributes.expires = new Date(Date.now() + attributes.expires * 864e5);
3088
- }
3089
- if (attributes.expires) {
3090
- attributes.expires = attributes.expires.toUTCString();
3091
- }
3092
- key = encodeURIComponent(key).replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent).replace(/[()]/g, escape);
3093
- let stringifiedAttributes = '';
3094
- for (let attributeName in attributes) {
3095
- if (!attributes[attributeName]) {
3096
- continue;
3097
- }
3098
- stringifiedAttributes += '; ' + attributeName;
3099
- if (attributes[attributeName] === true) {
3100
- continue;
3101
- }
3102
-
3103
- // Considers RFC 6265 section 5.2:
3104
- // ...
3105
- // 3. If the remaining unparsed-attributes contains a %x3B (";")
3106
- // character:
3107
- // Consume the characters of the unparsed-attributes up to,
3108
- // not including, the first %x3B (";") character.
3109
- // ...
3110
- stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];
3111
- }
3112
- return document.cookie = key + '=' + converter.write(value, key) + stringifiedAttributes;
3113
- }
3114
- function get(key) {
3115
- if (typeof document === 'undefined' || arguments.length && !key) {
3116
- return;
3117
- }
3118
-
3119
- // To prevent the for loop in the first place assign an empty array
3120
- // in case there are no cookies at all.
3121
- let cookies = document.cookie ? document.cookie.split('; ') : [];
3122
- let jar = {};
3123
- for (let i = 0; i < cookies.length; i++) {
3124
- let parts = cookies[i].split('=');
3125
- let value = parts.slice(1).join('=');
3126
- try {
3127
- let foundKey = decodeURIComponent(parts[0]);
3128
- jar[foundKey] = converter.read(value, foundKey);
3129
- if (key === foundKey) {
3130
- break;
3131
- }
3132
- } catch (e) {}
3133
- }
3134
- return key ? jar[key] : jar;
3135
- }
3136
- return Object.create({
3137
- set: set,
3138
- get: get,
3139
- remove: function (key, attributes) {
3140
- set(key, '', assign({}, attributes, {
3141
- expires: -1
3142
- }));
3143
- },
3144
- withAttributes: function (attributes) {
3145
- return init(this.converter, assign({}, this.attributes, attributes));
3146
- },
3147
- withConverter: function (converter) {
3148
- return init(assign({}, this.converter, converter), this.attributes);
3149
- }
3150
- }, {
3151
- attributes: {
3152
- value: Object.freeze(defaultAttributes)
3153
- },
3154
- converter: {
3155
- value: Object.freeze(converter)
3156
- }
3157
- });
3158
- }
3159
- let api = init(defaultConverter, {
3160
- path: '/'
3161
- });
3162
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (api);
3163
-
3164
- /***/ }),
3165
-
3166
- /***/ "./app/utils/js/dom/data.js":
3167
- /*!**********************************!*\
3168
- !*** ./app/utils/js/dom/data.js ***!
3169
- \**********************************/
3170
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3171
-
3172
- __webpack_require__.r(__webpack_exports__);
3173
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3174
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
3175
- /* harmony export */ });
3176
- /**
3177
- * --------------------------------------------------------------------------
3178
- * Bootstrap data.js
3179
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3180
- * --------------------------------------------------------------------------
3181
- * Скрипт работает с коллекцией модулей. Подробнее тут https://learn.javascript.ru/map-set
3182
- */
3183
-
3184
- /**
3185
- * Константы
3186
- */
3187
-
3188
- const elementMap = new Map();
3189
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
3190
- set(element, key, instance) {
3191
- if (!elementMap.has(element)) {
3192
- elementMap.set(element, new Map());
3193
- }
3194
- const instanceMap = elementMap.get(element);
3195
- if (!instanceMap.has(key) && instanceMap.size !== 0) {
3196
- console.error(`VGApp не допускает более одного экземпляра для каждого элемента. Связанный экземпляр: ${Array.from(instanceMap.keys())[0]}.`);
3197
- return;
3198
- }
3199
- instanceMap.set(key, instance);
3200
- },
3201
- get(element, key) {
3202
- if (elementMap.has(element)) {
3203
- return elementMap.get(element).get(key) || null;
3204
- }
3205
- return null;
3206
- },
3207
- remove(element, key) {
3208
- if (!elementMap.has(element)) {
3209
- return;
3210
- }
3211
- const instanceMap = elementMap.get(element);
3212
- instanceMap.delete(key);
3213
- if (instanceMap.size === 0) {
3214
- elementMap.delete(element);
3215
- }
3216
- }
3217
- });
3218
-
3219
- /***/ }),
3220
-
3221
- /***/ "./app/utils/js/dom/event.js":
3222
- /*!***********************************!*\
3223
- !*** ./app/utils/js/dom/event.js ***!
3224
- \***********************************/
3225
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3226
-
3227
- __webpack_require__.r(__webpack_exports__);
3228
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3229
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
3230
- /* harmony export */ });
3231
- /**
3232
- * --------------------------------------------------------------------------
3233
- * Bootstrap event.js
3234
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3235
- * --------------------------------------------------------------------------
3236
- * Скрипт для прослушивания события
3237
- */
3238
-
3239
- /**
3240
- * Константы
3241
- */
3242
-
3243
- const namespaceRegex = /[^.]*(?=\..*)\.|.*/;
3244
- const stripNameRegex = /\..*/;
3245
- const stripUidRegex = /::\d+$/;
3246
- const eventRegistry = {}; // Events storage
3247
- let uidEvent = 1;
3248
- const customEvents = {
3249
- mouseenter: 'mouseover',
3250
- mouseleave: 'mouseout'
3251
- };
3252
- const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'submit', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);
3253
-
3254
- /**
3255
- * Приватные методы
3256
- */
3257
-
3258
- function makeEventUid(element, uid) {
3259
- return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
3260
- }
3261
- function getElementEvents(element) {
3262
- const uid = makeEventUid(element);
3263
- element.uidEvent = uid;
3264
- eventRegistry[uid] = eventRegistry[uid] || {};
3265
- return eventRegistry[uid];
3266
- }
3267
- function bootstrapHandler(element, fn) {
3268
- return function handler(event) {
3269
- hydrateObj(event, {
3270
- delegateTarget: element
3271
- });
3272
- if (handler.oneOff) {
3273
- EventHandler.off(element, event.type, fn);
3274
- }
3275
- return fn.apply(element, [event]);
3276
- };
3277
- }
3278
- function bootstrapDelegationHandler(element, selector, fn) {
3279
- return function handler(event) {
3280
- const domElements = element.querySelectorAll(selector);
3281
- for (let {
3282
- target
3283
- } = event; target && target !== this; target = target.parentNode) {
3284
- for (const domElement of domElements) {
3285
- if (domElement !== target) {
3286
- continue;
3287
- }
3288
- hydrateObj(event, {
3289
- delegateTarget: target
3290
- });
3291
- if (handler.oneOff) {
3292
- EventHandler.off(element, event.type, selector, fn);
3293
- }
3294
- return fn.apply(target, [event]);
3295
- }
3296
- }
3297
- };
3298
- }
3299
- function findHandler(events, callable, delegationSelector = null) {
3300
- return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);
3301
- }
3302
- function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
3303
- const isDelegated = typeof handler === 'string';
3304
- // TODO: выдает "false" вместо селектора, поэтому нужно проверить. boot
3305
- const callable = isDelegated ? delegationFunction : handler || delegationFunction;
3306
- let typeEvent = getTypeEvent(originalTypeEvent);
3307
- if (!nativeEvents.has(typeEvent)) {
3308
- typeEvent = originalTypeEvent;
3309
- }
3310
- return [isDelegated, callable, typeEvent];
3311
- }
3312
- function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
3313
- if (typeof originalTypeEvent !== 'string' || !element) {
3314
- return;
3315
- }
3316
- let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
3317
-
3318
- // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
3319
- // this prevents the handler from being dispatched the same way as mouseover or mouseout does
3320
- if (originalTypeEvent in customEvents) {
3321
- const wrapFunction = fn => {
3322
- return function (event) {
3323
- if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
3324
- return fn.call(this, event);
3325
- }
3326
- };
3327
- };
3328
- callable = wrapFunction(callable);
3329
- }
3330
- const events = getElementEvents(element);
3331
- const handlers = events[typeEvent] || (events[typeEvent] = {});
3332
- const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
3333
- if (previousFunction) {
3334
- previousFunction.oneOff = previousFunction.oneOff && oneOff;
3335
- return;
3336
- }
3337
- const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));
3338
- const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
3339
- fn.delegationSelector = isDelegated ? handler : null;
3340
- fn.callable = callable;
3341
- fn.oneOff = oneOff;
3342
- fn.uidEvent = uid;
3343
- handlers[uid] = fn;
3344
- element.addEventListener(typeEvent, fn, isDelegated);
3345
- }
3346
- function removeHandler(element, events, typeEvent, handler, delegationSelector) {
3347
- const fn = findHandler(events[typeEvent], handler, delegationSelector);
3348
- if (!fn) {
3349
- return;
3350
- }
3351
- element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));
3352
- delete events[typeEvent][fn.uidEvent];
3353
- }
3354
- function removeNamespacedHandlers(element, events, typeEvent, namespace) {
3355
- const storeElementEvent = events[typeEvent] || {};
3356
- for (const [handlerKey, event] of Object.entries(storeElementEvent)) {
3357
- if (handlerKey.includes(namespace)) {
3358
- removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
3359
- }
3360
- }
3361
- }
3362
- function getTypeEvent(event) {
3363
- // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
3364
- event = event.replace(stripNameRegex, '');
3365
- return customEvents[event] || event;
3366
- }
3367
- function hydrateObj(obj, meta = {}) {
3368
- for (const [key, value] of Object.entries(meta)) {
3369
- try {
3370
- obj[key] = value;
3371
- } catch {
3372
- Object.defineProperty(obj, key, {
3373
- configurable: true,
3374
- get() {
3375
- return value;
3376
- }
3377
- });
3378
- }
3379
- }
3380
- return obj;
3381
- }
3382
-
3383
- /**
3384
- * События
3385
- * @type {{one(*, *, *, *): void, trigger(*, *, *): (null|*), off(*, *, *, *): void, on(*, *, *, *): void}}
3386
- */
3387
- const EventHandler = {
3388
- /**
3389
- * Прослушиватель событий (элемент, событие (полный список смотри в константе nativeEvents, источник события или хендлер, функция обратного вызова))
3390
- * @param element
3391
- * @param event
3392
- * @param handler
3393
- * @param delegationFunction
3394
- */
3395
- on(element, event, handler, delegationFunction) {
3396
- addHandler(element, event, handler, delegationFunction, false);
3397
- },
3398
- /**
3399
- * Прослушиватель событий, но замыкается и больше не повторяется на элементе
3400
- * @param element
3401
- * @param event
3402
- * @param handler
3403
- * @param delegationFunction
3404
- */
3405
- one(element, event, handler, delegationFunction) {
3406
- addHandler(element, event, handler, delegationFunction, true);
3407
- },
3408
- /**
3409
- * Удаление обработчика
3410
- * @param element
3411
- * @param originalTypeEvent
3412
- * @param handler
3413
- * @param delegationFunction
3414
- */
3415
- off(element, originalTypeEvent, handler, delegationFunction) {
3416
- if (typeof originalTypeEvent !== 'string' || !element) {
3417
- return;
3418
- }
3419
- const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
3420
- const inNamespace = typeEvent !== originalTypeEvent;
3421
- const events = getElementEvents(element);
3422
- const storeElementEvent = events[typeEvent] || {};
3423
- const isNamespace = originalTypeEvent.startsWith('.');
3424
- if (typeof callable !== 'undefined') {
3425
- // Simplest case: handler is passed, remove that listener ONLY.
3426
- if (!Object.keys(storeElementEvent).length) {
3427
- return;
3428
- }
3429
- removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
3430
- return;
3431
- }
3432
- if (isNamespace) {
3433
- for (const elementEvent of Object.keys(events)) {
3434
- removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
3435
- }
3436
- }
3437
- for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {
3438
- const handlerKey = keyHandlers.replace(stripUidRegex, '');
3439
- if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
3440
- removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
3441
- }
3442
- }
3443
- },
3444
- /**
3445
- * Пользовательские события. Подробнее тут https://learn.javascript.ru/dispatch-events
3446
- * @param element
3447
- * @param event
3448
- * @param args
3449
- * @returns {*|null}
3450
- */
3451
- trigger(element, event, args) {
3452
- if (typeof event !== 'string' || !element) {
3453
- return null;
3454
- }
3455
- let bubbles = true;
3456
- let nativeDispatch = true;
3457
- let defaultPrevented = false;
3458
- const evt = hydrateObj(new Event(event, {
3459
- bubbles,
3460
- cancelable: true
3461
- }), args);
3462
- if (defaultPrevented) {
3463
- evt.preventDefault();
3464
- }
3465
- if (nativeDispatch) {
3466
- element.dispatchEvent(evt);
3467
- }
3468
- return evt;
3469
- }
3470
- };
3471
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EventHandler);
3472
-
3473
- /***/ }),
3474
-
3475
- /***/ "./app/utils/js/dom/manipulator.js":
3476
- /*!*****************************************!*\
3477
- !*** ./app/utils/js/dom/manipulator.js ***!
3478
- \*****************************************/
3479
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3480
-
3481
- __webpack_require__.r(__webpack_exports__);
3482
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3483
- /* harmony export */ Manipulator: () => (/* binding */ Manipulator)
3484
- /* harmony export */ });
3485
- /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../functions */ "./app/utils/js/functions.js");
3486
-
3487
-
3488
- /**
3489
- * Манипуляции с атрибутами у элемента:
3490
- * get (элемент, имя, флаг - вырезать data-) - метод выбирает значение атрибута по его имени, если в поле имени передать 'data' -> будут выбраны только дата атрибуты, если 'all' -> метод вернет значение всех атрибутов
3491
- * has (элемент, имя) - есть ли атрибут у элемента
3492
- * set (элемент, имя, значение) - установка у элемента атрибута или его изменение
3493
- * remove (элемент, имя) - удаляет атрибут у элемента
3494
- */
3495
- const Manipulator = {
3496
- get(element, nameAttribute = 'data', isRemoveDataName = true) {
3497
- if (!element) {
3498
- return {};
3499
- }
3500
- if (nameAttribute === 'data') {
3501
- let elmBase = ['data-vg-toggle', 'data-vg-target', 'data-vg-dismiss'],
3502
- attributes = {};
3503
- let arr = [].filter.call(element.attributes, function (at) {
3504
- return /^data-/.test(at.name);
3505
- });
3506
- if (arr.length) {
3507
- arr.forEach(function (v) {
3508
- let name = v.name;
3509
- if (!elmBase.includes(name)) {
3510
- if (isRemoveDataName) name = name.slice(5);
3511
- attributes[name] = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.normalizeData)(v.value);
3512
- }
3513
- });
3514
- }
3515
- return attributes;
3516
- } else if (nameAttribute === 'all') {
3517
- return element.getAttributeNames().reduce((acc, name) => {
3518
- return {
3519
- ...acc,
3520
- [name]: element.getAttribute(name)
3521
- };
3522
- }, {});
3523
- } else {
3524
- return element.getAttribute(nameAttribute);
3525
- }
3526
- },
3527
- has(element, nameAttribute) {
3528
- return element.hasAttribute(nameAttribute);
3529
- },
3530
- set(element, name, value) {
3531
- if ((0,_functions__WEBPACK_IMPORTED_MODULE_0__.isElement)(element) && name) {
3532
- element.setAttribute(name, value);
3533
- }
3534
- },
3535
- remove(element, nameAttribute) {
3536
- if ((0,_functions__WEBPACK_IMPORTED_MODULE_0__.isElement)(element) && nameAttribute) {
3537
- element.removeAttribute(nameAttribute);
3538
- }
3539
- },
3540
- hide(el) {
3541
- el.style.display = 'none';
3542
- },
3543
- show(el, state = 'block') {
3544
- el.style.display = state;
3545
- }
3546
- };
3547
-
3548
-
3549
- /***/ }),
3550
-
3551
- /***/ "./app/utils/js/dom/selectors.js":
3552
- /*!***************************************!*\
3553
- !*** ./app/utils/js/dom/selectors.js ***!
3554
- \***************************************/
3555
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3556
-
3557
- __webpack_require__.r(__webpack_exports__);
3558
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3559
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
3560
- /* harmony export */ });
3561
- /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../functions */ "./app/utils/js/functions.js");
3562
- /**
3563
- * Работа с DOM
3564
- * @param selector
3565
- * @returns {*}
3566
- */
3567
-
3568
- const parseSelector = selector => {
3569
- if (selector && window.CSS && window.CSS.escape) {
3570
- selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`);
3571
- }
3572
- return selector;
3573
- };
3574
- const getSelector = element => {
3575
- let selector = element.getAttribute('data-vg-target');
3576
- if (!selector || selector === '#') {
3577
- let hrefAttribute = element.getAttribute('href');
3578
- if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {
3579
- return null;
3580
- }
3581
- if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
3582
- hrefAttribute = `#${hrefAttribute.split('#')[1]}`;
3583
- }
3584
- selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;
3585
- }
3586
- return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;
3587
- };
3588
- const Selectors = {
3589
- find(selector, element = document.documentElement) {
3590
- if ((0,_functions__WEBPACK_IMPORTED_MODULE_0__.isElement)(selector)) {
3591
- return selector;
3592
- } else {
3593
- return Element.prototype.querySelector.call(element, selector);
3594
- }
3595
- },
3596
- findAll(selector, container = document.documentElement) {
3597
- return [].concat(...Element.prototype.querySelectorAll.call(container, selector));
3598
- },
3599
- getSelectorFromElement(element) {
3600
- const selector = getSelector(element);
3601
- if (selector) return Selectors.find(selector) ? selector : null;
3602
- return null;
3603
- },
3604
- getElementFromSelector(element) {
3605
- const selector = getSelector(element);
3606
- return selector ? Selectors.find(selector) : null;
3607
- },
3608
- getMultipleElementsFromSelector(element) {
3609
- const selector = getSelector(element);
3610
- return selector ? Selectors.findAll(selector) : [];
3611
- }
3612
- };
3613
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Selectors);
3614
-
3615
- /***/ }),
3616
-
3617
- /***/ "./app/utils/js/functions.js":
3618
- /*!***********************************!*\
3619
- !*** ./app/utils/js/functions.js ***!
3620
- \***********************************/
3621
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3622
-
3623
- __webpack_require__.r(__webpack_exports__);
3624
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3625
- /* harmony export */ execute: () => (/* binding */ execute),
3626
- /* harmony export */ executeAfterTransition: () => (/* binding */ executeAfterTransition),
3627
- /* harmony export */ isDisabled: () => (/* binding */ isDisabled),
3628
- /* harmony export */ isElement: () => (/* binding */ isElement),
3629
- /* harmony export */ isEmptyObj: () => (/* binding */ isEmptyObj),
3630
- /* harmony export */ isObject: () => (/* binding */ isObject),
3631
- /* harmony export */ isRTL: () => (/* binding */ isRTL),
3632
- /* harmony export */ isVisible: () => (/* binding */ isVisible),
3633
- /* harmony export */ makeRandomString: () => (/* binding */ makeRandomString),
3634
- /* harmony export */ mergeDeepObject: () => (/* binding */ mergeDeepObject),
3635
- /* harmony export */ noop: () => (/* binding */ noop),
3636
- /* harmony export */ normalizeData: () => (/* binding */ normalizeData),
3637
- /* harmony export */ reflow: () => (/* binding */ reflow),
3638
- /* harmony export */ removeElementArray: () => (/* binding */ removeElementArray),
3639
- /* harmony export */ transliterate: () => (/* binding */ transliterate)
3640
- /* harmony export */ });
3641
- /**
3642
- * Набор скриптов для широкого применения
3643
- */
3644
-
3645
- /**
3646
- * Если что-нибудь в объекте
3647
- * @param obj
3648
- * @returns {boolean}
3649
- */
3650
- function isEmptyObj(obj) {
3651
- for (let prop in obj) {
3652
- if (Object.prototype.hasOwnProperty.call(obj, prop)) {
3653
- return false;
3654
- }
3655
- }
3656
- return true;
3657
- }
3658
-
3659
- /**
3660
- * isElement
3661
- * @param object
3662
- * @returns {boolean}
3663
- */
3664
- const isElement = object => {
3665
- if (!isObject(object)) {
3666
- return false;
3667
- }
3668
- return typeof object.nodeType !== 'undefined';
3669
- };
3670
-
3671
- /**
3672
- * isDisabled
3673
- * @param element
3674
- * @returns {boolean}
3675
- */
3676
- const isDisabled = element => {
3677
- if (!element || element.nodeType !== Node.ELEMENT_NODE) {
3678
- return true;
3679
- }
3680
- if (element.classList.contains('disabled')) {
3681
- return true;
3682
- }
3683
- if (typeof element.disabled !== 'undefined') {
3684
- return element.disabled;
3685
- }
3686
- return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
3687
- };
3688
-
3689
- /**
3690
- * isVisible
3691
- * @param element
3692
- * @returns {boolean}
3693
- */
3694
- function isVisible(element) {
3695
- if (!isElement(element) || element.getClientRects().length === 0) {
3696
- return false;
3697
- }
3698
- const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';
3699
- const closedDetails = element.closest('details:not([open])');
3700
- if (!closedDetails) {
3701
- return elementIsVisible;
3702
- }
3703
- if (closedDetails !== element) {
3704
- const summary = element.closest('summary');
3705
- if (summary && summary.parentNode !== closedDetails) {
3706
- return false;
3707
- }
3708
- if (summary === null) {
3709
- return false;
3710
- }
3711
- }
3712
- return elementIsVisible;
3713
- }
3714
-
3715
- /**
3716
- * isObject
3717
- * @param obj
3718
- * @returns {boolean}
3719
- */
3720
- function isObject(obj) {
3721
- return obj && typeof obj === 'object';
3722
- }
3723
-
3724
- /**
3725
- * Приводим в порядок типы данных
3726
- * @param value
3727
- * @returns {any}
3728
- */
3729
- function normalizeData(value) {
3730
- if (value === 'true') {
3731
- return true;
3732
- }
3733
- if (value === 'false') {
3734
- return false;
3735
- }
3736
- if (value === Number(value).toString()) {
3737
- return Number(value);
3738
- }
3739
- if (value === '' || value === 'null') {
3740
- return null;
3741
- }
3742
- if (typeof value !== 'string') {
3743
- return value;
3744
- }
3745
- try {
3746
- return JSON.parse(decodeURIComponent(value));
3747
- } catch {
3748
- return value;
3749
- }
3750
- }
3751
-
3752
- /**
3753
- * Удаляем элементы с массива
3754
- * @param arr
3755
- * @param el
3756
- */
3757
- function removeElementArray(arr, el) {
3758
- return arr.filter(item => !el.includes(item));
3759
- }
3760
-
3761
- /**
3762
- * Глубокое объединение объектов
3763
- * @param objects
3764
- * @returns {*}
3765
- */
3766
- function mergeDeepObject(...objects) {
3767
- const isObject = obj => obj && typeof obj === 'object';
3768
- return objects.reduce((prev, obj) => {
3769
- Object.keys(obj).forEach(key => {
3770
- const pVal = prev[key];
3771
- const oVal = obj[key];
3772
- if (Array.isArray(pVal) && Array.isArray(oVal)) {
3773
- prev[key] = pVal.concat(...oVal);
3774
- } else if (isObject(pVal) && isObject(oVal)) {
3775
- prev[key] = mergeDeepObject(pVal, oVal);
3776
- } else {
3777
- prev[key] = oVal;
3778
- }
3779
- });
3780
- return prev;
3781
- }, {});
3782
- }
3783
-
3784
- /**
3785
- * Callback
3786
- * @param possibleCallback
3787
- * @param args
3788
- * @param defaultValue
3789
- * @returns {*}
3790
- */
3791
- function execute(possibleCallback, args = [], defaultValue = possibleCallback) {
3792
- return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;
3793
- }
3794
-
3795
- /**
3796
- * Transition
3797
- * @param callback
3798
- * @param transitionElement
3799
- * @param waitForTransition
3800
- */
3801
- const TRANSITION_END = 'transitionend';
3802
- const MILLISECONDS_MULTIPLIER = 1000;
3803
- function executeAfterTransition(callback, transitionElement, waitForTransition = true, timeOutMs) {
3804
- if (!waitForTransition) {
3805
- execute(callback);
3806
- return;
3807
- }
3808
- const durationPadding = 5;
3809
- const emulatedDuration = timeOutMs ? timeOutMs : getTransitionDurationFromElement(transitionElement) + durationPadding;
3810
- let called = false;
3811
- const handler = ({
3812
- target
3813
- }) => {
3814
- if (target !== transitionElement) {
3815
- return;
3816
- }
3817
- called = true;
3818
- transitionElement.removeEventListener(TRANSITION_END, handler);
3819
- execute(callback);
3820
- };
3821
- transitionElement.addEventListener(TRANSITION_END, handler);
3822
- setTimeout(() => {
3823
- if (!called) {
3824
- triggerTransitionEnd(transitionElement);
3825
- }
3826
- }, emulatedDuration);
3827
- }
3828
- const getTransitionDurationFromElement = element => {
3829
- if (!element) {
3830
- return 0;
3831
- }
3832
-
3833
- // Get transition-duration of the element
3834
- let {
3835
- transitionDuration,
3836
- transitionDelay
3837
- } = window.getComputedStyle(element);
3838
- const floatTransitionDuration = Number.parseFloat(transitionDuration);
3839
- const floatTransitionDelay = Number.parseFloat(transitionDelay);
3840
-
3841
- // Return 0 if element or transition duration is not found
3842
- if (!floatTransitionDuration && !floatTransitionDelay) {
3843
- return 0;
3844
- }
3845
-
3846
- // If multiple durations are defined, take the first
3847
- transitionDuration = transitionDuration.split(',')[0];
3848
- transitionDelay = transitionDelay.split(',')[0];
3849
- return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
3850
- };
3851
- const triggerTransitionEnd = element => {
3852
- element.dispatchEvent(new Event(TRANSITION_END));
3853
- };
3854
-
3855
- /**
3856
- * Трюк для перезапуска анимации элемента
3857
- *
3858
- * @param {HTMLElement} element
3859
- * @return void
3860
- *
3861
- * @смотри https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
3862
- */
3863
- const reflow = element => {
3864
- element.offsetHeight; // eslint-disable-line no-unused-expressions
3865
- };
3866
-
3867
- /**
3868
- * Noop
3869
- */
3870
- const noop = () => {};
3871
-
3872
- /**
3873
- * Генерация случайной строки
3874
- */
3875
- function makeRandomString(length = 7) {
3876
- let result = '';
3877
- const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
3878
- const charactersLength = characters.length;
3879
- let counter = 0;
3880
- while (counter < length) {
3881
- result += characters.charAt(Math.floor(Math.random() * charactersLength));
3882
- counter += 1;
3883
- }
3884
- return result;
3885
- }
3886
-
3887
- /**
3888
- * Транслитерация символов с латиницы на кириллицу и обратно
3889
- * @param text
3890
- * @param enToRu
3891
- * @returns {*}
3892
- */
3893
- function transliterate(text, enToRu) {
3894
- let ru = "й ц у к е н г ш щ з х ъ ф ы в а п р о л д ж э я ч с м и т ь б ю".split(/ +/g);
3895
- let en = "q w e r t y u i o p [ ] a s d f g h j k l ; ' z x c v b n m , .".split(/ +/g);
3896
- let x;
3897
- for (x = 0; x < ru.length; x++) {
3898
- text = text.split(enToRu ? en[x] : ru[x]).join(enToRu ? ru[x] : en[x]);
3899
- text = text.split(enToRu ? en[x].toUpperCase() : ru[x].toUpperCase()).join(enToRu ? ru[x].toUpperCase() : en[x].toUpperCase());
3900
- }
3901
- return text;
3902
- }
3903
-
3904
- /**
3905
- *
3906
- */
3907
- const isRTL = () => document.documentElement.dir === 'rtl';
3908
-
3909
-
3910
- /***/ }),
3911
-
3912
- /***/ "./app/modules/vgdropdown/scss/vgdropdown.scss":
3913
- /*!*****************************************************!*\
3914
- !*** ./app/modules/vgdropdown/scss/vgdropdown.scss ***!
3915
- \*****************************************************/
3916
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3917
-
3918
- __webpack_require__.r(__webpack_exports__);
3919
- // extracted by mini-css-extract-plugin
3920
-
3921
-
3922
- /***/ }),
3923
-
3924
- /***/ "./app/modules/vgformsender/scss/vgformsender.scss":
3925
- /*!*********************************************************!*\
3926
- !*** ./app/modules/vgformsender/scss/vgformsender.scss ***!
3927
- \*********************************************************/
3928
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3929
-
3930
- __webpack_require__.r(__webpack_exports__);
3931
- // extracted by mini-css-extract-plugin
3932
-
3933
-
3934
- /***/ }),
3935
-
3936
- /***/ "./app/modules/vglawcookie/scss/vglawcookie.scss":
3937
- /*!*******************************************************!*\
3938
- !*** ./app/modules/vglawcookie/scss/vglawcookie.scss ***!
3939
- \*******************************************************/
3940
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3941
-
3942
- __webpack_require__.r(__webpack_exports__);
3943
- // extracted by mini-css-extract-plugin
3944
-
3945
-
3946
- /***/ }),
3947
-
3948
- /***/ "./app/modules/vgmodal/scss/vgmodal.scss":
3949
- /*!***********************************************!*\
3950
- !*** ./app/modules/vgmodal/scss/vgmodal.scss ***!
3951
- \***********************************************/
3952
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3953
-
3954
- __webpack_require__.r(__webpack_exports__);
3955
- // extracted by mini-css-extract-plugin
3956
-
3957
-
3958
- /***/ }),
3959
-
3960
- /***/ "./app/modules/vgnav/scss/vgnav.scss":
3961
- /*!*******************************************!*\
3962
- !*** ./app/modules/vgnav/scss/vgnav.scss ***!
3963
- \*******************************************/
3964
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3965
-
3966
- __webpack_require__.r(__webpack_exports__);
3967
- // extracted by mini-css-extract-plugin
3968
-
3969
-
3970
- /***/ }),
3971
-
3972
- /***/ "./app/modules/vgrollup/scss/vgrollup.scss":
3973
- /*!*************************************************!*\
3974
- !*** ./app/modules/vgrollup/scss/vgrollup.scss ***!
3975
- \*************************************************/
3976
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3977
-
3978
- __webpack_require__.r(__webpack_exports__);
3979
- // extracted by mini-css-extract-plugin
3980
-
3981
-
3982
- /***/ }),
3983
-
3984
- /***/ "./app/modules/vgselect/scss/vgselect.scss":
3985
- /*!*************************************************!*\
3986
- !*** ./app/modules/vgselect/scss/vgselect.scss ***!
3987
- \*************************************************/
3988
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3989
-
3990
- __webpack_require__.r(__webpack_exports__);
3991
- // extracted by mini-css-extract-plugin
3992
-
3993
-
3994
- /***/ }),
3995
-
3996
- /***/ "./app/modules/vgsidebar/scss/vgsidebar.scss":
3997
- /*!***************************************************!*\
3998
- !*** ./app/modules/vgsidebar/scss/vgsidebar.scss ***!
3999
- \***************************************************/
4000
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4001
-
4002
- __webpack_require__.r(__webpack_exports__);
4003
- // extracted by mini-css-extract-plugin
4004
-
4005
-
4006
- /***/ }),
4007
-
4008
- /***/ "./app/utils/scss/default.scss":
4009
- /*!*************************************!*\
4010
- !*** ./app/utils/scss/default.scss ***!
4011
- \*************************************/
4012
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4013
-
4014
- __webpack_require__.r(__webpack_exports__);
4015
- // extracted by mini-css-extract-plugin
4016
-
4017
-
4018
- /***/ })
4019
-
4020
- /******/ });
4021
- /************************************************************************/
4022
- /******/ // The module cache
4023
- /******/ var __webpack_module_cache__ = {};
4024
- /******/
4025
- /******/ // The require function
4026
- /******/ function __webpack_require__(moduleId) {
4027
- /******/ // Check if module is in cache
4028
- /******/ var cachedModule = __webpack_module_cache__[moduleId];
4029
- /******/ if (cachedModule !== undefined) {
4030
- /******/ return cachedModule.exports;
4031
- /******/ }
4032
- /******/ // Create a new module (and put it into the cache)
4033
- /******/ var module = __webpack_module_cache__[moduleId] = {
4034
- /******/ // no module.id needed
4035
- /******/ // no module.loaded needed
4036
- /******/ exports: {}
4037
- /******/ };
4038
- /******/
4039
- /******/ // Execute the module function
4040
- /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
4041
- /******/
4042
- /******/ // Return the exports of the module
4043
- /******/ return module.exports;
4044
- /******/ }
4045
- /******/
4046
- /************************************************************************/
4047
- /******/ /* webpack/runtime/define property getters */
4048
- /******/ (() => {
4049
- /******/ // define getter functions for harmony exports
4050
- /******/ __webpack_require__.d = (exports, definition) => {
4051
- /******/ for(var key in definition) {
4052
- /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
4053
- /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
4054
- /******/ }
4055
- /******/ }
4056
- /******/ };
4057
- /******/ })();
4058
- /******/
4059
- /******/ /* webpack/runtime/hasOwnProperty shorthand */
4060
- /******/ (() => {
4061
- /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
4062
- /******/ })();
4063
- /******/
4064
- /******/ /* webpack/runtime/make namespace object */
4065
- /******/ (() => {
4066
- /******/ // define __esModule on exports
4067
- /******/ __webpack_require__.r = (exports) => {
4068
- /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
4069
- /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4070
- /******/ }
4071
- /******/ Object.defineProperty(exports, '__esModule', { value: true });
4072
- /******/ };
4073
- /******/ })();
4074
- /******/
4075
- /************************************************************************/
4076
- var __webpack_exports__ = {};
4077
- // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
4078
- (() => {
4079
- /*!******************!*\
4080
- !*** ./index.js ***!
4081
- \******************/
4082
- __webpack_require__.r(__webpack_exports__);
4083
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4084
- /* harmony export */ VGCollapse: () => (/* reexport safe */ _app_modules_vgcollapse_js_vgcollapse__WEBPACK_IMPORTED_MODULE_3__["default"]),
4085
- /* harmony export */ VGDropdown: () => (/* reexport safe */ _app_modules_vgdropdown_js_vgdropdown__WEBPACK_IMPORTED_MODULE_7__["default"]),
4086
- /* harmony export */ VGFormSender: () => (/* reexport safe */ _app_modules_vgformsender_js_vgformsender__WEBPACK_IMPORTED_MODULE_11__["default"]),
4087
- /* harmony export */ VGLawCookie: () => (/* reexport safe */ _app_modules_vglawcookie_js_vglawcookie__WEBPACK_IMPORTED_MODULE_15__["default"]),
4088
- /* harmony export */ VGModal: () => (/* reexport safe */ _app_modules_vgmodal_js_vgmodal__WEBPACK_IMPORTED_MODULE_9__["default"]),
4089
- /* harmony export */ VGNav: () => (/* reexport safe */ _app_modules_vgnav_js_vgnav__WEBPACK_IMPORTED_MODULE_5__["default"]),
4090
- /* harmony export */ VGRollup: () => (/* reexport safe */ _app_modules_vgrollup_js_vgrollup__WEBPACK_IMPORTED_MODULE_13__["default"]),
4091
- /* harmony export */ VGSelect: () => (/* reexport safe */ _app_modules_vgselect_js_vgselect__WEBPACK_IMPORTED_MODULE_17__["default"]),
4092
- /* harmony export */ VGSidebar: () => (/* reexport safe */ _app_modules_vgsidebar_js_vgsidebar__WEBPACK_IMPORTED_MODULE_2__["default"])
4093
- /* harmony export */ });
4094
- /* harmony import */ var _app_utils_scss_default_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./app/utils/scss/default.scss */ "./app/utils/scss/default.scss");
4095
- /* harmony import */ var _app_modules_vgsidebar_scss_vgsidebar_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./app/modules/vgsidebar/scss/vgsidebar.scss */ "./app/modules/vgsidebar/scss/vgsidebar.scss");
4096
- /* harmony import */ var _app_modules_vgsidebar_js_vgsidebar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./app/modules/vgsidebar/js/vgsidebar */ "./app/modules/vgsidebar/js/vgsidebar.js");
4097
- /* harmony import */ var _app_modules_vgcollapse_js_vgcollapse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./app/modules/vgcollapse/js/vgcollapse */ "./app/modules/vgcollapse/js/vgcollapse.js");
4098
- /* harmony import */ var _app_modules_vgnav_scss_vgnav_scss__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app/modules/vgnav/scss/vgnav.scss */ "./app/modules/vgnav/scss/vgnav.scss");
4099
- /* harmony import */ var _app_modules_vgnav_js_vgnav__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./app/modules/vgnav/js/vgnav */ "./app/modules/vgnav/js/vgnav.js");
4100
- /* harmony import */ var _app_modules_vgdropdown_scss_vgdropdown_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./app/modules/vgdropdown/scss/vgdropdown.scss */ "./app/modules/vgdropdown/scss/vgdropdown.scss");
4101
- /* harmony import */ var _app_modules_vgdropdown_js_vgdropdown__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./app/modules/vgdropdown/js/vgdropdown */ "./app/modules/vgdropdown/js/vgdropdown.js");
4102
- /* harmony import */ var _app_modules_vgmodal_scss_vgmodal_scss__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./app/modules/vgmodal/scss/vgmodal.scss */ "./app/modules/vgmodal/scss/vgmodal.scss");
4103
- /* harmony import */ var _app_modules_vgmodal_js_vgmodal__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./app/modules/vgmodal/js/vgmodal */ "./app/modules/vgmodal/js/vgmodal.js");
4104
- /* harmony import */ var _app_modules_vgformsender_scss_vgformsender_scss__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./app/modules/vgformsender/scss/vgformsender.scss */ "./app/modules/vgformsender/scss/vgformsender.scss");
4105
- /* harmony import */ var _app_modules_vgformsender_js_vgformsender__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./app/modules/vgformsender/js/vgformsender */ "./app/modules/vgformsender/js/vgformsender.js");
4106
- /* harmony import */ var _app_modules_vgrollup_scss_vgrollup_scss__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./app/modules/vgrollup/scss/vgrollup.scss */ "./app/modules/vgrollup/scss/vgrollup.scss");
4107
- /* harmony import */ var _app_modules_vgrollup_js_vgrollup__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./app/modules/vgrollup/js/vgrollup */ "./app/modules/vgrollup/js/vgrollup.js");
4108
- /* harmony import */ var _app_modules_vglawcookie_scss_vglawcookie_scss__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./app/modules/vglawcookie/scss/vglawcookie.scss */ "./app/modules/vglawcookie/scss/vglawcookie.scss");
4109
- /* harmony import */ var _app_modules_vglawcookie_js_vglawcookie__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./app/modules/vglawcookie/js/vglawcookie */ "./app/modules/vglawcookie/js/vglawcookie.js");
4110
- /* harmony import */ var _app_modules_vgselect_scss_vgselect_scss__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./app/modules/vgselect/scss/vgselect.scss */ "./app/modules/vgselect/scss/vgselect.scss");
4111
- /* harmony import */ var _app_modules_vgselect_js_vgselect__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./app/modules/vgselect/js/vgselect */ "./app/modules/vgselect/js/vgselect.js");
4112
- // css классы по умолчанию
4113
-
4114
-
4115
- // sidebar
4116
-
4117
-
4118
-
4119
- // collapse
4120
-
4121
-
4122
- // nav
4123
-
4124
-
4125
-
4126
- // dropdown
4127
-
4128
-
4129
-
4130
- // modal
4131
-
4132
-
4133
-
4134
- // form sender
4135
-
4136
-
4137
-
4138
- // rollup
4139
-
4140
-
4141
-
4142
- // law cookie
4143
-
4144
-
4145
-
4146
- // select
4147
-
4148
-
4149
-
4150
- })();
4151
-
4152
- vg = __webpack_exports__;
4153
- /******/ })()
4154
- ;
4155
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmdhcHAuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeGZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxRkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0TEE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQ3ZEQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUMzQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7O0FDakhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7QUM5SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQWtEQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUMxVUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3JTQTs7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7OztBQ0FBOzs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3ZnLy4vYXBwL21vZHVsZXMvYmFzZS1tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvbW9kdWxlcy9tb2R1bGUtZm4uanMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvbW9kdWxlcy92Z2NvbGxhcHNlL2pzL3ZnY29sbGFwc2UuanMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvbW9kdWxlcy92Z2Ryb3Bkb3duL2pzL3ZnZHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvbW9kdWxlcy92Z2Zvcm1zZW5kZXIvanMvdmdmb3Jtc2VuZGVyLmpzIiwid2VicGFjazovL3ZnLy4vYXBwL21vZHVsZXMvdmdsYXdjb29raWUvanMvdmdsYXdjb29raWUuanMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvbW9kdWxlcy92Z21vZGFsL2pzL3ZnbW9kYWwuanMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvbW9kdWxlcy92Z25hdi9qcy92Z25hdi5qcyIsIndlYnBhY2s6Ly92Zy8uL2FwcC9tb2R1bGVzL3Zncm9sbHVwL2pzL3Zncm9sbHVwLmpzIiwid2VicGFjazovL3ZnLy4vYXBwL21vZHVsZXMvdmdzZWxlY3QvanMvdmdzZWxlY3QuanMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvbW9kdWxlcy92Z3NpZGViYXIvanMvdmdzaWRlYmFyLmpzIiwid2VicGFjazovL3ZnLy4vYXBwL3V0aWxzL2pzL2NvbXBvbmVudHMvYW5pbWF0aW9uLmpzIiwid2VicGFjazovL3ZnLy4vYXBwL3V0aWxzL2pzL2NvbXBvbmVudHMvYmFja2Ryb3AuanMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvdXRpbHMvanMvY29tcG9uZW50cy9vdmVyZmxvdy5qcyIsIndlYnBhY2s6Ly92Zy8uL2FwcC91dGlscy9qcy9jb21wb25lbnRzL3BhcmFtcy5qcyIsIndlYnBhY2s6Ly92Zy8uL2FwcC91dGlscy9qcy9jb21wb25lbnRzL3BsYWNlbWVudC5qcyIsIndlYnBhY2s6Ly92Zy8uL2FwcC91dGlscy9qcy9jb21wb25lbnRzL3Jlc3BvbnNpdmUuanMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvdXRpbHMvanMvY29tcG9uZW50cy9zY3JvbGxiYXIuanMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvdXRpbHMvanMvZG9tL2Nvb2tpZS5qcyIsIndlYnBhY2s6Ly92Zy8uL2FwcC91dGlscy9qcy9kb20vZGF0YS5qcyIsIndlYnBhY2s6Ly92Zy8uL2FwcC91dGlscy9qcy9kb20vZXZlbnQuanMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvdXRpbHMvanMvZG9tL21hbmlwdWxhdG9yLmpzIiwid2VicGFjazovL3ZnLy4vYXBwL3V0aWxzL2pzL2RvbS9zZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvdXRpbHMvanMvZnVuY3Rpb25zLmpzIiwid2VicGFjazovL3ZnLy4vYXBwL21vZHVsZXMvdmdkcm9wZG93bi9zY3NzL3ZnZHJvcGRvd24uc2Nzcz9lODI1Iiwid2VicGFjazovL3ZnLy4vYXBwL21vZHVsZXMvdmdmb3Jtc2VuZGVyL3Njc3Mvdmdmb3Jtc2VuZGVyLnNjc3M/NjkxMiIsIndlYnBhY2s6Ly92Zy8uL2FwcC9tb2R1bGVzL3ZnbGF3Y29va2llL3Njc3MvdmdsYXdjb29raWUuc2Nzcz9kZDQ1Iiwid2VicGFjazovL3ZnLy4vYXBwL21vZHVsZXMvdmdtb2RhbC9zY3NzL3ZnbW9kYWwuc2Nzcz8xMjg5Iiwid2VicGFjazovL3ZnLy4vYXBwL21vZHVsZXMvdmduYXYvc2Nzcy92Z25hdi5zY3NzPzE5YmMiLCJ3ZWJwYWNrOi8vdmcvLi9hcHAvbW9kdWxlcy92Z3JvbGx1cC9zY3NzL3Zncm9sbHVwLnNjc3M/MzUyNiIsIndlYnBhY2s6Ly92Zy8uL2FwcC9tb2R1bGVzL3Znc2VsZWN0L3Njc3MvdmdzZWxlY3Quc2Nzcz8wZmJlIiwid2VicGFjazovL3ZnLy4vYXBwL21vZHVsZXMvdmdzaWRlYmFyL3Njc3MvdmdzaWRlYmFyLnNjc3M/NWFjZCIsIndlYnBhY2s6Ly92Zy8uL2FwcC91dGlscy9zY3NzL2RlZmF1bHQuc2Nzcz9jNjM0Iiwid2VicGFjazovL3ZnL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3ZnL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly92Zy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3ZnL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vdmcvLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2V4ZWN1dGUsIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24sIGlzRW1wdHlPYmp9IGZyb20gXCIuLi91dGlscy9qcy9mdW5jdGlvbnNcIjtcclxuaW1wb3J0IFNlbGVjdG9ycyBmcm9tIFwiLi4vdXRpbHMvanMvZG9tL3NlbGVjdG9yc1wiO1xyXG5pbXBvcnQgRGF0YSBmcm9tIFwiLi4vdXRpbHMvanMvZG9tL2RhdGFcIjtcclxuaW1wb3J0IFBhcmFtcyBmcm9tIFwiLi4vdXRpbHMvanMvY29tcG9uZW50cy9wYXJhbXNcIjtcclxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tIFwiLi4vdXRpbHMvanMvZG9tL2V2ZW50XCI7XHJcbmltcG9ydCB7QWpheCwgZ2V0U1ZHfSBmcm9tIFwiLi9tb2R1bGUtZm5cIjtcclxuaW1wb3J0IEFuaW1hdGlvbiBmcm9tIFwiLi4vdXRpbHMvanMvY29tcG9uZW50cy9hbmltYXRpb25cIjtcclxuXHJcbmNsYXNzIEJhc2VNb2R1bGUge1xyXG5cdGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcclxuXHRcdGlmICghZWxlbWVudCkgcmV0dXJuXHJcblxyXG5cdFx0dGhpcy5fZWxlbWVudCA9IFNlbGVjdG9ycy5maW5kKGVsZW1lbnQpO1xyXG5cdFx0aWYgKCF0aGlzLl9lbGVtZW50KXtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCfQotC+0LLQsNGA0LjRiSEg0J/QtdGA0LLRi9C5INC/0LDRgNCw0LzQtdGC0YAg0L3QtSDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0L/Rg9GB0YLRi9C8IScpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3BhcmFtcyA9IHt9O1xyXG5cdFx0RGF0YS5zZXQodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5OQU1FX0tFWSwgdGhpcyk7XHJcblx0fVxyXG5cclxuXHRfZ2V0UGFyYW1zKGVsZW1lbnQsIHBhcmFtcykge1xyXG5cdFx0cmV0dXJuIG5ldyBQYXJhbXMocGFyYW1zLCBlbGVtZW50KS5nZXQoKTtcclxuXHR9XHJcblxyXG5cdGRpc3Bvc2UoKSB7XHJcblx0XHREYXRhLnJlbW92ZSh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLk5BTUVfS0VZKTtcclxuXHRcdEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpXHJcblxyXG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcclxuXHRcdFx0dGhpc1twcm9wZXJ0eU5hbWVdID0gbnVsbFxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0X3JvdXRlKGNhbGxiYWNrKSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblx0XHRsZXQgJGNvbnRlbnQgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IHNldERhdGEgPSAoZGF0YSkgPT4ge1xyXG5cdFx0XHRpZiAoJGNvbnRlbnQpICRjb250ZW50LmlubmVySFRNTCA9IGRhdGE7XHJcblx0XHR9O1xyXG5cclxuXHRcdGlmICghX3RoaXMuX3BhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnYWpheCcpKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIV90aGlzLl9wYXJhbXMuYWpheC5yb3V0ZSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCEnbWV0aG9kJyBpbiBfdGhpcy5fcGFyYW1zLmFqYXgpIHtcclxuXHRcdFx0X3RoaXMuX3BhcmFtcy5hamF4Lm1ldGhvZCA9ICdnZXQnO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICgndGFyZ2V0JyBpbiBfdGhpcy5fcGFyYW1zLmFqYXggJiYgX3RoaXMuX3BhcmFtcy5hamF4LnRhcmdldCkge1xyXG5cdFx0XHQkY29udGVudCA9IFNlbGVjdG9ycy5maW5kKF90aGlzLl9wYXJhbXMuYWpheC50YXJnZXQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICgnbG9hZGVyJyBpbiBfdGhpcy5fcGFyYW1zLmFqYXggJiYgX3RoaXMuX3BhcmFtcy5hamF4LmxvYWRlcikge1xyXG5cdFx0XHRzZXREYXRhKCc8ZGl2IGNsYXNzPVwidmctbG9hZGVyXCI+PC9kaXY+Jyk7XHJcblx0XHR9XHJcblxyXG5cdFx0QWpheFtfdGhpcy5fcGFyYW1zLmFqYXgubWV0aG9kXShfdGhpcy5fcGFyYW1zLmFqYXgucm91dGUsIF90aGlzLl9wYXJhbXMuYWpheC5kYXRhIHx8IHt9LCBmdW5jdGlvbiAoc3RhdHVzLCBkYXRhKSB7XHJcblx0XHRcdHNldERhdGEoZGF0YS5yZXNwb25zZSk7XHJcblx0XHRcdGV4ZWN1dGUoY2FsbGJhY2ssIFtzdGF0dXMsIGRhdGFdKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0X2Rpc21pc3NFbGVtZW50KCkge1xyXG5cdFx0bGV0IGNyb3NzID0gZ2V0U1ZHKCdjcm9zcycpLFxyXG5cdFx0XHRidXR0b24gPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy52Zy1idG4tY2xvc2UnKTtcclxuXHJcblx0XHRpZiAoYnV0dG9uKSB7XHJcblx0XHRcdGxldCBzdmcgPSBidXR0b24ucXVlcnlTZWxlY3Rvcignc3ZnJyk7XHJcblx0XHRcdGlmICghc3ZnKSBidXR0b24uaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBjcm9zcyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRfcXVldWVDYWxsYmFjayhjYWxsYmFjaywgZWxlbWVudCwgaXNBbmltYXRlZCA9IHRydWUsIHRpbWVPdXRNcykge1xyXG5cdFx0ZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbihjYWxsYmFjaywgZWxlbWVudCwgaXNBbmltYXRlZCwgdGltZU91dE1zKTtcclxuXHR9XHJcblxyXG5cdF9hbmltYXRpb24oZWxlbWVudCwga2V5LCBwYXJhbXMgPSB7fSkge1xyXG5cdFx0bmV3IEFuaW1hdGlvbihlbGVtZW50LCBrZXksIHBhcmFtcyk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0SW5zdGFuY2UoZWxlbWVudCkge1xyXG5cdFx0cmV0dXJuIERhdGEuZ2V0KFNlbGVjdG9ycy5maW5kKGVsZW1lbnQpLCB0aGlzLk5BTUVfS0VZKVxyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgcGFyYW1zID0ge30pIHtcclxuXHRcdHJldHVybiB0aGlzLmdldEluc3RhbmNlKGVsZW1lbnQpIHx8IG5ldyB0aGlzKGVsZW1lbnQsICFpc0VtcHR5T2JqKHBhcmFtcykgPyBwYXJhbXMgOiB7fSlcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXQgREFUQV9LRVkoKSB7XHJcblx0XHRyZXR1cm4gYHZnLiR7dGhpcy5OQU1FfWBcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXQgRVZFTlRfS0VZKCkge1xyXG5cdFx0cmV0dXJuIGAuJHt0aGlzLkRBVEFfS0VZfWBcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJhc2VNb2R1bGU7IiwiaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tIFwiLi4vdXRpbHMvanMvZG9tL2V2ZW50XCI7XHJcbmltcG9ydCB7aXNEaXNhYmxlZCwgaXNFbXB0eU9ian0gZnJvbSBcIi4uL3V0aWxzL2pzL2Z1bmN0aW9uc1wiO1xyXG5pbXBvcnQgU2VsZWN0b3JzIGZyb20gXCIuLi91dGlscy9qcy9kb20vc2VsZWN0b3JzXCI7XHJcblxyXG4vKipcclxuICog0KLRg9GCINGB0L7QsdGA0LDQvdGLINCy0YHQv9C+0LzQvtCz0LDRgtC10LvRjNC90YvQtSDRgdC60YDQuNC/0YLRiyDQtNC70Y8g0YDQsNCx0L7RgtGLINC80L7QtNGD0LvQtdC5XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqINCd0LDQsdC+0YAgc3ZnINGN0LvQtdC80LXQvdGC0L7QslxyXG4gKiBAcGFyYW0gbmFtZVxyXG4gKiBAcmV0dXJucyB7Knx7fX1cclxuICovXHJcbmNvbnN0IGdldFNWRyA9IChuYW1lKSA9PiB7XHJcblx0Y29uc3Qgc3ZnID0gIHtcclxuXHRcdGVycm9yOiAnPHN2ZyAgdmlld0JveD1cIjAgMCA4NyA4N1wiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+PGcgaWQ9XCJ1aS1zdWNjZXNzXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj48ZyBpZD1cIkdyb3VwLTJcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMi4wMDAwMDAsIDIuMDAwMDAwKVwiPjxjaXJjbGUgaWQ9XCJPdmFsLTJcIiBzdHJva2U9XCJyZ2JhKDI1MiwgMTkxLCAxOTEsIC41KVwiIHN0cm9rZS13aWR0aD1cIjRcIiBjeD1cIjQxLjVcIiBjeT1cIjQxLjVcIiByPVwiNDEuNVwiPjwvY2lyY2xlPjxjaXJjbGUgY2xhc3M9XCJ1aS1lcnJvci1jaXJjbGVcIiBzdHJva2U9XCIjRjc0NDQ0XCIgc3Ryb2tlLXdpZHRoPVwiNFwiIGN4PVwiNDEuNVwiIGN5PVwiNDEuNVwiIHI9XCI0MS41XCI+PC9jaXJjbGU+PHBhdGggY2xhc3M9XCJ1aS1lcnJvci1saW5lMVwiIGQ9XCJNMjIuMjQ0MjI0LDIyIEw2MC40Mjc5OTAyLDYwLjE4Mzc2NjJcIiBpZD1cIkxpbmVcIiBzdHJva2U9XCIjRjc0NDQ0XCIgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwic3F1YXJlXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVwidWktZXJyb3ItbGluZTJcIiBkPVwiTTYwLjc1NTc3NiwyMSBMMjMuMjQ0MjI0LDU5Ljg0NDM0OTJcIiBpZD1cIkxpbmVcIiBzdHJva2U9XCIjRjc0NDQ0XCIgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwic3F1YXJlXCI+PC9wYXRoPjwvZz48L2c+PC9zdmc+JyxcclxuXHRcdHN1Y2Nlc3M6ICc8c3ZnIHZpZXdCb3g9XCIwIDAgODcgODdcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPjxnIGlkPVwidWktZXJyb3JcIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPjxnIGlkPVwiR3JvdXAtM1wiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgyLjAwMDAwMCwgMi4wMDAwMDApXCI+PGNpcmNsZSBpZD1cIk92YWwtMlwiIHN0cm9rZT1cInJnYmEoMTE3LCAxODMsIDE1MiwgMC40KVwiIHN0cm9rZS13aWR0aD1cIjRcIiBjeD1cIjQxLjVcIiBjeT1cIjQxLjVcIiByPVwiNDEuNVwiPjwvY2lyY2xlPjxjaXJjbGUgIGNsYXNzPVwidWktc3VjY2Vzcy1jaXJjbGVcIiBpZD1cIk92YWwtMlwiIHN0cm9rZT1cIiNBNURDODZcIiBzdHJva2Utd2lkdGg9XCI0XCIgY3g9XCI0MS41XCIgY3k9XCI0MS41XCIgcj1cIjQxLjVcIj48L2NpcmNsZT48cG9seWxpbmUgY2xhc3M9XCJ1aS1zdWNjZXNzLXBhdGhcIiBpZD1cIlBhdGgtMlwiIHN0cm9rZT1cIiNBNURDODZcIiBzdHJva2Utd2lkdGg9XCI0XCIgcG9pbnRzPVwiMTkgMzguODAzNjgxMyAzMS4xMDIwNzQ0IDU0LjgwNDY4NzUgNjMuMjk5MjIxIDI4XCI+PC9wb2x5bGluZT48L2c+PC9nPjwvc3ZnPicsXHJcblx0XHR3YWl0aW5nOiAnPHN2ZyB2aWV3Qm94PVwiMCAwIDg3IDg3XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj48ZyBpZD1cInVpLXdhaXRpbmdcIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPjxnIGlkPVwiR3JvdXAtM1wiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgyLjAwMDAwMCwgMi4wMDAwMDApXCI+PGNpcmNsZSBpZD1cIk92YWwtMlwiIHN0cm9rZT1cInJnYmEoMjU1LCAyMTgsIDEwNiwgMC40KVwiIHN0cm9rZS13aWR0aD1cIjRcIiBjeD1cIjQxLjVcIiBjeT1cIjQxLjVcIiByPVwiNDEuNVwiPjwvY2lyY2xlPjxjaXJjbGUgY2xhc3M9XCJ1aS13YWl0aW5nLWNpcmNsZVwiIGlkPVwiT3ZhbC0yXCIgc3Ryb2tlPVwiI2ZmZGE2YVwiIHN0cm9rZS13aWR0aD1cIjRcIiBjeD1cIjQxLjVcIiBjeT1cIjQxLjVcIiByPVwiNDEuNVwiPjwvY2lyY2xlPjxwYXRoIGNsYXNzPVwidWktd2FpdGluZy1saW5lMVwiIGQ9XCJNNDMgNjNDNTQuNTk4IDYzIDY0IDUzLjU5OCA2NCA0MkM2NCAzMC40MDIgNTQuNTk4IDIxIDQzIDIxQzMxLjQwMiAyMSAyMiAzMC40MDIgMjIgNDJDMjIgNTMuNTk4IDMxLjQwMiA2MyA0MyA2M1pcIiBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlPVwiI2ZmZGE2YVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBjbGFzcz1cInVpLXdhaXRpbmctbGluZTJcIiBkPVwiTTQwLjY2NjcgMzIuNjY0MVY0NC4zMzA3SDUyLjMzMzRcIiBzdHJva2U9XCIjZmZkYTZhXCIgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L2c+PC9nPjwvc3ZnPicsXHJcblx0XHRkb3RzOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGNsYXNzPVwiYmkgYmktdGhyZWUtZG90cy12ZXJ0aWNhbFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj48cGF0aCBkPVwiTTkuNSAxM2ExLjUgMS41IDAgMSAxLTMgMCAxLjUgMS41IDAgMCAxIDMgMHptMC01YTEuNSAxLjUgMCAxIDEtMyAwIDEuNSAxLjUgMCAwIDEgMyAwem0wLTVhMS41IDEuNSAwIDEgMS0zIDAgMS41IDEuNSAwIDAgMSAzIDB6XCIvPjwvc3ZnPicsXHJcblx0XHRjcm9zczogJzxzdmcgdmVyc2lvbj1cIjEuMVwiIGlkPVwiQ2FwYV8xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMjQuNTEyIDIyNC41MTJcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPjxnPjxwb2x5Z29uIHBvaW50cz1cIjIyNC41MDcsNi45OTcgMjE3LjUyMSwwIDExMi4yNTYsMTA1LjI1OCA2Ljk5OCwwIDAuMDA1LDYuOTk3IDEwNS4yNjMsMTEyLjI1NCAwLjAwNSwyMTcuNTEyIDYuOTk4LDIyNC41MTIgMTEyLjI1NiwxMTkuMjQgMjE3LjUyMSwyMjQuNTEyIDIyNC41MDcsMjE3LjUxMiAxMTkuMjQ5LDExMi4yNTQgXCIvPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48L3N2Zz4nXHJcblx0fTtcclxuXHJcblx0cmV0dXJuIHN2Z1tuYW1lXSA/PyB7fTtcclxufVxyXG5cclxuLyoqXHJcbiAqINCS0LXRiNCw0LXQvCDRgdC+0LHRi9GC0LjQtSBcItCX0LDQutGA0YvRgtGMXCIg0L3QsCDQstGB0LUg0LzQvtC00LDQu9C60LgsINGB0LDQudC00LHQsNGA0Ysg0Lgg0YIu0L8uXHJcbiAqIEBwYXJhbSBtb2R1bGVcclxuICogQHBhcmFtIG1ldGhvZFxyXG4gKi9cclxuY29uc3QgZGlzbWlzc1RyaWdnZXIgPSAobW9kdWxlLCBtZXRob2QgPSAnaGlkZScpID0+IHtcclxuXHRjb25zdCBjbGlja0V2ZW50ID0gYGNsaWNrLmRpc21pc3MuJHttb2R1bGUuRVZFTlRfS0VZfWBcclxuXHRjb25zdCBuYW1lID0gbW9kdWxlLk5BTUU7XHJcblxyXG5cdEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgY2xpY2tFdmVudCwgYFtkYXRhLXZnLWRpc21pc3M9XCIke25hbWV9XCJdYCwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcblx0XHRpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGlzRGlzYWJsZWQodGhpcykpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCB0YXJnZXQgPSBTZWxlY3RvcnMuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKSB8fCB0aGlzLmNsb3Nlc3QoYC52Zy0ke25hbWV9YCk7XHJcblx0XHRjb25zdCBpbnN0YW5jZSA9IG1vZHVsZS5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XHJcblxyXG5cdFx0aW5zdGFuY2VbbWV0aG9kXSgpO1xyXG5cdH0pXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBSkFYIFJFUVVFU1RcclxuICogQHR5cGUge3twb3N0OiBhamF4LnBvc3QsIGdldDogYWpheC5nZXQsIHg6ICgoZnVuY3Rpb24oKTogKFhNTEh0dHBSZXF1ZXN0KSl8KiksIHNlbmQ6IGFqYXguc2VuZH19XHJcbiAqL1xyXG5jb25zdCBBamF4ID0ge1xyXG5cdHg6IGZ1bmN0aW9uICgpIHtcclxuXHRcdGlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnKSB7XHJcblx0XHRcdHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuXHRcdH1cclxuXHRcdGxldCB2ZXJzaW9ucyA9IFtcclxuXHRcdFx0XCJNU1hNTDIuWG1sSHR0cC42LjBcIixcclxuXHRcdFx0XCJNU1hNTDIuWG1sSHR0cC41LjBcIixcclxuXHRcdFx0XCJNU1hNTDIuWG1sSHR0cC40LjBcIixcclxuXHRcdFx0XCJNU1hNTDIuWG1sSHR0cC4zLjBcIixcclxuXHRcdFx0XCJNU1hNTDIuWG1sSHR0cC4yLjBcIixcclxuXHRcdFx0XCJNaWNyb3NvZnQuWG1sSHR0cFwiXHJcblx0XHRdO1xyXG5cclxuXHRcdGxldCB4aHI7XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZlcnNpb25zLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0eGhyID0gbmV3IEFjdGl2ZVhPYmplY3QodmVyc2lvbnNbaV0pO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9IGNhdGNoIChlKSB7fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB4aHI7XHJcblx0fSxcclxuXHJcblx0c2VuZDogZnVuY3Rpb24gKHVybCwgY2FsbGJhY2ssIG1ldGhvZCwgZGF0YSwgYXN5bmMpIHtcclxuXHRcdGlmIChhc3luYyA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGFzeW5jID0gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdGxldCB4ID0gQWpheC54KCk7XHJcblx0XHR4Lm9wZW4obWV0aG9kLCB1cmwsIGFzeW5jKTtcclxuXHRcdHguc2V0UmVxdWVzdEhlYWRlcihcIlgtUmVxdWVzdGVkLVdpdGhcIiwgXCJYTUxIdHRwUmVxdWVzdFwiKTtcclxuXHRcdHgub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRpZiAoeC5yZWFkeVN0YXRlID09PSA0KSB7XHJcblx0XHRcdFx0c3dpdGNoICh4LnN0YXR1cykge1xyXG5cdFx0XHRcdFx0Y2FzZSAyMDA6XHJcblx0XHRcdFx0XHRcdGNhbGxiYWNrKCdzdWNjZXNzJywge3RleHQ6IHguc3RhdHVzVGV4dCwgcmVzcG9uc2U6IHgucmVzcG9uc2VUZXh0LCBjb2RlOiB4LnN0YXR1c30pXHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0Y2FsbGJhY2soJ2Vycm9yJywge3RleHQ6IHguc3RhdHVzVGV4dCwgcmVzcG9uc2U6IHgucmVzcG9uc2VUZXh0LCBjb2RlOiB4LnN0YXR1c30pXHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHRcdHguc2VuZChkYXRhKVxyXG5cdH0sXHJcblxyXG5cdGdldDogZnVuY3Rpb24gKHVybCwgZGF0YSwgY2FsbGJhY2ssIGFzeW5jKSB7XHJcblx0XHRsZXQgcXVlcnkgPSBbXTtcclxuXHJcblx0XHRpZiAoIWlzRW1wdHlPYmooZGF0YSkpIHtcclxuXHRcdFx0Zm9yIChsZXQga2V5IG9mIGRhdGEpIHtcclxuXHRcdFx0XHRxdWVyeS5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXlbMF0pICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGtleVsxXSkpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRBamF4LnNlbmQodXJsICsgKHF1ZXJ5Lmxlbmd0aCA/ICc/JyArIHF1ZXJ5LmpvaW4oJyYnKSA6ICcnKSwgY2FsbGJhY2ssICdHRVQnLCBudWxsLCBhc3luYylcclxuXHR9LFxyXG5cclxuXHRwb3N0OiBmdW5jdGlvbiAodXJsLCBkYXRhLCBjYWxsYmFjaywgYXN5bmMpIHtcclxuXHRcdEFqYXguc2VuZCh1cmwsIGNhbGxiYWNrLCAnUE9TVCcsIGRhdGEsIGFzeW5jKVxyXG5cdH1cclxufTtcclxuXHJcbmV4cG9ydCB7XHJcblx0ZGlzbWlzc1RyaWdnZXIsIEFqYXgsIGdldFNWR1xyXG59IiwiaW1wb3J0IEJhc2VNb2R1bGUgZnJvbSBcIi4uLy4uL2Jhc2UtbW9kdWxlXCI7XHJcbmltcG9ydCB7bWVyZ2VEZWVwT2JqZWN0LCByZWZsb3d9IGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9mdW5jdGlvbnNcIjtcclxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvZG9tL2V2ZW50XCI7XHJcbmltcG9ydCBTZWxlY3RvcnMgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2pzL2RvbS9zZWxlY3RvcnNcIjtcclxuaW1wb3J0IHtNYW5pcHVsYXRvcn0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2pzL2RvbS9tYW5pcHVsYXRvclwiO1xyXG5cclxuLyoqXHJcbiAqIENvbnN0YW50c1xyXG4gKi9cclxuY29uc3QgTkFNRSA9ICdjb2xsYXBzZSc7XHJcbmNvbnN0IE5BTUVfS0VZID0gJ3ZnLmNvbGxhcHNlJztcclxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnO1xyXG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNFID0gJ3ZnLWNvbGxhcHNlJztcclxuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTSU5HID0gJ3ZnLWNvbGxhcHNpbmcnO1xyXG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNFRCA9ICd2Zy1jb2xsYXBzZWQnO1xyXG5jb25zdCBDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiA9IGA6c2NvcGUgLiR7Q0xBU1NfTkFNRV9DT0xMQVBTRX0gLiR7Q0xBU1NfTkFNRV9DT0xMQVBTRX1gO1xyXG5cclxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEU9ICdbZGF0YS12Zy10b2dnbGU9XCJjb2xsYXBzZVwiXSc7XHJcbmNvbnN0IFNFTEVDVE9SX0FDVElWRVMgPSAnLmNvbGxhcHNlLnNob3csIC5jb2xsYXBzZS5jb2xsYXBzaW5nJztcclxuXHJcbmNvbnN0IEVWRU5UX0tFWV9ISURFICAgPSBgJHtOQU1FX0tFWX0uaGlkZWA7XHJcbmNvbnN0IEVWRU5UX0tFWV9ISURERU4gPSBgJHtOQU1FX0tFWX0uaGlkZGVuYDtcclxuY29uc3QgRVZFTlRfS0VZX1NIT1cgICA9IGAke05BTUVfS0VZfS5zaG93YDtcclxuY29uc3QgRVZFTlRfS0VZX1NIT1dOICA9IGAke05BTUVfS0VZfS5zaG93bmA7XHJcblxyXG5jb25zdCBFVkVOVF9LRVlfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2suJHtOQU1FX0tFWX0uZGF0YS5hcGlgO1xyXG5cclxuY2xhc3MgVkdDb2xsYXBzZSBleHRlbmRzIEJhc2VNb2R1bGUge1xyXG5cdGNvbnN0cnVjdG9yKGVsZW1lbnQsIHBhcmFtcyA9IHt9KSB7XHJcblx0XHRzdXBlcihlbGVtZW50LCBwYXJhbXMpO1xyXG5cclxuXHRcdHRoaXMuX3BhcmFtcyA9IHRoaXMuX2dldFBhcmFtcyhlbGVtZW50LCBtZXJnZURlZXBPYmplY3Qoe1xyXG5cdFx0XHR0b2dnbGU6IHRydWUsXHJcblx0XHRcdHBhcmVudDogbnVsbCxcclxuXHRcdFx0YWpheDoge1xyXG5cdFx0XHRcdHJvdXRlOiAnJyxcclxuXHRcdFx0XHR0YXJnZXQ6ICcnLFxyXG5cdFx0XHRcdG1ldGhvZDogJ2dldCdcclxuXHRcdFx0fVxyXG5cdFx0fSwgcGFyYW1zKSk7XHJcblxyXG5cdFx0dGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcclxuXHRcdHRoaXMuX3RyaWdnZXJBcnJheSA9IFtdXHJcblxyXG5cdFx0Y29uc3QgdG9nZ2xlTGlzdCA9IFNlbGVjdG9ycy5maW5kQWxsKFNFTEVDVE9SX0RBVEFfVE9HR0xFKTtcclxuXHJcblx0XHRmb3IgKGNvbnN0IGVsZW0gb2YgdG9nZ2xlTGlzdCkge1xyXG5cdFx0XHRjb25zdCBzZWxlY3RvciA9IFNlbGVjdG9ycy5nZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW0pO1xyXG5cdFx0XHRjb25zdCBmaWx0ZXJFbGVtZW50ID0gU2VsZWN0b3JzLmZpbmRBbGwoc2VsZWN0b3IpLmZpbHRlcihmb3VuZEVsZW1lbnQgPT4gZm91bmRFbGVtZW50ID09PSB0aGlzLl9lbGVtZW50KTtcclxuXHJcblx0XHRcdGlmIChzZWxlY3RvciAhPT0gbnVsbCAmJiBmaWx0ZXJFbGVtZW50Lmxlbmd0aCkge1xyXG5cdFx0XHRcdHRoaXMuX3RyaWdnZXJBcnJheS5wdXNoKGVsZW0pXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9pbml0aWFsaXplQ2hpbGRyZW4oKTtcclxuXHJcblx0XHRpZiAoIXRoaXMuX3BhcmFtcy5wYXJlbnQpIHtcclxuXHRcdFx0dGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwgdGhpcy5faXNTaG93bigpKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5fcGFyYW1zLnRvZ2dsZSkge1xyXG5cdFx0XHR0aGlzLnRvZ2dsZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldCBOQU1FKCkge1xyXG5cdFx0cmV0dXJuIE5BTUU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0IE5BTUVfS0VZKCkge1xyXG5cdFx0cmV0dXJuIE5BTUVfS0VZXHJcblx0fVxyXG5cclxuXHR0b2dnbGUocmVsYXRlZFRhcmdldCkge1xyXG5cdFx0cmV0dXJuICF0aGlzLl9pc1Nob3duKCkgPyB0aGlzLnNob3cocmVsYXRlZFRhcmdldCkgOiB0aGlzLmhpZGUoKTtcclxuXHR9XHJcblxyXG5cdHNob3coKSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKF90aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgX3RoaXMuX2lzU2hvd24oKSkgcmV0dXJuO1xyXG5cclxuXHRcdGxldCBhY3RpdmVDaGlsZHJlbiA9IFtdO1xyXG5cclxuXHRcdGlmIChfdGhpcy5fcGFyYW1zLnBhcmVudCkge1xyXG5cdFx0XHRhY3RpdmVDaGlsZHJlbiA9IHRoaXMuX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihTRUxFQ1RPUl9BQ1RJVkVTKVxyXG5cdFx0XHRcdC5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KVxyXG5cdFx0XHRcdC5tYXAoZWxlbWVudCA9PiBWR0NvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgeyB0b2dnbGU6IGZhbHNlIH0pKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoYWN0aXZlQ2hpbGRyZW4ubGVuZ3RoICYmIGFjdGl2ZUNoaWxkcmVuWzBdLl9pc1RyYW5zaXRpb25pbmcpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBzdGFydEV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIoX3RoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWV9TSE9XKTtcclxuXHRcdGlmIChzdGFydEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcclxuXHJcblx0XHRmb3IgKGNvbnN0IGFjdGl2ZUluc3RhbmNlIG9mIGFjdGl2ZUNoaWxkcmVuKSB7XHJcblx0XHRcdGFjdGl2ZUluc3RhbmNlLmhpZGUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRfdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0UpXHJcblx0XHRfdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0lORylcclxuXHJcblx0XHRfdGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAwO1xyXG5cclxuXHRcdF90aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoX3RoaXMuX3RyaWdnZXJBcnJheSwgdHJ1ZSk7XHJcblx0XHRfdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcclxuXHJcblx0XHRfdGhpcy5fcm91dGUoKTtcclxuXHJcblx0XHRjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcclxuXHRcdFx0X3RoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0X3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNJTkcpO1xyXG5cdFx0XHRfdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVyk7XHJcblxyXG5cdFx0XHRfdGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcclxuXHRcdFx0RXZlbnRIYW5kbGVyLnRyaWdnZXIoX3RoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWV9TSE9XTik7XHJcblx0XHR9XHJcblxyXG5cdFx0X3RoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIF90aGlzLl9lbGVtZW50LCB0cnVlKTtcclxuXHJcblx0XHRjb25zdCBzY3JvbGxTaXplID0gYHNjcm9sbEhlaWdodGA7XHJcblx0XHRfdGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtfdGhpcy5fZWxlbWVudFtzY3JvbGxTaXplXX1weGA7XHJcblx0fVxyXG5cclxuXHRoaWRlKCkge1xyXG5cdFx0Y29uc3QgX3RoaXMgPSB0aGlzO1xyXG5cclxuXHRcdGlmIChfdGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICFfdGhpcy5faXNTaG93bigpKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3Qgc3RhcnRFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKF90aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlfSElERSlcclxuXHRcdGlmIChzdGFydEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcclxuXHJcblx0XHRfdGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodH1weGA7XHJcblx0XHRyZWZsb3coX3RoaXMuX2VsZW1lbnQpO1xyXG5cclxuXHRcdF90aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKTtcclxuXHRcdF90aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTRSwgQ0xBU1NfTkFNRV9TSE9XKTtcclxuXHJcblx0XHRmb3IgKGNvbnN0IHRyaWdnZXIgb2YgX3RoaXMuX3RyaWdnZXJBcnJheSkge1xyXG5cdFx0XHRjb25zdCBlbGVtZW50ID0gU2VsZWN0b3JzLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodHJpZ2dlcik7XHJcblxyXG5cdFx0XHRpZiAoZWxlbWVudCAmJiAhX3RoaXMuX2lzU2hvd24oZWxlbWVudCkpIHtcclxuXHRcdFx0XHRfdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFt0cmlnZ2VyXSwgZmFsc2UpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0X3RoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWVcclxuXHJcblx0XHRjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcclxuXHRcdFx0X3RoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xyXG5cdFx0XHRfdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORyk7XHJcblx0XHRcdF90aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTRSk7XHJcblx0XHRcdEV2ZW50SGFuZGxlci50cmlnZ2VyKF90aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlfSElEREVOKTtcclxuXHRcdH1cclxuXHJcblx0XHRfdGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcclxuXHRcdF90aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBfdGhpcy5fZWxlbWVudCwgdHJ1ZSk7XHJcblx0fVxyXG5cclxuXHRkaXNwb3NlKCkge1xyXG5cdFx0c3VwZXIuZGlzcG9zZSgpO1xyXG5cdH1cclxuXHJcblx0X2lzU2hvd24oZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQpIHtcclxuXHRcdHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpO1xyXG5cdH1cclxuXHJcblx0X2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0cmlnZ2VyQXJyYXksIGlzT3Blbikge1xyXG5cdFx0aWYgKCF0cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XHJcblx0XHRcdHJldHVyblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiB0cmlnZ2VyQXJyYXkpIHtcclxuXHRcdFx0dGhpcy5fY2hhbmdlU3RhdGVCdXR0b24oZWxlbWVudCwgaXNPcGVuKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdF9pbml0aWFsaXplQ2hpbGRyZW4oKSB7XHJcblx0XHRpZiAoIXRoaXMuX3BhcmFtcy5wYXJlbnQpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBjaGlsZHJlbiA9IHRoaXMuX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihTRUxFQ1RPUl9EQVRBX1RPR0dMRSk7XHJcblxyXG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGNoaWxkcmVuKSB7XHJcblx0XHRcdGNvbnN0IHNlbGVjdGVkID0gU2VsZWN0b3JzLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudClcclxuXHJcblx0XHRcdGlmIChzZWxlY3RlZCkge1xyXG5cdFx0XHRcdHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbZWxlbWVudF0sIHRoaXMuX2lzU2hvd24oc2VsZWN0ZWQpKVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRfZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKHNlbGVjdG9yKSB7XHJcblx0XHRjb25zdCBjaGlsZHJlbiA9IFNlbGVjdG9ycy5maW5kKENMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOLCB0aGlzLl9wYXJhbXMucGFyZW50KTtcclxuXHRcdHJldHVybiBTZWxlY3RvcnMuZmluZChzZWxlY3RvciwgdGhpcy5fcGFyYW1zLnBhcmVudCkuZmlsdGVyKGVsZW1lbnQgPT4gIWNoaWxkcmVuLmluY2x1ZGVzKGVsZW1lbnQpKTtcclxuXHR9XHJcblxyXG5cdF9jaGFuZ2VTdGF0ZUJ1dHRvbihlbGVtZW50LCBpc09wZW4pIHtcclxuXHRcdGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShDTEFTU19OQU1FX0NPTExBUFNFRCwgIWlzT3Blbik7XHJcblx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGlzT3Blbik7XHJcblx0XHRlbGVtZW50LmlubmVySFRNTCA9IE1hbmlwdWxhdG9yLmdldChlbGVtZW50LCBgZGF0YS0ke2lzT3BlbiA/ICdoaWRlJyA6ICdzaG93J30tdGV4dGApIHx8IGVsZW1lbnQuaW5uZXJIVE1MO1xyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXHJcbiAqL1xyXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWV9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xyXG5cdGlmIChldmVudC50YXJnZXQudGFnTmFtZSA9PT0gJ0EnIHx8IChldmVudC5kZWxlZ2F0ZVRhcmdldCAmJiBldmVudC5kZWxlZ2F0ZVRhcmdldC50YWdOYW1lID09PSAnQScpKSB7XHJcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcblx0fVxyXG5cclxuXHRTZWxlY3RvcnMuZ2V0TXVsdGlwbGVFbGVtZW50c0Zyb21TZWxlY3Rvcih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcblx0XHRWR0NvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwge3RvZ2dsZTogZmFsc2V9KS50b2dnbGUoKTtcclxuXHR9KTtcclxufSlcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZHQ29sbGFwc2U7IiwiaW1wb3J0IEJhc2VNb2R1bGUgZnJvbSBcIi4uLy4uL2Jhc2UtbW9kdWxlXCI7XHJcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2pzL2RvbS9ldmVudFwiO1xyXG5pbXBvcnQgU2VsZWN0b3JzIGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9kb20vc2VsZWN0b3JzXCI7XHJcbmltcG9ydCB7aXNEaXNhYmxlZCwgbWVyZ2VEZWVwT2JqZWN0LCBub29wfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvZnVuY3Rpb25zXCI7XHJcbmltcG9ydCBQbGFjZW1lbnQgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2pzL2NvbXBvbmVudHMvcGxhY2VtZW50XCI7XHJcblxyXG5jb25zdCBOQU1FICAgICAgICAgICAgID0gJ2Ryb3Bkb3duJztcclxuY29uc3QgTkFNRV9LRVkgICAgICAgICA9ICd2Zy5kcm9wZG93bic7XHJcbmNvbnN0IENMQVNTX05BTUVfU0hPVyAgPSAnc2hvdyc7XHJcbmNvbnN0IENMQVNTX05BTUVfRkFERSAgPSAnZmFkZSc7XHJcbmNvbnN0IFRBUkdFVF9DT05UQUlORVIgPSAndmctZHJvcGRvd24tY29udGVudCc7XHJcbmNvbnN0IFBBUkVOVF9DT05UQUlORVIgPSAndmctZHJvcGRvd24nO1xyXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS12Zy10b2dnbGU9XCJkcm9wZG93blwiXSc7XHJcblxyXG5jb25zdCBFVkVOVF9LRVlfSElERSAgID0gYCR7TkFNRV9LRVl9LmhpZGVgO1xyXG5jb25zdCBFVkVOVF9LRVlfSElEREVOID0gYCR7TkFNRV9LRVl9LmhpZGRlbmA7XHJcbmNvbnN0IEVWRU5UX0tFWV9TSE9XICAgPSBgJHtOQU1FX0tFWX0uc2hvd2A7XHJcbmNvbnN0IEVWRU5UX0tFWV9TSE9XTiAgPSBgJHtOQU1FX0tFWX0uc2hvd25gO1xyXG5cclxuY29uc3QgRVZFTlRfS0VZVVBfREFUQV9BUEkgPSAgICAgYGtleXVwLiR7TkFNRV9LRVl9LmRhdGEuYXBpYDtcclxuY29uc3QgRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSA9ICAgYGtleWRvd24uJHtOQU1FX0tFWX0uZGF0YS5hcGlgO1xyXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9ICAgICBgY2xpY2suJHtOQU1FX0tFWX0uZGF0YS5hcGlgO1xyXG5jb25zdCBFVkVOVF9NT1VTRU9WRVJfREFUQV9BUEkgPSBgbW91c2VvdmVyLiR7TkFNRV9LRVl9LmRhdGEuYXBpYDtcclxuY29uc3QgRVZFTlRfTU9VU0VPVVRfREFUQV9BUEkgPSAgYG1vdXNlb3V0LiR7TkFNRV9LRVl9LmRhdGEuYXBpYDtcclxuXHJcbmNsYXNzIFZHRHJvcGRvd24gZXh0ZW5kcyBCYXNlTW9kdWxlIHtcclxuXHRjb25zdHJ1Y3RvcihlbGVtZW50LCBwYXJhbXMpIHtcclxuXHRcdHN1cGVyKGVsZW1lbnQsIHBhcmFtcyk7XHJcblxyXG5cdFx0bGV0IGRlZmF1bHRQYXJhbXMgPSB7XHJcblx0XHRcdG9mZnNldDogWzAsIDJdLFxyXG5cdFx0XHRvdmVyOiBmYWxzZSxcclxuXHRcdFx0YmFja2Ryb3A6IHRydWUsXHJcblx0XHRcdG92ZXJmbG93OiB0cnVlLFxyXG5cdFx0XHRrZXlib2FyZDogdHJ1ZSxcclxuXHRcdFx0cGxhY2VtZW50OiAnYm90dG9tJyxcclxuXHRcdFx0dGltZW91dEFuaW1hdGlvbjogMzUwLFxyXG5cdFx0XHRob3ZlcjogZmFsc2UsXHJcblx0XHRcdGFqYXg6IHtcclxuXHRcdFx0XHRyb3V0ZTogJycsXHJcblx0XHRcdFx0dGFyZ2V0OiAnJyxcclxuXHRcdFx0XHRtZXRob2Q6ICdnZXQnXHJcblx0XHRcdH0sXHJcblx0XHRcdGFuaW1hdGlvbjoge1xyXG5cdFx0XHRcdGVuYWJsZTogZmFsc2UsXHJcblx0XHRcdFx0aW46ICdhbmltYXRlX19mbGlwSW5ZJyxcclxuXHRcdFx0XHRvdXQ6ICdhbmltYXRlX19mbGlwT3V0WScsXHJcblx0XHRcdFx0ZGVsYXk6IDgwMCxcclxuXHRcdFx0fSxcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoJ29mZnNldCcgaW4gcGFyYW1zICYmIEFycmF5LmlzQXJyYXkocGFyYW1zLm9mZnNldCkpIHtcclxuXHRcdFx0ZGVmYXVsdFBhcmFtcy5vZmZzZXQgPSBwYXJhbXMub2Zmc2V0O1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3BhcmFtcyA9IHRoaXMuX2dldFBhcmFtcyhlbGVtZW50LCBtZXJnZURlZXBPYmplY3QoZGVmYXVsdFBhcmFtcywgcGFyYW1zKSk7XHJcblxyXG5cdFx0dGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlO1xyXG5cdFx0dGhpcy5fZHJvcCA9IFNlbGVjdG9ycy5maW5kKCcuJyArIFRBUkdFVF9DT05UQUlORVIsIHRoaXMuX3BhcmVudCk7XHJcblx0XHR0aGlzLl9pc1BsYWNlbWVudCA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMuX3BhcmFtcy5hbmltYXRpb24uZGVsYXkgPSAhdGhpcy5fcGFyYW1zLmFuaW1hdGlvbi5lbmFibGUgPyAwIDogdGhpcy5fcGFyYW1zLmFuaW1hdGlvbi5kZWxheTtcclxuXHRcdHRoaXMuX2FuaW1hdGlvbih0aGlzLl9kcm9wLCBWR0Ryb3Bkb3duLk5BTUVfS0VZLCB0aGlzLl9wYXJhbXMuYW5pbWF0aW9uKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXQgTkFNRSgpIHtcclxuXHRcdHJldHVybiBOQU1FO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldCBOQU1FX0tFWSgpIHtcclxuXHRcdHJldHVybiBOQU1FX0tFWTtcclxuXHR9XHJcblxyXG5cdHRvZ2dsZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLl9pc1Nob3duKCkgPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdygpO1xyXG5cdH1cclxuXHJcblx0c2hvdygpIHtcclxuXHRcdGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8IHRoaXMuX2lzU2hvd24oKSkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7XHJcblx0XHRcdHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlfU0hPVywgcmVsYXRlZFRhcmdldClcclxuXHRcdGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xyXG5cclxuXHRcdGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuXHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xyXG5cdFx0XHRcdEV2ZW50SGFuZGxlci5vbihlbGVtZW50LCAnbW91c2VvdmVyJywgbm9vcCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9yb3V0ZSgpO1xyXG5cclxuXHRcdHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XHJcblx0XHR0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKTtcclxuXHRcdHRoaXMuX2Ryb3AuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpO1xyXG5cdFx0dGhpcy5fc2V0UGxhY2VtZW50KCk7XHJcblxyXG5cdFx0Y29uc3QgY29tcGxldGVDYWxsQmFjayA9ICgpID0+IHtcclxuXHRcdFx0dGhpcy5fZHJvcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSk7XHJcblx0XHRcdEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWV9TSE9XTiwgcmVsYXRlZFRhcmdldClcclxuXHRcdH1cclxuXHRcdHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsQmFjaywgdGhpcy5fZHJvcCwgdHJ1ZSwgNTApO1xyXG5cdH1cclxuXHJcblx0aGlkZSgpIHtcclxuXHRcdGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8ICF0aGlzLl9pc1Nob3duKCkpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7XHJcblx0XHRcdHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9jb21wbGV0ZUhpZGUocmVsYXRlZFRhcmdldCk7XHJcblx0fVxyXG5cclxuXHRkaXNwb3NlKCkge1xyXG5cdFx0cmV0dXJuIHN1cGVyLmRpc3Bvc2UoKTtcclxuXHR9XHJcblxyXG5cdF9pc1Nob3duKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVyk7XHJcblx0fVxyXG5cclxuXHRfY29tcGxldGVIaWRlKHJlbGF0ZWRUYXJnZXQpIHtcclxuXHRcdGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWV9ISURFLCByZWxhdGVkVGFyZ2V0KVxyXG5cdFx0aWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcblx0XHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBbXS5jb25jYXQoLi4uZG9jdW1lbnQuYm9keS5jaGlsZHJlbikpIHtcclxuXHRcdFx0XHRFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2Ryb3AuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0ZBREUpO1xyXG5cdFx0dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyk7XHJcblx0XHR0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xyXG5cclxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRjb25zdCBjb21wbGV0ZUNhbGxiYWNrID0gKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuX2Ryb3AuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xyXG5cdFx0XHRcdEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWV9ISURERU4sIHJlbGF0ZWRUYXJnZXQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsYmFjaywgdGhpcy5fcGFyZW50LCB0cnVlLCAxMCk7XHJcblx0XHR9LCB0aGlzLl9wYXJhbXMuYW5pbWF0aW9uLmRlbGF5KTtcclxuXHR9XHJcblxyXG5cdC8vIFRPRE8gY2xhc3MgUGxhY2VtZW50IGlzbid0IGRvbmVcclxuXHRfc2V0UGxhY2VtZW50KCkge1xyXG5cdFx0Y29uc3QgX3RoaXMgPSB0aGlzO1xyXG5cclxuXHRcdGlmICghX3RoaXMuX2lzUGxhY2VtZW50KSB7XHJcblx0XHRcdGxldCBwbGFjZW1lbnQgPSBuZXcgUGxhY2VtZW50KHtcclxuXHRcdFx0XHRlbGVtZW50OiB0aGlzLl9wYXJlbnQsXHJcblx0XHRcdFx0ZHJvcDogdGhpcy5fZHJvcFxyXG5cdFx0XHR9KS5fZ2V0UGxhY2VtZW50KCk7XHJcblxyXG5cdFx0XHRpZiAocGxhY2VtZW50LmlzRml4ZWQpIHtcclxuXHRcdFx0XHRfdGhpcy5fZHJvcC5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcblx0XHRcdFx0X3RoaXMuX2Ryb3Auc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVkoLTIwJSknOyAvLyB0b2RvIHRoaXMgaXMg0LrQvtGB0YLRi9C70Ywg0L/QvmZpeNC40YLRjFxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfdGhpcy5fZHJvcC5zdHlsZS5sZWZ0ID0gcGxhY2VtZW50LmxlZnQgKyAncHgnO1xyXG5cdFx0XHRfdGhpcy5fZHJvcC5zdHlsZS50b3AgPSAgcGxhY2VtZW50LnRvcCArICdweCc7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKF90aGlzLl9wYXJhbXMub2Zmc2V0KSB7XHJcblx0XHRcdF90aGlzLl9kcm9wLnN0eWxlLnBhZGRpbmdUb3AgPSBfdGhpcy5fcGFyYW1zLm9mZnNldFsxXSArICdweCc7XHJcblx0XHRcdF90aGlzLl9kcm9wLnN0eWxlLnBhZGRpbmdSaWdodCA9IF90aGlzLl9wYXJhbXMub2Zmc2V0WzBdICsgJ3B4JztcclxuXHRcdH1cclxuXHJcblx0XHRfdGhpcy5faXNQbGFjZW1lbnQgPSB0cnVlO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGluaXQoZWxlbWVudCwgcGFyYW1zID0ge30pIHtcclxuXHRcdGNvbnN0IGluc3RhbmNlID0gVkdEcm9wZG93bi5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHBhcmFtcyk7XHJcblxyXG5cdFx0aWYgKGluc3RhbmNlLl9wYXJhbXMuaG92ZXIpIHtcclxuXHRcdFx0bGV0IGN1cnJlbnRFbGVtID0gbnVsbDtcclxuXHRcdFx0RXZlbnRIYW5kbGVyLm9uKGluc3RhbmNlLl9wYXJlbnQsIEVWRU5UX01PVVNFT1ZFUl9EQVRBX0FQSSwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcblx0XHRcdFx0aWYgKGN1cnJlbnRFbGVtKSByZXR1cm47XHJcblx0XHRcdFx0VkdEcm9wZG93bi5oaWRlT3BlblRvZ2dsZXMoZXZlbnQpO1xyXG5cclxuXHRcdFx0XHRsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy4nICsgUEFSRU5UX0NPTlRBSU5FUik7XHJcblx0XHRcdFx0aWYgKCF0YXJnZXQpIHJldHVybjtcclxuXHJcblx0XHRcdFx0aWYgKCFpbnN0YW5jZS5fcGFyZW50LmNvbnRhaW5zKHRhcmdldCkpIHJldHVybjtcclxuXHRcdFx0XHRjdXJyZW50RWxlbSA9IHRhcmdldDtcclxuXHRcdFx0XHRpbnN0YW5jZS5zaG93KCk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0RXZlbnRIYW5kbGVyLm9uKGluc3RhbmNlLl9wYXJlbnQsIEVWRU5UX01PVVNFT1VUX0RBVEFfQVBJLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuXHRcdFx0XHRpZiAoIWN1cnJlbnRFbGVtKSByZXR1cm47XHJcblxyXG5cdFx0XHRcdGxldCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcclxuXHJcblx0XHRcdFx0d2hpbGUgKHJlbGF0ZWRUYXJnZXQpIHtcclxuXHRcdFx0XHRcdGlmIChyZWxhdGVkVGFyZ2V0ID09PSBjdXJyZW50RWxlbSkgcmV0dXJuO1xyXG5cdFx0XHRcdFx0cmVsYXRlZFRhcmdldCA9IHJlbGF0ZWRUYXJnZXQucGFyZW50Tm9kZTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRFbGVtID0gbnVsbDtcclxuXHRcdFx0XHRpbnN0YW5jZS5fY29tcGxldGVIaWRlKHtyZWxhdGVkVGFyZ2V0OiBpbnN0YW5jZS5fZWxlbWVudH0pO1xyXG5cdFx0XHR9KVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0RXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlVUF9EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIFZHRHJvcGRvd24ua2V5ZG93bkhhbmRsZXIpO1xyXG5cdFx0XHRFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fREFUQV9BUEksICcuJyArIFRBUkdFVF9DT05UQUlORVIsIFZHRHJvcGRvd24ua2V5ZG93bkhhbmRsZXIpO1xyXG5cdFx0XHRFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWVVQX0RBVEFfQVBJLCBWR0Ryb3Bkb3duLmNsZWFyRHJvcHMpO1xyXG5cdFx0XHRFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBWR0Ryb3Bkb3duLmNsZWFyRHJvcHMpO1xyXG5cdFx0XHRFdmVudEhhbmRsZXIub24oZWxlbWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIGZ1bmN0aW9uIChldmVudCkge1xyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0aW5zdGFuY2UudG9nZ2xlKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0c3RhdGljIGhpZGVPcGVuVG9nZ2xlcyhldmVudCkge1xyXG5cdFx0Y29uc3Qgb3BlblRvZ2dsZXMgPSBTZWxlY3RvcnMuZmluZEFsbCgnW2RhdGEtdmctdG9nZ2xlPVwiZHJvcGRvd25cIl06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCkuc2hvdycpO1xyXG5cdFx0Zm9yIChjb25zdCB0b2dnbGUgb2Ygb3BlblRvZ2dsZXMpIHtcclxuXHRcdFx0Y29uc3QgY29udGV4dCA9IFZHRHJvcGRvd24uZ2V0SW5zdGFuY2UodG9nZ2xlKTtcclxuXHRcdFx0aWYgKCFjb250ZXh0KSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmIChldmVudC50YXJnZXQuY2xvc2VzdCgnLicgKyBUQVJHRVRfQ09OVEFJTkVSKSA9PT0gY29udGV4dC5fZHJvcCkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY29tcG9zZWRQYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XHJcblx0XHRcdGlmIChjb21wb3NlZFBhdGguaW5jbHVkZXMoY29udGV4dC5fZWxlbWVudCkpIHtcclxuXHRcdFx0XHRjb250aW51ZVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCByZWxhdGVkVGFyZ2V0ID0geyByZWxhdGVkVGFyZ2V0OiBjb250ZXh0Ll9lbGVtZW50IH1cclxuXHJcblx0XHRcdGlmIChldmVudC50eXBlID09PSAnY2xpY2snKSB7XHJcblx0XHRcdFx0cmVsYXRlZFRhcmdldC5jbGlja0V2ZW50ID0gZXZlbnRcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29udGV4dC5fY29tcGxldGVIaWRlKHJlbGF0ZWRUYXJnZXQpXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzdGF0aWMga2V5ZG93bkhhbmRsZXIoZXZlbnQpIHtcclxuXHRcdGNvbnN0IGlzSW5wdXQgPSAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKVxyXG5cdFx0Y29uc3QgaXNFc2NhcGVFdmVudCA9IGV2ZW50LmtleSA9PT0gJ0VzY2FwZSdcclxuXHRcdGNvbnN0IGlzVXBPckRvd25FdmVudCA9IFsnQXJyb3dVcCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcyhldmVudC5rZXkpXHJcblxyXG5cdFx0aWYgKCFpc1VwT3JEb3duRXZlbnQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcclxuXHRcdFx0cmV0dXJuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGlzSW5wdXQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcclxuXHRcdFx0cmV0dXJuXHJcblx0XHR9XHJcblxyXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG5cclxuXHRcdGNvbnN0IGdldFRvZ2dsZUJ1dHRvbiA9IHRoaXMubWF0Y2hlcyhTRUxFQ1RPUl9EQVRBX1RPR0dMRSkgP1xyXG5cdFx0XHR0aGlzIDogKFNlbGVjdG9ycy5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBldmVudC5kZWxlZ2F0ZVRhcmdldC5wYXJlbnROb2RlKSlcclxuXHJcblx0XHRjb25zdCBpbnN0YW5jZSA9IFZHRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZShnZXRUb2dnbGVCdXR0b24pXHJcblxyXG5cdFx0aWYgKGlzVXBPckRvd25FdmVudCkge1xyXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG5cdFx0XHRpbnN0YW5jZS5zaG93KClcclxuXHRcdFx0cmV0dXJuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGluc3RhbmNlLl9pc1Nob3duKCkpIHtcclxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcclxuXHRcdFx0aW5zdGFuY2UuaGlkZSgpXHJcblx0XHRcdGdldFRvZ2dsZUJ1dHRvbi5mb2N1cygpXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY2xlYXJEcm9wcyhldmVudCkge1xyXG5cdFx0aWYgKGV2ZW50LmJ1dHRvbiA9PT0gMiB8fCAoZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXkgIT09ICdUYWInKSkge1xyXG5cdFx0XHRyZXR1cm5cclxuXHRcdH1cclxuXHJcblx0XHRWR0Ryb3Bkb3duLmhpZGVPcGVuVG9nZ2xlcyhldmVudClcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZHRHJvcGRvd247IiwiaW1wb3J0IEJhc2VNb2R1bGUgZnJvbSBcIi4uLy4uL2Jhc2UtbW9kdWxlXCI7XHJcbmltcG9ydCB7TWFuaXB1bGF0b3J9IGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9kb20vbWFuaXB1bGF0b3JcIjtcclxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvZG9tL2V2ZW50XCI7XHJcbmltcG9ydCBWR01vZGFsIGZyb20gXCIuLi8uLi92Z21vZGFsL2pzL3ZnbW9kYWxcIjtcclxuaW1wb3J0IHtpc09iamVjdCwgbWFrZVJhbmRvbVN0cmluZywgbWVyZ2VEZWVwT2JqZWN0LCBub3JtYWxpemVEYXRhfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvZnVuY3Rpb25zXCI7XHJcbmltcG9ydCBTZWxlY3RvcnMgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2pzL2RvbS9zZWxlY3RvcnNcIjtcclxuaW1wb3J0IFZHQ29sbGFwc2UgZnJvbSBcIi4uLy4uL3ZnY29sbGFwc2UvanMvdmdjb2xsYXBzZVwiO1xyXG5pbXBvcnQge2dldFNWR30gZnJvbSBcIi4uLy4uL21vZHVsZS1mblwiO1xyXG5pbXBvcnQgQmFja2Ryb3AgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2pzL2NvbXBvbmVudHMvYmFja2Ryb3BcIjtcclxuXHJcbi8qKlxyXG4gKiBDb25zdGFudHNcclxuICovXHJcbmNvbnN0IE5BTUUgPSAnZm9ybS1zZW5kZXInO1xyXG5jb25zdCBOQU1FX0tFWSA9ICd2Zy5mcyc7XHJcblxyXG4vKipcclxuICogQ29uc3RhbnRzIEV2ZW50c1xyXG4gKi9cclxuY29uc3QgRVZFTlRfS0VZX1NVQ0NFU1MgPSAndmcuZnMuc3VjY2Vzcyc7XHJcbmNvbnN0IEVWRU5UX0tFWV9FUlJPUiAgID0gJ3ZnLmZzLmVycm9yJztcclxuY29uc3QgRVZFTlRfS0VZX0JFRk9SRSAgPSAndmcuZnMuYmVmb3JlJztcclxuXHJcbmNvbnN0IEVWRU5UX1NVQk1JVF9EQVRBX0FQSSA9IGBzdWJtaXQuJHtOQU1FX0tFWX0uZGF0YS5hcGlgO1xyXG5cclxuY2xhc3MgVkdGb3JtU2VuZGVyIGV4dGVuZHMgQmFzZU1vZHVsZSB7XHJcblx0Y29uc3RydWN0b3IoZWxlbWVudCwgcGFyYW1zID0ge30pIHtcclxuXHRcdHN1cGVyKGVsZW1lbnQsIHBhcmFtcyk7XHJcblxyXG5cdFx0dGhpcy5fcGFyYW1zID0gdGhpcy5fZ2V0UGFyYW1zKGVsZW1lbnQsIG1lcmdlRGVlcE9iamVjdCh7XHJcblx0XHRcdHJlZGlyZWN0OiAnJyxcclxuXHRcdFx0dmFsaWRhdGU6IGZhbHNlLFxyXG5cdFx0XHRzdWJtaXQ6IGZhbHNlLFxyXG5cdFx0XHRmaWVsZHM6IFtdLFxyXG5cdFx0XHRhbGVydDoge1xyXG5cdFx0XHRcdGVuYWJsZWQ6IHRydWUsXHJcblx0XHRcdFx0dHlwZTogJ21vZGFsJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRhamF4OiB7XHJcblx0XHRcdFx0cm91dGU6ICcnLFxyXG5cdFx0XHRcdHRhcmdldDogJycsXHJcblx0XHRcdFx0bWV0aG9kOiAnZ2V0JyxcclxuXHRcdFx0fSxcclxuXHRcdFx0Y2xhc3Nlczoge1xyXG5cdFx0XHRcdGdlbmVyYWw6ICd2Zy1mb3JtLXNlbmRlcicsXHJcblx0XHRcdFx0YWxlcnRDb2xsYXBzZTogJ3ZnLWZvcm0tc2VuZGVyLWNvbGxhcHNlJyxcclxuXHRcdFx0XHRhbGVydE1vZGFsOiAndmctZm9ybS1zZW5kZXItbW9kYWwnLFxyXG5cdFx0XHRcdHZhbGlkYXRpb246ICduZWVkcy12YWxpZGF0aW9uJyxcclxuXHRcdFx0XHR3YXNWYWxpZGF0ZTogJ3dhcy12YWxpZGF0ZWQnXHJcblx0XHRcdH1cclxuXHRcdH0sIHBhcmFtcykpO1xyXG5cclxuXHRcdHRoaXMuX3BhcmFtcy5hamF4LnJvdXRlID0gTWFuaXB1bGF0b3IuZ2V0KHRoaXMuX2VsZW1lbnQsICdhY3Rpb24nKS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0dGhpcy5fcGFyYW1zLmFqYXgubWV0aG9kID0gTWFuaXB1bGF0b3IuZ2V0KHRoaXMuX2VsZW1lbnQsICdtZXRob2QnKS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0dGhpcy5fYnV0dG9uID0gU2VsZWN0b3JzLmZpbmQoJ1t0eXBlPVwic3VibWl0XCJdJywgdGhpcy5fZWxlbWVudCkgfHwgU2VsZWN0b3JzLmZpbmQoJ1tmb3JtPVwiJyArIHRoaXMuX2VsZW1lbnQuaWQgKyAnXCJdJykgfHwgbnVsbDtcclxuXHJcblx0XHR0aGlzLl9wYXJhbXMuaXNCdG5UZXh0ICAgPSBNYW5pcHVsYXRvci5nZXQodGhpcy5fZWxlbWVudCwgJ2RhdGEtYnRuLXRleHQnKSAhPT0gJ2ZhbHNlJztcclxuXHRcdHRoaXMuX3BhcmFtcy5pc0pzb25QYXJzZSA9IE1hbmlwdWxhdG9yLmdldCh0aGlzLl9lbGVtZW50LCAnZGF0YS1qc29uLXBhcnNlJykgIT09ICdmYWxzZSc7XHJcblx0XHR0aGlzLl9wYXJhbXMuaXNTaG93UGFzcyAgPSBNYW5pcHVsYXRvci5nZXQodGhpcy5fZWxlbWVudCwgJ2RhdGEtc2hvdy1wYXNzJykgPT09ICd0cnVlJztcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXQgTkFNRSgpIHtcclxuXHRcdHJldHVybiBOQU1FO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldCBOQU1FX0tFWSgpIHtcclxuXHRcdHJldHVybiBOQU1FX0tFWTtcclxuXHR9XHJcblxyXG5cdGJ1aWxkKCkge1xyXG5cdFx0dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuX3BhcmFtcy5jbGFzc2VzLmdlbmVyYWwpO1xyXG5cclxuXHRcdGlmICh0aGlzLl9wYXJhbXMudmFsaWRhdGUpIHtcclxuXHRcdFx0TWFuaXB1bGF0b3Iuc2V0KHRoaXMuX2VsZW1lbnQsICdub3ZhbGlkYXRlJywgJycpO1xyXG5cdFx0XHR0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5fcGFyYW1zLmNsYXNzZXMudmFsaWRhdGlvbik7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVE9ETyDRgdC00LXQu9Cw0YLRjCDQtNC+0LHQsNCy0LvQtdC90LjQtSDQs9C70LDQt9CwINC10YHQu9C4INC10YHRgtGMINCy0LLQvtC0INC/0LDRgNC+0LvRj1xyXG5cclxuXHRcdHJldHVybiB0aGlzXHJcblx0fVxyXG5cclxuXHRyZXF1ZXN0KGRhdGEsIGV2ZW50KSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0X3RoaXMuX2FsZXJ0QmVmb3JlKCk7XHJcblxyXG5cdFx0X3RoaXMuX3BhcmFtcy5hamF4LmRhdGEgPSBkYXRhO1xyXG5cclxuXHRcdF90aGlzLl9yb3V0ZShmdW5jdGlvbiAoc3RhdHVzLCBkYXRhKSB7XHJcblx0XHRcdF90aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3dhcy12YWxpZGF0ZWQnKTtcclxuXHJcblx0XHRcdGlmIChfdGhpcy5fcGFyYW1zLmFsZXJ0LmVuYWJsZWQpIHtcclxuXHRcdFx0XHRpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ3N0cmluZycgJiYgc3RhdHVzID09PSAnZXJyb3InKSB7XHJcblx0XHRcdFx0XHRfdGhpcy5fYWxlcnRFcnJvcihldmVudCwgZGF0YSk7XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnc3RyaW5nJyAmJiBzdGF0dXMgPT09ICdzdWNjZXNzJykge1xyXG5cdFx0XHRcdFx0X3RoaXMuX2FsZXJ0U3VjY2VzcyhldmVudCwgZGF0YSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoX3RoaXMuX3BhcmFtcy5yZWRpcmVjdCkge1xyXG5cdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gX3RoaXMuX3BhcmFtcy5yZWRpcmVjdDtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRfYWxlcnRCZWZvcmUoKSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKF90aGlzLl9wYXJhbXMuYWxlcnQudHlwZSA9PT0gJ2NvbGxhcHNlJykge1xyXG5cdFx0XHRbLi4uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShfdGhpcy5fcGFyYW1zLmNsYXNzZXMuYWxlcnRDb2xsYXBzZSldLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuXHRcdFx0XHRpZiAoZWxlbWVudCAmJiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSB7XHJcblx0XHRcdFx0XHRWR0NvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwge3RvZ2dsZTogZmFsc2V9KS5oaWRlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRfdGhpcy5fc3RhdHVzQnV0dG9uKCdiZWZvcmUnKTtcclxuXHRcdEV2ZW50SGFuZGxlci50cmlnZ2VyKF90aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlfQkVGT1JFLCBfdGhpcyk7XHJcblx0fVxyXG5cclxuXHRfYWxlcnRFcnJvcihldmVudCwgZGF0YSkge1xyXG5cdFx0Y29uc3QgX3RoaXMgPSB0aGlzO1xyXG5cclxuXHRcdF90aGlzLl9zdGF0dXNCdXR0b24oJ2FmdGVyJyk7XHJcblx0XHRfdGhpcy5fanNvblBhcnNlKGRhdGEsICdlcnJvcicpO1xyXG5cdFx0RXZlbnRIYW5kbGVyLnRyaWdnZXIoX3RoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWV9FUlJPUiwgW2V2ZW50LCBfdGhpcywgZGF0YV0pO1xyXG5cdH1cclxuXHJcblx0X2FsZXJ0U3VjY2VzcyhldmVudCwgZGF0YSkge1xyXG5cdFx0Y29uc3QgX3RoaXMgPSB0aGlzO1xyXG5cclxuXHRcdF90aGlzLl9zdGF0dXNCdXR0b24oJ2FmdGVyJyk7XHJcblx0XHRfdGhpcy5fanNvblBhcnNlKGRhdGEsICdzdWNjZXNzJyk7XHJcblx0XHRFdmVudEhhbmRsZXIudHJpZ2dlcihfdGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZX1NVQ0NFU1MsIFtldmVudCwgX3RoaXMsIGRhdGFdKTtcclxuXHR9XHJcblxyXG5cdF9zdGF0dXNCdXR0b24oc3RhdHVzKSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCFfdGhpcy5fYnV0dG9uKSByZXR1cm47XHJcblxyXG5cdFx0bGV0IGJ0blN1Ym1pdFRleHQgPSBfdGhpcy5fYnV0dG9uLFxyXG5cdFx0XHRidG5UZXh0ID0ge1xyXG5cdFx0XHRzZW5kOiAn0J7RgtC/0YDQsNCy0LvRj9C10LwuLi4nLFxyXG5cdFx0XHR0ZXh0OiAn0J7RgtC/0YDQsNCy0LjRgtGMJ1xyXG5cdFx0fTtcclxuXHJcblx0XHRpZiAoTWFuaXB1bGF0b3IuaGFzKF90aGlzLl9idXR0b24sICdkYXRhLXNwaW5uZXInKSAmJiBzdGF0dXMgPT09ICdiZWZvcmUnKSB7XHJcblx0XHRcdF90aGlzLl9idXR0b24uaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywgJzxzcGFuIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gbWUtMlwiPjwvc3Bhbj4nKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoTWFuaXB1bGF0b3IuaGFzKF90aGlzLl9idXR0b24sICdkYXRhLXRleHQnKSkge1xyXG5cdFx0XHRidG5UZXh0LnRleHQgPSBNYW5pcHVsYXRvci5nZXQoX3RoaXMuX2J1dHRvbiwgJ2RhdGEtdGV4dCcpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bGV0ICRidG5UZXh0ID0gX3RoaXMuX2J1dHRvbi5xdWVyeVNlbGVjdG9yKCdbZGF0YS10ZXh0XScpO1xyXG5cdFx0XHRpZiAoJGJ0blRleHQpIHtcclxuXHRcdFx0XHRidG5UZXh0LnRleHQgPSBNYW5pcHVsYXRvci5nZXQoJGJ0blRleHQsICdkYXRhLXRleHQnKTtcclxuXHRcdFx0XHRidG5TdWJtaXRUZXh0ID0gJGJ0blRleHQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoTWFuaXB1bGF0b3IuaGFzKF90aGlzLl9idXR0b24sICdkYXRhLXRleHQtc2VuZCcpKSB7XHJcblx0XHRcdGJ0blRleHQuc2VuZCA9IE1hbmlwdWxhdG9yLmdldChfdGhpcy5fYnV0dG9uLCAnZGF0YS10ZXh0LXNlbmQnKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGxldCAkYnRuVGV4dFNlbmQgPSBfdGhpcy5fYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRleHQtc2VuZF0nKTtcclxuXHRcdFx0aWYgKCRidG5UZXh0U2VuZCkge1xyXG5cdFx0XHRcdGJ0blRleHQuc2VuZCA9IE1hbmlwdWxhdG9yLmdldCgkYnRuVGV4dFNlbmQsICdkYXRhLXRleHQtc2VuZCcpO1xyXG5cdFx0XHRcdGJ0blN1Ym1pdFRleHQgPSAkYnRuVGV4dFNlbmQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoc3RhdHVzID09PSAnYmVmb3JlJykge1xyXG5cdFx0XHRpZiAoX3RoaXMuX3BhcmFtcy5pc0J0blRleHQpIHtcclxuXHRcdFx0XHRidG5TdWJtaXRUZXh0LmlubmVySFRNTCA9IGJ0blRleHQuc2VuZDtcclxuXHRcdFx0fVxyXG5cdFx0XHRNYW5pcHVsYXRvci5zZXQoX3RoaXMuX2J1dHRvbiwnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoc3RhdHVzID09PSAnYWZ0ZXInKSB7XHJcblx0XHRcdGlmIChfdGhpcy5fcGFyYW1zLmlzQnRuVGV4dCkge1xyXG5cdFx0XHRcdGJ0blN1Ym1pdFRleHQuaW5uZXJIVE1MID0gYnRuVGV4dC50ZXh0O1xyXG5cdFx0XHR9XHJcblx0XHRcdE1hbmlwdWxhdG9yLnJlbW92ZShfdGhpcy5fYnV0dG9uLCdkaXNhYmxlZCcpO1xyXG5cclxuXHRcdFx0bGV0IHNwaW5uZXIgPSBfdGhpcy5fYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoJy5zcGlubmVyLWJvcmRlcicpO1xyXG5cdFx0XHRpZiAoc3Bpbm5lcikgc3Bpbm5lci5yZW1vdmUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdF9qc29uUGFyc2UoZGF0YSwgc3RhdHVzKSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKF90aGlzLl9wYXJhbXMuaXNKc29uUGFyc2UgJiYgdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdGxldCBwYXJzZXJEYXRhID0ge307XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdHBhcnNlckRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xyXG5cdFx0XHRcdF90aGlzLmFsZXJ0KHBhcnNlckRhdGEsIHN0YXR1cyk7XHJcblx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRfdGhpcy5hbGVydChkYXRhLCBzdGF0dXMpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRfdGhpcy5hbGVydChkYXRhLCBzdGF0dXMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YWxlcnQoZGF0YSwgc3RhdHVzKSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKGlzT2JqZWN0KGRhdGEpKSB7XHJcblx0XHRcdGlmICgoJ2NvZGUnIGluIGRhdGEpICYmIGRhdGEuY29kZSAmJiBkYXRhLmNvZGUgPT09IDIwMCkge1xyXG5cdFx0XHRcdGlmICgncmVzcG9uc2UnIGluIGRhdGEgJiYgZGF0YS5yZXNwb25zZSkge1xyXG5cdFx0XHRcdFx0bGV0IHJlc3BvbnNlID0gbm9ybWFsaXplRGF0YShkYXRhLnJlc3BvbnNlKTtcclxuXHRcdFx0XHRcdGlmICh0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdFx0XHRcdGlmIChyZXNwb25zZS5pbmRleE9mKFwiUGFyc2UgZXJyb3JcIikgIT09IC0xIHx8IHJlc3BvbnNlLmluZGV4T2YoXCJzeW50YXggZXJyb3JcIikgIT09IC0xKSB7XHJcblx0XHRcdFx0XHRcdFx0c3RhdHVzID0gJ2Vycm9yJztcclxuXHRcdFx0XHRcdFx0XHRkYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2U6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6ICdFcnJvcicsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdTb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHJlcGVhdCBsYXRlcidcclxuXHRcdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHR0ZXh0OiAnU29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSByZXBlYXQgbGF0ZXInXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRpZiAoJ2Vycm9ycycgaW4gcmVzcG9uc2UgJiYgbm9ybWFsaXplRGF0YShyZXNwb25zZS5lcnJvcnMpKSB7XHJcblx0XHRcdFx0XHRcdFx0c3RhdHVzID0gbm9ybWFsaXplRGF0YShyZXNwb25zZS5lcnJvcnMpID8gJ2Vycm9yJyA6ICdzdWNjZXNzJztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghX3RoaXMuX3BhcmFtcy5hbGVydC5lbmFibGVkKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoX3RoaXMuX3BhcmFtcy5hbGVydC50eXBlID09PSAnbW9kYWwnKSB7XHJcblx0XHRcdF90aGlzLl9hbGVydE1vZGFsKGRhdGEsIHN0YXR1cylcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoX3RoaXMuX3BhcmFtcy5hbGVydC50eXBlID09PSAnY29sbGFwc2UnKSB7XHJcblx0XHRcdF90aGlzLl9hbGVydENvbGxhcHNlKGRhdGEsIHN0YXR1cylcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdF9hbGVydE1vZGFsKGRhdGEsIHN0YXR1cykge1xyXG5cdFx0Y29uc3QgX3RoaXMgPSB0aGlzO1xyXG5cclxuXHRcdC8vINCV0YHRgtGMINC70Lgg0L7RgtC60YDRi9GC0YvQtSDQvNC+0LTQsNC70LrQuCwg0LfQsNC60YDRi9Cy0LDQtdC8XHJcblx0XHRbLi4uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbW9kYWwnKV0uZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xyXG5cdFx0XHRpZiAoZWxlbWVudCAmJiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSB7XHJcblx0XHRcdFx0bGV0IG1CUyA9IGJvb3RzdHJhcC5Nb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQpO1xyXG5cdFx0XHRcdG1CUy5oaWRlKCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdFsuLi5kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2Zy1tb2RhbCcpXS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcblx0XHRcdGlmIChlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcclxuXHRcdFx0XHRjb25zdCBtVkcgPSBWR01vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCk7XHJcblx0XHRcdFx0bVZHLmhpZGUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0bGV0IGlkID0gX3RoaXMuX3BhcmFtcy5jbGFzc2VzLmdlbmVyYWwgKyAnLScgKyBtYWtlUmFuZG9tU3RyaW5nKCk7XHJcblxyXG5cdFx0bGV0ICRtb2RhbCA9IFNlbGVjdG9ycy5maW5kKCcuJyArIF90aGlzLl9wYXJhbXMuY2xhc3Nlcy5hbGVydE1vZGFsKTtcclxuXHRcdGlmICgkbW9kYWwpICRtb2RhbC5yZW1vdmUoKTtcclxuXHJcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0VkdNb2RhbC5pbml0KGlkLCB7XHJcblx0XHRcdFx0Y2xhc3Nlczoge1xyXG5cdFx0XHRcdFx0YWxlcnQ6IF90aGlzLl9wYXJhbXMuY2xhc3Nlcy5hbGVydE1vZGFsXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LCBmdW5jdGlvbiAoc2VsZikge1xyXG5cdFx0XHRcdGxldCBlbGVtZW50ID0gc2VsZi5fZWxlbWVudDtcclxuXHRcdFx0XHRlbGVtZW50LmNsYXNzTGlzdC5hZGQoX3RoaXMuX3BhcmFtcy5jbGFzc2VzLmFsZXJ0TW9kYWwpO1xyXG5cclxuXHRcdFx0XHRsZXQgJGJvZHkgPSBTZWxlY3RvcnMuZmluZCgnLnZnLW1vZGFsLWJvZHknLCBlbGVtZW50KTtcclxuXHRcdFx0XHRpZiAoJGJvZHkpICRib2R5LmFwcGVuZChfdGhpcy5zZXREYXRhUmVsYXRpb25TdGF0dXMoZWxlbWVudCwgc3RhdHVzLCBkYXRhLCAnbW9kYWwnKSk7XHJcblxyXG5cdFx0XHRcdHNlbGYudG9nZ2xlKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSwgODAwKTtcclxuXHR9XHJcblxyXG5cdF9hbGVydENvbGxhcHNlKGRhdGEsIHN0YXR1cykge1xyXG5cdFx0Y29uc3QgX3RoaXMgPSB0aGlzO1xyXG5cclxuXHRcdGxldCAkY29sbGFwc2UgPSBTZWxlY3RvcnMuZmluZCgnLicgKyBfdGhpcy5fcGFyYW1zLmNsYXNzZXMuYWxlcnRDb2xsYXBzZSk7XHJcblx0XHRpZiAoISRjb2xsYXBzZSkge1xyXG5cdFx0XHQkY29sbGFwc2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdFx0JGNvbGxhcHNlLmNsYXNzTGlzdC5hZGQoX3RoaXMuX3BhcmFtcy5jbGFzc2VzLmFsZXJ0Q29sbGFwc2UpO1xyXG5cdFx0XHQkY29sbGFwc2UuY2xhc3NMaXN0LmFkZCgndmctY29sbGFwc2UnKTtcclxuXHRcdFx0JGNvbGxhcHNlLmlkID0gX3RoaXMuX3BhcmFtcy5jbGFzc2VzLmdlbmVyYWwgKyAnLScgKyBtYWtlUmFuZG9tU3RyaW5nKCk7XHJcblx0XHRcdCRjb2xsYXBzZS5hcHBlbmQoX3RoaXMuc2V0RGF0YVJlbGF0aW9uU3RhdHVzKCRjb2xsYXBzZSwgc3RhdHVzLCBkYXRhLCAnY29sbGFwc2UnKSk7XHJcblxyXG5cdFx0XHRfdGhpcy5fZWxlbWVudC5wcmVwZW5kKCRjb2xsYXBzZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0VkdDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKCRjb2xsYXBzZSwge3RvZ2dsZTogZmFsc2V9KS50b2dnbGUoKTtcclxuXHR9XHJcblxyXG5cdHNldERhdGFSZWxhdGlvblN0YXR1cygkZWxlbWVudCwgc3RhdHVzLCBkYXRhLCB0eXBlKSB7XHJcblx0XHRsZXQgJGFsZXJ0ID0gU2VsZWN0b3JzLmZpbmQoJy52Zy1hbGVydC0nICsgc3RhdHVzLCAkZWxlbWVudCk7XHJcblxyXG5cdFx0aWYgKGlzT2JqZWN0KGRhdGEpKSB7XHJcblx0XHRcdGlmIChzdGF0dXMgPT09ICdlcnJvcicpIHtcclxuXHRcdFx0XHRpZiAoJ2NvZGUnIGluIGRhdGEgJiYgZGF0YS5jb2RlICE9PSAyMDApIHtcclxuXHRcdFx0XHRcdGlmICgndGV4dCcgaW4gZGF0YSAmJiAhZGF0YS50ZXh0KSB7XHJcblx0XHRcdFx0XHRcdGRhdGEudGV4dCA9ICdTb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHJlcGVhdCBsYXRlcic7XHJcblxyXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKGRhdGEuY29kZSkge1xyXG5cdFx0XHRcdFx0XHRcdGNhc2UgNDAwOlxyXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YS50ZXh0ID0gJ0JhZCBSZXF1ZXN0J1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSA0MDE6XHJcblx0XHRcdFx0XHRcdFx0XHRkYXRhLnRleHQgPSAnVW5hdXRob3JpemVkJ1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSA0MDM6XHJcblx0XHRcdFx0XHRcdFx0XHRkYXRhLnRleHQgPSAnVW5hdXRob3JpemVkJ1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSA0MTM6XHJcblx0XHRcdFx0XHRcdFx0XHRkYXRhLnRleHQgPSAnRm9yYmlkZGVuJ1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSA0MDQ6XHJcblx0XHRcdFx0XHRcdFx0XHRkYXRhLnRleHQgPSAnTm90IEZvdW5kJ1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSA0MjI6XHJcblx0XHRcdFx0XHRcdFx0XHRkYXRhLnRleHQgPSAnVW5wcm9jZXNzYWJsZSBFbnRpdHknXHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRjYXNlIDUwMDpcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGEudGV4dCA9ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InXHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRjYXNlIDUwNDpcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGEudGV4dCA9ICdHYXRld2F5IFRpbWVvdXQnXHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCdyZXNwb25zZScgaW4gZGF0YSkge1xyXG5cdFx0XHRcdGxldCByZXNwb25zZSA9IG5vcm1hbGl6ZURhdGEoZGF0YS5yZXNwb25zZSksIHRpdGxlID0gJycsIHR4dCA9ICcnLCBjb2RlID0gJyc7XHJcblx0XHRcdFx0aWYgKHR5cGVvZiByZXNwb25zZSAhPT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRcdGlmICghKCd2aWV3JyBpbiByZXNwb25zZSkpIHtcclxuXHRcdFx0XHRcdFx0aWYgKCd0aXRsZScgaW4gcmVzcG9uc2UpIHRpdGxlID0gcmVzcG9uc2UudGl0bGU7XHJcblx0XHRcdFx0XHRcdGlmIChzdGF0dXMgPT09ICdlcnJvcicgJiYgZGF0YS5jb2RlICE9PSAyMDApIHtcclxuXHRcdFx0XHRcdFx0XHRjb2RlID0gJyAnICsgZGF0YS50ZXh0ICsgJyAoJyArIGRhdGEuY29kZSArICcpJztcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0dHh0ICs9ICc8aDQgY2xhc3M9XCJ2Zy1hbGVydC1jb250ZW50LS10aXRsZVwiPicgKyB0aXRsZSArIGNvZGUgKyAnPC9oND4nO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCdtZXNzYWdlJyBpbiByZXNwb25zZSkge1xyXG5cdFx0XHRcdFx0XHRcdHR4dCArPSAnPGRpdiBjbGFzcz1cInZnLWFsZXJ0LWNvbnRlbnQtLW1lc3NhZ2VcIj4nICsgcmVzcG9uc2UubWVzc2FnZSArICc8L2Rpdj4nXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICgnZXJyb3JzJyBpbiByZXNwb25zZSkge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBlcnJvcnMgPSBub3JtYWxpemVEYXRhKHJlc3BvbnNlLmVycm9ycykgfHwgbnVsbDtcclxuXHRcdFx0XHRcdFx0XHRpZiAoaXNPYmplY3QoZXJyb3JzKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBlcnJvciBpbiBlcnJvcnMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoZXJyb3JzW2Vycm9yXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlcnJvcnNbZXJyb3JdLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR4dCArPSAnPGRpdj4nKyB0ICsnPC9kaXY+JztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHR4dCA9ICc8ZGl2PicrIGVycm9yc1tlcnJvcl0gKyc8L2Rpdj4nO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRkYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRcdHZpZXc6IHR4dFxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGRhdGEudmlldyA9IHJlc3BvbnNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghJGFsZXJ0KSB7XHJcblx0XHRcdCRhbGVydCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0XHQkYWxlcnQuY2xhc3NMaXN0LmFkZCgndmctYWxlcnQnLCAndmctYWxlcnQtJyArIHN0YXR1cywgJ3ZnLWFsZXJ0LScgKyB0eXBlKTtcclxuXHJcblx0XHRcdGxldCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHRcdGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgndmctYWxlcnQtY29udGVudCcpO1xyXG5cclxuXHRcdFx0bGV0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdFx0aWNvbi5jbGFzc0xpc3QuYWRkKCd2Zy1hbGVydC1jb250ZW50LS1pY29uJyk7XHJcblxyXG5cdFx0XHRsZXQgaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKTtcclxuXHRcdFx0aS5pbm5lckhUTUwgPSBnZXRTVkcoc3RhdHVzKTtcclxuXHJcblx0XHRcdGljb24uYXBwZW5kKGkpO1xyXG5cdFx0XHRjb250ZW50LmFwcGVuZChpY29uKTtcclxuXHJcblx0XHRcdGxldCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHRcdHRleHQuY2xhc3NMaXN0LmFkZCgndmctYWxlcnQtY29udGVudC0tdGV4dCcpO1xyXG5cdFx0XHR0ZXh0LmlubmVySFRNTCA9IGRhdGEudmlldztcclxuXHJcblx0XHRcdGNvbnRlbnQuYXBwZW5kKHRleHQpO1xyXG5cdFx0XHQkYWxlcnQuYXBwZW5kKGNvbnRlbnQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bGV0IHRleHQgPSBTZWxlY3RvcnMuZmluZCgnLnZnLWFsZXJ0LWNvbnRlbnQtLXRleHQnLCAkYWxlcnQpO1xyXG5cdFx0XHR0ZXh0LmlubmVySFRNTCA9IGRhdGEudmlldztcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gJGFsZXJ0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICog0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y9cclxuXHQgKiBAcGFyYW0gZWxlbWVudFxyXG5cdCAqIEBwYXJhbSBwYXJhbXNcclxuXHQgKi9cclxuXHRzdGF0aWMgaW5pdChlbGVtZW50LCBwYXJhbXMgPSB7fSkge1xyXG5cdFx0Y29uc3QgaW5zdGFuY2UgPSBWR0Zvcm1TZW5kZXIuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCBwYXJhbXMpO1xyXG5cdFx0aW5zdGFuY2UuYnVpbGQoKTtcclxuXHR9XHJcbn1cclxuXHJcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfU1VCTUlUX0RBVEFfQVBJLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuXHRpZiAoIU1hbmlwdWxhdG9yLmhhcyhldmVudC50YXJnZXQsICdkYXRhLXZnZm9ybXNlbmRlcicpKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHRjb25zdCBpbnN0YW5jZSA9IFZHRm9ybVNlbmRlci5nZXRPckNyZWF0ZUluc3RhbmNlKGV2ZW50LnRhcmdldCwge30pO1xyXG5cdGlmICghaW5zdGFuY2UpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGlmIChpbnN0YW5jZS5fcGFyYW1zLnZhbGlkYXRlKSB7XHJcblx0XHRpZiAoIWluc3RhbmNlLl9lbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcblx0XHRcdGluc3RhbmNlLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoaW5zdGFuY2UuX3BhcmFtcy5jbGFzc2VzLndhc1ZhbGlkYXRlKTtcclxuXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNvbnN0IGNvbGxlY3REYXRhID0gZnVuY3Rpb24oZGF0YSwgZmllbGRzKSB7XHJcblx0XHRmb3IgKGxldCBuYW1lIGluIGZpZWxkcykge1xyXG5cdFx0XHRpZiAodHlwZW9mIGZpZWxkc1tuYW1lXSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHRmb3IgKGxldCBrZXkgaW4gZmllbGRzW25hbWVdKSB7XHJcblx0XHRcdFx0XHRsZXQgYXJyID0gT2JqZWN0LmtleXMoZmllbGRzW25hbWVdW2tleV0pLm1hcChmdW5jdGlvbiAoaSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmllbGRzW25hbWVdW2tleV1baV07XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdGRhdGEuYXBwZW5kKG5hbWUsIGFycik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGRhdGEuYXBwZW5kKG5hbWUsIGZpZWxkc1tuYW1lXSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHR9XHJcblxyXG5cdGlmICghaW5zdGFuY2UuX3BhcmFtcy5zdWJtaXQpIHtcclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0bGV0IGRhdGEgPSBuZXcgRm9ybURhdGEoaW5zdGFuY2UuX2VsZW1lbnQpO1xyXG5cclxuXHRcdC8vIFRPRE8g0LTQvtC00LXQu9Cw0YLRjFxyXG5cdFx0LyppZiAoQXJyYXkuaXNBcnJheShpbnN0YW5jZS5fcGFyYW1zLmFqYXguZmllbGRzKSAmJiBpbnN0YW5jZS5fcGFyYW1zLmFqYXguZmllbGRzLmxlbmd0aCkge1xyXG5cdFx0XHRkYXRhID0gY29sbGVjdERhdGEoZGF0YSwgaW5zdGFuY2UuX3BhcmFtcy5hamF4LmZpZWxkcyk7XHJcblx0XHR9Ki9cclxuXHJcblx0XHRyZXR1cm4gaW5zdGFuY2UucmVxdWVzdChkYXRhLCBldmVudCk7XHJcblx0fVxyXG59KVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVkdGb3JtU2VuZGVyOyIsImltcG9ydCBCYXNlTW9kdWxlIGZyb20gXCIuLi8uLi9iYXNlLW1vZHVsZVwiO1xyXG5pbXBvcnQge2lzRGlzYWJsZWQsIG1lcmdlRGVlcE9iamVjdH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2pzL2Z1bmN0aW9uc1wiO1xyXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9kb20vZXZlbnRcIjtcclxuaW1wb3J0IFNlbGVjdG9ycyBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvZG9tL3NlbGVjdG9yc1wiO1xyXG5pbXBvcnQgQ29va2llcyBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvZG9tL2Nvb2tpZVwiO1xyXG5pbXBvcnQge2Rpc21pc3NUcmlnZ2VyfSBmcm9tIFwiLi4vLi4vbW9kdWxlLWZuXCI7XHJcblxyXG4vKipcclxuICogQ29uc3RhbnRzXHJcbiAqL1xyXG5jb25zdCBOQU1FICAgICA9ICdsYXdjb29raWUnO1xyXG5jb25zdCBOQU1FX0tFWSA9ICd2Zy5sYXdjb29raWUnO1xyXG5cclxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnO1xyXG5cclxuY29uc3QgRVZFTlRfS0VZX0hJREUgICA9IGAke05BTUVfS0VZfS5oaWRlYDtcclxuY29uc3QgRVZFTlRfS0VZX0hJRERFTiA9IGAke05BTUVfS0VZfS5oaWRkZW5gO1xyXG5jb25zdCBFVkVOVF9LRVlfU0hPVyAgID0gYCR7TkFNRV9LRVl9LnNob3dgO1xyXG5jb25zdCBFVkVOVF9LRVlfU0hPV04gID0gYCR7TkFNRV9LRVl9LnNob3duYDtcclxuXHJcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFICAgICAgID0gJ1tkYXRhLXZnLXRvZ2dsZT1cImxhd2Nvb2tpZVwiXSc7XHJcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFX0NMRUFSID0gJ1tkYXRhLXZnLXRvZ2dsZT1cImxhd2Nvb2tpZS1jbGVhclwiXSc7XHJcbmNvbnN0IEVWRU5UX0tFWV9DTElDS19EQVRBX0FQSSAgID0gYGNsaWNrLiR7TkFNRV9LRVl9LmRhdGEuYXBpYDtcclxuXHJcbmNsYXNzIFZHTGF3Q29va2llIGV4dGVuZHMgQmFzZU1vZHVsZSB7XHJcblx0c3RhdGljIHNQYXJhbXMgPSB7fTtcclxuXHJcblx0Y29uc3RydWN0b3IoZWxlbWVudCwgcGFyYW1zID0ge30pIHtcclxuXHRcdHN1cGVyKGVsZW1lbnQsIHBhcmFtcyk7XHJcblxyXG5cdFx0dGhpcy5fcGFyYW1zID0gdGhpcy5fZ2V0UGFyYW1zKGVsZW1lbnQsIG1lcmdlRGVlcE9iamVjdCh7XHJcblx0XHRcdHN0b3JhZ2U6ICdsb2NhbCcsIC8vIGNvb2tpZSBvciBsb2NhbFxyXG5cdFx0XHRkZWxheTogNTAwLFxyXG5cdFx0XHRjb29raWU6IHtcclxuXHRcdFx0XHRuYW1lOiAnbGF3Q29va2llJyxcclxuXHRcdFx0XHR2YWx1ZTogJ3llcycsXHJcblx0XHRcdFx0YXR0cmlidXRlczoge31cclxuXHRcdFx0fSxcclxuXHRcdFx0YW5pbWF0aW9uOiB7XHJcblx0XHRcdFx0ZW5hYmxlOiB0cnVlLFxyXG5cdFx0XHRcdGluOiAnYW5pbWF0ZV9fZmFkZUluVXAnLFxyXG5cdFx0XHRcdG91dDogJ2FuaW1hdGVfX2ZhZGVPdXREb3duJyxcclxuXHRcdFx0XHRkZWxheTogODAwLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRhamF4OiB7XHJcblx0XHRcdFx0cm91dGU6ICcnLFxyXG5cdFx0XHRcdHRhcmdldDogJycsXHJcblx0XHRcdFx0bWV0aG9kOiAnZ2V0J1xyXG5cdFx0XHR9XHJcblx0XHR9LCBwYXJhbXMpKTtcclxuXHJcblx0XHRWR0xhd0Nvb2tpZS5zUGFyYW1zID0gdGhpcy5fcGFyYW1zO1xyXG5cclxuXHRcdHRoaXMuX3BhcmFtcy5hbmltYXRpb24uZGVsYXkgPSAhdGhpcy5fcGFyYW1zLmFuaW1hdGlvbi5lbmFibGUgPyAwIDogdGhpcy5fcGFyYW1zLmFuaW1hdGlvbi5kZWxheTtcclxuXHRcdHRoaXMuX2FuaW1hdGlvbih0aGlzLl9lbGVtZW50LCBWR0xhd0Nvb2tpZS5OQU1FX0tFWSwgdGhpcy5fcGFyYW1zLmFuaW1hdGlvbik7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0IE5BTUUoKSB7XHJcblx0XHRyZXR1cm4gTkFNRTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXQgTkFNRV9LRVkoKSB7XHJcblx0XHRyZXR1cm4gTkFNRV9LRVk7XHJcblx0fVxyXG5cclxuXHR0b2dnbGUoKSB7XHJcblx0XHRyZXR1cm4gIXRoaXMuX2lzU2hvd24oKSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XHJcblx0fVxyXG5cclxuXHRfaXNTaG93bigpIHtcclxuXHRcdHJldHVybiB0aGlzLnN0b3JhZ2UoKS5nZXQoKTtcclxuXHR9XHJcblxyXG5cdHNob3coKSB7XHJcblx0XHRpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWV9TSE9XLCB7fSlcclxuXHRcdGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xyXG5cclxuXHRcdHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpO1xyXG5cclxuXHRcdGNvbnN0IGNvbXBsZXRlQ2FsbEJhY2sgPSAoKSA9PiB7XHJcblx0XHRcdEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWV9TSE9XTiwge30pO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZUNhbGxCYWNrLCB0aGlzLl9lbGVtZW50LCB0cnVlLCB0aGlzLl9wYXJhbXMuZGVsYXkpXHJcblx0fVxyXG5cclxuXHRoaWRlKCkge1xyXG5cdFx0Y29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZX0hJREUpO1xyXG5cdFx0aWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XHJcblxyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xyXG5cclxuXHRcdFx0Y29uc3QgY29tcGxldGVDYWxsYmFjayA9ICgpID0+IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWV9ISURERU4pO1xyXG5cdFx0XHR0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbGJhY2ssIHRoaXMuX2VsZW1lbnQsIHRydWUpO1xyXG5cdFx0fSwgdGhpcy5fcGFyYW1zLmFuaW1hdGlvbi5kZWxheSk7XHJcblx0fVxyXG5cclxuXHRzdG9yYWdlKCkge1xyXG5cdFx0dGhpcy5fc3RvcmFnZSA9IHtcclxuXHRcdFx0aXNDb29raWU6IHRoaXMuX3BhcmFtcy5zdG9yYWdlID09PSAnY29va2llJyxcclxuXHRcdFx0c3RvcmFnZTogdGhpcy5fcGFyYW1zLnN0b3JhZ2UgPT09ICdjb29raWUnID8gQ29va2llcyA6IGxvY2FsU3RvcmFnZSxcclxuXHRcdFx0bmFtZTogdGhpcy5fcGFyYW1zLmNvb2tpZS5uYW1lLFxyXG5cdFx0XHR2YWx1ZTogdGhpcy5fcGFyYW1zLmNvb2tpZS52YWx1ZSxcclxuXHRcdFx0YXR0cmlidXRlczogdGhpcy5fcGFyYW1zLmNvb2tpZS5hdHRyaWJ1dGVzLFxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHJcblx0Z2V0KCkge1xyXG5cdFx0aWYgKHRoaXMuX3N0b3JhZ2UuaXNDb29raWUpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuX3N0b3JhZ2Uuc3RvcmFnZS5nZXQodGhpcy5fc3RvcmFnZS5uYW1lKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiB0aGlzLl9zdG9yYWdlLnN0b3JhZ2UuZ2V0SXRlbSh0aGlzLl9zdG9yYWdlLm5hbWUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0c2V0KCkge1xyXG5cdFx0aWYgKHRoaXMuX3N0b3JhZ2UuaXNDb29raWUpIHtcclxuXHRcdFx0dGhpcy5fc3RvcmFnZS5zdG9yYWdlLnNldCh0aGlzLl9zdG9yYWdlLm5hbWUsIHRoaXMuX3N0b3JhZ2UudmFsdWUsIHRoaXMuX3N0b3JhZ2UuYXR0cmlidXRlcyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLl9zdG9yYWdlLnN0b3JhZ2Uuc2V0SXRlbSh0aGlzLl9zdG9yYWdlLm5hbWUsIHRoaXMuX3N0b3JhZ2UudmFsdWUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZGlzcG9zZSgpIHtcclxuXHRcdHN1cGVyLmRpc3Bvc2UoKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyByZXNldCgpIHtcclxuXHRcdENvb2tpZXMucmVtb3ZlKFZHTGF3Q29va2llLnNQYXJhbXMuY29va2llLm5hbWUpO1xyXG5cdFx0bG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcblx0XHRsb2NhdGlvbi5yZWxvYWQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqINCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPXHJcblx0ICogQHBhcmFtIGVsZW1lbnRcclxuXHQgKiBAcGFyYW0gcGFyYW1zXHJcblx0ICovXHJcblx0c3RhdGljIGluaXQoZWxlbWVudCwgcGFyYW1zID0ge30pIHtcclxuXHRcdGNvbnN0IGluc3RhbmNlID0gVkdMYXdDb29raWUuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCBwYXJhbXMpO1xyXG5cdFx0aW5zdGFuY2UudG9nZ2xlKCk7XHJcblx0fVxyXG59XHJcblxyXG5kaXNtaXNzVHJpZ2dlcihWR0xhd0Nvb2tpZSk7XHJcblxyXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWV9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xyXG5cdGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuXHR9XHJcblxyXG5cdGlmIChpc0Rpc2FibGVkKHRoaXMpKSByZXR1cm47XHJcblxyXG5cdGNvbnN0IGVsZW1lbnQgPSBTZWxlY3RvcnMuZmluZCgnI3ZnLWxhd2Nvb2tpZScpO1xyXG5cdGlmICghZWxlbWVudCkgcmV0dXJuO1xyXG5cclxuXHRjb25zdCBpbnN0YW5jZSA9IFZHTGF3Q29va2llLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCk7XHJcblx0aW5zdGFuY2Uuc3RvcmFnZSgpLnNldCgpO1xyXG5cdGluc3RhbmNlLmhpZGUoKTtcclxufSk7XHJcblxyXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWV9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEVfQ0xFQVIsIGZ1bmN0aW9uIChldmVudCkge1xyXG5cdGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuXHR9XHJcblxyXG5cdGlmIChpc0Rpc2FibGVkKHRoaXMpKSByZXR1cm47XHJcblxyXG5cdGNvbnN0IGVsZW1lbnQgPSBTZWxlY3RvcnMuZmluZCgnI3ZnLWxhd2Nvb2tpZScpO1xyXG5cdGlmICghZWxlbWVudCkgcmV0dXJuO1xyXG5cclxuXHRjb25zdCBpbnN0YW5jZSA9IFZHTGF3Q29va2llLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCk7XHJcblx0aW5zdGFuY2UuZGlzcG9zZSgpO1xyXG5cclxuXHRsb2NhdGlvbi5yZWxvYWQoKTtcclxufSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBWR0xhd0Nvb2tpZTsiLCJpbXBvcnQgQmFzZU1vZHVsZSBmcm9tIFwiLi4vLi4vYmFzZS1tb2R1bGVcIjtcclxuaW1wb3J0IFNjcm9sbEJhckhlbHBlciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvY29tcG9uZW50cy9zY3JvbGxiYXJcIjtcclxuaW1wb3J0IEJhY2tkcm9wIGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9jb21wb25lbnRzL2JhY2tkcm9wXCI7XHJcbmltcG9ydCBTZWxlY3RvcnMgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2pzL2RvbS9zZWxlY3RvcnNcIjtcclxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvZG9tL2V2ZW50XCI7XHJcbmltcG9ydCB7TWFuaXB1bGF0b3J9IGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9kb20vbWFuaXB1bGF0b3JcIjtcclxuaW1wb3J0IHtleGVjdXRlLCBpc0Rpc2FibGVkLCBpc1JUTCwgbWVyZ2VEZWVwT2JqZWN0LCByZWZsb3d9IGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9mdW5jdGlvbnNcIjtcclxuaW1wb3J0IHtkaXNtaXNzVHJpZ2dlcn0gZnJvbSBcIi4uLy4uL21vZHVsZS1mblwiO1xyXG5pbXBvcnQgUGFyYW1zIGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9jb21wb25lbnRzL3BhcmFtc1wiO1xyXG5cclxuLyoqXHJcbiAqIENvbnN0YW50c1xyXG4gKi9cclxuY29uc3QgTkFNRSA9ICdtb2RhbCc7XHJcbmNvbnN0IE5BTUVfS0VZID0gJ3ZnLm1vZGFsJztcclxuXHJcbmNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJztcclxuXHJcbmNvbnN0IE9QRU5fU0VMRUNUT1IgPSAnLnZnLW1vZGFsLnNob3cnO1xyXG5jb25zdCBTRUxFQ1RPUl9ESUFMT0cgPSAnLnZnLW1vZGFsLWRpYWxvZyc7XHJcbmNvbnN0IFNFTEVDVE9SX01PREFMX0JPRFkgPSAnLnZnLW1vZGFsLWJvZHknO1xyXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS12Zy10b2dnbGU9XCJtb2RhbFwiXSc7XHJcblxyXG5jb25zdCBDTEFTU19OQU1FX09QRU4gPSAndmctbW9kYWwtb3Blbic7XHJcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93JztcclxuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnO1xyXG5jb25zdCBDTEFTU19OQU1FX1NUQVRJQyA9ICd2Zy1tb2RhbC1zdGF0aWMnXHJcblxyXG5jb25zdCBFVkVOVF9LRVlfSElERSAgID0gYCR7TkFNRV9LRVl9LmhpZGVgO1xyXG5jb25zdCBFVkVOVF9LRVlfSElEREVOID0gYCR7TkFNRV9LRVl9LmhpZGRlbmA7XHJcbmNvbnN0IEVWRU5UX0tFWV9TSE9XICAgPSBgJHtOQU1FX0tFWX0uc2hvd2A7XHJcbmNvbnN0IEVWRU5UX0tFWV9TSE9XTiAgPSBgJHtOQU1FX0tFWX0uc2hvd25gO1xyXG5jb25zdCBFVkVOVF9LRVlfUkVTSVpFID0gYCR7TkFNRV9LRVl9LnJlc2l6ZWBcclxuXHJcbmNvbnN0IEVWRU5UX0tFWV9LRVlET1dOX0RJU01JU1MgICAgID0gYGtleWRvd24uZGlzbWlzcy4ke05BTUVfS0VZfWA7XHJcbmNvbnN0IEVWRU5UX0tFWV9ISURFX1BSRVZFTlRFRCAgICAgID0gYGhpZGVQcmV2ZW50ZWQuJHtOQU1FX0tFWX1gO1xyXG5jb25zdCBFVkVOVF9LRVlfQ0xJQ0tfREFUQV9BUEkgICAgICA9IGBjbGljay4ke05BTUVfS0VZfS5kYXRhLmFwaWA7XHJcbmNvbnN0IEVWRU5UX0tFWV9NT1VTRURPV05fRElTTUlTUyAgID0gYG1vdXNlZG93bi5kaXNtaXNzJHtOQU1FX0tFWX1gXHJcbmNvbnN0IEVWRU5UX0tFWV9DTElDS19ESVNNSVNTICAgICAgICAgICA9IGBjbGljay5kaXNtaXNzJHtOQU1FX0tFWX1gXHJcblxyXG5jbGFzcyBWR01vZGFsIGV4dGVuZHMgQmFzZU1vZHVsZSB7XHJcblx0Y29uc3RydWN0b3IoZWxlbWVudCwgcGFyYW1zID0ge30pIHtcclxuXHRcdHN1cGVyKGVsZW1lbnQsIHBhcmFtcyk7XHJcblxyXG5cdFx0dGhpcy5fcGFyYW1zID0gdGhpcy5fZ2V0UGFyYW1zKGVsZW1lbnQsIG1lcmdlRGVlcE9iamVjdCh7XHJcblx0XHRcdGJhY2tkcm9wOiB0cnVlLFxyXG5cdFx0XHRmb2N1czogdHJ1ZSxcclxuXHRcdFx0a2V5Ym9hcmQ6IHRydWUsXHJcblx0XHRcdGZpZWxkczogW10sXHJcblx0XHRcdGFqYXg6IHtcclxuXHRcdFx0XHRyb3V0ZTogJycsXHJcblx0XHRcdFx0dGFyZ2V0OiAnJyxcclxuXHRcdFx0XHRtZXRob2Q6ICdnZXQnLFxyXG5cdFx0XHRcdGxvYWRlcjogZmFsc2VcclxuXHRcdFx0fSxcclxuXHRcdFx0YW5pbWF0aW9uOiB7XHJcblx0XHRcdFx0ZW5hYmxlOiBmYWxzZSxcclxuXHRcdFx0XHRpbjogJ2FuaW1hdGVfX3JvbGxJbicsXHJcblx0XHRcdFx0b3V0OiAnYW5pbWF0ZV9fcm9sbE91dCcsXHJcblx0XHRcdFx0ZGVsYXk6IDgwMCxcclxuXHRcdFx0fSxcclxuXHRcdFx0Y2xhc3Nlczoge1xyXG5cdFx0XHRcdGdlbmVyYWw6ICd2Zy1tb2RhbCcsXHJcblx0XHRcdFx0ZGlhbG9nOiAndmctbW9kYWwtZGlhbG9nJyxcclxuXHRcdFx0XHRjb250ZW50OiAndmctbW9kYWwtY29udGVudCcsXHJcblx0XHRcdFx0aGVhZGVyOiAndmctbW9kYWwtaGVhZGVyJyxcclxuXHRcdFx0XHR0aXRsZTogJ3ZnLW1vZGFsLXRpdGxlJyxcclxuXHRcdFx0XHRib2R5OiAndmctbW9kYWwtYm9keScsXHJcblx0XHRcdFx0Zm9vdGVyOiAndmctbW9kYWwtZm9vdGVyJyxcclxuXHRcdFx0fVxyXG5cdFx0fSwgcGFyYW1zKSk7XHJcblxyXG5cdFx0dGhpcy5fYnV0dG9uID0gbnVsbDtcclxuXHRcdHRoaXMuX2RpYWxvZyA9IFNlbGVjdG9ycy5maW5kKFNFTEVDVE9SX0RJQUxPRywgdGhpcy5fZWxlbWVudCk7XHJcblx0XHR0aGlzLl9pc1Nob3duID0gZmFsc2U7XHJcblx0XHR0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcclxuXHRcdHRoaXMuX3Njcm9sbEJhciA9IG5ldyBTY3JvbGxCYXJIZWxwZXIoKTtcclxuXHJcblx0XHR0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xyXG5cdFx0dGhpcy5fZGlzbWlzc0VsZW1lbnQoKTtcclxuXHJcblx0XHR0aGlzLl9wYXJhbXMuYW5pbWF0aW9uLmRlbGF5ID0gIXRoaXMuX3BhcmFtcy5hbmltYXRpb24uZW5hYmxlID8gMCA6IHRoaXMuX3BhcmFtcy5hbmltYXRpb24uZGVsYXk7XHJcblx0XHR0aGlzLl9hbmltYXRpb24odGhpcy5fZWxlbWVudCwgVkdNb2RhbC5OQU1FX0tFWSwgdGhpcy5fcGFyYW1zLmFuaW1hdGlvbik7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0IE5BTUUoKSB7XHJcblx0XHRyZXR1cm4gTkFNRTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXQgTkFNRV9LRVkoKSB7XHJcblx0XHRyZXR1cm4gTkFNRV9LRVk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgaW5pdChlbGVtZW50LCBwYXJhbXMsIGNhbGxiYWNrKSB7XHJcblx0XHRWR01vZGFsLmJ1aWxkKGVsZW1lbnQsIHBhcmFtcywgY2FsbGJhY2spO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGJ1aWxkKGlkLCBwYXJhbXMsIGNhbGxiYWNrKSB7XHJcblx0XHRpZiAodHlwZW9mIGlkICE9PSBcInN0cmluZ1wiKSByZXR1cm47XHJcblxyXG5cdFx0bGV0IF9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHRfZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd2Zy1tb2RhbCcsICdmYWRlJyk7XHJcblx0XHRfZWxlbWVudC5pZCA9IGlkO2xldCBkaWFsb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdGRpYWxvZy5jbGFzc0xpc3QuYWRkKCd2Zy1tb2RhbC1kaWFsb2cnKTtcclxuXHJcblx0XHRsZXQgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0Y29udGVudC5jbGFzc0xpc3QuYWRkKCd2Zy1tb2RhbC1jb250ZW50Jyk7XHJcblxyXG5cdFx0bGV0IGJ0bkNsb3NlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcblx0XHRNYW5pcHVsYXRvci5zZXQoYnRuQ2xvc2UsICd0eXBlJywgJ2J1dHRvbicpO1xyXG5cdFx0TWFuaXB1bGF0b3Iuc2V0KGJ0bkNsb3NlLCAnZGF0YS12Zy1kaXNtaXNzJywgJ21vZGFsJyk7XHJcblx0XHRNYW5pcHVsYXRvci5zZXQoYnRuQ2xvc2UsICdkYXRhLXZnLXRhcmdldCcsICcjJyArIGlkKTtcclxuXHRcdE1hbmlwdWxhdG9yLnNldChidG5DbG9zZSwgJ2FyaWEtbGFiZWwnLCAnY2xvc2UnKTtcclxuXHRcdGJ0bkNsb3NlLmNsYXNzTGlzdC5hZGQoJ3ZnLWJ0bi1jbG9zZScpO1xyXG5cclxuXHRcdGNvbnRlbnQuYXBwZW5kKGJ0bkNsb3NlKTtcclxuXHJcblx0XHRsZXQgYm9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0Ym9keS5jbGFzc0xpc3QuYWRkKCd2Zy1tb2RhbC1ib2R5Jyk7XHJcblxyXG5cdFx0Y29udGVudC5hcHBlbmQoYm9keSk7XHJcblx0XHRkaWFsb2cuYXBwZW5kKGNvbnRlbnQpO1xyXG5cdFx0X2VsZW1lbnQuYXBwZW5kKGRpYWxvZyk7XHJcblxyXG5cdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmQoX2VsZW1lbnQpO1xyXG5cclxuXHRcdGNvbnN0IG1vZGFsID0gVkdNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKF9lbGVtZW50LCBwYXJhbXMpO1xyXG5cclxuXHRcdGV4ZWN1dGUoY2FsbGJhY2ssIFttb2RhbF0pO1xyXG5cdH1cclxuXHJcblx0dG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcclxuXHRcdHJldHVybiAhdGhpcy5faXNTaG93biA/IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KSA6IHRoaXMuaGlkZSgpO1xyXG5cdH1cclxuXHJcblx0c2hvdyhyZWxhdGVkVGFyZ2V0KSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblx0XHRpZiAoaXNEaXNhYmxlZChfdGhpcy5fZWxlbWVudCkpIHJldHVybjtcclxuXHJcblx0XHR0aGlzLl9wYXJhbXMgPSB0aGlzLl9nZXRQYXJhbXMocmVsYXRlZFRhcmdldCwgdGhpcy5fcGFyYW1zKTtcclxuXHRcdHRoaXMuX3JvdXRlKCk7XHJcblxyXG5cdFx0Y29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZX1NIT1csIHsgcmVsYXRlZFRhcmdldCB9KVxyXG5cdFx0aWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XHJcblxyXG5cdFx0dGhpcy5faXNTaG93biA9IHRydWU7XHJcblx0XHR0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuX3Njcm9sbEJhci5oaWRlKCk7XHJcblxyXG5cdFx0ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfT1BFTik7XHJcblxyXG5cdFx0dGhpcy5fYWRkRmllbGRzSW5Nb2RhbChyZWxhdGVkVGFyZ2V0KTtcclxuXHRcdHRoaXMuX2FkanVzdERpYWxvZygpO1xyXG5cclxuXHRcdEJhY2tkcm9wLnNob3coKCkgPT4gdGhpcy5fc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkpO1xyXG5cdH1cclxuXHJcblx0aGlkZSgpIHtcclxuXHRcdGlmICghdGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlfSElERSk7XHJcblx0XHRpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcclxuXHJcblx0XHR0aGlzLl9pc1Nob3duID0gZmFsc2U7XHJcblx0XHR0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xyXG5cclxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHR0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKTtcclxuXHRcdFx0dGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB0aGlzLl9oaWRlTW9kYWwoKSwgdGhpcy5fZWxlbWVudCwgdGhpcy5faXNBbmltYXRlZEZhZGUoKSk7XHJcblx0XHR9LCB0aGlzLl9wYXJhbXMuYW5pbWF0aW9uLmRlbGF5KTtcclxuXHR9XHJcblxyXG5cdF9oaWRlTW9kYWwoKSB7XHJcblx0XHR0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHR0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCB0cnVlKTtcclxuXHRcdHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLW1vZGFsJyk7XHJcblx0XHR0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpO1xyXG5cdFx0dGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0QmFja2Ryb3AuaGlkZSgoKSA9PiB7XHJcblx0XHRcdGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX09QRU4pO1xyXG5cdFx0XHR0aGlzLl9yZXNldEFkanVzdG1lbnRzKCk7XHJcblx0XHRcdHRoaXMuX3Njcm9sbEJhci5yZXNldCgpO1xyXG5cclxuXHRcdFx0RXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZX0hJRERFTik7XHJcblx0XHR9KVxyXG5cdH1cclxuXHJcblx0X3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpIHtcclxuXHRcdGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyh0aGlzLl9lbGVtZW50KSkge1xyXG5cdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZCh0aGlzLl9lbGVtZW50KTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cdFx0dGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XHJcblx0XHR0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcsIHRydWUpO1xyXG5cdFx0dGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJyk7XHJcblx0XHR0aGlzLl9lbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcblxyXG5cdFx0Y29uc3QgbW9kYWxCb2R5ID0gU2VsZWN0b3JzLmZpbmQoU0VMRUNUT1JfTU9EQUxfQk9EWSwgdGhpcy5fZGlhbG9nKTtcclxuXHRcdGlmIChtb2RhbEJvZHkpIHtcclxuXHRcdFx0bW9kYWxCb2R5LnNjcm9sbFRvcCA9IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVmbG93KHRoaXMuX2VsZW1lbnQpO1xyXG5cclxuXHRcdHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXHJcblxyXG5cdFx0Y29uc3QgdHJhbnNpdGlvbkNvbXBsZXRlID0gKCkgPT4ge1xyXG5cdFx0XHR0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcclxuXHRcdFx0RXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZX1NIT1dOLCB7XHJcblx0XHRcdFx0cmVsYXRlZFRhcmdldFxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9xdWV1ZUNhbGxiYWNrKHRyYW5zaXRpb25Db21wbGV0ZSwgdGhpcy5fZGlhbG9nLCB0aGlzLl9pc0FuaW1hdGVkRmFkZSgpKVxyXG5cdH1cclxuXHJcblx0X2lzQW5pbWF0ZWRGYWRlKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSlcclxuXHR9XHJcblxyXG5cdF9hZGp1c3REaWFsb2coKSB7XHJcblx0XHRjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcclxuXHRcdGNvbnN0IHNjcm9sbGJhcldpZHRoID0gdGhpcy5fc2Nyb2xsQmFyLmdldFdpZHRoKClcclxuXHRcdGNvbnN0IGlzQm9keU92ZXJmbG93aW5nID0gc2Nyb2xsYmFyV2lkdGggPiAwXHJcblxyXG5cdFx0aWYgKGlzQm9keU92ZXJmbG93aW5nICYmICFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcclxuXHRcdFx0Y29uc3QgcHJvcGVydHkgPSBpc1JUTCgpID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnXHJcblx0XHRcdHRoaXMuX2VsZW1lbnQuc3R5bGVbcHJvcGVydHldID0gYCR7c2Nyb2xsYmFyV2lkdGh9cHhgXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCFpc0JvZHlPdmVyZmxvd2luZyAmJiBpc01vZGFsT3ZlcmZsb3dpbmcpIHtcclxuXHRcdFx0Y29uc3QgcHJvcGVydHkgPSBpc1JUTCgpID8gJ3BhZGRpbmdSaWdodCcgOiAncGFkZGluZ0xlZnQnXHJcblx0XHRcdHRoaXMuX2VsZW1lbnQuc3R5bGVbcHJvcGVydHldID0gYCR7c2Nyb2xsYmFyV2lkdGh9cHhgXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRfcmVzZXRBZGp1c3RtZW50cygpIHtcclxuXHRcdHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSAnJ1xyXG5cdFx0dGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnJ1xyXG5cdH1cclxuXHJcblx0X2FkZEV2ZW50TGlzdGVuZXJzKCkge1xyXG5cdFx0RXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWV9LRVlET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcclxuXHRcdFx0aWYgKGV2ZW50LmtleSAhPT0gRVNDQVBFX0tFWSkgcmV0dXJuO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuX3BhcmFtcy5rZXlib2FyZCkge1xyXG5cdFx0XHRcdHRoaXMuaGlkZSgpO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0RXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfS0VZX1JFU0laRSwgKCkgPT4ge1xyXG5cdFx0XHRpZiAodGhpcy5faXNTaG93biAmJiAhdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB0aGlzLl9hZGp1c3REaWFsb2coKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlfTU9VU0VET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcclxuXHRcdFx0RXZlbnRIYW5kbGVyLm9uZSh0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlfQ0xJQ0tfRElTTUlTUywgZXZlbnQyID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy5fZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0IHx8IHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50Mi50YXJnZXQpIHJldHVybjtcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuX3BhcmFtcy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcclxuXHRcdFx0XHRcdHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLl9wYXJhbXMuYmFja2Ryb3ApIHtcclxuXHRcdFx0XHRcdHRoaXMuaGlkZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSlcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0X3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKSB7XHJcblx0XHRjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlfSElERV9QUkVWRU5URUQpO1xyXG5cdFx0aWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG5cdFx0Y29uc3QgaW5pdGlhbE92ZXJmbG93WSA9IHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZO1xyXG5cclxuXHRcdGlmIChpbml0aWFsT3ZlcmZsb3dZID09PSAnaGlkZGVuJyB8fCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NUQVRJQykpIHJldHVybjtcclxuXHRcdGlmICghaXNNb2RhbE92ZXJmbG93aW5nKSB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xyXG5cclxuXHRcdHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NUQVRJQyk7XHJcblxyXG5cdFx0dGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB7XHJcblx0XHRcdHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NUQVRJQyk7XHJcblx0XHRcdHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gaW5pdGlhbE92ZXJmbG93WTtcclxuXHRcdFx0fSwgdGhpcy5fZGlhbG9nKTtcclxuXHRcdH0sIHRoaXMuX2RpYWxvZyk7XHJcblx0fVxyXG5cclxuXHRfYWRkRmllbGRzSW5Nb2RhbChyZWxhdGVkVGFyZ2V0KSB7XHJcblx0XHR0aGlzLl9wYXJhbXMgPSB0aGlzLl9nZXRQYXJhbXMocmVsYXRlZFRhcmdldCwgdGhpcy5fcGFyYW1zKTtcclxuXHJcblx0XHRpZiAoIXRoaXMuX3BhcmFtcy5maWVsZHMubGVuZ3RoKSByZXR1cm47XHJcblxyXG5cdFx0dGhpcy5fcGFyYW1zLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XHJcblx0XHRcdGlmICghJ25hbWUnIGluIGl0ZW0gJiYgISd2YWx1ZScgaW4gaXRlbSkgcmV0dXJuO1xyXG5cclxuXHRcdFx0bGV0IGVsZW1lbnRzID0gU2VsZWN0b3JzLmZpbmRBbGwoJ1tkYXRhLScgKyBpdGVtLm5hbWUgKyAnXScpO1xyXG5cdFx0XHRpZiAoIWVsZW1lbnRzLmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Zm9yIChjb25zdCBlbG0gb2YgZWxlbWVudHMpIHtcclxuXHRcdFx0XHRzd2l0Y2ggKGVsbS50YWdOYW1lKSB7XHJcblx0XHRcdFx0XHRjYXNlICdJTlBVVCc6IGVsbS52YWx1ZSA9IGl0ZW0udmFsdWU7IGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSAnSU1HJzogTWFuaXB1bGF0b3Iuc2V0KGVsbSwgJ3NyYycsIGl0ZW0udmFsdWUpOyBicmVhaztcclxuXHRcdFx0XHRcdGRlZmF1bHQ6IGVsbS5pbm5lckhUTUwgPSBpdGVtLnZhbHVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5kaXNtaXNzVHJpZ2dlcihWR01vZGFsKTtcclxuXHJcblxyXG4vKipcclxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cclxuICovXHJcblxyXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWV9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xyXG5cdGNvbnN0IHRhcmdldCA9IFNlbGVjdG9ycy5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpO1xyXG5cclxuXHRpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfS0VZX1NIT1csIHNob3dFdmVudCA9PiB7XHJcblx0XHRpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcclxuXHR9KTtcclxuXHJcblx0Y29uc3QgYWxyZWFkeU9wZW4gPSBTZWxlY3RvcnMuZmluZChPUEVOX1NFTEVDVE9SKTtcclxuXHRpZiAoYWxyZWFkeU9wZW4pIFZHTW9kYWwuZ2V0SW5zdGFuY2UoYWxyZWFkeU9wZW4pLmhpZGUoKTtcclxuXHJcblx0Y29uc3QgZGF0YSA9IFZHTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpO1xyXG5cdGRhdGEudG9nZ2xlKHRoaXMpO1xyXG59KVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVkdNb2RhbDsiLCJpbXBvcnQgQmFzZU1vZHVsZSBmcm9tIFwiLi4vLi4vYmFzZS1tb2R1bGVcIjtcclxuaW1wb3J0IFNlbGVjdG9ycyBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvZG9tL3NlbGVjdG9yc1wiO1xyXG5pbXBvcnQgUmVzcG9uc2l2ZSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvY29tcG9uZW50cy9yZXNwb25zaXZlXCI7XHJcbmltcG9ydCB7Z2V0U1ZHfSBmcm9tIFwiLi4vLi4vbW9kdWxlLWZuXCI7XHJcbmltcG9ydCB7ZXhlY3V0ZSwgaXNEaXNhYmxlZCwgaXNWaXNpYmxlLCBtZXJnZURlZXBPYmplY3QsIG5vb3AsIG5vcm1hbGl6ZURhdGF9IGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9mdW5jdGlvbnNcIjtcclxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvZG9tL2V2ZW50XCI7XHJcbmltcG9ydCB7TWFuaXB1bGF0b3J9IGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9kb20vbWFuaXB1bGF0b3JcIjtcclxuXHJcbi8qKlxyXG4gKiBDb25zdGFudHNcclxuICovXHJcbmNvbnN0IE5BTUUgPSAnbmF2JztcclxuY29uc3QgTkFNRV9LRVkgPSAndmcubmF2JztcclxuXHJcbi8qKlxyXG4gKiBDb25zdGFudHMgQ2xhc3Nlc1xyXG4gKi9cclxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XICAgPSAnc2hvdyc7XHJcbmNvbnN0IENMQVNTX05BTUVfRkFERSAgID0gJ2ZhZGUnO1xyXG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnO1xyXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICcudmctbmF2IGEnO1xyXG5cclxuLyoqXHJcbiAqIENvbnN0YW50cyBFdmVudHNcclxuICovXHJcbmNvbnN0IEVWRU5UX0tFWV9ISURFICAgPSBgJHtOQU1FX0tFWX0uaGlkZWA7XHJcbmNvbnN0IEVWRU5UX0tFWV9ISURERU4gPSBgJHtOQU1FX0tFWX0uaGlkZGVuYDtcclxuY29uc3QgRVZFTlRfS0VZX1NIT1cgICA9IGAke05BTUVfS0VZfS5zaG93YDtcclxuY29uc3QgRVZFTlRfS0VZX1NIT1dOICA9IGAke05BTUVfS0VZfS5zaG93bmA7XHJcblxyXG5jb25zdCBFVkVOVF9NT1VTRU9WRVJfREFUQV9BUEkgPSBgbW91c2VvdmVyLiR7TkFNRV9LRVl9LmRhdGEuYXBpYDtcclxuY29uc3QgRVZFTlRfTU9VU0VPVVRfREFUQV9BUEkgID0gYG1vdXNlb3V0LiR7TkFNRV9LRVl9LmRhdGEuYXBpYDtcclxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2suJHtOQU1FX0tFWX0uZGF0YS5hcGlgO1xyXG5jb25zdCBFVkVOVF9LRVlVUF9EQVRBX0FQSSA9IGBrZXl1cC4ke05BTUVfS0VZfS5kYXRhLmFwaWA7XHJcbmNvbnN0IEVWRU5UX1JFU0laRV9EQVRBX0FQSSA9IGByZXNpemUuJHtOQU1FX0tFWX0uZGF0YS5hcGlgO1xyXG5cclxuY2xhc3MgVkdOYXYgZXh0ZW5kcyBCYXNlTW9kdWxlIHtcclxuXHRjb25zdHJ1Y3RvcihlbGVtZW50LCBwYXJhbXMgPSB7fSkge1xyXG5cdFx0c3VwZXIoZWxlbWVudCk7XHJcblxyXG5cdFx0dGhpcy5fcGFyYW1zID0gdGhpcy5fZ2V0UGFyYW1zKGVsZW1lbnQsIG1lcmdlRGVlcE9iamVjdCh7XHJcblx0XHRcdGJyZWFrcG9pbnQ6IGZhbHNlLFxyXG5cdFx0XHRwbGFjZW1lbnQ6ICdob3Jpem9udGFsJyxcclxuXHRcdFx0Y2xhc3Nlczoge1xyXG5cdFx0XHRcdGhhbWJ1cmdlckFjdGl2ZTogJ3ZnLW5hdi1oYW1idXJnZXItYWN0aXZlJyxcclxuXHRcdFx0XHRoYW1idXJnZXJBbHdheXM6ICd2Zy1uYXYtaGFtYnVyZ2VyLWFsd2F5cycsXHJcblx0XHRcdFx0aGFtYnVyZ2VyOiAndmctbmF2LWhhbWJ1cmdlcicsXHJcblx0XHRcdFx0Y29udGFpbmVyOiAndmctbmF2LWNvbnRhaW5lcicsXHJcblx0XHRcdFx0d3JhcHBlcjogJ3ZnLW5hdi13cmFwcGVyJyxcclxuXHRcdFx0XHRhY3RpdmU6ICd2Zy1uYXYtYWN0aXZlJyxcclxuXHRcdFx0XHRleHBhbmQ6ICd2Zy1uYXYtZXhwYW5kJyxcclxuXHRcdFx0XHRjbG9uZWQ6ICd2Zy1uYXYtY2xvbmVkJyxcclxuXHRcdFx0XHRob3ZlcjogJ3ZnLW5hdi1ob3ZlcicsXHJcblx0XHRcdFx0ZmxpcDogJ3ZnLW5hdi1mbGlwJyxcclxuXHRcdFx0XHRYWFhMOiAndmctbmF2LXh4eGwnLFxyXG5cdFx0XHRcdFhYTDogJ3ZnLW5hdi14eGwnLFxyXG5cdFx0XHRcdFhMOiAndmctbmF2LXhsJyxcclxuXHRcdFx0XHRMRzogJ3ZnLW5hdi1sZycsXHJcblx0XHRcdFx0TUQ6ICd2Zy1uYXYtbWQnLFxyXG5cdFx0XHRcdFNNOiAndmctbmF2LXNtJyxcclxuXHRcdFx0XHRYUzogJ3ZnLW5hdi14cydcclxuXHRcdFx0fSxcclxuXHRcdFx0ZXhwYW5kOiB0cnVlLFxyXG5cdFx0XHRob3ZlcjogZmFsc2UsXHJcblx0XHRcdHBvc2l0aW9uOiB0cnVlLFxyXG5cdFx0XHRjb2xsYXBzZTogdHJ1ZSxcclxuXHRcdFx0dG9nZ2xlOiAnPHNwYW4gY2xhc3M9XCJkZWZhdWx0XCI+PC9zcGFuPicsXHJcblx0XHRcdGhhbWJ1cmdlcjoge1xyXG5cdFx0XHRcdGVuYWJsZTogdHJ1ZSxcclxuXHRcdFx0XHRhbHdheXM6IGZhbHNlLFxyXG5cdFx0XHRcdHRpdGxlOiAnJyxcclxuXHRcdFx0XHRib2R5OiBudWxsXHJcblx0XHRcdH0sXHJcblx0XHRcdGNhbGxiYWNrOiBub29wLFxyXG5cdFx0XHRhbmltYXRpb246IHRydWUsXHJcblx0XHRcdHRpbWVvdXRBbmltYXRpb246IDMwMCxcclxuXHRcdFx0YWpheDoge1xyXG5cdFx0XHRcdHJvdXRlOiAnJyxcclxuXHRcdFx0XHR0YXJnZXQ6ICcnLFxyXG5cdFx0XHRcdG1ldGhvZDogJ2dldCdcclxuXHRcdFx0fVxyXG5cdFx0fSwgcGFyYW1zKSk7XHJcblxyXG5cdFx0dGhpcy5fbmF2aWdhdGlvbiA9IG51bGw7XHJcblx0XHR0aGlzLm5hdmlnYXRpb24gPSAnLicgKyB0aGlzLl9wYXJhbXMuY2xhc3Nlcy53cmFwcGVyO1xyXG5cclxuXHRcdHRoaXMubW92ZWRMaW5rcyA9IFtdO1xyXG5cdFx0dGhpcy4kbGlua3MgPSBTZWxlY3RvcnMuZmluZEFsbCgnLicgKyB0aGlzLl9wYXJhbXMuY2xhc3Nlcy53cmFwcGVyICsgJyA+IGxpJywgdGhpcy5uYXZpZ2F0aW9uKVxyXG5cclxuXHRcdGlmICh0aGlzLl9wYXJhbXMuYW5pbWF0aW9uID09PSBmYWxzZSkge1xyXG5cdFx0XHR0aGlzLl9wYXJhbXMudGltZW91dEFuaW1hdGlvbiA9IDEwXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0IE5BTUUoKSB7XHJcblx0XHRyZXR1cm4gTkFNRTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXQgTkFNRV9LRVkoKSB7XHJcblx0XHRyZXR1cm4gTkFNRV9LRVk7XHJcblx0fVxyXG5cclxuXHRnZXQgbmF2aWdhdGlvbigpIHtcclxuXHRcdHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uO1xyXG5cdH1cclxuXHJcblx0c2V0IG5hdmlnYXRpb24oZWwpIHtcclxuXHRcdGxldCBlbG0gPSBTZWxlY3RvcnMuZmluZChlbCwgdGhpcy5fZWxlbWVudCk7XHJcblx0XHRpZiAoIWVsbSkgcmV0dXJuO1xyXG5cdFx0dGhpcy5fbmF2aWdhdGlvbiA9IGVsbTtcclxuXHR9XHJcblxyXG5cdGJ1aWxkKCkge1xyXG5cdFx0aWYgKCF0aGlzLm5hdmlnYXRpb24pIHJldHVybjtcclxuXHJcblx0XHRsZXQgcGFyYW1zID0gdGhpcy5fcGFyYW1zO1xyXG5cclxuXHRcdC8vINCS0LXRiNCw0LXQvCDQvtGB0L3QvtCy0L3Ri9C1INC60LvQsNGB0YHRi1xyXG5cdFx0dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKHBhcmFtcy5jbGFzc2VzLmNvbnRhaW5lcik7XHJcblx0XHR0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3ZnLW5hdi0nICsgcGFyYW1zLnBsYWNlbWVudCk7XHJcblxyXG5cdFx0Ly8g0JXRgdC70Lgg0L3Rg9C20L3QviDQvtGB0YLQsNCy0LjRgtGMINGB0L/QuNGB0L7QuiDQvNC10L3RjiDQuNC70Lgg0YPRgdGC0LDQvdC+0LLQuNGC0Ywg0LzQtdC00LjQsCDRgtC+0YfQutGDXHJcblx0XHRpZiAoIXBhcmFtcy5icmVha3BvaW50KSB7XHJcblx0XHRcdHBhcmFtcy5leHBhbmQgPSBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIXBhcmFtcy5oYW1idXJnZXIuYWx3YXlzKSB7XHJcblx0XHRcdGlmICghcGFyYW1zLmJyZWFrcG9pbnQgfHwgIXBhcmFtcy5leHBhbmQpIHtcclxuXHRcdFx0XHR0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQocGFyYW1zLmNsYXNzZXMuZXhwYW5kKTtcclxuXHRcdFx0fSBlbHNlIGlmIChwYXJhbXMuYnJlYWtwb2ludCAhPT0gZmFsc2UpIHtcclxuXHRcdFx0XHR0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3ZnLW5hdi0nICsgcGFyYW1zLmJyZWFrcG9pbnQpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQocGFyYW1zLmNsYXNzZXMuaGFtYnVyZ2VyQWx3YXlzKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDQnNC10L3RjiDRgdGA0LDQsdCw0YLRi9Cy0LDQtdGCINC/0YDQuCDQvdCw0LLQtdC00LXQvdC40LgsINC10YHQu9C4INGN0YLQviDQvdC1INC80L7QsdC40LvRjNC90L7QtSDRg9GB0YLRgNC+0LnRgdGC0LLQvlxyXG5cdFx0aWYgKHBhcmFtcy5ob3Zlcikge1xyXG5cdFx0XHR0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQocGFyYW1zLmNsYXNzZXMuaG92ZXIpO1xyXG5cclxuXHRcdFx0aWYgKFJlc3BvbnNpdmUuY2hlY2tNb2JpbGVPclRhYmxldCgpKSB7XHJcblx0XHRcdFx0dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHBhcmFtcy5jbGFzc2VzLmhvdmVyKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8INCz0LDQvNCx0YPRgNCz0LXRgCwg0LXRgdC70Lgg0LXQs9C+INC90LXRgiDQsiDRgNCw0LfQvNC10YLQutC1XHJcblx0XHRpZiAocGFyYW1zLmV4cGFuZCAmJiAhcGFyYW1zLmhhbWJ1cmdlci5ib2R5KSB7XHJcblx0XHRcdGxldCBpc0hhbWJ1cmdlciA9IFNlbGVjdG9ycy5maW5kKCcuJyArIHBhcmFtcy5jbGFzc2VzLmhhbWJ1cmdlciwgdGhpcy5fZWxlbWVudCk7XHJcblxyXG5cdFx0XHRpZiAoaXNIYW1idXJnZXIgPT09IG51bGwpIHtcclxuXHRcdFx0XHRsZXQgbVRpdGxlID0gJycsXHJcblx0XHRcdFx0XHRoYW1idXJnZXIgPSAnPHNwYW4gY2xhc3M9XCInICsgcGFyYW1zLmNsYXNzZXMuaGFtYnVyZ2VyICsgJy0tbGluZXNcIj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L3NwYW4+JztcclxuXHJcblx0XHRcdFx0aWYgKHBhcmFtcy5oYW1idXJnZXIudGl0bGUpIHtcclxuXHRcdFx0XHRcdG1UaXRsZSA9ICc8c3BhbiBjbGFzcz1cIicgKyBwYXJhbXMuY2xhc3Nlcy5oYW1idXJnZXIgKyAnLS10aXRsZVwiPicrIHBhcmFtcy5oYW1idXJnZXIudGl0bGUgKyc8L3NwYW4+JztcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChwYXJhbXMuaGFtYnVyZ2VyLmJvZHkgIT09IG51bGwpIHtcclxuXHRcdFx0XHRcdGhhbWJ1cmdlciA9IHBhcmFtcy5oYW1idXJnZXIuYm9keTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHRoaXMuX2VsZW1lbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywnPGEgaHJlZj1cIiNzaWRlYmFyLW5hdlwiIGNsYXNzPVwiJyArIHBhcmFtcy5jbGFzc2VzLmhhbWJ1cmdlciArICdcIiBkYXRhLXZnLXRvZ2dsZT1cInNpZGViYXJcIj4nICsgbVRpdGxlICsgaGFtYnVyZ2VyICsnPC9hPicpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8g0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10Lwg0YPQutCw0LfQsNGC0LXQu9GMINC/0LXRgNC10LrQu9GO0YfQsNGC0LXQu9GPXHJcblx0XHRpZiAocGFyYW1zLnRvZ2dsZSkge1xyXG5cdFx0XHRsZXQgJGRyb3Bkb3duX2EgPSBbLi4uU2VsZWN0b3JzLmZpbmRBbGwoJy5kcm9wZG93bi1tZWdhID4gYSwgLmRyb3Bkb3duID4gYScsIHRoaXMuX2VsZW1lbnQpXSxcclxuXHRcdFx0XHR0b2dnbGUgPSAnPHNwYW4gY2xhc3M9XCJ0b2dnbGVcIj4nICsgcGFyYW1zLnRvZ2dsZSArICc8L3NwYW4+JztcclxuXHJcblx0XHRcdGlmICgkZHJvcGRvd25fYS5sZW5ndGgpIHtcclxuXHRcdFx0XHQkZHJvcGRvd25fYS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtKSB7XHJcblx0XHRcdFx0XHRpZiAoIWVsZW0ucXVlcnlTZWxlY3RvcignLnRvZ2dsZScpICYmICFlbGVtLmNsb3Nlc3QoJy5kb3RzJykpIHtcclxuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKVxyXG5cdFx0XHRcdFx0XHRlbGVtLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgdG9nZ2xlKVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHBhcmFtcy5jb2xsYXBzZSAmJiBSZXNwb25zaXZlLmNoZWNrKHRoaXMpICYmIHBhcmFtcy5wbGFjZW1lbnQgIT09ICd2ZXJ0aWNhbCcpIHtcclxuXHRcdFx0c2V0Q29sbGFwc2UodGhpcyk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCdhZnRlckluaXQnIGluIHRoaXMuX3BhcmFtcy5jYWxsYmFjaykge1xyXG5cdFx0XHRleGVjdXRlKHRoaXMuX3BhcmFtcy5jYWxsYmFjay5hZnRlckluaXQsIFt0aGlzXSk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiDQpNGD0L3QutGG0LjRjyDRgdCy0L7RgNCw0YfQuNCy0LDQvdC40Y9cclxuXHRcdCAqIFRPRE8g0J/RgNC40LTRg9C80LDRgtGMINGH0YLQviDRgtC+INGBINC80LXQs9CwINC80LXQvdGOLCDQutC+0YLQvtGA0L7QtSDRg9GF0L7QtNC40YIg0LIg0L/QvtC00LzQtdC90Y5cclxuXHRcdCAqIFRPRE8g0KLQsNC6INC20LUg0LXRgdGC0Ywg0LrQvtGB0Y/QutC4INC/0YDQuCDRgNC10YHQsNC50LfQtVxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiBzZXRDb2xsYXBzZShfdGhpcykge1xyXG5cdFx0XHRsZXQgd2lkdGhfbmF2aWdhdGlvbl9yZXNwb25zaXZlID0gX3RoaXMubmF2aWdhdGlvbi5jbGllbnRXaWR0aCxcclxuXHRcdFx0XHR3aWR0aF9hbGxfbGlua3NfcmVzcG9uc2l2ZSA9IDAsXHJcblx0XHRcdFx0JGRvdHMgPSBTZWxlY3RvcnMuZmluZCgnLmRvdHMnLCBfdGhpcy5uYXZpZ2F0aW9uKSxcclxuXHRcdFx0XHRfZG90cyA9IGdldFNWRygnZG90cycpO1xyXG5cclxuXHRcdFx0aWYgKF90aGlzLiRsaW5rcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRpZiAoJGRvdHMpIHtcclxuXHRcdFx0XHRcdHdpZHRoX2FsbF9saW5rc19yZXNwb25zaXZlID0gJGRvdHMuY2xpZW50V2lkdGhcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0bGV0ICRhID0gU2VsZWN0b3JzLmZpbmQoJ2EnLCBfdGhpcy4kbGlua3NbMF0pLFxyXG5cdFx0XHRcdFx0XHQkbGlua1N0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSgkYSksXHJcblx0XHRcdFx0XHRcdHBhZGRpbmdMZWZ0ID0gbm9ybWFsaXplRGF0YSgkbGlua1N0eWxlLnBhZGRpbmdMZWZ0LnNsaWNlKDAsIC0yKSksXHJcblx0XHRcdFx0XHRcdHBhZGRpbmdSaWdodCA9ICBub3JtYWxpemVEYXRhKCRsaW5rU3R5bGUucGFkZGluZ1JpZ2h0LnNsaWNlKDAsIC0yKSksXHJcblx0XHRcdFx0XHRcdHBhZGRpbmcgPSBwYWRkaW5nTGVmdCArIHBhZGRpbmdSaWdodDtcclxuXHJcblx0XHRcdFx0XHQvLyBUT0RPINC90LUg0YHQvtCy0YHQtdC8INCy0LXRgNC90L4sINC90L4g0LzRiyDRgtC+0YfQvdC+INC30L3QsNC10Lwg0YjQuNGA0LjQvdGDINGC0L7Rh9C10Log0LIgc3ZnIC0gMTZweFxyXG5cdFx0XHRcdFx0d2lkdGhfYWxsX2xpbmtzX3Jlc3BvbnNpdmUgPSBwYWRkaW5nICsgMTY7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmb3IgKGxldCAkbGluayBvZiBfdGhpcy4kbGlua3MpIHtcclxuXHRcdFx0XHRcdGxldCB3aWR0aCA9ICRsaW5rLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xyXG5cdFx0XHRcdFx0d2lkdGhfYWxsX2xpbmtzX3Jlc3BvbnNpdmUgPSB3aWR0aF9hbGxfbGlua3NfcmVzcG9uc2l2ZSArIHdpZHRoO1xyXG5cclxuXHRcdFx0XHRcdGlmICgod2lkdGhfbmF2aWdhdGlvbl9yZXNwb25zaXZlKSA8IHdpZHRoX2FsbF9saW5rc19yZXNwb25zaXZlKSB7XHJcblx0XHRcdFx0XHRcdF90aGlzLm1vdmVkTGlua3MucHVzaCgkbGluayk7XHJcblx0XHRcdFx0XHRcdCRsaW5rLnJlbW92ZSgpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0aWYgKF90aGlzLm1vdmVkTGlua3MubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCRkb3RzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRfdGhpcy5uYXZpZ2F0aW9uLmluc2VydEJlZm9yZShfdGhpcy5tb3ZlZExpbmtzWzBdLCAkZG90cylcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0X3RoaXMubmF2aWdhdGlvbi5hcHBlbmRDaGlsZChfdGhpcy5tb3ZlZExpbmtzWzBdKVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRfdGhpcy5tb3ZlZExpbmtzLnNwbGljZSgwLCAxKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKF90aGlzLm1vdmVkTGlua3MubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRpZiAoISRkb3RzKSB7XHJcblx0XHRcdFx0XHRcdF90aGlzLm5hdmlnYXRpb24uaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCc8bGkgY2xhc3M9XCJkcm9wZG93biBkb3RzXCI+JyArICc8YSBocmVmPVwiI1wiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPicrIF9kb3RzICsnPC9hPjwvbGk+Jyk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmICgkZG90cykge1xyXG5cdFx0XHRcdFx0XHQkZG90cy5yZW1vdmUoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGxldCAkZCA9IF90aGlzLm5hdmlnYXRpb24ucXVlcnlTZWxlY3RvcignLmRvdHMnKTtcclxuXHRcdFx0XHRpZiAoJGQgJiYgX3RoaXMubW92ZWRMaW5rcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdGxldCAkZHJvcGRvd24gPSAkZC5xdWVyeVNlbGVjdG9yKCd1bCcpO1xyXG5cdFx0XHRcdFx0aWYgKCRkcm9wZG93bikge1xyXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBsaW5rIG9mIF90aGlzLm1vdmVkTGlua3MpIHtcclxuXHRcdFx0XHRcdFx0XHQkZHJvcGRvd24ucHJlcGVuZChsaW5rKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0bGV0ICRkcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcblx0XHRcdFx0XHRcdCRkcm9wZG93bi5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1jb250ZW50Jyk7XHJcblx0XHRcdFx0XHRcdCRkcm9wZG93bi5jbGFzc0xpc3QuYWRkKCdyaWdodCcpO1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgbGluayBvZiBfdGhpcy5tb3ZlZExpbmtzKSB7XHJcblx0XHRcdFx0XHRcdFx0JGRyb3Bkb3duLnByZXBlbmQobGluayk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdCRkLmFwcGVuZENoaWxkKCRkcm9wZG93bik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzaG93KHJlbGF0ZWRUYXJnZXQpIHtcclxuXHRcdGxldCB0YXJnZXQgPSByZWxhdGVkVGFyZ2V0LnJlbGF0ZWRUYXJnZXQ7XHJcblxyXG5cdFx0aWYgKCF0YXJnZXQgfHwgaXNEaXNhYmxlZCh0YXJnZXQpKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIXRhcmdldC5jbG9zZXN0KCcuZHJvcGRvd24tY29udGVudCcpKSB7XHJcblx0XHRcdHRhcmdldC5jbGFzc0xpc3QuYWRkKCdmaXJzdCcpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRhcmdldCwgRVZFTlRfS0VZX1NIT1csIHsgcmVsYXRlZFRhcmdldCB9KTtcclxuXHRcdGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xyXG5cclxuXHRcdGxldCBkcm9wID0gU2VsZWN0b3JzLmZpbmQoJy5kcm9wZG93bi1jb250ZW50JywgdGFyZ2V0KSxcclxuXHRcdFx0bGluayA9IHRhcmdldC5maXJzdEVsZW1lbnRDaGlsZDtcclxuXHJcblx0XHRpZiAobGluaykgbGluay5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpO1xyXG5cdFx0ZHJvcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyk7XHJcblx0XHR0YXJnZXQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSk7XHJcblxyXG5cdFx0c2V0RHJvcFBvc2l0aW9uKGRyb3ApXHJcblxyXG5cdFx0Y29uc3QgY29tcGxldGVDYWxsQmFjayA9ICgpID0+IHtcclxuXHRcdFx0ZHJvcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSk7XHJcblx0XHRcdEV2ZW50SGFuZGxlci50cmlnZ2VyKHRhcmdldCwgRVZFTlRfS0VZX1NIT1dOLCByZWxhdGVkVGFyZ2V0KVxyXG5cdFx0fVxyXG5cdFx0dGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZUNhbGxCYWNrLCBkcm9wLCB0cnVlLCA1MCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtICRkcm9wXHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIHNldERyb3BQb3NpdGlvbigkZHJvcCkge1xyXG5cdFx0XHRsZXQge3dpZHRoLCByaWdodH0gPSAkZHJvcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcclxuXHRcdFx0XHR3aW5kb3dfd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuXHJcblx0XHRcdGxldCBOX3JpZ2h0ID0gd2luZG93X3dpZHRoIC0gcmlnaHQgLSB3aWR0aDtcclxuXHJcblx0XHRcdCRkcm9wLmNsYXNzTGlzdC5yZW1vdmUoJ3JpZ2h0Jyk7XHJcblx0XHRcdCRkcm9wLmNsYXNzTGlzdC5yZW1vdmUoJ2xlZnQnKTtcclxuXHJcblx0XHRcdGxldCAkcGFyZW50ID0gJGRyb3AuY2xvc2VzdCgnbGknKSxcclxuXHRcdFx0XHQkdWwgPSAkcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3VsJyk7XHJcblxyXG5cdFx0XHRpZiAoTl9yaWdodCA+IHdpZHRoKSB7XHJcblx0XHRcdFx0Zm9yIChjb25zdCAkZWwgb2YgJHVsKSB7XHJcblx0XHRcdFx0XHQkZWwuY2xhc3NMaXN0LmFkZCgnbGVmdCcpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRmb3IgKGNvbnN0ICRlbCBvZiAkdWwpIHtcclxuXHRcdFx0XHRcdCRlbC5jbGFzc0xpc3QuYWRkKCdyaWdodCcpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aGlkZShyZWxhdGVkVGFyZ2V0KSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblx0XHRpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcblx0XHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBbXS5jb25jYXQoLi4uZG9jdW1lbnQuYm9keS5jaGlsZHJlbikpIHtcclxuXHRcdFx0XHRFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBlbGVtZW50ID0gcmVsYXRlZFRhcmdldC5yZWxhdGVkVGFyZ2V0O1xyXG5cclxuXHRcdGlmICgnZWxtJyBpbiByZWxhdGVkVGFyZ2V0ICYmIHJlbGF0ZWRUYXJnZXQuZWxtKSB7XHJcblx0XHRcdGVsZW1lbnQgPSByZWxhdGVkVGFyZ2V0LmVsbVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChlbGVtZW50KSB7XHJcblx0XHRcdGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKGVsZW1lbnQsIEVWRU5UX0tFWV9ISURFKTtcclxuXHRcdFx0aWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XHJcblxyXG5cdFx0XHRlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpO1xyXG5cclxuXHRcdFx0aWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmaXJzdCcpKSB7XHJcblx0XHRcdFx0ZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdmaXJzdCcpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRbLi4uU2VsZWN0b3JzLmZpbmRBbGwoJy4nICsgQ0xBU1NfTkFNRV9TSE9XLCBlbGVtZW50KV0uZm9yRWFjaChmdW5jdGlvbiAoZWwsIGluZGV4KSB7XHJcblx0XHRcdFx0ZWwuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0ZBREUpO1xyXG5cclxuXHRcdFx0XHRsZXQgcGFyZW50ID0gZWwuY2xvc2VzdCgnLmRyb3Bkb3duJyk7XHJcblx0XHRcdFx0aWYgKHBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9BQ1RJVkUpKSB7XHJcblx0XHRcdFx0XHRwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRsZXQgbGluayA9IGVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XHJcblx0XHRcdFx0aWYgKGxpbmspIGxpbmsuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XHJcblxyXG5cdFx0XHRcdGlmIChpbmRleCA9PT0gMCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgY29tcGxldGVDYWxsYmFjayA9ICgpID0+IHtcclxuXHRcdFx0XHRcdFx0ZWwuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xyXG5cdFx0XHRcdFx0XHRFdmVudEhhbmRsZXIudHJpZ2dlcihlbCwgRVZFTlRfS0VZX0hJRERFTiwgcmVsYXRlZFRhcmdldClcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRfdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZUNhbGxiYWNrLCBlbCwgdHJ1ZSwgNTAwKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVE9ETyDQtdGB0LvQuCDQvdCwINGB0YLRgNCw0L3QuNGG0LUg0L3QtdGB0LrQvtC70YzQutC+INC90LDQstC40LPQsNGG0LjQuSwg0YLQviDQtdGB0YLRjCDQutC+0YHRj9C60LhcclxuXHQgKiBAcGFyYW0gZWxlbWVudFxyXG5cdCAqIEBwYXJhbSBwYXJhbXNcclxuXHQgKi9cclxuXHRzdGF0aWMgaW5pdChlbGVtZW50LCBwYXJhbXMgPSB7fSkge1xyXG5cdFx0Y29uc3QgaW5zdGFuY2UgPSBWR05hdi5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHBhcmFtcyk7XHJcblx0XHRpbnN0YW5jZS5idWlsZCgpO1xyXG5cclxuXHRcdGxldCBkcm9wcyA9IFNlbGVjdG9ycy5maW5kQWxsKCcuZHJvcGRvd24nLCBpbnN0YW5jZS5fbmF2aWdhdGlvbilcclxuXHJcblx0XHRpZiAoaW5zdGFuY2UuX3BhcmFtcy5ob3Zlcikge1xyXG5cdFx0XHRbLi4uZHJvcHNdLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XHJcblx0XHRcdFx0bGV0IGN1cnJlbnRFbGVtID0gbnVsbDtcclxuXHRcdFx0XHRFdmVudEhhbmRsZXIub24oZWwsIEVWRU5UX01PVVNFT1ZFUl9EQVRBX0FQSSwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcblx0XHRcdFx0XHRpZiAoY3VycmVudEVsZW0pIHJldHVybjtcclxuXHRcdFx0XHRcdFZHTmF2LmhpZGVPcGVuRHJvcHMoZXZlbnQpO1xyXG5cclxuXHRcdFx0XHRcdGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnLmRyb3Bkb3duJyk7XHJcblx0XHRcdFx0XHRpZiAoIXRhcmdldCkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHRcdGlmICghaW5zdGFuY2UubmF2aWdhdGlvbi5jb250YWlucyh0YXJnZXQpKSByZXR1cm47XHJcblx0XHRcdFx0XHRjdXJyZW50RWxlbSA9IHRhcmdldDtcclxuXHJcblx0XHRcdFx0XHRsZXQgcmVsYXRlZFRhcmdldCA9IHtcclxuXHRcdFx0XHRcdFx0cmVsYXRlZFRhcmdldDogdGFyZ2V0XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aW5zdGFuY2Uuc2hvdyhyZWxhdGVkVGFyZ2V0KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRFdmVudEhhbmRsZXIub24oZWwsIEVWRU5UX01PVVNFT1VUX0RBVEFfQVBJLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuXHRcdFx0XHRcdGlmICghY3VycmVudEVsZW0pIHJldHVybjtcclxuXHJcblx0XHRcdFx0XHRsZXQgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQuY2xvc2VzdCgnLmRyb3Bkb3duJyksXHJcblx0XHRcdFx0XHRcdGVsbSA9IGN1cnJlbnRFbGVtO1xyXG5cclxuXHRcdFx0XHRcdHdoaWxlIChyZWxhdGVkVGFyZ2V0KSB7XHJcblx0XHRcdFx0XHRcdGlmIChyZWxhdGVkVGFyZ2V0ID09PSBjdXJyZW50RWxlbSkgcmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRyZWxhdGVkVGFyZ2V0ID0gcmVsYXRlZFRhcmdldC5wYXJlbnROb2RlO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGN1cnJlbnRFbGVtID0gbnVsbDtcclxuXHRcdFx0XHRcdGluc3RhbmNlLmhpZGUoe3JlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRUYXJnZXQsIGVsbTogZWxtfSk7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0fSlcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZVVBfREFUQV9BUEksIFZHTmF2LmNsZWFyRHJvcHMpO1xyXG5cdFx0XHRFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBWR05hdi5jbGVhckRyb3BzKTtcclxuXHRcdFx0RXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xyXG5cdFx0XHRcdGlmICghTWFuaXB1bGF0b3IuaGFzKHRoaXMsICdhcmlhLWV4cGFuZGVkJykpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICgnY2xpY2snIGluIGluc3RhbmNlLl9wYXJhbXMuY2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdGV4ZWN1dGUoaW5zdGFuY2UuX3BhcmFtcy5jYWxsYmFjay5jbGljaywgW3RoaXNdKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRcdGxldCBzZWxmID0gdGhpcy5jbG9zZXN0KCcudmctbmF2JyksXHJcblx0XHRcdFx0XHRpc0ZpcnN0ID0gc2VsZi5xdWVyeVNlbGVjdG9yKCcuZmlyc3QnKTtcclxuXHJcblx0XHRcdFx0bGV0IHRhcmdldCA9IHRoaXMuY2xvc2VzdCgnLmRyb3Bkb3duJyk7XHJcblx0XHRcdFx0aWYgKCF0YXJnZXQpIHJldHVybjtcclxuXHJcblx0XHRcdFx0aWYgKGlzRGlzYWJsZWQodGFyZ2V0KSAmJiAhaXNWaXNpYmxlKHRhcmdldCkpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChpc0ZpcnN0ICYmIHRoaXMuY2xvc2VzdCgnLmZpcnN0JykpIHtcclxuXHRcdFx0XHRcdGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkge1xyXG5cdFx0XHRcdFx0XHRpbnN0YW5jZS5oaWRlKHtyZWxhdGVkVGFyZ2V0OiB0YXJnZXR9KTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRbLi4uU2VsZWN0b3JzLmZpbmRBbGwoJy5hY3RpdmUnLCBzZWxmKV0uZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGVsICYmIGVsICE9PSB0YXJnZXQpIHtcclxuXHRcdFx0XHRcdFx0XHRpbnN0YW5jZS5oaWRlKHtyZWxhdGVkVGFyZ2V0OiBlbH0pXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aW5zdGFuY2Uuc2hvdyh7cmVsYXRlZFRhcmdldDogdGFyZ2V0fSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHZnTmF2U2lkZWJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLW5hdicpO1xyXG5cdFx0bGV0IGhhbWJ1cmdlciA9IGluc3RhbmNlLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy4nICsgaW5zdGFuY2UuX3BhcmFtcy5jbGFzc2VzLmhhbWJ1cmdlcik7XHJcblxyXG5cdFx0aWYgKHZnTmF2U2lkZWJhciAmJiBoYW1idXJnZXIpIHtcclxuXHRcdFx0dmdOYXZTaWRlYmFyLmFkZEV2ZW50TGlzdGVuZXIoJ3ZnLnNpZGViYXIuc2hvdycsIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRoYW1idXJnZXIuY2xhc3NMaXN0LmFkZChpbnN0YW5jZS5fcGFyYW1zLmNsYXNzZXMuaGFtYnVyZ2VyQWN0aXZlKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR2Z05hdlNpZGViYXIuYWRkRXZlbnRMaXN0ZW5lcigndmcuc2lkZWJhci5oaWRlJywgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdGhhbWJ1cmdlci5jbGFzc0xpc3QucmVtb3ZlKGluc3RhbmNlLl9wYXJhbXMuY2xhc3Nlcy5oYW1idXJnZXJBY3RpdmUpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHN0YXRpYyBjbGVhckRyb3BzKGV2ZW50KSB7XHJcblx0XHRpZiAoZXZlbnQuYnV0dG9uID09PSAyIHx8IChldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LmtleSAhPT0gJ1RhYicpKSB7XHJcblx0XHRcdHJldHVyblxyXG5cdFx0fVxyXG5cclxuXHRcdFZHTmF2LmhpZGVPcGVuRHJvcHMoZXZlbnQpXHJcblx0fVxyXG5cclxuXHRzdGF0aWMgaGlkZU9wZW5Ecm9wcyhldmVudCkge1xyXG5cdFx0Y29uc3Qgb3BlblRvZ2dsZXMgPSBTZWxlY3RvcnMuZmluZEFsbCgnLmRyb3Bkb3duOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpLmFjdGl2ZScpO1xyXG5cclxuXHRcdGZvciAoY29uc3QgdG9nZ2xlIG9mIG9wZW5Ub2dnbGVzKSB7XHJcblx0XHRcdGNvbnN0IGNvbnRleHQgPSBWR05hdi5nZXRJbnN0YW5jZSh0b2dnbGUuY2xvc2VzdCgnLnZnLW5hdicpKTtcclxuXHRcdFx0aWYgKCFjb250ZXh0KSBjb250aW51ZTtcclxuXHJcblx0XHRcdGlmIChldmVudC50YXJnZXQuY2xvc2VzdCgnLmZpcnN0JykpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7IHJlbGF0ZWRUYXJnZXQ6IHRvZ2dsZSB9XHJcblxyXG5cdFx0XHRpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xyXG5cdFx0XHRcdHJlbGF0ZWRUYXJnZXQuY2xpY2tFdmVudCA9IGV2ZW50XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnRleHQuaGlkZShyZWxhdGVkVGFyZ2V0KVxyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFX0RBVEFfQVBJLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuXHRjb25zdCBpbnN0YW5jZSA9IFZHTmF2LmdldE9yQ3JlYXRlSW5zdGFuY2UoJy52Zy1uYXYnLCB7fSk7XHJcblx0aW5zdGFuY2UuYnVpbGQoKTtcclxufSlcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZHTmF2OyIsImltcG9ydCBCYXNlTW9kdWxlIGZyb20gXCIuLi8uLi9iYXNlLW1vZHVsZVwiO1xyXG5pbXBvcnQge2V4ZWN1dGUsIGlzRGlzYWJsZWQsIGlzVmlzaWJsZSwgbWVyZ2VEZWVwT2JqZWN0LCBub29wfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvZnVuY3Rpb25zXCI7XHJcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2pzL2RvbS9ldmVudFwiO1xyXG5pbXBvcnQgU2VsZWN0b3JzIGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9kb20vc2VsZWN0b3JzXCI7XHJcbmltcG9ydCB7TWFuaXB1bGF0b3J9IGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9kb20vbWFuaXB1bGF0b3JcIjtcclxuXHJcbi8qKlxyXG4gKiBDb25zdGFudHNcclxuICovXHJcbmNvbnN0IE5BTUUgPSAncm9sbHVwJztcclxuY29uc3QgTkFNRV9LRVkgPSAndmcucm9sbHVwJztcclxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnO1xyXG5jb25zdCBDTEFTU19OQU1FX0hJREUgPSAnZC1ub25lJztcclxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEU9ICdbZGF0YS12Zy10b2dnbGU9XCJyb2xsdXBcIl0nXHJcblxyXG5jb25zdCBFVkVOVF9LRVlfSElERSAgID0gYCR7TkFNRV9LRVl9LmhpZGVgO1xyXG5jb25zdCBFVkVOVF9LRVlfSElEREVOID0gYCR7TkFNRV9LRVl9LmhpZGRlbmA7XHJcbmNvbnN0IEVWRU5UX0tFWV9TSE9XICAgPSBgJHtOQU1FX0tFWX0uc2hvd2A7XHJcbmNvbnN0IEVWRU5UX0tFWV9TSE9XTiAgPSBgJHtOQU1FX0tFWX0uc2hvd25gO1xyXG5cclxuY29uc3QgRVZFTlRfS0VZX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrLiR7TkFNRV9LRVl9LmRhdGEuYXBpYDtcclxuXHJcbmNsYXNzIFZHUm9sbHVwICBleHRlbmRzIEJhc2VNb2R1bGUge1xyXG5cdGNvbnN0cnVjdG9yKGVsZW1lbnQsIHBhcmFtcyA9IHt9KSB7XHJcblx0XHRzdXBlcihlbGVtZW50LCBwYXJhbXMpO1xyXG5cclxuXHRcdHRoaXMuX3BhcmFtcyA9IHRoaXMuX2dldFBhcmFtcyhlbGVtZW50LCBtZXJnZURlZXBPYmplY3Qoe1xyXG5cclxuXHRcdH0sIHBhcmFtcykpO1xyXG5cclxuXHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0IE5BTUUoKSB7XHJcblx0XHRyZXR1cm4gTkFNRTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXQgTkFNRV9LRVkoKSB7XHJcblx0XHRyZXR1cm4gTkFNRV9LRVlcclxuXHR9XHJcblxyXG5cdGJ1aWxkKCkge1xyXG5cclxuXHR9XHJcblxyXG5cdHRvZ2dsZShyZWxhdGVkVGFyZ2V0KSB7XHJcblx0XHRyZXR1cm4gIXRoaXMuX2lzU2hvd24oKSA/IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KSA6IHRoaXMuaGlkZSgpO1xyXG5cdH1cclxuXHJcblx0c2hvdyhyZWxhdGVkVGFyZ2V0KSB7XHJcblxyXG5cdH1cclxuXHJcblx0X2lzU2hvd24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqINCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPXHJcblx0ICogQHBhcmFtIGVsZW1lbnRcclxuXHQgKiBAcGFyYW0gcGFyYW1zXHJcblx0ICovXHJcblx0c3RhdGljIGluaXQoZWxlbWVudCwgcGFyYW1zID0ge30pIHtcclxuXHRcdGNvbnN0IGluc3RhbmNlID0gVkdSb2xsdXAuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCBwYXJhbXMpO1xyXG5cdFx0aW5zdGFuY2UudG9nZ2xlKCk7XHJcblx0fVxyXG59XHJcblxyXG4vKipcclxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cclxuICovXHJcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcblx0Y29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JzLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcyk7XHJcblx0aWYgKCF0YXJnZXQpIHJldHVybjtcclxuXHJcblx0aWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xyXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG5cdH1cclxuXHJcblx0aWYgKGlzRGlzYWJsZWQodGhpcykpIHtcclxuXHRcdHJldHVyblxyXG5cdH1cclxuXHJcblx0dGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcclxuXHJcblx0Y29uc3QgZGF0YSA9IFZHUm9sbHVwLmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KVxyXG5cdGRhdGEudG9nZ2xlKHRoaXMpO1xyXG59KTtcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBWR1JvbGx1cDsiLCJpbXBvcnQgQmFzZU1vZHVsZSBmcm9tIFwiLi4vLi4vYmFzZS1tb2R1bGVcIjtcclxuaW1wb3J0IHtpc0VtcHR5T2JqLCBtZXJnZURlZXBPYmplY3QsIHRyYW5zbGl0ZXJhdGV9IGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9mdW5jdGlvbnNcIjtcclxuaW1wb3J0IHtNYW5pcHVsYXRvcn0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2pzL2RvbS9tYW5pcHVsYXRvclwiO1xyXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9kb20vZXZlbnRcIjtcclxuXHJcbi8qKlxyXG4gKiBDb25zdGFudHNcclxuICovXHJcbmNvbnN0IE5BTUUgPSAnc2VsZWN0JztcclxuY29uc3QgTkFNRV9LRVkgPSAndmcuc2VsZWN0JztcclxuXHJcbmNvbnN0IENMQVNTX05BTUVfQ09OVEFJTkVSICAgICAgPSAndmctc2VsZWN0JztcclxuY29uc3QgQ0xBU1NfTkFNRV9EUk9QRE9XTiAgICAgICA9ICd2Zy1zZWxlY3QtZHJvcGRvd24nO1xyXG5jb25zdCBDTEFTU19OQU1FX0xJU1QgICAgICAgICAgID0gJ3ZnLXNlbGVjdC1saXN0JztcclxuY29uc3QgQ0xBU1NfTkFNRV9PUFRJT04gICAgICAgICA9ICd2Zy1zZWxlY3QtbGlzdC0tb3B0aW9uJztcclxuY29uc3QgQ0xBU1NfTkFNRV9PUFRHUk9VUCAgICAgICA9ICd2Zy1zZWxlY3QtbGlzdC0tb3B0Z3JvdXAnO1xyXG5jb25zdCBDTEFTU19OQU1FX09QVEdST1VQX1RJVExFID0gJ3ZnLXNlbGVjdC1saXN0LS1vcHRncm91cC10aXRsZSc7XHJcbmNvbnN0IENMQVNTX05BTUVfQ1VSUkVOVCAgICAgICAgPSAndmctc2VsZWN0LWN1cnJlbnQnO1xyXG5jb25zdCBDTEFTU19OQU1FX1NFQVJDSCAgICAgICAgID0gJ3ZnLXNlbGVjdC1zZWFyY2gnO1xyXG5jb25zdCBDTEFTU19OQU1FX1NFTEVDVEVEICAgICAgID0gJ3NlbGVjdGVkJztcclxuXHJcbmNvbnN0IEVWRU5UX0tFWV9DSEFOR0UgICAgICAgICAgPSBgJHtOQU1FX0tFWX0uY2hhbmdlYDtcclxuXHJcbmxldCBvYnNlcnZlclRpbW91dDtcclxuXHJcbmNsYXNzIFZHU2VsZWN0IGV4dGVuZHMgQmFzZU1vZHVsZSB7XHJcblx0Y29uc3RydWN0b3IoZWxlbWVudCwgcGFyYW1zID0ge30pIHtcclxuXHRcdHN1cGVyKGVsZW1lbnQsIHBhcmFtcyk7XHJcblxyXG5cdFx0dGhpcy5fcGFyYW1zID0gdGhpcy5fZ2V0UGFyYW1zKGVsZW1lbnQsIG1lcmdlRGVlcE9iamVjdCh7XHJcblx0XHRcdHNlYXJjaDogZmFsc2VcclxuXHRcdH0sIHBhcmFtcykpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldCBOQU1FKCkge1xyXG5cdFx0cmV0dXJuIE5BTUU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0IE5BTUVfS0VZKCkge1xyXG5cdFx0cmV0dXJuIE5BTUVfS0VZO1xyXG5cdH1cclxuXHJcblx0YnVpbGQoaXNSZWJ1aWxkLCBlbG0gPSBudWxsKSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblx0XHRsZXQgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XHJcblxyXG5cdFx0aWYgKGVsbSkgZWxlbWVudCA9IGVsbTtcclxuXHJcblx0XHRpZiAoZWxlbWVudC5kYXRhc2V0Py5pbml0ZWQgPT09ICd0cnVlJyAmJiAhaXNSZWJ1aWxkKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH0gZWxzZSBpZiAoaXNSZWJ1aWxkKSB7XHJcblx0XHRcdF90aGlzLmRlc3Ryb3koZWxlbWVudCk7XHJcblx0XHR9XHJcblxyXG5cdFx0ZWxlbWVudC5wYXJlbnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuXHJcblx0XHRsZXQgb3B0aW9uX3NlbGVjdGVkID0gZWxlbWVudC5vcHRpb25zW2VsZW1lbnQuc2VsZWN0ZWRJbmRleF0uaW5uZXJUZXh0LFxyXG5cdFx0XHRvcHRpb25zID0gZWxlbWVudC5vcHRpb25zO1xyXG5cclxuXHRcdC8vINCh0L7Qt9C00LDQtdC8INC+0YHQvdC+0LLQvdC+0Lkg0Y3Qu9C10LzQtdC90YIg0YEg0LrQu9Cw0YHRgdCw0LzQuCDRgdC10LvQtdC60YLQsFxyXG5cdFx0bGV0IGNsYXNzZXMgPSBNYW5pcHVsYXRvci5nZXQoZWxlbWVudCwnY2xhc3MnKSxcclxuXHRcdFx0c2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG5cdFx0Y2xhc3NlcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcclxuXHJcblx0XHRmb3IgKGNvbnN0IF9jbGFzcyBvZiBjbGFzc2VzKSB7XHJcblx0XHRcdHNlbGVjdC5jbGFzc0xpc3QuYWRkKF9jbGFzcylcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoTWFuaXB1bGF0b3IuaGFzKGVsZW1lbnQsICdkaXNhYmxlZCcpKSBzZWxlY3QuY2xhc3NMaXN0LmFkZCgnZGlzYWJsZWQnKVxyXG5cclxuXHRcdGxldCBlbERhdGEgPSBNYW5pcHVsYXRvci5nZXQoZWxlbWVudCk7XHJcblx0XHRpZiAoIWlzRW1wdHlPYmooZWxEYXRhKSkge1xyXG5cdFx0XHRmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbERhdGEpKSB7XHJcblx0XHRcdFx0TWFuaXB1bGF0b3Iuc2V0KHNlbGVjdCwnZGF0YS0nICsga2V5LCBlbERhdGFba2V5XSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyDQodC+0LfQtNCw0LXQvCDRjdC70LXQvNC10L3RgiDRgSDQvtGC0L7QsdGA0LDQttC10L3QuNC10Lwg0LLRi9Cx0YDQsNC90L3QvtCz0L4g0LLQsNGA0LjQsNC90YLQsFxyXG5cdFx0bGV0IGN1cnJlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdGN1cnJlbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NVUlJFTlQpO1xyXG5cdFx0Y3VycmVudC5pbm5lclRleHQgPSBvcHRpb25fc2VsZWN0ZWQudHJpbSgpO1xyXG5cdFx0c2VsZWN0LmFwcGVuZChjdXJyZW50KTtcclxuXHJcblx0XHQvLyDQodC+0LfQtNCw0LXQvCDRjdC70LXQvNC10L3RgiDQstGL0L/QsNC00LDRjtGJ0LXQs9C+INGB0L/QuNGB0LrQsFxyXG5cdFx0bGV0IGRyb3Bkb3duID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHRkcm9wZG93bi5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRFJPUERPV04pO1xyXG5cdFx0c2VsZWN0LmFwcGVuZChkcm9wZG93bik7XHJcblxyXG5cdFx0Ly8g0KHQvtC30LTQsNC10Lwg0YHQv9C40YHQvtC6INC4INCy0LDRgNC40LDQvdGC0Ysg0YHQtdC70LXQutGC0LBcclxuXHRcdGxldCBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcclxuXHRcdGxpc3QuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0xJU1QpO1xyXG5cclxuXHRcdGxldCBvcHRHcm91cCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnb3B0Z3JvdXAnKTtcclxuXHJcblx0XHRpZiAob3B0R3JvdXAubGVuZ3RoKSB7XHJcblx0XHRcdGxldCBpc1NlbGVjdGVkID0gZmFsc2U7XHJcblx0XHRcdFsuLi5vcHRHcm91cF0uZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcclxuXHRcdFx0XHRsZXQgb2xPcHRHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29sJyk7XHJcblx0XHRcdFx0b2xPcHRHcm91cC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfT1BUR1JPVVApO1xyXG5cclxuXHRcdFx0XHRsZXQgbGlMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcblx0XHRcdFx0bGlMYWJlbC5pbm5lckhUTUwgPSBlbC5sYWJlbC50cmltKCk7XHJcblx0XHRcdFx0bGlMYWJlbC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfT1BUR1JPVVBfVElUTEUpXHJcblxyXG5cdFx0XHRcdG9sT3B0R3JvdXAucHJlcGVuZChsaUxhYmVsKVxyXG5cclxuXHRcdFx0XHRsZXQgb3B0R3JvdXBPcHRpb25zID0gZWwucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJyk7XHJcblxyXG5cdFx0XHRcdGNyZWF0ZUxpKG9wdEdyb3VwT3B0aW9ucywgb2xPcHRHcm91cCwgaXNTZWxlY3RlZCk7XHJcblxyXG5cdFx0XHRcdGxpc3QuYXBwZW5kKG9sT3B0R3JvdXApO1xyXG5cdFx0XHRcdGlzU2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGxldCBpc1NlbGVjdGVkID0gZmFsc2U7XHJcblx0XHRcdGNyZWF0ZUxpKG9wdGlvbnMsIGxpc3QsIGlzU2VsZWN0ZWQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGNyZWF0ZUxpKG9wdGlvbnMsIGxpc3QsIGlzU2VsZWN0ZWQpIHtcclxuXHRcdFx0bGV0IGkgPSAwO1xyXG5cdFx0XHRmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XHJcblx0XHRcdFx0bGV0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcclxuXHJcblx0XHRcdFx0bGkuaW5uZXJIVE1MID0gb3B0aW9uLmlubmVySFRNTC50cmltKCkucmVwbGFjZSgvPFxcL1tePl0rKD58JCkvZywgXCJcIilcclxuXHRcdFx0XHRsaS5kYXRhc2V0LnZhbHVlID0gTWFuaXB1bGF0b3IuZ2V0KG9wdGlvbiwgJ3ZhbHVlJyk7XHJcblx0XHRcdFx0bGkuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX09QVElPTik7XHJcblxyXG5cdFx0XHRcdGxldCBsaURhdGEgPSBNYW5pcHVsYXRvci5nZXQob3B0aW9uKTtcclxuXHRcdFx0XHRpZiAoIWlzRW1wdHlPYmoobGlEYXRhKSkge1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobGlEYXRhKSkge1xyXG5cdFx0XHRcdFx0XHRNYW5pcHVsYXRvci5zZXQobGksICdkYXRhLScgKyBrZXksIGxpRGF0YVtrZXldKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChpID09PSBlbGVtZW50LnNlbGVjdGVkSW5kZXggJiYgIWlzU2VsZWN0ZWQpIHtcclxuXHRcdFx0XHRcdGxpLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoTWFuaXB1bGF0b3IuaGFzKG9wdGlvbiwgJ2Rpc2FibGVkJykpIGxpLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XHJcblx0XHRcdFx0aWYgKE1hbmlwdWxhdG9yLmhhcyhvcHRpb24sICdoaWRkZW4nKSkgbGkuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XHJcblxyXG5cdFx0XHRcdGxpc3QuYXBwZW5kKGxpKTtcclxuXHJcblx0XHRcdFx0aSsrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0ZHJvcGRvd24uYXBwZW5kKGxpc3QpO1xyXG5cclxuXHRcdC8vINCU0L7QsdCw0LLQu9GP0LXQvCDQstGB0LUg0YHQvtC30LTQsNC90L3Ri9C5INC60L7QvdGC0LXQudC90LXRgCDQv9C+0YHQu9C1INGB0LXQu9C10LrRgtCwXHJcblx0XHRlbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBzZWxlY3QpO1xyXG5cclxuXHRcdC8vINC/0L7QvNC10YfQsNC10Lwg0Y3Qu9C10LzQtdC90YIg0LjQvdC40YbQuNCw0LvQuNC30LjRgNC+0LLQsNC90L3Ri9C8XHJcblx0XHRlbGVtZW50LmRhdGFzZXQuaW5pdGVkID0gJ3RydWUnO1xyXG5cclxuXHRcdGlmIChfdGhpcy5fcGFyYW1zLnNlYXJjaCkge1xyXG5cdFx0XHR0aGlzLnNlYXJjaChzZWxlY3QpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKHNlbGVjdCk7XHJcblx0fVxyXG5cclxuXHRkZXN0cm95KHNlbGVjdCkge1xyXG5cdFx0bGV0IGVsZW1lbnQgPSBzZWxlY3QubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG5cclxuXHRcdGlmIChlbGVtZW50KSB7XHJcblx0XHRcdGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0NPTlRBSU5FUikpIHtcclxuXHRcdFx0XHRlbGVtZW50LnJlbW92ZSgpO1xyXG5cclxuXHRcdFx0XHRzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IDA7XHJcblx0XHRcdFx0Wy4uLnNlbGVjdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb24nKV0uZm9yRWFjaChmdW5jdGlvbiAoZWwsIGluZGV4KSB7XHJcblx0XHRcdFx0XHRpZiAoZWwuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpKSB7XHJcblx0XHRcdFx0XHRcdHNlbGVjdC5zZWxlY3RlZEluZGV4ID0gaW5kZXg7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJlZnJlc2goc2VsZWN0KSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0bGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xyXG5cdFx0XHRjbGVhclRpbWVvdXQob2JzZXJ2ZXJUaW1vdXQpO1xyXG5cdFx0XHRvYnNlcnZlclRpbW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRcdF90aGlzLmJ1aWxkKHRydWUsIHNlbGVjdCk7XHJcblx0XHRcdH0sIDEwMCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRvYnNlcnZlci5vYnNlcnZlKHNlbGVjdCwge1xyXG5cdFx0XHRhdHRyaWJ1dGVGaWx0ZXI6IFsnZGlzYWJsZWQnLCAncmVxdWlyZWQnLCAnc3R5bGUnLCAnaGlkZGVuJ10sXHJcblx0XHRcdGNoaWxkTGlzdDogdHJ1ZSxcclxuXHRcdFx0c3VidHJlZTogdHJ1ZSxcclxuXHRcdFx0Y2hhcmFjdGVyRGF0YU9sZFZhbHVlOiB0cnVlLFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRzZWFyY2goc2VsZWN0KSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0bGV0IGRyb3Bkb3duID0gc2VsZWN0LnF1ZXJ5U2VsZWN0b3IoJy4nICsgQ0xBU1NfTkFNRV9EUk9QRE9XTik7XHJcblxyXG5cdFx0bGV0IHNlYXJjaF9jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdHNlYXJjaF9jb250YWluZXIuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NFQVJDSCk7XHJcblxyXG5cdFx0bGV0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuXHRcdGlucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsICd2Zy1zZWxlY3Qtc2VhcmNoJyk7XHJcblx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dCcpO1xyXG5cdFx0aW5wdXQuc2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicsICfQn9C+0LjRgdC6Li4uJyk7XHJcblxyXG5cdFx0c2VhcmNoX2NvbnRhaW5lci5hcHBlbmQoaW5wdXQpO1xyXG5cdFx0ZHJvcGRvd24ucHJlcGVuZChzZWFyY2hfY29udGFpbmVyKTtcclxuXHJcblx0XHRzZWFyY2hfY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPXZnLXNlbGVjdC1zZWFyY2hdJykuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZSkgPT4ge1xyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRsZXQgZWwgPSBlLnRhcmdldDtcclxuXHJcblx0XHRcdGxldCBzZWxlY3RMaXN0ID0gZWw/LmNsb3Nlc3QoJy4nICsgQ0xBU1NfTkFNRV9EUk9QRE9XTikucXVlcnlTZWxlY3RvcignLicgKyBDTEFTU19OQU1FX0xJU1QpO1xyXG5cdFx0XHRpZiAoc2VsZWN0TGlzdCkge1xyXG5cdFx0XHRcdGxldCBvcHRpb25zID0gWy4uLnNlbGVjdExpc3QucXVlcnlTZWxlY3RvckFsbCgnLicgKyBDTEFTU19OQU1FX09QVElPTildLFxyXG5cdFx0XHRcdFx0b3B0aW9uc0dyb3VwID0gWy4uLnNlbGVjdExpc3QucXVlcnlTZWxlY3RvckFsbCgnLicgKyBDTEFTU19OQU1FX09QVEdST1VQKV0sXHJcblx0XHRcdFx0XHR2YWx1ZSA9IGVsPy52YWx1ZTtcclxuXHJcblx0XHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY29uY2F0KG9wdGlvbnNHcm91cCk7XHJcblxyXG5cdFx0XHRcdGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcclxuXHRcdFx0XHRcdE1hbmlwdWxhdG9yLnNob3cob3B0aW9uKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICh2YWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdHZhbHVlID0gdmFsdWUudHJpbSgpO1xyXG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdFx0dmFsdWUgPSB0cmFuc2xpdGVyYXRlKHZhbHVlLCB0cnVlKTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XHJcblx0XHRcdFx0XHRcdGxldCB0ZXh0ID0gb3B0aW9uLmlubmVyVGV4dC50b0xvd2VyQ2FzZSgpO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKHRleHQuaW5kZXhPZih2YWx1ZSkgPT09IC0xKSBNYW5pcHVsYXRvci5oaWRlKG9wdGlvbik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGRpc3Bvc2UoKSB7XHJcblx0XHRzdXBlci5kaXNwb3NlKCk7XHJcblx0fVxyXG5cclxuXHRfYWRkRXZlbnRMaXN0ZW5lcnMoc2VsZWN0KSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cdFx0c2VsZWN0LnF1ZXJ5U2VsZWN0b3IoJy4nICsgQ0xBU1NfTkFNRV9DVVJSRU5UKS5vbmNsaWNrID0gZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0bGV0IGVsID0gZS50YXJnZXQsXHJcblx0XHRcdFx0Y29udGFpbmVyID0gZWwuY2xvc2VzdCgnLicgKyBDTEFTU19OQU1FX0NPTlRBSU5FUik7XHJcblxyXG5cdFx0XHRsZXQgc2VsZWN0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgQ0xBU1NfTkFNRV9DT05UQUlORVIpO1xyXG5cdFx0XHRpZiAoc2VsZWN0cy5sZW5ndGgpIHtcclxuXHRcdFx0XHRmb3IgKGNvbnN0IGVscyBvZiBzZWxlY3RzKSB7XHJcblx0XHRcdFx0XHRpZiAoZWxzICE9PSBjb250YWluZXIpIHtcclxuXHRcdFx0XHRcdFx0ZWxzPy5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSB7XHJcblx0XHRcdFx0Y29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xyXG5cclxuXHRcdFx0XHRpZiAoX3RoaXMuX3BhcmFtcy5zZWFyY2gpIHtcclxuXHRcdFx0XHRcdGxldCBpbnB1dCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xyXG5cdFx0XHRcdFx0aWYgKGlucHV0KSBpbnB1dC5mb2N1cygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHNlbGVjdC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIENMQVNTX05BTUVfT1BUSU9OKS5mb3JFYWNoKChvcHRpb24pID0+IHtcclxuXHRcdFx0b3B0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRcdGxldCBlbCA9IGUudGFyZ2V0O1xyXG5cclxuXHRcdFx0XHRpZiAoIWVsLmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xyXG5cdFx0XHRcdFx0bGV0IGNvbnRhaW5lciA9IGVsLmNsb3Nlc3QoJy4nICsgQ0xBU1NfTkFNRV9DT05UQUlORVIpLFxyXG5cdFx0XHRcdFx0XHRvcHRpb25zID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgQ0xBU1NfTkFNRV9PUFRJT04pO1xyXG5cclxuXHRcdFx0XHRcdGlmIChvcHRpb25zLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XHJcblx0XHRcdFx0XHRcdFx0b3B0aW9uLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRlbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xyXG5cclxuXHRcdFx0XHRcdGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuJyArIENMQVNTX05BTUVfQ1VSUkVOVCkuaW5uZXJUZXh0ID0gZWwuaW5uZXJUZXh0O1xyXG5cdFx0XHRcdFx0Y29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcclxuXHJcblx0XHRcdFx0XHRsZXQgc2VsZWN0ID0gY29udGFpbmVyLnByZXZpb3VzU2libGluZztcclxuXHRcdFx0XHRcdHNlbGVjdC52YWx1ZSA9IGVsLmRhdGFzZXQudmFsdWU7XHJcblx0XHRcdFx0XHRFdmVudEhhbmRsZXIudHJpZ2dlcihzZWxlY3QsIEVWRU5UX0tFWV9DSEFOR0UpXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdGlmICghZT8udGFyZ2V0LmNsb3Nlc3QoJy4nICsgQ0xBU1NfTkFNRV9DT05UQUlORVIpKSB7XHJcblx0XHRcdFx0bGV0IHNlbGVjdHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIENMQVNTX05BTUVfQ09OVEFJTkVSKTtcclxuXHRcdFx0XHRpZiAoc2VsZWN0cy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdGZvciAoY29uc3QgZWwgb2Ygc2VsZWN0cykge1xyXG5cdFx0XHRcdFx0XHRlbD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Wy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Zvcm0nKV0uZm9yRWFjaChmdW5jdGlvbiAoZm9ybSkge1xyXG5cdFx0XHRmb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldFwiLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0Zm9ybS5xdWVyeVNlbGVjdG9yQWxsKCdzZWxlY3Qudmctc2VsZWN0JykuZm9yRWFjaChmdW5jdGlvbiAoc2VsZWN0KSB7XHJcblx0XHRcdFx0XHRWR1NlbGVjdC5pbml0KHNlbGVjdCwge30sIHRydWUpXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqINCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPXHJcblx0ICogQHBhcmFtIGVsZW1lbnRcclxuXHQgKiBAcGFyYW0gcGFyYW1zXHJcblx0ICogQHBhcmFtIGlzUmVidWlsZFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBpbml0KGVsZW1lbnQsIHBhcmFtcyA9IHt9LCBpc1JlYnVpbGQgPSBmYWxzZSkge1xyXG5cdFx0Y29uc3QgaW5zdGFuY2UgPSBWR1NlbGVjdC5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHBhcmFtcyk7XHJcblx0XHRpbnN0YW5jZS5idWlsZChpc1JlYnVpbGQpO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVkdTZWxlY3Q7IiwiaW1wb3J0IEJhc2VNb2R1bGUgZnJvbSBcIi4uLy4uL2Jhc2UtbW9kdWxlXCI7XHJcbmltcG9ydCB7aXNEaXNhYmxlZCwgaXNWaXNpYmxlLCBtZXJnZURlZXBPYmplY3R9IGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9mdW5jdGlvbnNcIjtcclxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvZG9tL2V2ZW50XCI7XHJcbmltcG9ydCB7ZGlzbWlzc1RyaWdnZXJ9IGZyb20gXCIuLi8uLi9tb2R1bGUtZm5cIjtcclxuaW1wb3J0IFNlbGVjdG9ycyBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvanMvZG9tL3NlbGVjdG9yc1wiO1xyXG5pbXBvcnQgQmFja2Ryb3AgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2pzL2NvbXBvbmVudHMvYmFja2Ryb3BcIjtcclxuaW1wb3J0IE92ZXJmbG93IGZyb20gXCIuLi8uLi8uLi91dGlscy9qcy9jb21wb25lbnRzL292ZXJmbG93XCI7XHJcblxyXG4vKipcclxuICogQ29uc3RhbnRzXHJcbiAqL1xyXG5jb25zdCBOQU1FID0gJ3NpZGViYXInO1xyXG5jb25zdCBOQU1FX0tFWSA9ICd2Zy5zaWRlYmFyJztcclxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEU9ICdbZGF0YS12Zy10b2dnbGU9XCJzaWRlYmFyXCJdJztcclxuXHJcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93JztcclxuY29uc3QgQ0xBU1NfTkFNRV9PUEVOID0gJ3ZnLXNpZGViYXItb3Blbic7XHJcblxyXG5jb25zdCBFVkVOVF9LRVlfSElERSAgID0gYCR7TkFNRV9LRVl9LmhpZGVgO1xyXG5jb25zdCBFVkVOVF9LRVlfSElEREVOID0gYCR7TkFNRV9LRVl9LmhpZGRlbmA7XHJcbmNvbnN0IEVWRU5UX0tFWV9TSE9XICAgPSBgJHtOQU1FX0tFWX0uc2hvd2A7XHJcbmNvbnN0IEVWRU5UX0tFWV9TSE9XTiAgPSBgJHtOQU1FX0tFWX0uc2hvd25gO1xyXG5cclxuY29uc3QgRVZFTlRfS0VZX0tFWURPV05fRElTTUlTUyA9IGBrZXlkb3duLmRpc21pc3MuJHtOQU1FX0tFWX1gO1xyXG5jb25zdCBFVkVOVF9LRVlfSElERV9QUkVWRU5URUQgPSBgaGlkZVByZXZlbnRlZC4ke05BTUVfS0VZfWA7XHJcbmNvbnN0IEVWRU5UX0tFWV9DTElDS19EQVRBX0FQSSA9IGBjbGljay4ke05BTUVfS0VZfS5kYXRhLmFwaWA7XHJcblxyXG5jbGFzcyBWR1NpZGViYXIgZXh0ZW5kcyBCYXNlTW9kdWxlIHtcclxuXHRjb25zdHJ1Y3RvcihlbGVtZW50LCBwYXJhbXMgPSB7fSkge1xyXG5cdFx0c3VwZXIoZWxlbWVudCwgcGFyYW1zKTtcclxuXHJcblx0XHR0aGlzLl9wYXJhbXMgPSB0aGlzLl9nZXRQYXJhbXMoZWxlbWVudCwgbWVyZ2VEZWVwT2JqZWN0KHtcclxuXHRcdFx0YmFja2Ryb3A6IHRydWUsXHJcblx0XHRcdG92ZXJmbG93OiB0cnVlLFxyXG5cdFx0XHRrZXlib2FyZDogdHJ1ZSxcclxuXHRcdFx0YW5pbWF0aW9uOiB7XHJcblx0XHRcdFx0ZW5hYmxlOiBmYWxzZSxcclxuXHRcdFx0XHRpbjogJ2FuaW1hdGVfX3JvbGxJbicsXHJcblx0XHRcdFx0b3V0OiAnYW5pbWF0ZV9fcm9sbE91dCcsXHJcblx0XHRcdFx0ZGVsYXk6IDgwMCxcclxuXHRcdFx0fSxcclxuXHRcdFx0YWpheDoge1xyXG5cdFx0XHRcdHJvdXRlOiAnJyxcclxuXHRcdFx0XHR0YXJnZXQ6ICcnLFxyXG5cdFx0XHRcdG1ldGhvZDogJ2dldCdcclxuXHRcdFx0fVxyXG5cdFx0fSwgcGFyYW1zKSk7XHJcblxyXG5cdFx0dGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcclxuXHRcdHRoaXMuX2Rpc21pc3NFbGVtZW50KCk7XHJcblxyXG5cdFx0dGhpcy5fcGFyYW1zLmFuaW1hdGlvbi5kZWxheSA9ICF0aGlzLl9wYXJhbXMuYW5pbWF0aW9uLmVuYWJsZSA/IDAgOiB0aGlzLl9wYXJhbXMuYW5pbWF0aW9uLmRlbGF5O1xyXG5cdFx0dGhpcy5fYW5pbWF0aW9uKHRoaXMuX2VsZW1lbnQsIFZHU2lkZWJhci5OQU1FX0tFWSwgdGhpcy5fcGFyYW1zLmFuaW1hdGlvbik7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0IE5BTUUoKSB7XHJcblx0XHRyZXR1cm4gTkFNRTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXQgTkFNRV9LRVkoKSB7XHJcblx0XHRyZXR1cm4gTkFNRV9LRVlcclxuXHR9XHJcblxyXG5cdHRvZ2dsZShyZWxhdGVkVGFyZ2V0KSB7XHJcblx0XHRyZXR1cm4gIXRoaXMuX2lzU2hvd24oKSA/IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KSA6IHRoaXMuaGlkZSgpO1xyXG5cdH1cclxuXHJcblx0c2hvdyhyZWxhdGVkVGFyZ2V0KSB7XHJcblx0XHRjb25zdCBfdGhpcyA9IHRoaXM7XHJcblx0XHRpZiAoaXNEaXNhYmxlZChfdGhpcy5fZWxlbWVudCkpIHJldHVybjtcclxuXHJcblx0XHRfdGhpcy5fcGFyYW1zID0gX3RoaXMuX2dldFBhcmFtcyhyZWxhdGVkVGFyZ2V0LCBfdGhpcy5fcGFyYW1zKTtcclxuXHRcdF90aGlzLl9yb3V0ZSgpO1xyXG5cclxuXHRcdGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKF90aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlfU0hPVywgeyByZWxhdGVkVGFyZ2V0IH0pXHJcblx0XHRpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcclxuXHJcblx0XHRpZiAoX3RoaXMuX3BhcmFtcy5iYWNrZHJvcCkge1xyXG5cdFx0XHRCYWNrZHJvcC5zaG93KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKF90aGlzLl9wYXJhbXMub3ZlcmZsb3cpIHtcclxuXHRcdFx0T3ZlcmZsb3cuYXBwZW5kKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0X3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpO1xyXG5cdFx0ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfT1BFTik7XHJcblxyXG5cdFx0Y29uc3QgY29tcGxldGVDYWxsQmFjayA9ICgpID0+IHtcclxuXHRcdFx0RXZlbnRIYW5kbGVyLm9uKFNlbGVjdG9ycy5maW5kKCcudmctYmFja2Ryb3AnKSwgJ21vdXNlZG93bi52Zy5iYWNrZHJvcCcsIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRfdGhpcy5oaWRlKCk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0RXZlbnRIYW5kbGVyLnRyaWdnZXIoX3RoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWV9TSE9XTiwgeyByZWxhdGVkVGFyZ2V0IH0pO1xyXG5cdFx0fVxyXG5cdFx0X3RoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsQmFjaywgX3RoaXMuX2VsZW1lbnQsIHRydWUsIDUwKVxyXG5cdH1cclxuXHJcblx0aGlkZSgpIHtcclxuXHRcdGNvbnN0IF90aGlzID0gdGhpcztcclxuXHRcdGlmIChpc0Rpc2FibGVkKF90aGlzLl9lbGVtZW50KSkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWV9ISURFKTtcclxuXHRcdGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xyXG5cclxuXHRcdGlmIChfdGhpcy5fcGFyYW1zLmJhY2tkcm9wKSB7XHJcblx0XHRcdEJhY2tkcm9wLmhpZGUoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdGlmIChfdGhpcy5fcGFyYW1zLm92ZXJmbG93KSB7XHJcblx0XHRcdFx0XHRPdmVyZmxvdy5kZXN0cm95KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoX3RoaXMuX3BhcmFtcy5vdmVyZmxvdykge1xyXG5cdFx0XHRPdmVyZmxvdy5kZXN0cm95KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdF90aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGZhbHNlKTtcclxuXHRcdFx0X3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xyXG5cclxuXHRcdFx0Y29uc3QgY29tcGxldGVDYWxsYmFjayA9ICgpID0+IHtcclxuXHRcdFx0XHRkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9PUEVOKTtcclxuXHRcdFx0XHRFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlfSElEREVOKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbGJhY2ssIHRoaXMuX2VsZW1lbnQsIHRydWUpO1xyXG5cdFx0fSwgdGhpcy5fcGFyYW1zLmFuaW1hdGlvbi5kZWxheSk7XHJcblx0fVxyXG5cclxuXHRkaXNwb3NlKCkge1xyXG5cdFx0c3VwZXIuZGlzcG9zZSgpO1xyXG5cdH1cclxuXHJcblx0X2lzU2hvd24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKTtcclxuXHR9XHJcblxyXG5cdF9hZGRFdmVudExpc3RlbmVycygpIHtcclxuXHRcdEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZX0tFWURPV05fRElTTUlTUywgZXZlbnQgPT4ge1xyXG5cdFx0XHRpZiAoZXZlbnQua2V5ICE9PSAnRXNjYXBlJykgcmV0dXJuO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuX3BhcmFtcy5rZXlib2FyZCkge1xyXG5cdFx0XHRcdHRoaXMuaGlkZSgpO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0RXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZX0hJREVfUFJFVkVOVEVEKVxyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5kaXNtaXNzVHJpZ2dlcihWR1NpZGViYXIpO1xyXG5cclxuLyoqXHJcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXHJcbiAqL1xyXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWV9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xyXG5cdGNvbnN0IHRhcmdldCA9IFNlbGVjdG9ycy5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpO1xyXG5cclxuXHRpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XHJcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcblx0fVxyXG5cclxuXHRpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xyXG5cdFx0cmV0dXJuXHJcblx0fVxyXG5cclxuXHR0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xyXG5cdEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9LRVlfSElEREVOLCAoKSA9PiB7XHJcblx0XHQvL2lmIChpc1Zpc2libGUodGhpcykpIHRoaXMuZm9jdXMoKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xyXG5cdH0pXHJcblxyXG5cdGNvbnN0IGFscmVhZHlPcGVuID0gU2VsZWN0b3JzLmZpbmQoJy52Zy1zaWRlYmFyLnNob3cnKVxyXG5cdGlmIChhbHJlYWR5T3BlbiAmJiBhbHJlYWR5T3BlbiAhPT0gdGFyZ2V0KSB7XHJcblx0XHRWR1NpZGViYXIuZ2V0SW5zdGFuY2UoYWxyZWFkeU9wZW4pLmhpZGUoKVxyXG5cdH1cclxuXHJcblx0Y29uc3QgZGF0YSA9IFZHU2lkZWJhci5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldClcclxuXHRkYXRhLnRvZ2dsZSh0aGlzKTtcclxufSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBWR1NpZGViYXI7XHJcbiIsImltcG9ydCB7aXNFbGVtZW50LCBtZXJnZURlZXBPYmplY3R9IGZyb20gXCIuLi9mdW5jdGlvbnNcIjtcclxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tIFwiLi4vZG9tL2V2ZW50XCI7XHJcblxyXG4vKipcclxuICog0JrQu9Cw0YHRgdGLINC00LvRjyDQsNC90LjQvNCw0YbQuNC5INGB0LzQvtGC0YDQuNC8INC30LTQtdGB0YxcclxuICogaHR0cHM6Ly9hbmltYXRlLnN0eWxlL1xyXG4gKlxyXG4gKiDQoNCw0LHQvtGC0LDQtdGCINGBINC80L7QtNGD0LvRj9C80Lgg0YMg0LrQvtGC0L7RgNGL0YUg0LXRgdGC0Ywg0YHQvtCx0YvRgtC40Y8gc2hvdywgaGlkZSwgaGlkZGVuXHJcbiAqL1xyXG5jbGFzcyBBbmltYXRpb24ge1xyXG5cdGNvbnN0cnVjdG9yKGVsZW1lbnQsIGtleSwgcGFyYW1zID0ge30pIHtcclxuXHRcdHRoaXMuX3BhcmFtcyA9IG1lcmdlRGVlcE9iamVjdCh7XHJcblx0XHRcdGVuYWJsZTogZmFsc2UsXHJcblx0XHRcdGluOiAnYW5pbWF0ZV9fYmFja0luVXAnLFxyXG5cdFx0XHRvdXQ6ICdhbmltYXRlX19iYWNrT3V0VXAnLFxyXG5cdFx0XHRkZWxheTogMCxcclxuXHRcdH0sIHBhcmFtcyk7XHJcblxyXG5cdFx0dGhpcy5jbGFzc2VzID0ge1xyXG5cdFx0XHRhbmltYXRlZDogJ2FuaW1hdGVfX2FuaW1hdGVkJ1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghdGhpcy5fcGFyYW1zLmVuYWJsZSkgcmV0dXJuO1xyXG5cdFx0aWYgKCFpc0VsZW1lbnQoZWxlbWVudCkpIHJldHVybjtcclxuXHJcblx0XHR0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcclxuXHRcdHRoaXMuX25hbWVfa2V5ID0ga2V5O1xyXG5cclxuXHRcdGlmICghdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnModGhpcy5jbGFzc2VzLmFuaW1hdGVkKSkge1xyXG5cdFx0XHR0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5jbGFzc2VzLmFuaW1hdGVkKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl90cmlnZ2VycygpO1xyXG5cdH1cclxuXHJcblx0X3RyaWdnZXJzKCkge1xyXG5cdFx0RXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIHRoaXMuX25hbWVfa2V5ICsgJy5zaG93JywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fcGFyYW1zLm91dCk7XHJcblx0XHRcdHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLl9wYXJhbXMuaW4pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0RXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIHRoaXMuX25hbWVfa2V5ICsgJy5oaWRlJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fcGFyYW1zLmluKTtcclxuXHRcdFx0dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuX3BhcmFtcy5vdXQpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0RXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIHRoaXMuX25hbWVfa2V5ICsgJy5oaWRkZW4nLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9wYXJhbXMub3V0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQW5pbWF0aW9uOyIsImltcG9ydCB7ZXhlY3V0ZX0gZnJvbSBcIi4uL2Z1bmN0aW9uc1wiO1xyXG5pbXBvcnQgU2VsZWN0b3JzIGZyb20gXCIuLi9kb20vc2VsZWN0b3JzXCI7XHJcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSBcIi4uL2RvbS9ldmVudFwiO1xyXG5pbXBvcnQgT3ZlcmZsb3cgZnJvbSBcIi4vb3ZlcmZsb3dcIjtcclxuXHJcbmNvbnN0IE5BTUUgPSAnYmFja2Ryb3AnO1xyXG5jb25zdCBDTEFTU19OQU1FID0gJ3ZnLWJhY2tkcm9wJztcclxuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnO1xyXG5jb25zdCBFVkVOVF9NT1VTRURPV04gPSBgbW91c2Vkb3duLnZnLiR7TkFNRX1gO1xyXG5cclxubGV0IGJhY2tkcm9wX2RlbGF5ID0gNTAwO1xyXG5cclxuY2xhc3MgQmFja2Ryb3Age1xyXG5cdHN0YXRpYyBzaG93KGNhbGxiYWNrKSB7XHJcblx0XHRCYWNrZHJvcC5fYXBwZW5kKClcclxuXHRcdGV4ZWN1dGUoY2FsbGJhY2spO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGhpZGUoY2FsbGJhY2spIHtcclxuXHRcdEJhY2tkcm9wLl9kZXN0cm95KCk7XHJcblx0XHRleGVjdXRlKGNhbGxiYWNrKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBfYXBwZW5kKCkge1xyXG5cdFx0aWYgKFNlbGVjdG9ycy5maW5kKCcuJyArIENMQVNTX05BTUUpKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgYmFja2Ryb3AgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdGJhY2tkcm9wLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRSk7XHJcblxyXG5cdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmQoYmFja2Ryb3ApO1xyXG5cclxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRiYWNrZHJvcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSlcclxuXHRcdH0sIDUwKTtcclxuXHJcblx0XHRFdmVudEhhbmRsZXIub24oYmFja2Ryb3AsIEVWRU5UX01PVVNFRE9XTiwgKCkgPT4ge1xyXG5cdFx0XHRCYWNrZHJvcC5oaWRlKClcclxuXHRcdFx0T3ZlcmZsb3cuZGVzdHJveSgpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgX2Rlc3Ryb3koKSB7XHJcblx0XHRsZXQgZWxlbWVudCA9IFNlbGVjdG9ycy5maW5kKCcuJyArIENMQVNTX05BTUUpO1xyXG5cdFx0aWYgKCFlbGVtZW50KSByZXR1cm47XHJcblxyXG5cdFx0ZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfRkFERSk7XHJcblxyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdGVsZW1lbnQucmVtb3ZlKCk7XHJcblx0XHR9LCBiYWNrZHJvcF9kZWxheSk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCYWNrZHJvcDsiLCJpbXBvcnQge01hbmlwdWxhdG9yfSBmcm9tIFwiLi4vZG9tL21hbmlwdWxhdG9yXCI7XHJcblxyXG4vKipcclxuICog0JrQu9Cw0YHRgSBPdmVyZmxvd1xyXG4gKiDQl9Cw0L/RgNC10YnQsNC10YIg0YHQutGA0L7Qu9C70LjQvdCzINC4INGD0LHQuNGA0LDQtdGCINC10LPQviwg0LrQvtC80L/QtdC90YHQuNGA0YPRjyDQvtGC0YHRgtGD0L/QvtC8XHJcbiAqL1xyXG5cclxuY2xhc3MgT3ZlcmZsb3cge1xyXG5cdHN0YXRpYyBhcHBlbmQoKSB7XHJcblx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IGdldFdpZHRoKCkgKyAncHgnO1xyXG5cdFx0ZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGdldFdpZHRoKCkge1xyXG5cdFx0XHRjb25zdCBkb2N1bWVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoXHJcblx0XHRcdHJldHVybiBNYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50V2lkdGgpXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZGVzdHJveSgpIHtcclxuXHRcdGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcclxuXHRcdGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJyc7XHJcblxyXG5cdFx0bGV0IHN0eWxlcyA9IE1hbmlwdWxhdG9yLmdldChkb2N1bWVudC5ib2R5LCAnc3R5bGUnKTtcclxuXHRcdGlmICghc3R5bGVzKSBNYW5pcHVsYXRvci5yZW1vdmUoZG9jdW1lbnQuYm9keSwgJ3N0eWxlJyk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBPdmVyZmxvdzsiLCJpbXBvcnQge2lzRWxlbWVudCwgbWVyZ2VEZWVwT2JqZWN0LCBub3JtYWxpemVEYXRhfSBmcm9tIFwiLi4vZnVuY3Rpb25zXCI7XHJcbmltcG9ydCB7TWFuaXB1bGF0b3J9IGZyb20gXCIuLi9kb20vbWFuaXB1bGF0b3JcIjtcclxuXHJcbmNsYXNzIFBhcmFtcyB7XHJcblx0Y29uc3RydWN0b3IocGFyYW1zLCBlbGVtZW50ID0gbnVsbCkge1xyXG5cdFx0dGhpcy5fcGFyYW1zID0gdGhpcy5tZXJnZShwYXJhbXMsIGVsZW1lbnQpO1xyXG5cdH1cclxuXHJcblx0Z2V0KCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3BhcmFtcztcclxuXHR9XHJcblxyXG5cdGZyb21FbGVtZW50KGVsZW1lbnQpIHtcclxuXHRcdHJldHVybiBpc0VsZW1lbnQoZWxlbWVudCkgPyBNYW5pcHVsYXRvci5nZXQoZWxlbWVudCkgOiB7fTtcclxuXHR9XHJcblxyXG5cdG1lcmdlKHBhcmFtcywgZWxlbWVudCkge1xyXG5cdFx0bGV0IG1QYXJhbXMgPSBtZXJnZURlZXBPYmplY3QocGFyYW1zLCB0aGlzLmZyb21FbGVtZW50KGVsZW1lbnQpKTtcclxuXHJcblx0XHRmb3IgKGxldCBrZXkgaW4gbVBhcmFtcykge1xyXG5cdFx0XHRpZiAoa2V5LmluZGV4T2YoJy0nKSAhPT0gLTEpIHtcclxuXHRcdFx0XHRsZXQga2V5cyA9IGtleS5zcGxpdCgnLScpLFxyXG5cdFx0XHRcdFx0dmFsdWUgPSBub3JtYWxpemVEYXRhKG1QYXJhbXNba2V5XSk7XHJcblxyXG5cdFx0XHRcdGlmIChrZXlzWzBdIGluIG1QYXJhbXMpIHtcclxuXHRcdFx0XHRcdGlmIChrZXlzWzFdIGluIG1QYXJhbXNba2V5c1swXV0pIHtcclxuXHRcdFx0XHRcdFx0bVBhcmFtc1trZXlzWzBdXVtrZXlzWzFdXSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZGVsZXRlIG1QYXJhbXNba2V5XTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICgncGFyYW1zJyBpbiBtUGFyYW1zKSB7XHJcblx0XHRcdG1QYXJhbXMgPSBtZXJnZURlZXBPYmplY3QobVBhcmFtcywgbVBhcmFtcy5wYXJhbXMpO1xyXG5cdFx0XHRkZWxldGUgbVBhcmFtcy5wYXJhbXM7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG1QYXJhbXM7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQYXJhbXM7IiwiaW1wb3J0IHttZXJnZURlZXBPYmplY3QsIG5vcm1hbGl6ZURhdGF9IGZyb20gXCIuLi9mdW5jdGlvbnNcIjtcclxuXHJcbi8qKlxyXG4gKiDQmtC70LDRgdGBIFBsYWNlbWVudCwg0L7Qv9GA0LXQtNC10LvRj9C10YIg0Lgg0YPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0LzQtdGB0YLQvtC/0L7Qu9C+0LbQtdC90LjQtSDRjdC70LXQvNC10L3RgtCwINC90LAg0YHRgtGA0LDQvdC40YbQtS5cclxuICogVE9ETyDQutC70LDRgdGBINC90LUg0LTQvtC/0LjRgdCw0L1cclxuICovXHJcblxyXG5jbGFzcyBQbGFjZW1lbnQge1xyXG5cdGNvbnN0cnVjdG9yKGFyZyA9IHt9KSB7XHJcblx0XHR0aGlzLnBhcmFtcyA9IG1lcmdlRGVlcE9iamVjdCh7XHJcblx0XHRcdGVsZW1lbnQ6IG51bGwsXHJcblx0XHRcdGRyb3A6IG51bGxcclxuXHRcdH0sIGFyZyk7XHJcblx0fVxyXG5cclxuXHRfZ2V0UGxhY2VtZW50KCkge1xyXG5cdFx0Y29uc3QgX3RoaXMgPSB0aGlzO1xyXG5cdFx0Y29uc3QgX3BhcmVudCA9IChzZWxmKSA9PiB7XHJcblx0XHRcdGxldCBwYXJlbnQgPSBzZWxmLnBhcmVudE5vZGUsXHJcblx0XHRcdFx0b3ZlcmZsb3cgPSBnZXRDb21wdXRlZFN0eWxlKHBhcmVudCkub3ZlcmZsb3c7XHJcblxyXG5cdFx0XHRpZiAocGFyZW50LnRhZ05hbWUgIT09ICdCT0RZJykge1xyXG5cdFx0XHRcdGlmIChvdmVyZmxvdyA9PT0gJ3Zpc2libGUnKSB7XHJcblx0XHRcdFx0XHRfcGFyZW50KHBhcmVudClcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHBhcmVudDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgaXNGaXhlZCA9IGZhbHNlLCB0b3AsIGxlZnQsXHJcblx0XHRcdGJvdW5kcyA9IF90aGlzLnBhcmFtcy5kcm9wLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxyXG5cdFx0XHRwYXJlbnQgPSBfdGhpcy5wYXJhbXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcblx0XHRpZiAoX3BhcmVudChfdGhpcy5wYXJhbXMuZWxlbWVudCkpIHtcclxuXHRcdFx0aXNGaXhlZCA9IHRydWU7XHJcblx0XHRcdHRvcCA9IGJvdW5kcy50b3A7XHJcblx0XHRcdGxlZnQgPSBib3VuZHMubGVmdDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGxldCBzdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKF90aGlzLnBhcmFtcy5kcm9wKTtcclxuXHRcdFx0dG9wID0gbm9ybWFsaXplRGF0YShzdHlsZXMudG9wLnNsaWNlKDAsIC0yKSk7XHJcblx0XHRcdGxlZnQgPSBub3JtYWxpemVEYXRhKHN0eWxlcy5sZWZ0LnNsaWNlKDAsIC0yKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKChib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCkgPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xyXG5cdFx0XHRsZWZ0ID0gcGFyZW50LndpZHRoIC0gYm91bmRzLndpZHRoO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGlzRml4ZWQ6IGlzRml4ZWQsXHJcblx0XHRcdHRvcDogdG9wLFxyXG5cdFx0XHRsZWZ0OiBsZWZ0XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQbGFjZW1lbnQ7IiwiLyoqXHJcbiAqINCa0LvQsNGB0YEgUmVzcG9uc2l2ZSwg0YDQsNCx0L7RgtCw0LXRgiDQv9C+INGC0LDQutC40Lwg0LbQtSDQvNC10LTQuNCwINGC0L7Rh9C60LDQvCwg0YfRgtC+INC4IGJvb3RzdHJhcFxyXG4gKiDQuCDQvtC/0YDQtdC00LXQu9GP0LXRgiDQvdCwINGC0LDRhyDRg9GB0YLRgNC+0LnRgdGC0LLQsC5cclxuICovXHJcblxyXG5jbGFzcyBSZXNwb25zaXZlIHtcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdHRoaXMuYnJlYWtwb2ludHMgPSB7XHJcblx0XHRcdHhzOiAwLFxyXG5cdFx0XHRzbTogNTc2LFxyXG5cdFx0XHRtZDogNzY4LFxyXG5cdFx0XHRsZzogOTkyLFxyXG5cdFx0XHR4bDogMTIwMCxcclxuXHRcdFx0eHhsOiAxNDAwLFxyXG5cdFx0XHR4eHhsOiAxNjAwLFxyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqINCV0YHQu9C4INC90LDRiNCwINGI0LjRgNC40L3QsCDRjdC60YDQsNC90LAg0YHQvtCy0L/QsNC00LDQtdGCINGBINC00LjQsNC/0LDQt9C+0L3QvtC8INC60L7RgtC+0YDRi9C5INGD0LrQsNC30LDQvSDQsiDQvNC+0LTRg9C70LUg0LLRi9C00LDQtdC8IHRydWUsINC40L3QsNGH0LUgZmFsc2VcclxuXHQgKiBAcGFyYW0gbW9kdWxlXHJcblx0ICogQHJldHVybnMge2Jvb2xlYW59XHJcblx0ICovXHJcblx0c3RhdGljIGNoZWNrKG1vZHVsZSkge1xyXG5cdFx0bGV0IGluc3RhbmNlID0gbmV3IHRoaXMgO1xyXG5cdFx0cmV0dXJuIGluc3RhbmNlLmRlZmluZShtb2R1bGUpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICog0J/RgNC+0LLQtdGA0Y/QtdGCINC90LAg0YLQsNGHINGD0YHRgtGA0L7QudGB0YLQstCwLiBUT0RPINC90LUg0YHQvtCy0YHQtdC8INC/0YDQsNCy0LjQu9GM0L3Qviwg0L3QsNC00L4g0YHQtNC10LvQsNGC0Ywg0L/Qvi3QtNGA0YPQs9C+0LzRg1xyXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBjaGVja01vYmlsZU9yVGFibGV0KCkge1xyXG5cdFx0bGV0IGNoZWNrID0gZmFsc2U7XHJcblx0XHQoZnVuY3Rpb24oYSkge1xyXG5cdFx0XHRpZiAoLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWlub3xhbmRyb2lkfGlwYWR8cGxheWJvb2t8c2lsay9pLnRlc3QoYSl8fC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzXFwtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfFxcLW18ciB8cyApfGF2YW58YmUoY2t8bGx8bnEpfGJpKGxifHJkKXxibChhY3xheil8YnIoZXx2KXd8YnVtYnxid1xcLShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtXFwtfGNlbGx8Y2h0bXxjbGRjfGNtZFxcLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkY1xcLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8XFwtZCl8ZWwoNDl8YWkpfGVtKGwyfHVsKXxlcihpY3xrMCl8ZXNsOHxleihbNC03XTB8b3N8d2F8emUpfGZldGN8Zmx5KFxcLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZlxcLTV8Z1xcLW1vfGdvKFxcLnd8b2QpfGdyKGFkfHVuKXxoYWllfGhjaXR8aGRcXC0obXxwfHQpfGhlaVxcLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzXFwtY3xodChjKFxcLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGlcXC0oMjB8Z298bWEpfGkyMzB8aWFjKCB8XFwtfFxcLyl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKHR8dilhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoIHxcXC8pfGtsb258a3B0IHxrd2NcXC18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8XFwtW2Etd10pfGxpYnd8bHlueHxtMVxcLXd8bTNnYXxtNTBcXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtXFwtY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoXFwtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSlcXC18b258dGZ8d2Z8d2d8d3QpfG5vayg2fGkpfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKGF8ZHx0KXxwZHhnfHBnKDEzfFxcLShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwblxcLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdFxcLWd8cWFcXC1hfHFjKDA3fDEyfDIxfDMyfDYwfFxcLVsyLTddfGlcXC0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XFwvfHNhKGdlfG1hfG1tfG1zfG55fHZhKXxzYygwMXxoXFwtfG9vfHBcXC0pfHNka1xcL3xzZShjKFxcLXwwfDEpfDQ3fG1jfG5kfHJpKXxzZ2hcXC18c2hhcnxzaWUoXFwtfG0pfHNrXFwtMHxzbCg0NXxpZCl8c20oYWx8YXJ8YjN8aXR8dDUpfHNvKGZ0fG55KXxzcCgwMXxoXFwtfHZcXC18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2xcXC18dGRnXFwtfHRlbChpfG0pfHRpbVxcLXx0XFwtbW98dG8ocGx8c2gpfHRzKDcwfG1cXC18bTN8bTUpfHR4XFwtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118XFwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhcXC18ICl8d2ViY3x3aGl0fHdpKGcgfG5jfG53KXx3bWxifHdvbnV8eDcwMHx5YXNcXC18eW91cnx6ZXRvfHp0ZVxcLS9pLnRlc3QoYS5zbGljZSgwLDQpKSl7XHJcblx0XHRcdFx0Y2hlY2sgPSB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHR9KShuYXZpZ2F0b3IudXNlckFnZW50fHxuYXZpZ2F0b3IudmVuZG9yfHx3aW5kb3cub3BlcmEpO1xyXG5cclxuXHRcdHJldHVybiBjaGVjaztcclxuXHR9XHJcblxyXG5cdGRlZmluZShtb2R1bGUpIHtcclxuXHRcdGxldCB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoLFxyXG5cdFx0XHRyZXNwb25zaXZlX3NpemUgPSB0aGlzLl9jaGVja1Jlc3BvbnNpdmVDbGFzcyhtb2R1bGUpLFxyXG5cdFx0XHRicmVha3BvaW50cyA9IHRoaXMuYnJlYWtwb2ludHMsXHJcblx0XHRcdHBvaW50ID0gT2JqZWN0LmtleXMoYnJlYWtwb2ludHMpLmZpbmQoa2V5ID0+IGJyZWFrcG9pbnRzW2tleV0gPT09IHJlc3BvbnNpdmVfc2l6ZSk7XHJcblxyXG5cdFx0bGV0IGtleXMgPSBPYmplY3Qua2V5cyhicmVha3BvaW50cyksXHJcblx0XHRcdGxvYyA9IGtleXMuaW5kZXhPZihwb2ludCk7XHJcblxyXG5cdFx0cmV0dXJuIHdpbmRvd1dpZHRoID49IGJyZWFrcG9pbnRzW2tleXNbbG9jICsgMV1dO1xyXG5cdH1cclxuXHJcblx0X2NoZWNrUmVzcG9uc2l2ZUNsYXNzKG1vZHVsZSkge1xyXG5cdFx0bGV0IGVsZW1lbnQgPSBtb2R1bGUuX2VsZW1lbnQsXHJcblx0XHRcdHBhcmFtcyA9IG1vZHVsZS5fcGFyYW1zLFxyXG5cdFx0XHRjdXJyZW50X3Jlc3BvbnNpdmVfc2l6ZSA9IDA7XHJcblxyXG5cdFx0aWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKHBhcmFtcy5jbGFzc2VzLlhYWEwpKSB7XHJcblx0XHRcdGN1cnJlbnRfcmVzcG9uc2l2ZV9zaXplID0gdGhpcy5icmVha3BvaW50cy54eHhsO1xyXG5cdFx0fSBlbHNlIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhwYXJhbXMuY2xhc3Nlcy5YWEwpKSB7XHJcblx0XHRcdGN1cnJlbnRfcmVzcG9uc2l2ZV9zaXplID0gdGhpcy5icmVha3BvaW50cy54eGw7XHJcblx0XHR9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKHBhcmFtcy5jbGFzc2VzLlhMKSkge1xyXG5cdFx0XHRjdXJyZW50X3Jlc3BvbnNpdmVfc2l6ZSA9IHRoaXMuYnJlYWtwb2ludHMueGw7XHJcblx0XHR9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKHBhcmFtcy5jbGFzc2VzLkxHKSkge1xyXG5cdFx0XHRjdXJyZW50X3Jlc3BvbnNpdmVfc2l6ZSA9IHRoaXMuYnJlYWtwb2ludHMubGc7XHJcblx0XHR9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKHBhcmFtcy5jbGFzc2VzLk1EKSkge1xyXG5cdFx0XHRjdXJyZW50X3Jlc3BvbnNpdmVfc2l6ZSA9IHRoaXMuYnJlYWtwb2ludHMubWQ7XHJcblx0XHR9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKHBhcmFtcy5jbGFzc2VzLlNNKSkge1xyXG5cdFx0XHRjdXJyZW50X3Jlc3BvbnNpdmVfc2l6ZSA9IHRoaXMuYnJlYWtwb2ludHMuc207XHJcblx0XHR9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKHBhcmFtcy5jbGFzc2VzLlhTKSkge1xyXG5cdFx0XHRjdXJyZW50X3Jlc3BvbnNpdmVfc2l6ZSA9IHRoaXMuYnJlYWtwb2ludHMueHM7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjdXJyZW50X3Jlc3BvbnNpdmVfc2l6ZSA9IHRoaXMuYnJlYWtwb2ludHMueHM7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGN1cnJlbnRfcmVzcG9uc2l2ZV9zaXplXHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZXNwb25zaXZlOyIsIi8qKlxyXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gKiBCb290c3RyYXAgdXRpbC9zY3JvbGxCYXIuanNcclxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXHJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtNYW5pcHVsYXRvcn0gZnJvbSBcIi4uL2RvbS9tYW5pcHVsYXRvclwiO1xyXG5pbXBvcnQge2lzRWxlbWVudH0gZnJvbSBcIi4uL2Z1bmN0aW9uc1wiO1xyXG5pbXBvcnQgU2VsZWN0b3JzIGZyb20gXCIuLi9kb20vc2VsZWN0b3JzXCI7XHJcblxyXG4vKipcclxuICogQ29uc3RhbnRzXHJcbiAqL1xyXG5cclxuY29uc3QgU0VMRUNUT1JfRklYRURfQ09OVEVOVCA9ICcuZml4ZWQtdG9wLCAuZml4ZWQtYm90dG9tLCAuaXMtZml4ZWQsIC5zdGlja3ktdG9wJ1xyXG5jb25zdCBTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCA9ICcuc3RpY2t5LXRvcCdcclxuY29uc3QgUFJPUEVSVFlfUEFERElORyA9ICdwYWRkaW5nLXJpZ2h0J1xyXG5jb25zdCBQUk9QRVJUWV9NQVJHSU4gPSAnbWFyZ2luLXJpZ2h0J1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGRlZmluaXRpb25cclxuICovXHJcblxyXG5jbGFzcyBTY3JvbGxCYXJIZWxwZXIge1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0dGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmJvZHlcclxuXHR9XHJcblxyXG5cdC8vIFB1YmxpY1xyXG5cdGdldFdpZHRoKCkge1xyXG5cdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9pbm5lcldpZHRoI3VzYWdlX25vdGVzXHJcblx0XHRjb25zdCBkb2N1bWVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoXHJcblx0XHRyZXR1cm4gTWF0aC5hYnMod2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudFdpZHRoKVxyXG5cdH1cclxuXHJcblx0aGlkZSgpIHtcclxuXHRcdGNvbnN0IHdpZHRoID0gdGhpcy5nZXRXaWR0aCgpXHJcblx0XHR0aGlzLl9kaXNhYmxlT3ZlckZsb3coKVxyXG5cdFx0Ly8gZ2l2ZSBwYWRkaW5nIHRvIGVsZW1lbnQgdG8gYmFsYW5jZSB0aGUgaGlkZGVuIHNjcm9sbGJhciB3aWR0aFxyXG5cdFx0dGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcy5fZWxlbWVudCwgUFJPUEVSVFlfUEFERElORywgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSArIHdpZHRoKVxyXG5cdFx0Ly8gdHJpY2s6IFdlIGFkanVzdCBwb3NpdGl2ZSBwYWRkaW5nUmlnaHQgYW5kIG5lZ2F0aXZlIG1hcmdpblJpZ2h0IHRvIHN0aWNreS10b3AgZWxlbWVudHMgdG8ga2VlcCBzaG93aW5nIGZ1bGx3aWR0aFxyXG5cdFx0dGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfRklYRURfQ09OVEVOVCwgUFJPUEVSVFlfUEFERElORywgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSArIHdpZHRoKVxyXG5cdFx0dGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTiwgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSAtIHdpZHRoKVxyXG5cdH1cclxuXHJcblx0cmVzZXQoKSB7XHJcblx0XHR0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpXHJcblx0XHR0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcpXHJcblx0XHR0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQsIFBST1BFUlRZX1BBRERJTkcpXHJcblx0XHR0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4pXHJcblx0fVxyXG5cclxuXHRpc092ZXJmbG93aW5nKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSA+IDBcclxuXHR9XHJcblxyXG5cdC8vIFByaXZhdGVcclxuXHRfZGlzYWJsZU92ZXJGbG93KCkge1xyXG5cdFx0dGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUodGhpcy5fZWxlbWVudCwgJ292ZXJmbG93JylcclxuXHRcdHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJ1xyXG5cdH1cclxuXHJcblx0X3NldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5LCBjYWxsYmFjaykge1xyXG5cdFx0Y29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLmdldFdpZHRoKClcclxuXHRcdGNvbnN0IG1hbmlwdWxhdGlvbkNhbGxCYWNrID0gZWxlbWVudCA9PiB7XHJcblx0XHRcdGlmIChlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50ICYmIHdpbmRvdy5pbm5lcldpZHRoID4gZWxlbWVudC5jbGllbnRXaWR0aCArIHNjcm9sbGJhcldpZHRoKSB7XHJcblx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX3NhdmVJbml0aWFsQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpXHJcblx0XHRcdGNvbnN0IGNhbGN1bGF0ZWRWYWx1ZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoc3R5bGVQcm9wZXJ0eSlcclxuXHRcdFx0ZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCBgJHtjYWxsYmFjayhOdW1iZXIucGFyc2VGbG9hdChjYWxjdWxhdGVkVmFsdWUpKX1weGApXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgbWFuaXB1bGF0aW9uQ2FsbEJhY2spXHJcblx0fVxyXG5cclxuXHRfc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSkge1xyXG5cdFx0Y29uc3QgYWN0dWFsVmFsdWUgPSBlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoc3R5bGVQcm9wZXJ0eSlcclxuXHRcdGlmIChhY3R1YWxWYWx1ZSkge1xyXG5cdFx0XHRNYW5pcHVsYXRvci5nZXQoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSwgYWN0dWFsVmFsdWUpXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRfcmVzZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wZXJ0eSkge1xyXG5cdFx0Y29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcclxuXHRcdFx0Y29uc3QgdmFsdWUgPSBNYW5pcHVsYXRvci5nZXQoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSlcclxuXHRcdFx0Ly8gV2Ugb25seSB3YW50IHRvIHJlbW92ZSB0aGUgcHJvcGVydHkgaWYgdGhlIHZhbHVlIGlzIGBudWxsYDsgdGhlIHZhbHVlIGNhbiBhbHNvIGJlIHplcm9cclxuXHRcdFx0aWYgKHZhbHVlID09PSBudWxsKSB7XHJcblx0XHRcdFx0ZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShzdHlsZVByb3BlcnR5KVxyXG5cdFx0XHRcdHJldHVyblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRNYW5pcHVsYXRvci5yZW1vdmUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSlcclxuXHRcdFx0ZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCB2YWx1ZSlcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBtYW5pcHVsYXRpb25DYWxsQmFjaylcclxuXHR9XHJcblxyXG5cdF9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBjYWxsQmFjaykge1xyXG5cdFx0aWYgKGlzRWxlbWVudChzZWxlY3RvcikpIHtcclxuXHRcdFx0Y2FsbEJhY2soc2VsZWN0b3IpXHJcblx0XHRcdHJldHVyblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoY29uc3Qgc2VsIG9mIFNlbGVjdG9ycy5maW5kQWxsKHNlbGVjdG9yLCB0aGlzLl9lbGVtZW50KSkge1xyXG5cdFx0XHRjYWxsQmFjayhzZWwpXHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTY3JvbGxCYXJIZWxwZXIiLCIvKiEganMtY29va2llIHYzLjAuMSB8IE1JVCAqL1xyXG5cclxuZnVuY3Rpb24gYXNzaWduICh0YXJnZXQpIHtcclxuXHRmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0bGV0IHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcclxuXHRcdGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcclxuXHRcdFx0dGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIHRhcmdldFxyXG59XHJcblxyXG5sZXQgZGVmYXVsdENvbnZlcnRlciA9IHtcclxuXHRyZWFkOiBmdW5jdGlvbiAodmFsdWUpIHtcclxuXHRcdGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xyXG5cdFx0XHR2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oJVtcXGRBLUZdezJ9KSsvZ2ksIGRlY29kZVVSSUNvbXBvbmVudClcclxuXHR9LFxyXG5cdHdyaXRlOiBmdW5jdGlvbiAodmFsdWUpIHtcclxuXHRcdHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoXHJcblx0XHRcdC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcclxuXHRcdFx0ZGVjb2RlVVJJQ29tcG9uZW50XHJcblx0XHQpXHJcblx0fVxyXG59O1xyXG5cclxuZnVuY3Rpb24gaW5pdCAoY29udmVydGVyLCBkZWZhdWx0QXR0cmlidXRlcykge1xyXG5cdGZ1bmN0aW9uIHNldCAoa2V5LCB2YWx1ZSwgYXR0cmlidXRlcykge1xyXG5cdFx0aWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuXHRcdFx0cmV0dXJuXHJcblx0XHR9XHJcblxyXG5cdFx0YXR0cmlidXRlcyA9IGFzc2lnbih7fSwgZGVmYXVsdEF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpO1xyXG5cclxuXHRcdGlmICh0eXBlb2YgYXR0cmlidXRlcy5leHBpcmVzID09PSAnbnVtYmVyJykge1xyXG5cdFx0XHRhdHRyaWJ1dGVzLmV4cGlyZXMgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZTUpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGF0dHJpYnV0ZXMuZXhwaXJlcykge1xyXG5cdFx0XHRhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcclxuXHRcdH1cclxuXHJcblx0XHRrZXkgPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KVxyXG5cdFx0XHQucmVwbGFjZSgvJSgyWzM0NkJdfDVFfDYwfDdDKS9nLCBkZWNvZGVVUklDb21wb25lbnQpXHJcblx0XHRcdC5yZXBsYWNlKC9bKCldL2csIGVzY2FwZSk7XHJcblxyXG5cdFx0bGV0IHN0cmluZ2lmaWVkQXR0cmlidXRlcyA9ICcnO1xyXG5cdFx0Zm9yIChsZXQgYXR0cmlidXRlTmFtZSBpbiBhdHRyaWJ1dGVzKSB7XHJcblx0XHRcdGlmICghYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSkge1xyXG5cdFx0XHRcdGNvbnRpbnVlXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcclxuXHJcblx0XHRcdGlmIChhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID09PSB0cnVlKSB7XHJcblx0XHRcdFx0Y29udGludWVcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQ29uc2lkZXJzIFJGQyA2MjY1IHNlY3Rpb24gNS4yOlxyXG5cdFx0XHQvLyAuLi5cclxuXHRcdFx0Ly8gMy4gIElmIHRoZSByZW1haW5pbmcgdW5wYXJzZWQtYXR0cmlidXRlcyBjb250YWlucyBhICV4M0IgKFwiO1wiKVxyXG5cdFx0XHQvLyAgICAgY2hhcmFjdGVyOlxyXG5cdFx0XHQvLyBDb25zdW1lIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHVwIHRvLFxyXG5cdFx0XHQvLyBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzQiAoXCI7XCIpIGNoYXJhY3Rlci5cclxuXHRcdFx0Ly8gLi4uXHJcblx0XHRcdHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnPScgKyBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLnNwbGl0KCc7JylbMF07XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIChkb2N1bWVudC5jb29raWUgPVxyXG5cdFx0XHRrZXkgKyAnPScgKyBjb252ZXJ0ZXIud3JpdGUodmFsdWUsIGtleSkgKyBzdHJpbmdpZmllZEF0dHJpYnV0ZXMpXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXQgKGtleSkge1xyXG5cdFx0aWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgKGFyZ3VtZW50cy5sZW5ndGggJiYgIWtleSkpIHtcclxuXHRcdFx0cmV0dXJuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVG8gcHJldmVudCB0aGUgZm9yIGxvb3AgaW4gdGhlIGZpcnN0IHBsYWNlIGFzc2lnbiBhbiBlbXB0eSBhcnJheVxyXG5cdFx0Ly8gaW4gY2FzZSB0aGVyZSBhcmUgbm8gY29va2llcyBhdCBhbGwuXHJcblx0XHRsZXQgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZSA/IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSA6IFtdO1xyXG5cdFx0bGV0IGphciA9IHt9O1xyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGxldCBwYXJ0cyA9IGNvb2tpZXNbaV0uc3BsaXQoJz0nKTtcclxuXHRcdFx0bGV0IHZhbHVlID0gcGFydHMuc2xpY2UoMSkuam9pbignPScpO1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRsZXQgZm91bmRLZXkgPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pO1xyXG5cdFx0XHRcdGphcltmb3VuZEtleV0gPSBjb252ZXJ0ZXIucmVhZCh2YWx1ZSwgZm91bmRLZXkpO1xyXG5cclxuXHRcdFx0XHRpZiAoa2V5ID09PSBmb3VuZEtleSkge1xyXG5cdFx0XHRcdFx0YnJlYWtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gY2F0Y2ggKGUpIHt9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGtleSA/IGphcltrZXldIDogamFyXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gT2JqZWN0LmNyZWF0ZSh7XHJcblx0XHRcdHNldDogc2V0LFxyXG5cdFx0XHRnZXQ6IGdldCxcclxuXHRcdFx0cmVtb3ZlOiBmdW5jdGlvbiAoa2V5LCBhdHRyaWJ1dGVzKSB7XHJcblx0XHRcdFx0c2V0KFxyXG5cdFx0XHRcdFx0a2V5LFxyXG5cdFx0XHRcdFx0JycsXHJcblx0XHRcdFx0XHRhc3NpZ24oe30sIGF0dHJpYnV0ZXMsIHtcclxuXHRcdFx0XHRcdFx0ZXhwaXJlczogLTFcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fSxcclxuXHRcdFx0d2l0aEF0dHJpYnV0ZXM6IGZ1bmN0aW9uIChhdHRyaWJ1dGVzKSB7XHJcblx0XHRcdFx0cmV0dXJuIGluaXQodGhpcy5jb252ZXJ0ZXIsIGFzc2lnbih7fSwgdGhpcy5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKSlcclxuXHRcdFx0fSxcclxuXHRcdFx0d2l0aENvbnZlcnRlcjogZnVuY3Rpb24gKGNvbnZlcnRlcikge1xyXG5cdFx0XHRcdHJldHVybiBpbml0KGFzc2lnbih7fSwgdGhpcy5jb252ZXJ0ZXIsIGNvbnZlcnRlciksIHRoaXMuYXR0cmlidXRlcylcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0YXR0cmlidXRlczogeyB2YWx1ZTogT2JqZWN0LmZyZWV6ZShkZWZhdWx0QXR0cmlidXRlcykgfSxcclxuXHRcdFx0Y29udmVydGVyOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGNvbnZlcnRlcikgfVxyXG5cdFx0fVxyXG5cdClcclxufVxyXG5cclxubGV0IGFwaSA9IGluaXQoZGVmYXVsdENvbnZlcnRlciwgeyBwYXRoOiAnLycgfSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhcGk7IiwiLyoqXHJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAqIEJvb3RzdHJhcCBkYXRhLmpzXHJcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxyXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gKiDQodC60YDQuNC/0YIg0YDQsNCx0L7RgtCw0LXRgiDRgSDQutC+0LvQu9C10LrRhtC40LXQuSDQvNC+0LTRg9C70LXQuS4g0J/QvtC00YDQvtCx0L3QtdC1INGC0YPRgiBodHRwczovL2xlYXJuLmphdmFzY3JpcHQucnUvbWFwLXNldFxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiDQmtC+0L3RgdGC0LDQvdGC0YtcclxuICovXHJcblxyXG5jb25zdCBlbGVtZW50TWFwID0gbmV3IE1hcCgpXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcblx0c2V0KGVsZW1lbnQsIGtleSwgaW5zdGFuY2UpIHtcclxuXHRcdGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcclxuXHRcdFx0ZWxlbWVudE1hcC5zZXQoZWxlbWVudCwgbmV3IE1hcCgpKVxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGluc3RhbmNlTWFwID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudClcclxuXHRcdGlmICghaW5zdGFuY2VNYXAuaGFzKGtleSkgJiYgaW5zdGFuY2VNYXAuc2l6ZSAhPT0gMCkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGBWR0FwcCDQvdC1INC00L7Qv9GD0YHQutCw0LXRgiDQsdC+0LvQtdC1INC+0LTQvdC+0LPQviDRjdC60LfQtdC80L/Qu9GP0YDQsCDQtNC70Y8g0LrQsNC20LTQvtCz0L4g0Y3Qu9C10LzQtdC90YLQsC4g0KHQstGP0LfQsNC90L3Ri9C5INGN0LrQt9C10LzQv9C70Y/RgDogJHtBcnJheS5mcm9tKGluc3RhbmNlTWFwLmtleXMoKSlbMF19LmApXHJcblx0XHRcdHJldHVyblxyXG5cdFx0fVxyXG5cclxuXHRcdGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKTtcclxuXHR9LFxyXG5cclxuXHRnZXQoZWxlbWVudCwga2V5KSB7XHJcblx0XHRpZiAoZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcclxuXHRcdFx0cmV0dXJuIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpLmdldChrZXkpIHx8IG51bGxcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbFxyXG5cdH0sXHJcblxyXG5cdHJlbW92ZShlbGVtZW50LCBrZXkpIHtcclxuXHRcdGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcclxuXHRcdFx0cmV0dXJuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgaW5zdGFuY2VNYXAgPSBlbGVtZW50TWFwLmdldChlbGVtZW50KVxyXG5cclxuXHRcdGluc3RhbmNlTWFwLmRlbGV0ZShrZXkpO1xyXG5cclxuXHRcdGlmIChpbnN0YW5jZU1hcC5zaXplID09PSAwKSB7XHJcblx0XHRcdGVsZW1lbnRNYXAuZGVsZXRlKGVsZW1lbnQpXHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiIsIi8qKlxyXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gKiBCb290c3RyYXAgZXZlbnQuanNcclxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXHJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAqINCh0LrRgNC40L/RgiDQtNC70Y8g0L/RgNC+0YHQu9GD0YjQuNCy0LDQvdC40Y8g0YHQvtCx0YvRgtC40Y9cclxuICovXHJcblxyXG4vKipcclxuICog0JrQvtC90YHRgtCw0L3RgtGLXHJcbiAqL1xyXG5cclxuY29uc3QgbmFtZXNwYWNlUmVnZXggPSAvW14uXSooPz1cXC4uKilcXC58LiovXHJcbmNvbnN0IHN0cmlwTmFtZVJlZ2V4ID0gL1xcLi4qL1xyXG5jb25zdCBzdHJpcFVpZFJlZ2V4ID0gLzo6XFxkKyQvXHJcbmNvbnN0IGV2ZW50UmVnaXN0cnkgPSB7fSAvLyBFdmVudHMgc3RvcmFnZVxyXG5sZXQgdWlkRXZlbnQgPSAxXHJcbmNvbnN0IGN1c3RvbUV2ZW50cyA9IHtcclxuXHRtb3VzZWVudGVyOiAnbW91c2VvdmVyJyxcclxuXHRtb3VzZWxlYXZlOiAnbW91c2VvdXQnXHJcbn1cclxuXHJcbmNvbnN0IG5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoW1xyXG5cdCdjbGljaycsXHJcblx0J2RibGNsaWNrJyxcclxuXHQnbW91c2V1cCcsXHJcblx0J21vdXNlZG93bicsXHJcblx0J2NvbnRleHRtZW51JyxcclxuXHQnbW91c2V3aGVlbCcsXHJcblx0J0RPTU1vdXNlU2Nyb2xsJyxcclxuXHQnbW91c2VvdmVyJyxcclxuXHQnbW91c2VvdXQnLFxyXG5cdCdtb3VzZW1vdmUnLFxyXG5cdCdzZWxlY3RzdGFydCcsXHJcblx0J3NlbGVjdGVuZCcsXHJcblx0J3N1Ym1pdCcsXHJcblx0J2tleWRvd24nLFxyXG5cdCdrZXlwcmVzcycsXHJcblx0J2tleXVwJyxcclxuXHQnb3JpZW50YXRpb25jaGFuZ2UnLFxyXG5cdCd0b3VjaHN0YXJ0JyxcclxuXHQndG91Y2htb3ZlJyxcclxuXHQndG91Y2hlbmQnLFxyXG5cdCd0b3VjaGNhbmNlbCcsXHJcblx0J3BvaW50ZXJkb3duJyxcclxuXHQncG9pbnRlcm1vdmUnLFxyXG5cdCdwb2ludGVydXAnLFxyXG5cdCdwb2ludGVybGVhdmUnLFxyXG5cdCdwb2ludGVyY2FuY2VsJyxcclxuXHQnZ2VzdHVyZXN0YXJ0JyxcclxuXHQnZ2VzdHVyZWNoYW5nZScsXHJcblx0J2dlc3R1cmVlbmQnLFxyXG5cdCdmb2N1cycsXHJcblx0J2JsdXInLFxyXG5cdCdjaGFuZ2UnLFxyXG5cdCdyZXNldCcsXHJcblx0J3NlbGVjdCcsXHJcblx0J3N1Ym1pdCcsXHJcblx0J2ZvY3VzaW4nLFxyXG5cdCdmb2N1c291dCcsXHJcblx0J2xvYWQnLFxyXG5cdCd1bmxvYWQnLFxyXG5cdCdiZWZvcmV1bmxvYWQnLFxyXG5cdCdyZXNpemUnLFxyXG5cdCdtb3ZlJyxcclxuXHQnRE9NQ29udGVudExvYWRlZCcsXHJcblx0J3JlYWR5c3RhdGVjaGFuZ2UnLFxyXG5cdCdlcnJvcicsXHJcblx0J2Fib3J0JyxcclxuXHQnc2Nyb2xsJ1xyXG5dKVxyXG5cclxuLyoqXHJcbiAqINCf0YDQuNCy0LDRgtC90YvQtSDQvNC10YLQvtC00YtcclxuICovXHJcblxyXG5mdW5jdGlvbiBtYWtlRXZlbnRVaWQoZWxlbWVudCwgdWlkKSB7XHJcblx0cmV0dXJuICh1aWQgJiYgYCR7dWlkfTo6JHt1aWRFdmVudCsrfWApIHx8IGVsZW1lbnQudWlkRXZlbnQgfHwgdWlkRXZlbnQrK1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpIHtcclxuXHRjb25zdCB1aWQgPSBtYWtlRXZlbnRVaWQoZWxlbWVudClcclxuXHJcblx0ZWxlbWVudC51aWRFdmVudCA9IHVpZFxyXG5cdGV2ZW50UmVnaXN0cnlbdWlkXSA9IGV2ZW50UmVnaXN0cnlbdWlkXSB8fCB7fVxyXG5cclxuXHRyZXR1cm4gZXZlbnRSZWdpc3RyeVt1aWRdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgZm4pIHtcclxuXHRyZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xyXG5cdFx0aHlkcmF0ZU9iaihldmVudCwgeyBkZWxlZ2F0ZVRhcmdldDogZWxlbWVudCB9KVxyXG5cclxuXHRcdGlmIChoYW5kbGVyLm9uZU9mZikge1xyXG5cdFx0XHRFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsIGV2ZW50LnR5cGUsIGZuKVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmbi5hcHBseShlbGVtZW50LCBbZXZlbnRdKVxyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgc2VsZWN0b3IsIGZuKSB7XHJcblx0cmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcclxuXHRcdGNvbnN0IGRvbUVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxyXG5cclxuXHRcdGZvciAobGV0IHsgdGFyZ2V0IH0gPSBldmVudDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gdGhpczsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcclxuXHRcdFx0Zm9yIChjb25zdCBkb21FbGVtZW50IG9mIGRvbUVsZW1lbnRzKSB7XHJcblx0XHRcdFx0aWYgKGRvbUVsZW1lbnQgIT09IHRhcmdldCkge1xyXG5cdFx0XHRcdFx0Y29udGludWVcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGh5ZHJhdGVPYmooZXZlbnQsIHsgZGVsZWdhdGVUYXJnZXQ6IHRhcmdldCB9KVxyXG5cclxuXHRcdFx0XHRpZiAoaGFuZGxlci5vbmVPZmYpIHtcclxuXHRcdFx0XHRcdEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgc2VsZWN0b3IsIGZuKVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIGZuLmFwcGx5KHRhcmdldCwgW2V2ZW50XSlcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gZmluZEhhbmRsZXIoZXZlbnRzLCBjYWxsYWJsZSwgZGVsZWdhdGlvblNlbGVjdG9yID0gbnVsbCkge1xyXG5cdHJldHVybiBPYmplY3QudmFsdWVzKGV2ZW50cylcclxuXHRcdC5maW5kKGV2ZW50ID0+IGV2ZW50LmNhbGxhYmxlID09PSBjYWxsYWJsZSAmJiBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IgPT09IGRlbGVnYXRpb25TZWxlY3RvcilcclxufVxyXG5cclxuZnVuY3Rpb24gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XHJcblx0Y29uc3QgaXNEZWxlZ2F0ZWQgPSB0eXBlb2YgaGFuZGxlciA9PT0gJ3N0cmluZydcclxuXHQvLyBUT0RPOiDQstGL0LTQsNC10YIgXCJmYWxzZVwiINCy0LzQtdGB0YLQviDRgdC10LvQtdC60YLQvtGA0LAsINC/0L7RjdGC0L7QvNGDINC90YPQttC90L4g0L/RgNC+0LLQtdGA0LjRgtGMLiBib290XHJcblx0Y29uc3QgY2FsbGFibGUgPSBpc0RlbGVnYXRlZCA/IGRlbGVnYXRpb25GdW5jdGlvbiA6IChoYW5kbGVyIHx8IGRlbGVnYXRpb25GdW5jdGlvbilcclxuXHRsZXQgdHlwZUV2ZW50ID0gZ2V0VHlwZUV2ZW50KG9yaWdpbmFsVHlwZUV2ZW50KVxyXG5cclxuXHRpZiAoIW5hdGl2ZUV2ZW50cy5oYXModHlwZUV2ZW50KSkge1xyXG5cdFx0dHlwZUV2ZW50ID0gb3JpZ2luYWxUeXBlRXZlbnRcclxuXHR9XHJcblxyXG5cdHJldHVybiBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZEhhbmRsZXIoZWxlbWVudCwgb3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgb25lT2ZmKSB7XHJcblx0aWYgKHR5cGVvZiBvcmlnaW5hbFR5cGVFdmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcclxuXHRcdHJldHVyblxyXG5cdH1cclxuXHJcblx0bGV0IFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF0gPSBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pXHJcblxyXG5cdC8vIGluIGNhc2Ugb2YgbW91c2VlbnRlciBvciBtb3VzZWxlYXZlIHdyYXAgdGhlIGhhbmRsZXIgd2l0aGluIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGl0cyBET00gcG9zaXRpb25cclxuXHQvLyB0aGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gYmVpbmcgZGlzcGF0Y2hlZCB0aGUgc2FtZSB3YXkgYXMgbW91c2VvdmVyIG9yIG1vdXNlb3V0IGRvZXNcclxuXHRpZiAob3JpZ2luYWxUeXBlRXZlbnQgaW4gY3VzdG9tRXZlbnRzKSB7XHJcblx0XHRjb25zdCB3cmFwRnVuY3Rpb24gPSBmbiA9PiB7XHJcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuXHRcdFx0XHRpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgIT09IGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmICFldmVudC5kZWxlZ2F0ZVRhcmdldC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkpIHtcclxuXHRcdFx0XHRcdHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGNhbGxhYmxlID0gd3JhcEZ1bmN0aW9uKGNhbGxhYmxlKVxyXG5cdH1cclxuXHJcblx0Y29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KVxyXG5cdGNvbnN0IGhhbmRsZXJzID0gZXZlbnRzW3R5cGVFdmVudF0gfHwgKGV2ZW50c1t0eXBlRXZlbnRdID0ge30pXHJcblx0Y29uc3QgcHJldmlvdXNGdW5jdGlvbiA9IGZpbmRIYW5kbGVyKGhhbmRsZXJzLCBjYWxsYWJsZSwgaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbClcclxuXHJcblx0aWYgKHByZXZpb3VzRnVuY3Rpb24pIHtcclxuXHRcdHByZXZpb3VzRnVuY3Rpb24ub25lT2ZmID0gcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgJiYgb25lT2ZmXHJcblxyXG5cdFx0cmV0dXJuXHJcblx0fVxyXG5cclxuXHRjb25zdCB1aWQgPSBtYWtlRXZlbnRVaWQoY2FsbGFibGUsIG9yaWdpbmFsVHlwZUV2ZW50LnJlcGxhY2UobmFtZXNwYWNlUmVnZXgsICcnKSlcclxuXHRjb25zdCBmbiA9IGlzRGVsZWdhdGVkID9cclxuXHRcdGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIGhhbmRsZXIsIGNhbGxhYmxlKSA6XHJcblx0XHRib290c3RyYXBIYW5kbGVyKGVsZW1lbnQsIGNhbGxhYmxlKVxyXG5cclxuXHRmbi5kZWxlZ2F0aW9uU2VsZWN0b3IgPSBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsXHJcblx0Zm4uY2FsbGFibGUgPSBjYWxsYWJsZVxyXG5cdGZuLm9uZU9mZiA9IG9uZU9mZlxyXG5cdGZuLnVpZEV2ZW50ID0gdWlkXHJcblx0aGFuZGxlcnNbdWlkXSA9IGZuXHJcblxyXG5cdGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBpc0RlbGVnYXRlZClcclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yKSB7XHJcblx0Y29uc3QgZm4gPSBmaW5kSGFuZGxlcihldmVudHNbdHlwZUV2ZW50XSwgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yKVxyXG5cclxuXHRpZiAoIWZuKSB7XHJcblx0XHRyZXR1cm5cclxuXHR9XHJcblxyXG5cdGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBCb29sZWFuKGRlbGVnYXRpb25TZWxlY3RvcikpXHJcblx0ZGVsZXRlIGV2ZW50c1t0eXBlRXZlbnRdW2ZuLnVpZEV2ZW50XVxyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIG5hbWVzcGFjZSkge1xyXG5cdGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge31cclxuXHJcblx0Zm9yIChjb25zdCBbaGFuZGxlcktleSwgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xyXG5cdFx0aWYgKGhhbmRsZXJLZXkuaW5jbHVkZXMobmFtZXNwYWNlKSkge1xyXG5cdFx0XHRyZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKVxyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0VHlwZUV2ZW50KGV2ZW50KSB7XHJcblx0Ly8gYWxsb3cgdG8gZ2V0IHRoZSBuYXRpdmUgZXZlbnRzIGZyb20gbmFtZXNwYWNlZCBldmVudHMgKCdjbGljay5icy5idXR0b24nIC0tPiAnY2xpY2snKVxyXG5cdGV2ZW50ID0gZXZlbnQucmVwbGFjZShzdHJpcE5hbWVSZWdleCwgJycpXHJcblx0cmV0dXJuIGN1c3RvbUV2ZW50c1tldmVudF0gfHwgZXZlbnRcclxufVxyXG5cclxuZnVuY3Rpb24gaHlkcmF0ZU9iaihvYmosIG1ldGEgPSB7fSkge1xyXG5cdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGEpKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRvYmpba2V5XSA9IHZhbHVlXHJcblx0XHR9IGNhdGNoIHtcclxuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XHJcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRcdGdldCgpIHtcclxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSlcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJldHVybiBvYmpcclxufVxyXG5cclxuLyoqXHJcbiAqINCh0L7QsdGL0YLQuNGPXHJcbiAqIEB0eXBlIHt7b25lKCosICosICosICopOiB2b2lkLCB0cmlnZ2VyKCosICosICopOiAobnVsbHwqKSwgb2ZmKCosICosICosICopOiB2b2lkLCBvbigqLCAqLCAqLCAqKTogdm9pZH19XHJcbiAqL1xyXG5jb25zdCBFdmVudEhhbmRsZXIgPSB7XHJcblx0LyoqXHJcblx0ICog0J/RgNC+0YHQu9GD0YjQuNCy0LDRgtC10LvRjCDRgdC+0LHRi9GC0LjQuSAo0Y3Qu9C10LzQtdC90YIsINGB0L7QsdGL0YLQuNC1ICjQv9C+0LvQvdGL0Lkg0YHQv9C40YHQvtC6INGB0LzQvtGC0YDQuCDQsiDQutC+0L3RgdGC0LDQvdGC0LUgbmF0aXZlRXZlbnRzLCDQuNGB0YLQvtGH0L3QuNC6INGB0L7QsdGL0YLQuNGPINC40LvQuCDRhdC10L3QtNC70LXRgCwg0YTRg9C90LrRhtC40Y8g0L7QsdGA0LDRgtC90L7Qs9C+INCy0YvQt9C+0LLQsCkpXHJcblx0ICogQHBhcmFtIGVsZW1lbnRcclxuXHQgKiBAcGFyYW0gZXZlbnRcclxuXHQgKiBAcGFyYW0gaGFuZGxlclxyXG5cdCAqIEBwYXJhbSBkZWxlZ2F0aW9uRnVuY3Rpb25cclxuXHQgKi9cclxuXHRvbihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XHJcblx0XHRhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIGZhbHNlKVxyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqINCf0YDQvtGB0LvRg9GI0LjQstCw0YLQtdC70Ywg0YHQvtCx0YvRgtC40LksINC90L4g0LfQsNC80YvQutCw0LXRgtGB0Y8g0Lgg0LHQvtC70YzRiNC1INC90LUg0L/QvtCy0YLQvtGA0Y/QtdGC0YHRjyDQvdCwINGN0LvQtdC80LXQvdGC0LVcclxuXHQgKiBAcGFyYW0gZWxlbWVudFxyXG5cdCAqIEBwYXJhbSBldmVudFxyXG5cdCAqIEBwYXJhbSBoYW5kbGVyXHJcblx0ICogQHBhcmFtIGRlbGVnYXRpb25GdW5jdGlvblxyXG5cdCAqL1xyXG5cdG9uZShlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XHJcblx0XHRhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIHRydWUpXHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICog0KPQtNCw0LvQtdC90LjQtSDQvtCx0YDQsNCx0L7RgtGH0LjQutCwXHJcblx0ICogQHBhcmFtIGVsZW1lbnRcclxuXHQgKiBAcGFyYW0gb3JpZ2luYWxUeXBlRXZlbnRcclxuXHQgKiBAcGFyYW0gaGFuZGxlclxyXG5cdCAqIEBwYXJhbSBkZWxlZ2F0aW9uRnVuY3Rpb25cclxuXHQgKi9cclxuXHRvZmYoZWxlbWVudCwgb3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xyXG5cdFx0aWYgKHR5cGVvZiBvcmlnaW5hbFR5cGVFdmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcclxuXHRcdFx0cmV0dXJuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbilcclxuXHRcdGNvbnN0IGluTmFtZXNwYWNlID0gdHlwZUV2ZW50ICE9PSBvcmlnaW5hbFR5cGVFdmVudFxyXG5cdFx0Y29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KVxyXG5cdFx0Y29uc3Qgc3RvcmVFbGVtZW50RXZlbnQgPSBldmVudHNbdHlwZUV2ZW50XSB8fCB7fVxyXG5cdFx0Y29uc3QgaXNOYW1lc3BhY2UgPSBvcmlnaW5hbFR5cGVFdmVudC5zdGFydHNXaXRoKCcuJylcclxuXHJcblx0XHRpZiAodHlwZW9mIGNhbGxhYmxlICE9PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHQvLyBTaW1wbGVzdCBjYXNlOiBoYW5kbGVyIGlzIHBhc3NlZCwgcmVtb3ZlIHRoYXQgbGlzdGVuZXIgT05MWS5cclxuXHRcdFx0aWYgKCFPYmplY3Qua2V5cyhzdG9yZUVsZW1lbnRFdmVudCkubGVuZ3RoKSB7XHJcblx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKVxyXG5cdFx0XHRyZXR1cm5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoaXNOYW1lc3BhY2UpIHtcclxuXHRcdFx0Zm9yIChjb25zdCBlbGVtZW50RXZlbnQgb2YgT2JqZWN0LmtleXMoZXZlbnRzKSkge1xyXG5cdFx0XHRcdHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIGVsZW1lbnRFdmVudCwgb3JpZ2luYWxUeXBlRXZlbnQuc2xpY2UoMSkpXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKGNvbnN0IFtrZXlIYW5kbGVycywgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xyXG5cdFx0XHRjb25zdCBoYW5kbGVyS2V5ID0ga2V5SGFuZGxlcnMucmVwbGFjZShzdHJpcFVpZFJlZ2V4LCAnJylcclxuXHJcblx0XHRcdGlmICghaW5OYW1lc3BhY2UgfHwgb3JpZ2luYWxUeXBlRXZlbnQuaW5jbHVkZXMoaGFuZGxlcktleSkpIHtcclxuXHRcdFx0XHRyZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICog0J/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40LUg0YHQvtCx0YvRgtC40Y8uINCf0L7QtNGA0L7QsdC90LXQtSDRgtGD0YIgaHR0cHM6Ly9sZWFybi5qYXZhc2NyaXB0LnJ1L2Rpc3BhdGNoLWV2ZW50c1xyXG5cdCAqIEBwYXJhbSBlbGVtZW50XHJcblx0ICogQHBhcmFtIGV2ZW50XHJcblx0ICogQHBhcmFtIGFyZ3NcclxuXHQgKiBAcmV0dXJucyB7KnxudWxsfVxyXG5cdCAqL1xyXG5cdHRyaWdnZXIoZWxlbWVudCwgZXZlbnQsIGFyZ3MpIHtcclxuXHRcdGlmICh0eXBlb2YgZXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XHJcblx0XHRcdHJldHVybiBudWxsXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGJ1YmJsZXMgPSB0cnVlO1xyXG5cdFx0bGV0IG5hdGl2ZURpc3BhdGNoID0gdHJ1ZTtcclxuXHRcdGxldCBkZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Y29uc3QgZXZ0ID0gaHlkcmF0ZU9iaihuZXcgRXZlbnQoZXZlbnQsIHsgYnViYmxlcywgY2FuY2VsYWJsZTogdHJ1ZSB9KSwgYXJncylcclxuXHJcblx0XHRpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xyXG5cdFx0XHRldnQucHJldmVudERlZmF1bHQoKVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChuYXRpdmVEaXNwYXRjaCkge1xyXG5cdFx0XHRlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBldnRcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEV2ZW50SGFuZGxlclxyXG4iLCJpbXBvcnQge2lzRWxlbWVudCwgbm9ybWFsaXplRGF0YX0gZnJvbSBcIi4uL2Z1bmN0aW9uc1wiO1xyXG5cclxuLyoqXHJcbiAqINCc0LDQvdC40L/Rg9C70Y/RhtC40Lgg0YEg0LDRgtGA0LjQsdGD0YLQsNC80Lgg0YMg0Y3Qu9C10LzQtdC90YLQsDpcclxuICogZ2V0ICjRjdC70LXQvNC10L3Rgiwg0LjQvNGPLCDRhNC70LDQsyAtINCy0YvRgNC10LfQsNGC0YwgZGF0YS0pIC0g0LzQtdGC0L7QtCDQstGL0LHQuNGA0LDQtdGCINC30L3QsNGH0LXQvdC40LUg0LDRgtGA0LjQsdGD0YLQsCDQv9C+INC10LPQviDQuNC80LXQvdC4LCDQtdGB0LvQuCDQsiDQv9C+0LvQtSDQuNC80LXQvdC4INC/0LXRgNC10LTQsNGC0YwgJ2RhdGEnIC0+INCx0YPQtNGD0YIg0LLRi9Cx0YDQsNC90Ysg0YLQvtC70YzQutC+INC00LDRgtCwINCw0YLRgNC40LHRg9GC0YssINC10YHQu9C4ICdhbGwnIC0+INC80LXRgtC+0LQg0LLQtdGA0L3QtdGCINC30L3QsNGH0LXQvdC40LUg0LLRgdC10YUg0LDRgtGA0LjQsdGD0YLQvtCyXHJcbiAqIGhhcyAo0Y3Qu9C10LzQtdC90YIsINC40LzRjykgLSDQtdGB0YLRjCDQu9C4INCw0YLRgNC40LHRg9GCINGDINGN0LvQtdC80LXQvdGC0LBcclxuICogc2V0ICjRjdC70LXQvNC10L3Rgiwg0LjQvNGPLCDQt9C90LDRh9C10L3QuNC1KSAtINGD0YHRgtCw0L3QvtCy0LrQsCDRgyDRjdC70LXQvNC10L3RgtCwINCw0YLRgNC40LHRg9GC0LAg0LjQu9C4INC10LPQviDQuNC30LzQtdC90LXQvdC40LVcclxuICogcmVtb3ZlICjRjdC70LXQvNC10L3Rgiwg0LjQvNGPKSAtINGD0LTQsNC70Y/QtdGCINCw0YLRgNC40LHRg9GCINGDINGN0LvQtdC80LXQvdGC0LBcclxuICovXHJcbmNvbnN0IE1hbmlwdWxhdG9yID0ge1xyXG5cdGdldChlbGVtZW50LCBuYW1lQXR0cmlidXRlID0gJ2RhdGEnLCBpc1JlbW92ZURhdGFOYW1lID0gdHJ1ZSkge1xyXG5cdFx0aWYgKCFlbGVtZW50KSB7XHJcblx0XHRcdHJldHVybiB7fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChuYW1lQXR0cmlidXRlID09PSAnZGF0YScpIHtcclxuXHRcdFx0bGV0IGVsbUJhc2UgPSBbJ2RhdGEtdmctdG9nZ2xlJywgJ2RhdGEtdmctdGFyZ2V0JywgJ2RhdGEtdmctZGlzbWlzcyddLFxyXG5cdFx0XHRcdGF0dHJpYnV0ZXMgPSB7fTtcclxuXHJcblx0XHRcdGxldCBhcnIgPSBbXS5maWx0ZXIuY2FsbChlbGVtZW50LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uIChhdCkge1xyXG5cdFx0XHRcdHJldHVybiAvXmRhdGEtLy50ZXN0KGF0Lm5hbWUpO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGlmIChhcnIubGVuZ3RoKSB7XHJcblx0XHRcdFx0YXJyLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcclxuXHRcdFx0XHRcdGxldCBuYW1lID0gdi5uYW1lO1xyXG5cclxuXHRcdFx0XHRcdGlmICghZWxtQmFzZS5pbmNsdWRlcyhuYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRpZiAoaXNSZW1vdmVEYXRhTmFtZSkgbmFtZSA9IG5hbWUuc2xpY2UoNSk7XHJcblx0XHRcdFx0XHRcdGF0dHJpYnV0ZXNbbmFtZV0gPSBub3JtYWxpemVEYXRhKHYudmFsdWUpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBhdHRyaWJ1dGVzO1xyXG5cdFx0fSBlbHNlIGlmIChuYW1lQXR0cmlidXRlID09PSAnYWxsJykge1xyXG5cdFx0XHRyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpLnJlZHVjZSgoYWNjLCBuYW1lKSA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIHsuLi5hY2MsIFtuYW1lXTogZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSl9O1xyXG5cdFx0XHR9LCB7fSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZUF0dHJpYnV0ZSk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0aGFzKGVsZW1lbnQsIG5hbWVBdHRyaWJ1dGUpIHtcclxuXHRcdHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShuYW1lQXR0cmlidXRlKTtcclxuXHR9LFxyXG5cclxuXHRzZXQoZWxlbWVudCwgbmFtZSwgdmFsdWUpIHtcclxuXHRcdGlmIChpc0VsZW1lbnQoZWxlbWVudCkgJiYgbmFtZSkge1xyXG5cdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0cmVtb3ZlKGVsZW1lbnQsIG5hbWVBdHRyaWJ1dGUpIHtcclxuXHRcdGlmIChpc0VsZW1lbnQoZWxlbWVudCkgJiYgbmFtZUF0dHJpYnV0ZSkge1xyXG5cdFx0XHRlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lQXR0cmlidXRlKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRoaWRlKGVsKSB7XHJcblx0XHRlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdH0sXHJcblxyXG5cdHNob3coZWwsIHN0YXRlID0gJ2Jsb2NrJykge1xyXG5cdFx0ZWwuc3R5bGUuZGlzcGxheSA9IHN0YXRlO1xyXG5cdH0sXHJcbn1cclxuXHJcbmV4cG9ydCB7TWFuaXB1bGF0b3J9XHJcbiIsIi8qKlxyXG4gKiDQoNCw0LHQvtGC0LAg0YEgRE9NXHJcbiAqIEBwYXJhbSBzZWxlY3RvclxyXG4gKiBAcmV0dXJucyB7Kn1cclxuICovXHJcbmltcG9ydCB7aXNFbGVtZW50fSBmcm9tIFwiLi4vZnVuY3Rpb25zXCI7XHJcblxyXG5jb25zdCBwYXJzZVNlbGVjdG9yID0gc2VsZWN0b3IgPT4ge1xyXG5cdGlmIChzZWxlY3RvciAmJiB3aW5kb3cuQ1NTICYmIHdpbmRvdy5DU1MuZXNjYXBlKSB7XHJcblx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoLyMoW15cXHNcIiMnXSspL2csIChtYXRjaCwgaWQpID0+IGAjJHtDU1MuZXNjYXBlKGlkKX1gKVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHNlbGVjdG9yXHJcbn1cclxuXHJcbmNvbnN0IGdldFNlbGVjdG9yID0gZWxlbWVudCA9PiB7XHJcblx0bGV0IHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmctdGFyZ2V0Jyk7XHJcblxyXG5cdGlmICghc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICcjJykge1xyXG5cdFx0bGV0IGhyZWZBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xyXG5cdFx0aWYgKCFocmVmQXR0cmlidXRlIHx8ICghaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJy4nKSkpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGhyZWZBdHRyaWJ1dGUuaW5jbHVkZXMoJyMnKSAmJiAhaHJlZkF0dHJpYnV0ZS5zdGFydHNXaXRoKCcjJykpIHtcclxuXHRcdFx0aHJlZkF0dHJpYnV0ZSA9IGAjJHtocmVmQXR0cmlidXRlLnNwbGl0KCcjJylbMV19YDtcclxuXHRcdH1cclxuXHJcblx0XHRzZWxlY3RvciA9IGhyZWZBdHRyaWJ1dGUgJiYgaHJlZkF0dHJpYnV0ZSAhPT0gJyMnID8gaHJlZkF0dHJpYnV0ZS50cmltKCkgOiBudWxsO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHNlbGVjdG9yID8gc2VsZWN0b3Iuc3BsaXQoJywnKS5tYXAoc2VsID0+IHBhcnNlU2VsZWN0b3Ioc2VsKSkuam9pbignLCcpIDogbnVsbDtcclxufVxyXG5cclxuY29uc3QgU2VsZWN0b3JzID0ge1xyXG5cdGZpbmQoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuXHRcdGlmIChpc0VsZW1lbnQoc2VsZWN0b3IpKSB7XHJcblx0XHRcdHJldHVybiBzZWxlY3RvcjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiBFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGZpbmRBbGwoc2VsZWN0b3IsIGNvbnRhaW5lciA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xyXG5cdFx0cmV0dXJuIFtdLmNvbmNhdCguLi5FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoY29udGFpbmVyLCBzZWxlY3RvcikpO1xyXG5cdH0sXHJcblxyXG5cdGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xyXG5cdFx0Y29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcclxuXHRcdGlmIChzZWxlY3RvcikgcmV0dXJuIFNlbGVjdG9ycy5maW5kKHNlbGVjdG9yKSA/IHNlbGVjdG9yIDogbnVsbFxyXG5cdFx0cmV0dXJuIG51bGxcclxuXHR9LFxyXG5cclxuXHRnZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpIHtcclxuXHRcdGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudCk7XHJcblx0XHRyZXR1cm4gc2VsZWN0b3IgPyBTZWxlY3RvcnMuZmluZChzZWxlY3RvcikgOiBudWxsXHJcblx0fSxcclxuXHJcblx0Z2V0TXVsdGlwbGVFbGVtZW50c0Zyb21TZWxlY3RvcihlbGVtZW50KSB7XHJcblx0XHRjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpO1xyXG5cdFx0cmV0dXJuIHNlbGVjdG9yID8gU2VsZWN0b3JzLmZpbmRBbGwoc2VsZWN0b3IpIDogW11cclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNlbGVjdG9yczsiLCIvKipcclxuICog0J3QsNCx0L7RgCDRgdC60YDQuNC/0YLQvtCyINC00LvRjyDRiNC40YDQvtC60L7Qs9C+INC/0YDQuNC80LXQvdC10L3QuNGPXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqINCV0YHQu9C4INGH0YLQvi3QvdC40LHRg9C00Ywg0LIg0L7QsdGK0LXQutGC0LVcclxuICogQHBhcmFtIG9ialxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbmZ1bmN0aW9uIGlzRW1wdHlPYmoob2JqKSB7XHJcblx0Zm9yIChsZXQgcHJvcCBpbiBvYmopIHtcclxuXHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdHJ1ZVxyXG59XHJcblxyXG4vKipcclxuICogaXNFbGVtZW50XHJcbiAqIEBwYXJhbSBvYmplY3RcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5jb25zdCBpc0VsZW1lbnQgPSBvYmplY3QgPT4ge1xyXG5cdGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xyXG5cdFx0cmV0dXJuIGZhbHNlXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdHlwZW9mIG9iamVjdC5ub2RlVHlwZSAhPT0gJ3VuZGVmaW5lZCdcclxufVxyXG5cclxuLyoqXHJcbiAqIGlzRGlzYWJsZWRcclxuICogQHBhcmFtIGVsZW1lbnRcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5jb25zdCBpc0Rpc2FibGVkID0gZWxlbWVudCA9PiB7XHJcblx0aWYgKCFlbGVtZW50IHx8IGVsZW1lbnQubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XHJcblx0XHRyZXR1cm4gdHJ1ZVxyXG5cdH1cclxuXHJcblx0aWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSB7XHJcblx0XHRyZXR1cm4gdHJ1ZVxyXG5cdH1cclxuXHJcblx0aWYgKHR5cGVvZiBlbGVtZW50LmRpc2FibGVkICE9PSAndW5kZWZpbmVkJykge1xyXG5cdFx0cmV0dXJuIGVsZW1lbnQuZGlzYWJsZWRcclxuXHR9XHJcblxyXG5cdHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSAhPT0gJ2ZhbHNlJ1xyXG59XHJcblxyXG4vKipcclxuICogaXNWaXNpYmxlXHJcbiAqIEBwYXJhbSBlbGVtZW50XHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuZnVuY3Rpb24gaXNWaXNpYmxlIChlbGVtZW50KSB7XHJcblx0aWYgKCFpc0VsZW1lbnQoZWxlbWVudCkgfHwgZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0cmV0dXJuIGZhbHNlXHJcblx0fVxyXG5cclxuXHRjb25zdCBlbGVtZW50SXNWaXNpYmxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5JykgPT09ICd2aXNpYmxlJ1xyXG5cdGNvbnN0IGNsb3NlZERldGFpbHMgPSBlbGVtZW50LmNsb3Nlc3QoJ2RldGFpbHM6bm90KFtvcGVuXSknKVxyXG5cclxuXHRpZiAoIWNsb3NlZERldGFpbHMpIHtcclxuXHRcdHJldHVybiBlbGVtZW50SXNWaXNpYmxlXHJcblx0fVxyXG5cclxuXHRpZiAoY2xvc2VkRGV0YWlscyAhPT0gZWxlbWVudCkge1xyXG5cdFx0Y29uc3Qgc3VtbWFyeSA9IGVsZW1lbnQuY2xvc2VzdCgnc3VtbWFyeScpXHJcblx0XHRpZiAoc3VtbWFyeSAmJiBzdW1tYXJ5LnBhcmVudE5vZGUgIT09IGNsb3NlZERldGFpbHMpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHN1bW1hcnkgPT09IG51bGwpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZWxlbWVudElzVmlzaWJsZVxyXG59XHJcblxyXG4vKipcclxuICogaXNPYmplY3RcclxuICogQHBhcmFtIG9ialxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbmZ1bmN0aW9uIGlzT2JqZWN0KG9iaikge1xyXG5cdHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCdcclxufVxyXG5cclxuLyoqXHJcbiAqINCf0YDQuNCy0L7QtNC40Lwg0LIg0L/QvtGA0Y/QtNC+0Log0YLQuNC/0Ysg0LTQsNC90L3Ri9GFXHJcbiAqIEBwYXJhbSB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7YW55fVxyXG4gKi9cclxuZnVuY3Rpb24gbm9ybWFsaXplRGF0YSh2YWx1ZSkgIHtcclxuXHRpZiAodmFsdWUgPT09ICd0cnVlJykge1xyXG5cdFx0cmV0dXJuIHRydWVcclxuXHR9XHJcblxyXG5cdGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xyXG5cdFx0cmV0dXJuIGZhbHNlXHJcblx0fVxyXG5cclxuXHRpZiAodmFsdWUgPT09IE51bWJlcih2YWx1ZSkudG9TdHJpbmcoKSkge1xyXG5cdFx0cmV0dXJuIE51bWJlcih2YWx1ZSlcclxuXHR9XHJcblxyXG5cdGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09ICdudWxsJykge1xyXG5cdFx0cmV0dXJuIG51bGxcclxuXHR9XHJcblxyXG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XHJcblx0XHRyZXR1cm4gdmFsdWVcclxuXHR9XHJcblxyXG5cdHRyeSB7XHJcblx0XHRyZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxyXG5cdH0gY2F0Y2gge1xyXG5cdFx0cmV0dXJuIHZhbHVlXHJcblx0fVxyXG59XHJcblxyXG4vKipcclxuICog0KPQtNCw0LvRj9C10Lwg0Y3Qu9C10LzQtdC90YLRiyDRgSDQvNCw0YHRgdC40LLQsFxyXG4gKiBAcGFyYW0gYXJyXHJcbiAqIEBwYXJhbSBlbFxyXG4gKi9cclxuZnVuY3Rpb24gcmVtb3ZlRWxlbWVudEFycmF5KGFyciwgZWwpIHtcclxuXHRyZXR1cm4gYXJyLmZpbHRlcigoaXRlbSkgPT4gIWVsLmluY2x1ZGVzKGl0ZW0pKTtcclxufVxyXG5cclxuLyoqXHJcbiAqINCT0LvRg9Cx0L7QutC+0LUg0L7QsdGK0LXQtNC40L3QtdC90LjQtSDQvtCx0YrQtdC60YLQvtCyXHJcbiAqIEBwYXJhbSBvYmplY3RzXHJcbiAqIEByZXR1cm5zIHsqfVxyXG4gKi9cclxuZnVuY3Rpb24gbWVyZ2VEZWVwT2JqZWN0KC4uLm9iamVjdHMpIHtcclxuXHRjb25zdCBpc09iamVjdCA9IG9iaiA9PiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCc7XHJcblxyXG5cdHJldHVybiBvYmplY3RzLnJlZHVjZSgocHJldiwgb2JqKSA9PiB7XHJcblx0XHRPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcclxuXHRcdFx0Y29uc3QgcFZhbCA9IHByZXZba2V5XTtcclxuXHRcdFx0Y29uc3Qgb1ZhbCA9IG9ialtrZXldO1xyXG5cclxuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkocFZhbCkgJiYgQXJyYXkuaXNBcnJheShvVmFsKSkge1xyXG5cdFx0XHRcdHByZXZba2V5XSA9IHBWYWwuY29uY2F0KC4uLm9WYWwpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgaWYgKGlzT2JqZWN0KHBWYWwpICYmIGlzT2JqZWN0KG9WYWwpKSB7XHJcblx0XHRcdFx0cHJldltrZXldID0gbWVyZ2VEZWVwT2JqZWN0KHBWYWwsIG9WYWwpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdHByZXZba2V5XSA9IG9WYWw7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdHJldHVybiBwcmV2O1xyXG5cdH0sIHt9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENhbGxiYWNrXHJcbiAqIEBwYXJhbSBwb3NzaWJsZUNhbGxiYWNrXHJcbiAqIEBwYXJhbSBhcmdzXHJcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWVcclxuICogQHJldHVybnMgeyp9XHJcbiAqL1xyXG5mdW5jdGlvbiBleGVjdXRlKHBvc3NpYmxlQ2FsbGJhY2ssIGFyZ3MgPSBbXSwgZGVmYXVsdFZhbHVlID0gcG9zc2libGVDYWxsYmFjaykge1xyXG5cdHJldHVybiB0eXBlb2YgcG9zc2libGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IHBvc3NpYmxlQ2FsbGJhY2soLi4uYXJncykgOiBkZWZhdWx0VmFsdWVcclxufVxyXG5cclxuLyoqXHJcbiAqIFRyYW5zaXRpb25cclxuICogQHBhcmFtIGNhbGxiYWNrXHJcbiAqIEBwYXJhbSB0cmFuc2l0aW9uRWxlbWVudFxyXG4gKiBAcGFyYW0gd2FpdEZvclRyYW5zaXRpb25cclxuICovXHJcbmNvbnN0IFRSQU5TSVRJT05fRU5EID0gJ3RyYW5zaXRpb25lbmQnO1xyXG5jb25zdCBNSUxMSVNFQ09ORFNfTVVMVElQTElFUiA9IDEwMDA7XHJcblxyXG5mdW5jdGlvbiBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uIChjYWxsYmFjaywgdHJhbnNpdGlvbkVsZW1lbnQsIHdhaXRGb3JUcmFuc2l0aW9uID0gdHJ1ZSwgdGltZU91dE1zKSB7XHJcblx0aWYgKCF3YWl0Rm9yVHJhbnNpdGlvbikge1xyXG5cdFx0ZXhlY3V0ZShjYWxsYmFjaylcclxuXHRcdHJldHVyblxyXG5cdH1cclxuXHJcblx0Y29uc3QgZHVyYXRpb25QYWRkaW5nID0gNVxyXG5cdGNvbnN0IGVtdWxhdGVkRHVyYXRpb24gPSB0aW1lT3V0TXMgPyB0aW1lT3V0TXMgOiBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0cmFuc2l0aW9uRWxlbWVudCkgKyBkdXJhdGlvblBhZGRpbmc7XHJcblxyXG5cdGxldCBjYWxsZWQgPSBmYWxzZVxyXG5cclxuXHRjb25zdCBoYW5kbGVyID0gKHsgdGFyZ2V0IH0pID0+IHtcclxuXHRcdGlmICh0YXJnZXQgIT09IHRyYW5zaXRpb25FbGVtZW50KSB7XHJcblx0XHRcdHJldHVyblxyXG5cdFx0fVxyXG5cclxuXHRcdGNhbGxlZCA9IHRydWVcclxuXHRcdHRyYW5zaXRpb25FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpXHJcblx0XHRleGVjdXRlKGNhbGxiYWNrKVxyXG5cdH1cclxuXHJcblx0dHJhbnNpdGlvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcilcclxuXHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdGlmICghY2FsbGVkKSB7XHJcblx0XHRcdHRyaWdnZXJUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25FbGVtZW50KVxyXG5cdFx0fVxyXG5cdH0sIGVtdWxhdGVkRHVyYXRpb24pXHJcbn1cclxuXHJcbmNvbnN0IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50ID0gZWxlbWVudCA9PiB7XHJcblx0aWYgKCFlbGVtZW50KSB7XHJcblx0XHRyZXR1cm4gMFxyXG5cdH1cclxuXHJcblx0Ly8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcclxuXHRsZXQgeyB0cmFuc2l0aW9uRHVyYXRpb24sIHRyYW5zaXRpb25EZWxheSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcclxuXHJcblx0Y29uc3QgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pXHJcblx0Y29uc3QgZmxvYXRUcmFuc2l0aW9uRGVsYXkgPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpXHJcblxyXG5cdC8vIFJldHVybiAwIGlmIGVsZW1lbnQgb3IgdHJhbnNpdGlvbiBkdXJhdGlvbiBpcyBub3QgZm91bmRcclxuXHRpZiAoIWZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uICYmICFmbG9hdFRyYW5zaXRpb25EZWxheSkge1xyXG5cdFx0cmV0dXJuIDBcclxuXHR9XHJcblxyXG5cdC8vIElmIG11bHRpcGxlIGR1cmF0aW9ucyBhcmUgZGVmaW5lZCwgdGFrZSB0aGUgZmlyc3RcclxuXHR0cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24uc3BsaXQoJywnKVswXVxyXG5cdHRyYW5zaXRpb25EZWxheSA9IHRyYW5zaXRpb25EZWxheS5zcGxpdCgnLCcpWzBdXHJcblxyXG5cdHJldHVybiAoTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKSArIE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSkpICogTUlMTElTRUNPTkRTX01VTFRJUExJRVJcclxufVxyXG5cclxuY29uc3QgdHJpZ2dlclRyYW5zaXRpb25FbmQgPSBlbGVtZW50ID0+IHtcclxuXHRlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFRSQU5TSVRJT05fRU5EKSlcclxufVxyXG5cclxuLyoqXHJcbiAqINCi0YDRjtC6INC00LvRjyDQv9C10YDQtdC30LDQv9GD0YHQutCwINCw0L3QuNC80LDRhtC40Lgg0Y3Qu9C10LzQtdC90YLQsFxyXG4gKlxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XHJcbiAqIEByZXR1cm4gdm9pZFxyXG4gKlxyXG4gKiBA0YHQvNC+0YLRgNC4IGh0dHBzOi8vd3d3LmNoYXJpc3RoZW8uaW8vYmxvZy8yMDIxLzAyL3Jlc3RhcnQtYS1jc3MtYW5pbWF0aW9uLXdpdGgtamF2YXNjcmlwdC8jcmVzdGFydGluZy1hLWNzcy1hbmltYXRpb25cclxuICovXHJcbmNvbnN0IHJlZmxvdyA9IGVsZW1lbnQgPT4ge1xyXG5cdGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBOb29wXHJcbiAqL1xyXG5jb25zdCBub29wID0gKCkgPT4ge307XHJcblxyXG4vKipcclxuICog0JPQtdC90LXRgNCw0YbQuNGPINGB0LvRg9GH0LDQudC90L7QuSDRgdGC0YDQvtC60LhcclxuICovXHJcbmZ1bmN0aW9uIG1ha2VSYW5kb21TdHJpbmcobGVuZ3RoID0gNykge1xyXG5cdGxldCByZXN1bHQgPSAnJztcclxuXHRjb25zdCBjaGFyYWN0ZXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcclxuXHRjb25zdCBjaGFyYWN0ZXJzTGVuZ3RoID0gY2hhcmFjdGVycy5sZW5ndGg7XHJcblx0bGV0IGNvdW50ZXIgPSAwO1xyXG5cdHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XHJcblx0XHRyZXN1bHQgKz0gY2hhcmFjdGVycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcmFjdGVyc0xlbmd0aCkpO1xyXG5cdFx0Y291bnRlciArPSAxO1xyXG5cdH1cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vKipcclxuICog0KLRgNCw0L3RgdC70LjRgtC10YDQsNGG0LjRjyDRgdC40LzQstC+0LvQvtCyINGBINC70LDRgtC40L3QuNGG0Ysg0L3QsCDQutC40YDQuNC70LvQuNGG0YMg0Lgg0L7QsdGA0LDRgtC90L5cclxuICogQHBhcmFtIHRleHRcclxuICogQHBhcmFtIGVuVG9SdVxyXG4gKiBAcmV0dXJucyB7Kn1cclxuICovXHJcbmZ1bmN0aW9uIHRyYW5zbGl0ZXJhdGUodGV4dCwgZW5Ub1J1KSB7XHJcblx0bGV0IHJ1ID0gXCLQuSDRhiDRgyDQuiDQtSDQvSDQsyDRiCDRiSDQtyDRhSDRiiDRhCDRiyDQsiDQsCDQvyDRgCDQviDQuyDQtCDQtiDRjSDRjyDRhyDRgSDQvCDQuCDRgiDRjCDQsSDRjlwiLnNwbGl0KC8gKy9nKTtcclxuXHRsZXQgZW4gPSBcInEgdyBlIHIgdCB5IHUgaSBvIHAgWyBdIGEgcyBkIGYgZyBoIGogayBsIDsgJyB6IHggYyB2IGIgbiBtICwgLlwiLnNwbGl0KC8gKy9nKTtcclxuXHRsZXQgeDtcclxuXHJcblx0Zm9yICh4ID0gMDsgeCA8IHJ1Lmxlbmd0aDsgeCsrKSB7XHJcblx0XHR0ZXh0ID0gdGV4dC5zcGxpdChlblRvUnUgPyBlblt4XSA6IHJ1W3hdKS5qb2luKGVuVG9SdSA/IHJ1W3hdIDogZW5beF0pO1xyXG5cdFx0dGV4dCA9IHRleHQuc3BsaXQoZW5Ub1J1ID8gZW5beF0udG9VcHBlckNhc2UoKSA6IHJ1W3hdLnRvVXBwZXJDYXNlKCkpLmpvaW4oZW5Ub1J1ID8gcnVbeF0udG9VcHBlckNhc2UoKSA6IGVuW3hdLnRvVXBwZXJDYXNlKCkpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRleHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKlxyXG4gKi9cclxuY29uc3QgaXNSVEwgPSAoKSA9PiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGlyID09PSAncnRsJ1xyXG5cclxuZXhwb3J0IHtpc0VsZW1lbnQsIGlzVmlzaWJsZSwgaXNEaXNhYmxlZCwgaXNPYmplY3QsIGlzRW1wdHlPYmosIG1lcmdlRGVlcE9iamVjdCwgcmVtb3ZlRWxlbWVudEFycmF5LCBub3JtYWxpemVEYXRhLCBleGVjdXRlLCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uLCByZWZsb3csIG5vb3AsIG1ha2VSYW5kb21TdHJpbmcsIGlzUlRMLCB0cmFuc2xpdGVyYXRlfSIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLy8gY3NzINC60LvQsNGB0YHRiyDQv9C+INGD0LzQvtC70YfQsNC90LjRjlxyXG5pbXBvcnQgXCIuL2FwcC91dGlscy9zY3NzL2RlZmF1bHQuc2Nzc1wiO1xyXG5cclxuLy8gc2lkZWJhclxyXG5pbXBvcnQgXCIuL2FwcC9tb2R1bGVzL3Znc2lkZWJhci9zY3NzL3Znc2lkZWJhci5zY3NzXCI7XHJcbmltcG9ydCBWR1NpZGViYXIgZnJvbSBcIi4vYXBwL21vZHVsZXMvdmdzaWRlYmFyL2pzL3Znc2lkZWJhclwiO1xyXG5cclxuLy8gY29sbGFwc2VcclxuaW1wb3J0IFZHQ29sbGFwc2UgZnJvbSBcIi4vYXBwL21vZHVsZXMvdmdjb2xsYXBzZS9qcy92Z2NvbGxhcHNlXCI7XHJcblxyXG4vLyBuYXZcclxuaW1wb3J0IFwiLi9hcHAvbW9kdWxlcy92Z25hdi9zY3NzL3ZnbmF2LnNjc3NcIjtcclxuaW1wb3J0IFZHTmF2IGZyb20gXCIuL2FwcC9tb2R1bGVzL3ZnbmF2L2pzL3ZnbmF2XCI7XHJcblxyXG4vLyBkcm9wZG93blxyXG5pbXBvcnQgXCIuL2FwcC9tb2R1bGVzL3ZnZHJvcGRvd24vc2Nzcy92Z2Ryb3Bkb3duLnNjc3NcIjtcclxuaW1wb3J0IFZHRHJvcGRvd24gZnJvbSBcIi4vYXBwL21vZHVsZXMvdmdkcm9wZG93bi9qcy92Z2Ryb3Bkb3duXCI7XHJcblxyXG4vLyBtb2RhbFxyXG5pbXBvcnQgXCIuL2FwcC9tb2R1bGVzL3ZnbW9kYWwvc2Nzcy92Z21vZGFsLnNjc3NcIjtcclxuaW1wb3J0IFZHTW9kYWwgZnJvbSBcIi4vYXBwL21vZHVsZXMvdmdtb2RhbC9qcy92Z21vZGFsXCI7XHJcblxyXG4vLyBmb3JtIHNlbmRlclxyXG5pbXBvcnQgXCIuL2FwcC9tb2R1bGVzL3ZnZm9ybXNlbmRlci9zY3NzL3ZnZm9ybXNlbmRlci5zY3NzXCI7XHJcbmltcG9ydCBWR0Zvcm1TZW5kZXIgZnJvbSBcIi4vYXBwL21vZHVsZXMvdmdmb3Jtc2VuZGVyL2pzL3ZnZm9ybXNlbmRlclwiO1xyXG5cclxuLy8gcm9sbHVwXHJcbmltcG9ydCBcIi4vYXBwL21vZHVsZXMvdmdyb2xsdXAvc2Nzcy92Z3JvbGx1cC5zY3NzXCI7XHJcbmltcG9ydCBWR1JvbGx1cCBmcm9tIFwiLi9hcHAvbW9kdWxlcy92Z3JvbGx1cC9qcy92Z3JvbGx1cFwiO1xyXG5cclxuLy8gbGF3IGNvb2tpZVxyXG5pbXBvcnQgXCIuL2FwcC9tb2R1bGVzL3ZnbGF3Y29va2llL3Njc3MvdmdsYXdjb29raWUuc2Nzc1wiO1xyXG5pbXBvcnQgVkdMYXdDb29raWUgZnJvbSBcIi4vYXBwL21vZHVsZXMvdmdsYXdjb29raWUvanMvdmdsYXdjb29raWVcIjtcclxuXHJcbi8vIHNlbGVjdFxyXG5pbXBvcnQgXCIuL2FwcC9tb2R1bGVzL3Znc2VsZWN0L3Njc3MvdmdzZWxlY3Quc2Nzc1wiO1xyXG5pbXBvcnQgVkdTZWxlY3QgZnJvbSBcIi4vYXBwL21vZHVsZXMvdmdzZWxlY3QvanMvdmdzZWxlY3RcIjtcclxuXHJcbmV4cG9ydCB7XHJcblx0VkdTaWRlYmFyLCBWR0NvbGxhcHNlLCBWR05hdiwgVkdEcm9wZG93biwgVkdNb2RhbCwgVkdGb3JtU2VuZGVyLCBWR1JvbGx1cCwgVkdMYXdDb29raWUsIFZHU2VsZWN0XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
1
+ /*! For license information please see vgapp.js.LICENSE.txt */
2
+ var vg;(()=>{"use strict";var e={d:(t,s)=>{for(var a in s)e.o(s,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:s[a]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};function s(e){for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}e.r(t),e.d(t,{VGCollapse:()=>be,VGDropdown:()=>Ze,VGFormSender:()=>Lt,VGLawCookie:()=>Ht,VGModal:()=>wt,VGNav:()=>Ne,VGRollup:()=>St,VGSelect:()=>ns,VGSidebar:()=>re});const a=e=>!!n(e)&&void 0!==e.nodeType,i=e=>!e||e.nodeType!==Node.ELEMENT_NODE||!!e.classList.contains("disabled")||(void 0!==e.disabled?e.disabled:e.hasAttribute("disabled")&&"false"!==e.getAttribute("disabled"));function n(e){return e&&"object"==typeof e}function r(e){if("true"===e)return!0;if("false"===e)return!1;if(e===Number(e).toString())return Number(e);if(""===e||"null"===e)return null;if("string"!=typeof e)return e;try{return JSON.parse(decodeURIComponent(e))}catch{return e}}function o(...e){const t=e=>e&&"object"==typeof e;return e.reduce(((e,s)=>(Object.keys(s).forEach((a=>{const i=e[a],n=s[a];Array.isArray(i)&&Array.isArray(n)?e[a]=i.concat(...n):t(i)&&t(n)?e[a]=o(i,n):e[a]=n})),e)),{})}function l(e,t=[],s=e){return"function"==typeof e?e(...t):s}const d="transitionend",c=e=>{e.offsetHeight},m=()=>{};function h(e=7){let t="";let s=0;for(;s<e;)t+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(62*Math.random())),s+=1;return t}const u=()=>"rtl"===document.documentElement.dir,g=e=>{let t=e.getAttribute("data-vg-target");if(!t||"#"===t){let s=e.getAttribute("href");if(!s||!s.includes("#")&&!s.startsWith("."))return null;s.includes("#")&&!s.startsWith("#")&&(s=`#${s.split("#")[1]}`),t=s&&"#"!==s?s.trim():null}return t?t.split(",").map((e=>(e=>(e&&window.CSS&&window.CSS.escape&&(e=e.replace(/#([^\s"#']+)/g,((e,t)=>`#${CSS.escape(t)}`))),e))(e))).join(","):null},p={find:(e,t=document.documentElement)=>a(e)?e:Element.prototype.querySelector.call(t,e),findAll:(e,t=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(t,e)),getSelectorFromElement(e){const t=g(e);return t&&p.find(t)?t:null},getElementFromSelector(e){const t=g(e);return t?p.find(t):null},getMultipleElementsFromSelector(e){const t=g(e);return t?p.findAll(t):[]}},_=p,f=new Map,v={set(e,t,s){f.has(e)||f.set(e,new Map);const a=f.get(e);a.has(t)||0===a.size?a.set(t,s):console.error(`VGApp не допускает более одного экземпляра для каждого элемента. Связанный экземпляр: ${Array.from(a.keys())[0]}.`)},get:(e,t)=>f.has(e)&&f.get(e).get(t)||null,remove(e,t){if(!f.has(e))return;const s=f.get(e);s.delete(t),0===s.size&&f.delete(e)}},b={get(e,t="data",s=!0){if(!e)return{};if("data"===t){let t=["data-vg-toggle","data-vg-target","data-vg-dismiss"],a={},i=[].filter.call(e.attributes,(function(e){return/^data-/.test(e.name)}));return i.length&&i.forEach((function(e){let i=e.name;t.includes(i)||(s&&(i=i.slice(5)),a[i]=r(e.value))})),a}return"all"===t?e.getAttributeNames().reduce(((t,s)=>({...t,[s]:e.getAttribute(s)})),{}):e.getAttribute(t)},has:(e,t)=>e.hasAttribute(t),set(e,t,s){a(e)&&t&&e.setAttribute(t,s)},remove(e,t){a(e)&&t&&e.removeAttribute(t)},hide(e){e.style.display="none"},show(e,t="block"){e.style.display=t}},w=class{constructor(e,t=null){this._params=this.merge(e,t)}get(){return this._params}fromElement(e){return a(e)?b.get(e):{}}merge(e,t){let s=o(e,this.fromElement(t));for(let e in s)if(-1!==e.indexOf("-")){let t=e.split("-"),a=r(s[e]);t[0]in s&&t[1]in s[t[0]]&&(s[t[0]][t[1]]=a),delete s[e]}return"params"in s&&(s=o(s,s.params),delete s.params),s}},y=/[^.]*(?=\..*)\.|.*/,k=/\..*/,x=/::\d+$/,L={};let E=1;const A={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","submit","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function S(e,t){return t&&`${t}::${E++}`||e.uidEvent||E++}function T(e){const t=S(e);return e.uidEvent=t,L[t]=L[t]||{},L[t]}function M(e,t,s=null){return Object.values(e).find((e=>e.callable===t&&e.delegationSelector===s))}function O(e,t,s){const a="string"==typeof t,i=a?s:t||s;let n=(r=(r=e).replace(k,""),A[r]||r);var r;return C.has(n)||(n=e),[a,i,n]}function $(e,t,s,a,i){if("string"!=typeof t||!e)return;let[n,r,o]=O(t,s,a);if(t in A){const e=e=>function(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)};r=e(r)}const l=T(e),d=l[o]||(l[o]={}),c=M(d,r,n?s:null);if(c)return void(c.oneOff=c.oneOff&&i);const m=S(r,t.replace(y,"")),h=n?function(e,t,s){return function a(i){const n=e.querySelectorAll(t);for(let{target:r}=i;r&&r!==this;r=r.parentNode)for(const o of n)if(o===r)return N(i,{delegateTarget:r}),a.oneOff&&I.off(e,i.type,t,s),s.apply(r,[i])}}(e,s,r):function(e,t){return function s(a){return N(a,{delegateTarget:e}),s.oneOff&&I.off(e,a.type,t),t.apply(e,[a])}}(e,r);h.delegationSelector=n?s:null,h.callable=r,h.oneOff=i,h.uidEvent=m,d[m]=h,e.addEventListener(o,h,n)}function j(e,t,s,a,i){const n=M(t[s],a,i);n&&(e.removeEventListener(s,n,Boolean(i)),delete t[s][n.uidEvent])}function P(e,t,s,a){const i=t[s]||{};for(const[n,r]of Object.entries(i))n.includes(a)&&j(e,t,s,r.callable,r.delegationSelector)}function N(e,t={}){for(const[s,a]of Object.entries(t))try{e[s]=a}catch{Object.defineProperty(e,s,{configurable:!0,get:()=>a})}return e}const I={on(e,t,s,a){$(e,t,s,a,!1)},one(e,t,s,a){$(e,t,s,a,!0)},off(e,t,s,a){if("string"!=typeof t||!e)return;const[i,n,r]=O(t,s,a),o=r!==t,l=T(e),d=l[r]||{},c=t.startsWith(".");if(void 0===n){if(c)for(const s of Object.keys(l))P(e,l,s,t.slice(1));for(const[s,a]of Object.entries(d)){const i=s.replace(x,"");o&&!t.includes(i)||j(e,l,r,a.callable,a.delegationSelector)}}else{if(!Object.keys(d).length)return;j(e,l,r,n,i?s:null)}},trigger(e,t,s){if("string"!=typeof t||!e)return null;const a=N(new Event(t,{bubbles:!0,cancelable:!0}),s);return e.dispatchEvent(a),a}},q=I,D=e=>({error:'<svg viewBox="0 0 87 87" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="ui-success" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="Group-2" transform="translate(2.000000, 2.000000)"><circle id="Oval-2" stroke="rgba(252, 191, 191, .5)" stroke-width="4" cx="41.5" cy="41.5" r="41.5"></circle><circle class="ui-error-circle" stroke="#F74444" stroke-width="4" cx="41.5" cy="41.5" r="41.5"></circle><path class="ui-error-line1" d="M22.244224,22 L60.4279902,60.1837662" id="Line" stroke="#F74444" stroke-width="3" stroke-linecap="square"></path><path class="ui-error-line2" d="M60.755776,21 L23.244224,59.8443492" id="Line" stroke="#F74444" stroke-width="3" stroke-linecap="square"></path></g></g></svg>',success:'<svg viewBox="0 0 87 87" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="ui-error" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="Group-3" transform="translate(2.000000, 2.000000)"><circle id="Oval-2" stroke="rgba(117, 183, 152, 0.4)" stroke-width="4" cx="41.5" cy="41.5" r="41.5"></circle><circle class="ui-success-circle" id="Oval-2" stroke="#A5DC86" stroke-width="4" cx="41.5" cy="41.5" r="41.5"></circle><polyline class="ui-success-path" id="Path-2" stroke="#A5DC86" stroke-width="4" points="19 38.8036813 31.1020744 54.8046875 63.299221 28"></polyline></g></g></svg>',waiting:'<svg viewBox="0 0 87 87" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="ui-waiting" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="Group-3" transform="translate(2.000000, 2.000000)"><circle id="Oval-2" stroke="rgba(255, 218, 106, 0.4)" stroke-width="4" cx="41.5" cy="41.5" r="41.5"></circle><circle class="ui-waiting-circle" id="Oval-2" stroke="#ffda6a" stroke-width="4" cx="41.5" cy="41.5" r="41.5"></circle><path class="ui-waiting-line1" d="M43 63C54.598 63 64 53.598 64 42C64 30.402 54.598 21 43 21C31.402 21 22 30.402 22 42C22 53.598 31.402 63 43 63Z" stroke-width="3" stroke="#ffda6a" stroke-linecap="round" stroke-linejoin="round"/><path class="ui-waiting-line2" d="M40.6667 32.6641V44.3307H52.3334" stroke="#ffda6a" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></g></g></svg>',dots:'<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-three-dots-vertical" viewBox="0 0 16 16"><path d="M9.5 13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"/></svg>',cross:'<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 224.512 224.512" xml:space="preserve"><g><polygon points="224.507,6.997 217.521,0 112.256,105.258 6.998,0 0.005,6.997 105.263,112.254 0.005,217.512 6.998,224.512 112.256,119.24 217.521,224.512 224.507,217.512 119.249,112.254 "/></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g></svg>'}[e]??{}),H=(e,t="hide")=>{const s=`click.dismiss.${e.EVENT_KEY}`,a=e.NAME;q.on(document,s,`[data-vg-dismiss="${a}"]`,(function(s){if(["A","AREA"].includes(this.tagName)&&s.preventDefault(),i(this))return;const n=_.getSelectorFromElement(this)||this.closest(`.vg-${a}`);e.getOrCreateInstance(n)[t]()}))},B={x:function(){if("undefined"!=typeof XMLHttpRequest)return new XMLHttpRequest;let e,t=["MSXML2.XmlHttp.6.0","MSXML2.XmlHttp.5.0","MSXML2.XmlHttp.4.0","MSXML2.XmlHttp.3.0","MSXML2.XmlHttp.2.0","Microsoft.XmlHttp"];for(let s=0;s<t.length;s++)try{e=new ActiveXObject(t[s]);break}catch(e){}return e},send:function(e,t,s,a,i){void 0===i&&(i=!0);let n=B.x();n.open(s,e,i),n.setRequestHeader("X-Requested-With","XMLHttpRequest"),n.onreadystatechange=function(){4===n.readyState&&(200===n.status?t("success",{text:n.statusText,response:n.responseText,code:n.status}):t("error",{text:n.statusText,response:n.responseText,code:n.status}))},n.send(a)},get:function(e,t,a,i){let n=[];if(!s(t))for(let e of t)n.push(encodeURIComponent(e[0])+"="+encodeURIComponent(e[1]));B.send(e+(n.length?"?"+n.join("&"):""),a,"GET",null,i)},post:function(e,t,s,a){B.send(e,s,"POST",t,a)}},R=class{constructor(e,t,s={}){this._params=o({enable:!1,in:"animate__backInUp",out:"animate__backOutUp",delay:0},s),this.classes={animated:"animate__animated"},this._params.enable&&a(e)&&(this._element=e,this._name_key=t,this._element.classList.contains(this.classes.animated)||this._element.classList.add(this.classes.animated),this._triggers())}_triggers(){q.on(this._element,this._name_key+".show",(()=>{this._element.classList.remove(this._params.out),this._element.classList.add(this._params.in)})),q.on(this._element,this._name_key+".hide",(()=>{this._element.classList.remove(this._params.in),this._element.classList.add(this._params.out)})),q.on(this._element,this._name_key+".hidden",(()=>{this._element.classList.remove(this._params.out)}))}},F=class{constructor(e){if(e){if(this._element=_.find(e),!this._element)throw new Error("Товарищ! Первый параметр не должен быть пустым!");this._params={},v.set(this._element,this.constructor.NAME_KEY,this)}}_getParams(e,t){return new w(t,e).get()}dispose(){v.remove(this._element,this.constructor.NAME_KEY),q.off(this._element,this.constructor.EVENT_KEY);for(const e of Object.getOwnPropertyNames(this))this[e]=null}_route(e){const t=this;let s=null;const a=e=>{s&&(s.innerHTML=e)};t._params.hasOwnProperty("ajax")&&t._params.ajax.route&&(!1 in t._params.ajax&&(t._params.ajax.method="get"),"target"in t._params.ajax&&t._params.ajax.target&&(s=_.find(t._params.ajax.target)),"loader"in t._params.ajax&&t._params.ajax.loader&&a('<div class="vg-loader"></div>'),B[t._params.ajax.method](t._params.ajax.route,t._params.ajax.data||{},(function(t,s){a(s.response),l(e,[t,s])})))}_dismissElement(){let e=D("cross"),t=this._element.querySelector(".vg-btn-close");t&&(t.querySelector("svg")||t.insertAdjacentHTML("beforeend",e))}_queueCallback(e,t,s=!0,a){!function(e,t,s=!0,a){if(!s)return void l(e);const i=a||(e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:s}=window.getComputedStyle(e);const a=Number.parseFloat(t),i=Number.parseFloat(s);return a||i?(t=t.split(",")[0],s=s.split(",")[0],1e3*(Number.parseFloat(t)+Number.parseFloat(s))):0})(t)+5;let n=!1;const r=({target:s})=>{s===t&&(n=!0,t.removeEventListener(d,r),l(e))};t.addEventListener(d,r),setTimeout((()=>{n||(e=>{e.dispatchEvent(new Event(d))})(t)}),i)}(e,t,s,a)}_animation(e,t,s={}){new R(e,t,s)}static getInstance(e){return v.get(_.find(e),this.NAME_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,s(t)?{}:t)}static get DATA_KEY(){return`vg.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}},X=class{static append(){document.body.style.paddingRight=function(){const e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}()+"px",document.body.style.overflow="hidden"}static destroy(){document.body.style.overflow="",document.body.style.paddingRight="",b.get(document.body,"style")||b.remove(document.body,"style")}},Y="vg-backdrop",z="fade";class K{static show(e){K._append(),l(e)}static hide(e){K._destroy(),l(e)}static _append(){if(_.find("."+Y))return!1;let e=document.createElement("div");e.classList.add(Y),document.body.append(e),setTimeout((()=>{e.classList.add(z)}),50),q.on(e,"mousedown.vg.backdrop",(()=>{K.hide(),X.destroy()}))}static _destroy(){let e=_.find("."+Y);e&&(e.classList.remove(z),setTimeout((()=>{e.remove()}),500))}}const V=K,W="vg.sidebar",U="show",G="vg-sidebar-open",J=`${W}.hide`,Z=`${W}.hidden`,Q=`${W}.show`,ee=`${W}.shown`,te=`${W}.loaded`,se=`keydown.dismiss.${W}`,ae=`hidePrevented.${W}`,ie=`click.${W}.data.api`;class ne extends F{constructor(e,t={}){super(e,t),this._params=this._getParams(e,o({backdrop:!0,overflow:!0,keyboard:!0,animation:{enable:!1,in:"animate__rollIn",out:"animate__rollOut",delay:800},ajax:{route:"",target:"",method:"get",loader:!1}},t)),this._addEventListeners(),this._dismissElement(),this._params.animation.delay=this._params.animation.enable?this._params.animation.delay:0,this._animation(this._element,ne.NAME_KEY,this._params.animation)}static get NAME(){return"sidebar"}static get NAME_KEY(){return W}toggle(e){return this._isShown()?this.hide():this.show(e)}show(e){const t=this;i(t._element)||(t._params=t._getParams(e,t._params),t._route((function(e,s){q.trigger(t._element,te,{stats:e,data:s})})),q.trigger(t._element,Q,{relatedTarget:e}).defaultPrevented||(t._params.backdrop&&V.show(),t._params.overflow&&X.append(),t._element.classList.add(U),document.body.classList.add(G),t._queueCallback((()=>{q.on(_.find(".vg-backdrop"),"mousedown.vg.backdrop",(function(){t.hide()})),q.trigger(t._element,ee,{relatedTarget:e})}),t._element,!0,50)))}hide(){const e=this;i(e._element)||q.trigger(this._element,J).defaultPrevented||setTimeout((()=>{e._element.setAttribute("aria-expanded",!1),e._element.classList.remove(U),this._queueCallback((()=>{e._params.backdrop&&V.hide((function(){e._params.overflow&&X.destroy()})),e._params.overflow&&X.destroy(),document.body.classList.remove(G),q.trigger(this._element,Z)}),this._element,!0)}),this._params.animation.delay)}dispose(){super.dispose()}_isShown(){return this._element.classList.contains(U)}_addEventListeners(){q.on(document,se,(e=>{"Escape"===e.key&&(this._params.keyboard?this.hide():q.trigger(this._element,ae))}))}}H(ne),q.on(document,ie,'[data-vg-toggle="sidebar"]',(function(e){const t=_.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),i(this))return;this.setAttribute("aria-expanded",!0),q.one(t,Z,(()=>{this.setAttribute("aria-expanded",!1)}));const s=_.find(".vg-sidebar.show");s&&s!==t&&ne.getInstance(s).hide(),ne.getOrCreateInstance(t).toggle(this)}));const re=ne,oe="vg.collapse",le="show",de="vg-collapse",ce="vg-collapsing",me=`:scope .${de} .${de}`,he='[data-vg-toggle="collapse"]',ue=`${oe}.hide`,ge=`${oe}.hidden`,pe=`${oe}.show`,_e=`${oe}.shown`,fe=`click.${oe}.data.api`;class ve extends F{constructor(e,t={}){super(e,t),this._params=this._getParams(e,o({toggle:!0,parent:null,ajax:{route:"",target:"",method:"get",loader:!1}},t)),this._isTransitioning=!1,this._triggerArray=[];const s=_.findAll(he);for(const e of s){const t=_.getSelectorFromElement(e),s=_.findAll(t).filter((e=>e===this._element));null!==t&&s.length&&this._triggerArray.push(e)}this._initializeChildren(),this._params.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._params.toggle&&this.toggle()}static get NAME(){return"collapse"}static get NAME_KEY(){return oe}toggle(e){return this._isShown()?this.hide():this.show(e)}show(){const e=this;if(e._isTransitioning||e._isShown())return;let t=[];if(!(e._params.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((e=>e!==this._element)).map((e=>ve.getOrCreateInstance(e,{toggle:!1})))),t.length&&t[0]._isTransitioning||q.trigger(e._element,pe).defaultPrevented)){for(const e of t)e.hide();e._element.classList.remove(de),e._element.classList.add(ce),e._element.style.height=0,e._addAriaAndCollapsedClass(e._triggerArray,!0),e._isTransitioning=!0,e._route(),e._queueCallback((()=>{e._isTransitioning=!1,e._element.classList.remove(ce),e._element.classList.add(de,le),e._element.style.height="",q.trigger(e._element,_e)}),e._element,!0),e._element.style.height=`${e._element.scrollHeight}px`}}hide(){const e=this;if(!e._isTransitioning&&e._isShown()&&!q.trigger(e._element,ue).defaultPrevented){e._element.style.height=`${this._element.getBoundingClientRect().height}px`,c(e._element),e._element.classList.add(ce),e._element.classList.remove(de,le);for(const t of e._triggerArray){const s=_.getElementFromSelector(t);s&&!e._isShown(s)&&e._addAriaAndCollapsedClass([t],!1)}e._isTransitioning=!0,e._element.style.height="",e._queueCallback((()=>{e._isTransitioning=!1,e._element.classList.remove(ce),e._element.classList.add(de),q.trigger(e._element,ge)}),e._element,!0)}}dispose(){super.dispose()}_isShown(e=this._element){return e.classList.contains(le)}_addAriaAndCollapsedClass(e,t){if(e.length)for(const s of e)this._changeStateButton(s,t)}_initializeChildren(){if(!this._params.parent)return;const e=this._getFirstLevelChildren(he);for(const t of e){const e=_.getElementFromSelector(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))}}_getFirstLevelChildren(e){const t=_.find(me,this._params.parent);return _.find(e,this._params.parent).filter((e=>!t.includes(e)))}_changeStateButton(e,t){e.classList.toggle("vg-collapsed",!t),e.setAttribute("aria-expanded",t),e.innerHTML=b.get(e,`data-${t?"hide":"show"}-text`)||e.innerHTML}}q.on(document,fe,he,(function(e){("A"===e.target.tagName||e.delegateTarget&&"A"===e.delegateTarget.tagName)&&e.preventDefault(),_.getMultipleElementsFromSelector(this).forEach((function(e){ve.getOrCreateInstance(e,{toggle:!1}).toggle()}))}));const be=ve,we=class{constructor(){this.breakpoints={xs:0,sm:576,md:768,lg:992,xl:1200,xxl:1400,xxxl:1600}}static check(e){return(new this).define(e)}static checkMobileOrTablet(){let e=!1;var t;return t=navigator.userAgent||navigator.vendor||window.opera,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.slice(0,4)))&&(e=!0),e}define(e){let t=window.innerWidth,s=this._checkResponsiveClass(e),a=this.breakpoints,i=Object.keys(a).find((e=>a[e]===s)),n=Object.keys(a),r=n.indexOf(i);return t>=a[n[r+1]]}_checkResponsiveClass(e){let t=e._element,s=e._params,a=0;return a=t.classList.contains(s.classes.XXXL)?this.breakpoints.xxxl:t.classList.contains(s.classes.XXL)?this.breakpoints.xxl:t.classList.contains(s.classes.XL)?this.breakpoints.xl:t.classList.contains(s.classes.LG)?this.breakpoints.lg:t.classList.contains(s.classes.MD)?this.breakpoints.md:t.classList.contains(s.classes.SM)?this.breakpoints.sm:(t.classList.contains(s.classes.XS),this.breakpoints.xs),a}},ye="vg.nav",ke="show",xe="fade",Le="active",Ee=`${ye}.hide`,Ae=`${ye}.hidden`,Ce=`${ye}.show`,Se=`${ye}.shown`,Te=`mouseover.${ye}.data.api`,Me=`mouseout.${ye}.data.api`,Oe=`click.${ye}.data.api`,$e=`keyup.${ye}.data.api`,je=`resize.${ye}.data.api`;class Pe extends F{constructor(e,t={}){super(e),this._params=this._getParams(e,o({breakpoint:!1,placement:"horizontal",classes:{hamburgerActive:"vg-nav-hamburger-active",hamburgerAlways:"vg-nav-hamburger-always",hamburger:"vg-nav-hamburger",container:"vg-nav-container",wrapper:"vg-nav-wrapper",active:"vg-nav-active",expand:"vg-nav-expand",cloned:"vg-nav-cloned",hover:"vg-nav-hover",flip:"vg-nav-flip",XXXL:"vg-nav-xxxl",XXL:"vg-nav-xxl",XL:"vg-nav-xl",LG:"vg-nav-lg",MD:"vg-nav-md",SM:"vg-nav-sm",XS:"vg-nav-xs"},expand:!0,hover:!1,position:!0,collapse:!0,toggle:'<span class="default"></span>',hamburger:{enable:!0,always:!1,title:"",body:null},callback:m,animation:!0,timeoutAnimation:300,ajax:{route:"",target:"",method:"get"}},t)),this._navigation=null,this.navigation="."+this._params.classes.wrapper,this.movedLinks=[],this.$links=_.findAll("."+this._params.classes.wrapper+" > li",this.navigation),!1===this._params.animation&&(this._params.timeoutAnimation=10)}static get NAME(){return"nav"}static get NAME_KEY(){return ye}get navigation(){return this._navigation}set navigation(e){let t=_.find(e,this._element);t&&(this._navigation=t)}build(){if(!this.navigation)return;let e=this._params;if(this._element.classList.add(e.classes.container),this._element.classList.add("vg-nav-"+e.placement),e.breakpoint||(e.expand=!1),e.hamburger.always?this._element.classList.add(e.classes.hamburgerAlways):e.breakpoint&&e.expand?!1!==e.breakpoint&&this._element.classList.add("vg-nav-"+e.breakpoint):this._element.classList.add(e.classes.expand),e.hover&&(this._element.classList.add(e.classes.hover),we.checkMobileOrTablet()&&this._element.classList.remove(e.classes.hover)),e.expand&&!e.hamburger.body&&null===_.find("."+e.classes.hamburger,this._element)){let t="",s='<span class="'+e.classes.hamburger+'--lines"><span></span><span></span><span></span></span>';e.hamburger.title&&(t='<span class="'+e.classes.hamburger+'--title">'+e.hamburger.title+"</span>"),null!==e.hamburger.body&&(s=e.hamburger.body),this._element.insertAdjacentHTML("afterbegin",'<a href="#sidebar-nav" class="'+e.classes.hamburger+'" data-vg-toggle="sidebar">'+t+s+"</a>")}if(e.toggle){let t=[..._.findAll(".dropdown-mega > a, .dropdown > a",this._element)],s='<span class="toggle">'+e.toggle+"</span>";t.length&&t.forEach((function(e){e.querySelector(".toggle")||e.closest(".dots")||(e.setAttribute("aria-expanded","false"),e.insertAdjacentHTML("beforeend",s))}))}e.collapse&&we.check(this)&&"vertical"!==e.placement&&function(e){let t=e.navigation.clientWidth,s=0,a=_.find(".dots",e.navigation),i=D("dots");if(e.$links.length){if(a)s=a.clientWidth;else{let t=_.find("a",e.$links[0]),a=getComputedStyle(t);s=r(a.paddingLeft.slice(0,-2))+r(a.paddingRight.slice(0,-2))+16}for(let i of e.$links)s+=i.getBoundingClientRect().width,t<s?(e.movedLinks.push(i),i.remove()):e.movedLinks.length&&(a?e.navigation.insertBefore(e.movedLinks[0],a):e.navigation.appendChild(e.movedLinks[0]),e.movedLinks.splice(0,1));e.movedLinks.length?a||e.navigation.insertAdjacentHTML("beforeend",'<li class="dropdown dots"><a href="#" aria-expanded="false">'+i+"</a></li>"):a&&a.remove();let n=e.navigation.querySelector(".dots");if(n&&e.movedLinks.length){let t=n.querySelector("ul");if(t)for(let s of e.movedLinks)t.prepend(s);else{let t=document.createElement("ul");t.classList.add("dropdown-content"),t.classList.add("right");for(let s of e.movedLinks)t.prepend(s);n.appendChild(t)}}}}(this),"afterInit"in this._params.callback&&l(this._params.callback.afterInit,[this])}show(e){let t=e.relatedTarget;if(!t||i(t))return;if(t.closest(".dropdown-content")||t.classList.add("first"),q.trigger(t,Ce,{relatedTarget:e}).defaultPrevented)return;let s=_.find(".dropdown-content",t),a=t.firstElementChild;a&&a.setAttribute("aria-expanded","true"),s.classList.add(ke),t.classList.add(Le),function(e){let{width:t,right:s}=e.getBoundingClientRect(),a=window.innerWidth-s-t;e.classList.remove("right"),e.classList.remove("left");let i=e.closest("li").querySelectorAll("ul");if(a>t)for(const e of i)e.classList.add("left");else for(const e of i)e.classList.add("right")}(s),this._queueCallback((()=>{s.classList.add(xe),q.trigger(t,Se,e)}),s,!0,50)}hide(e){const t=this;if("ontouchstart"in document.documentElement)for(const e of[].concat(...document.body.children))q.off(e,"mouseover",m);let s=e.relatedTarget;if("elm"in e&&e.elm&&(s=e.elm),s){if(q.trigger(s,Ee).defaultPrevented)return;s.classList.remove(Le),s.classList.contains("first")&&s.classList.remove("first"),[..._.findAll("."+ke,s)].forEach((function(s,a){s.classList.remove(xe);let i=s.closest(".dropdown");i.classList.contains(Le)&&i.classList.remove(Le);let n=s.previousElementSibling;if(n&&n.setAttribute("aria-expanded","false"),0===a){const a=()=>{s.classList.remove(ke),q.trigger(s,Ae,e)};t._queueCallback(a,s,!0,500)}}))}}static init(e,t={}){const s=Pe.getOrCreateInstance(e,t);s.build();let n=_.findAll(".dropdown",s._navigation);s._params.hover?[...n].forEach((function(e){let t=null;q.on(e,Te,(function(e){if(t)return;Pe.hideOpenDrops(e);let a=e.target.closest(".dropdown");if(!a)return;if(!s.navigation.contains(a))return;t=a;let i={relatedTarget:a};s.show(i)})),q.on(e,Me,(function(e){if(!t)return;let a=e.relatedTarget.closest(".dropdown"),i=t;for(;a;){if(a===t)return;a=a.parentNode}t=null,s.hide({relatedTarget:a,elm:i})}))})):(q.on(document,$e,Pe.clearDrops),q.on(document,Oe,Pe.clearDrops),q.on(document,Oe,".vg-nav a",(function(e){if(!b.has(this,"aria-expanded"))return;"click"in s._params.callback&&l(s._params.callback.click,[this]),e.preventDefault();let t=this.closest(".vg-nav"),n=t.querySelector(".first"),r=this.closest(".dropdown");if(r&&(!i(r)||function(e){if(!a(e)||0===e.getClientRects().length)return!1;const t="visible"===getComputedStyle(e).getPropertyValue("visibility"),s=e.closest("details:not([open])");if(!s)return t;if(s!==e){const t=e.closest("summary");if(t&&t.parentNode!==s)return!1;if(null===t)return!1}return t}(r))){if(n&&this.closest(".first")){if(r.classList.contains("active"))return void s.hide({relatedTarget:r})}else[..._.findAll(".active",t)].forEach((function(e){e&&e!==r&&s.hide({relatedTarget:e})}));s.show({relatedTarget:r})}})));const r=document.getElementById("sidebar-nav");let o=s._element.querySelector("."+s._params.classes.hamburger);r&&o&&(r.addEventListener("vg.sidebar.show",(function(){o.classList.add(s._params.classes.hamburgerActive)})),r.addEventListener("vg.sidebar.hide",(function(){o.classList.remove(s._params.classes.hamburgerActive)})))}static clearDrops(e){2===e.button||"keyup"===e.type&&"Tab"!==e.key||Pe.hideOpenDrops(e)}static hideOpenDrops(e){const t=_.findAll(".dropdown:not(.disabled):not(:disabled).active");for(const s of t){const t=Pe.getInstance(s.closest(".vg-nav"));if(!t)continue;if(e.target.closest(".first"))return;const a={relatedTarget:s};"click"===e.type&&(a.clickEvent=e),t.hide(a)}}}q.on(window,je,(function(e){Pe.getOrCreateInstance(".vg-nav",{}).build()}));const Ne=Pe,Ie=class{constructor(e={}){this.params=o({element:null,drop:null},e)}_getPlacement(){const e=this,t=e=>{let s=e.parentNode,a=getComputedStyle(s).overflow;return"BODY"===s.tagName?null:"visible"!==a?s:void t(s)};let s,a,i=!1,n=e.params.drop.getBoundingClientRect(),o=e.params.element.getBoundingClientRect();if(t(e.params.element))i=!0,s=n.top,a=n.left;else{let t=getComputedStyle(e.params.drop);s=r(t.top.slice(0,-2)),a=r(t.left.slice(0,-2))}return n.left+n.width>window.innerWidth&&(a=o.width-n.width),{isFixed:i,top:s,left:a}}},qe="vg.dropdown",De="show",He="fade",Be="vg-dropdown-content",Re='[data-vg-toggle="dropdown"]',Fe=`${qe}.hide`,Xe=`${qe}.hidden`,Ye=`${qe}.show`,ze=`${qe}.shown`,Ke=`keyup.${qe}.data.api`,Ve=`keydown.${qe}.data.api`,We=`click.${qe}.data.api`,Ue=`mouseover.${qe}.data.api`,Ge=`mouseout.${qe}.data.api`;class Je extends F{constructor(e,t){super(e,t);let s={offset:[0,2],over:!1,backdrop:!0,overflow:!0,keyboard:!0,placement:"bottom",timeoutAnimation:350,hover:!1,ajax:{route:"",target:"",method:"get"},animation:{enable:!1,in:"animate__flipInY",out:"animate__flipOutY",delay:800}};"offset"in t&&Array.isArray(t.offset)&&(s.offset=t.offset),this._params=this._getParams(e,o(s,t)),this._parent=this._element.parentNode,this._drop=_.find("."+Be,this._parent),this._isPlacement=!1,this._params.animation.delay=this._params.animation.enable?this._params.animation.delay:0,this._animation(this._drop,Je.NAME_KEY,this._params.animation)}static get NAME(){return"dropdown"}static get NAME_KEY(){return qe}toggle(){return this._isShown()?this.hide():this.show()}show(){if(i(this._element)||this._isShown())return;const e={relatedTarget:this._element};if(!q.trigger(this._element,Ye,e).defaultPrevented){if("ontouchstart"in document.documentElement)for(const e of[].concat(...document.body.children))q.on(e,"mouseover",m);this._route(),this._element.setAttribute("aria-expanded",!0),this._element.classList.add(De),this._drop.classList.add(De),this._setPlacement(),this._queueCallback((()=>{this._drop.classList.add(He),q.trigger(this._element,ze,e)}),this._drop,!0,50)}}hide(){if(i(this._element)||!this._isShown())return;const e={relatedTarget:this._element};this._completeHide(e)}dispose(){return super.dispose()}_isShown(){return this._element.classList.contains(De)}_completeHide(e){if(!q.trigger(this._element,Fe,e).defaultPrevented){if("ontouchstart"in document.documentElement)for(const e of[].concat(...document.body.children))q.off(e,"mouseover",m);this._drop.classList.remove(He),this._element.classList.remove(De),this._element.setAttribute("aria-expanded","false"),setTimeout((()=>{this._queueCallback((()=>{this._drop.classList.remove(De),q.trigger(this._element,Xe,e)}),this._parent,!0,10)}),this._params.animation.delay)}}_setPlacement(){const e=this;if(!e._isPlacement){let t=new Ie({element:this._parent,drop:this._drop})._getPlacement();t.isFixed&&(e._drop.style.position="fixed",e._drop.style.transform="translateY(-20%)"),e._drop.style.left=t.left+"px",e._drop.style.top=t.top+"px"}e._params.offset&&(e._drop.style.paddingTop=e._params.offset[1]+"px",e._drop.style.paddingRight=e._params.offset[0]+"px"),e._isPlacement=!0}static init(e,t={}){const s=Je.getOrCreateInstance(e,t);if(s._params.hover){let e=null;q.on(s._parent,Ue,(function(t){if(e)return;Je.hideOpenToggles(t);let a=t.target.closest(".vg-dropdown");a&&s._parent.contains(a)&&(e=a,s.show())})),q.on(s._parent,Ge,(function(t){if(!e)return;let a=t.relatedTarget;for(;a;){if(a===e)return;a=a.parentNode}e=null,s._completeHide({relatedTarget:s._element})}))}else q.on(document,Ke,Re,Je.keydownHandler),q.on(document,Ve,"."+Be,Je.keydownHandler),q.on(document,Ke,Je.clearDrops),q.on(document,We,Je.clearDrops),q.on(e,We,(function(e){e.preventDefault(),s.toggle()}))}static hideOpenToggles(e){const t=_.findAll('[data-vg-toggle="dropdown"]:not(.disabled):not(:disabled).show');for(const s of t){const t=Je.getInstance(s);if(!t)continue;if(e.target.closest("."+Be)===t._drop)return;if(e.composedPath().includes(t._element))continue;const a={relatedTarget:t._element};"click"===e.type&&(a.clickEvent=e),t._completeHide(a)}}static keydownHandler(e){const t=/input|textarea/i.test(e.target.tagName),s="Escape"===e.key,a=["ArrowUp","ArrowDown"].includes(e.key);if(!a&&!s)return;if(t&&!s)return;e.preventDefault();const i=this.matches(Re)?this:_.find(Re,e.delegateTarget.parentNode),n=Je.getOrCreateInstance(i);if(a)return e.stopPropagation(),void n.show();n._isShown()&&(e.stopPropagation(),n.hide(),i.focus())}static clearDrops(e){2===e.button||"keyup"===e.type&&"Tab"!==e.key||Je.hideOpenToggles(e)}}const Ze=Je,Qe=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",et=".sticky-top",tt="padding-right",st="margin-right",at=class{constructor(){this._element=document.body}getWidth(){const e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){const e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,tt,(t=>t+e)),this._setElementAttributes(Qe,tt,(t=>t+e)),this._setElementAttributes(et,st,(t=>t-e))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,tt),this._resetElementAttributes(Qe,tt),this._resetElementAttributes(et,st)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,s){const a=this.getWidth();this._applyManipulationCallback(e,(e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+a)return;this._saveInitialAttribute(e,t);const i=window.getComputedStyle(e).getPropertyValue(t);e.style.setProperty(t,`${s(Number.parseFloat(i))}px`)}))}_saveInitialAttribute(e,t){const s=e.style.getPropertyValue(t);s&&b.get(e,t,s)}_resetElementAttributes(e,t){this._applyManipulationCallback(e,(e=>{const s=b.get(e,t);null!==s?(b.remove(e,t),e.style.setProperty(t,s)):e.style.removeProperty(t)}))}_applyManipulationCallback(e,t){if(a(e))t(e);else for(const s of _.findAll(e,this._element))t(s)}},it="vg.modal",nt="vg-modal-open",rt="show",ot="vg-modal-static",lt=`${it}.hide`,dt=`${it}.hidden`,ct=`${it}.show`,mt=`${it}.shown`,ht=`${it}.resize`,ut=`${it}.loaded`,gt=`keydown.dismiss.${it}`,pt=`hidePrevented.${it}`,_t=`click.${it}.data.api`,ft=`mousedown.dismiss${it}`,vt=`click.dismiss${it}`;class bt extends F{constructor(e,t={}){super(e,t),this._params=this._getParams(e,o({backdrop:!0,focus:!0,keyboard:!0,fields:[],ajax:{route:"",target:"",method:"get",loader:!1},animation:{enable:!1,in:"animate__rollIn",out:"animate__rollOut",delay:800},classes:{general:"vg-modal",dialog:"vg-modal-dialog",content:"vg-modal-content",header:"vg-modal-header",title:"vg-modal-title",body:"vg-modal-body",footer:"vg-modal-footer"}},t)),this._button=null,this._dialog=_.find(".vg-modal-dialog",this._element),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new at,this._addEventListeners(),this._dismissElement(),this._params.animation.delay=this._params.animation.enable?this._params.animation.delay:0,this._animation(this._element,bt.NAME_KEY,this._params.animation)}static get NAME(){return"modal"}static get NAME_KEY(){return it}static init(e,t,s){bt.build(e,t,s)}static build(e,t,s){if("string"!=typeof e)return;let a=document.createElement("div");a.classList.add("vg-modal","fade"),a.id=e;let i=document.createElement("div");i.classList.add("vg-modal-dialog");let n=document.createElement("div");n.classList.add("vg-modal-content");let r=document.createElement("button");b.set(r,"type","button"),b.set(r,"data-vg-dismiss","modal"),b.set(r,"data-vg-target","#"+e),b.set(r,"aria-label","close"),r.classList.add("vg-btn-close"),n.append(r);let o=document.createElement("div");o.classList.add("vg-modal-body"),n.append(o),i.append(n),a.append(i),document.body.append(a),l(s,[bt.getOrCreateInstance(a,t)])}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){const t=this;i(t._element)||(this._params=this._getParams(e,this._params),t._route((function(e,s){q.trigger(t._element,ut,{stats:e,data:s})})),q.trigger(this._element,ct,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(nt),this._addFieldsInModal(e),this._adjustDialog(),V.show((()=>this._showElement(e)))))}hide(){this._isShown&&!this._isTransitioning&&(q.trigger(this._element,lt).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,setTimeout((()=>{this._element.classList.remove(rt),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimatedFade())}),this._params.animation.delay)))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,V.hide((()=>{document.body.classList.remove(nt),this._resetAdjustments(),this._scrollBar.reset(),q.trigger(this._element,dt)}))}_showElement(e){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const t=_.find(".vg-modal-body",this._dialog);t&&(t.scrollTop=0),c(this._element),this._element.classList.add(rt),this._queueCallback((()=>{this._isTransitioning=!1,q.trigger(this._element,mt,{relatedTarget:e})}),this._dialog,this._isAnimatedFade())}_isAnimatedFade(){return this._element.classList.contains("fade")}_adjustDialog(){const e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),s=t>0;if(s&&!e){const e=u()?"paddingLeft":"paddingRight";this._element.style[e]=`${t}px`}if(!s&&e){const e=u()?"paddingRight":"paddingLeft";this._element.style[e]=`${t}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}_addEventListeners(){q.on(this._element,gt,(e=>{"Escape"===e.key&&(this._params.keyboard?this.hide():this._triggerBackdropTransition())})),q.on(window,ht,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),q.on(this._element,ft,(e=>{q.one(this._element,vt,(t=>{this._element===e.target&&this._element===t.target&&("static"!==this._params.backdrop?this._params.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_triggerBackdropTransition(){if(q.trigger(this._element,pt).defaultPrevented)return;const e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._element.style.overflowY;"hidden"===t||this._element.classList.contains(ot)||(e||(this._element.style.overflowY="hidden"),this._element.classList.add(ot),this._queueCallback((()=>{this._element.classList.remove(ot),this._queueCallback((()=>{this._element.style.overflowY=t}),this._dialog)}),this._dialog))}_addFieldsInModal(e){this._params=this._getParams(e,this._params),this._params.fields.length&&this._params.fields.forEach((function(e){if(!1 in e&&!1 in e)return;let t=_.findAll("[data-"+e.name+"]");if(t.length)for(const s of t)switch(s.tagName){case"INPUT":s.value=e.value;break;case"IMG":b.set(s,"src",e.value);break;default:s.innerHTML=e.value}}))}}H(bt),q.on(document,_t,'[data-vg-toggle="modal"]',(function(e){const t=_.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&e.preventDefault(),q.one(t,ct,(e=>{e.defaultPrevented}));const s=_.find(".vg-modal.show");s&&bt.getInstance(s).hide(),bt.getOrCreateInstance(t).toggle(this)}));const wt=bt,yt="vg.fs",kt=`submit.${yt}.data.api`;class xt extends F{constructor(e,t={}){super(e,t),this._params=this._getParams(e,o({redirect:"",validate:!1,submit:!1,fields:[],alert:{enabled:!0,type:"modal"},ajax:{route:"",target:"",method:"get"},classes:{general:"vg-form-sender",alertCollapse:"vg-form-sender-collapse",alertModal:"vg-form-sender-modal",validation:"needs-validation",wasValidate:"was-validated"}},t)),this._params.ajax.route=b.get(this._element,"action").toLowerCase(),this._params.ajax.method=b.get(this._element,"method").toLowerCase(),this._button=_.find('[type="submit"]',this._element)||_.find('[form="'+this._element.id+'"]')||null,this._params.isBtnText="false"!==b.get(this._element,"data-btn-text"),this._params.isJsonParse="false"!==b.get(this._element,"data-json-parse"),this._params.isShowPass="true"===b.get(this._element,"data-show-pass")}static get NAME(){return"form-sender"}static get NAME_KEY(){return yt}build(){return this._element.classList.add(this._params.classes.general),this._params.validate&&(b.set(this._element,"novalidate",""),this._element.classList.add(this._params.classes.validation)),this}request(e,t){const s=this;s._alertBefore(),s._params.ajax.data=e,s._route((function(e,a){s._element.classList.remove("was-validated"),s._params.alert.enabled&&("string"==typeof e&&"error"===e?s._alertError(t,a):"string"==typeof e&&"success"===e&&s._alertSuccess(t,a)),s._params.redirect&&(window.location.href=s._params.redirect)}))}_alertBefore(){const e=this;"collapse"===e._params.alert.type&&[...document.getElementsByClassName(e._params.classes.alertCollapse)].forEach((function(e){e&&e.classList.contains("show")&&be.getOrCreateInstance(e,{toggle:!1}).hide()})),e._statusButton("before"),q.trigger(e._element,"vg.fs.before",e)}_alertError(e,t){const s=this;s._statusButton("after"),s._jsonParse(t,"error"),q.trigger(s._element,"vg.fs.error",[e,s,t])}_alertSuccess(e,t){const s=this;s._statusButton("after"),s._jsonParse(t,"success"),q.trigger(s._element,"vg.fs.success",[e,s,t])}_statusButton(e){const t=this;if(!t._button)return;let s=t._button,a={send:"Отправляем...",text:"Отправить"};if(b.has(t._button,"data-spinner")&&"before"===e&&t._button.insertAdjacentHTML("afterbegin",'<span class="spinner-border spinner-border-sm me-2"></span>'),b.has(t._button,"data-text"))a.text=b.get(t._button,"data-text");else{let e=t._button.querySelector("[data-text]");e&&(a.text=b.get(e,"data-text"),s=e)}if(b.has(t._button,"data-text-send"))a.send=b.get(t._button,"data-text-send");else{let e=t._button.querySelector("[data-text-send]");e&&(a.send=b.get(e,"data-text-send"),s=e)}if("before"===e&&(t._params.isBtnText&&(s.innerHTML=a.send),b.set(t._button,"disabled","disabled")),"after"===e){t._params.isBtnText&&(s.innerHTML=a.text),b.remove(t._button,"disabled");let e=t._button.querySelector(".spinner-border");e&&e.remove()}}_jsonParse(e,t){const s=this;if(s._params.isJsonParse&&"string"==typeof e){let a={};try{a=JSON.parse(e),s.alert(a,t)}catch(a){s.alert(e,t)}}else s.alert(e,t)}alert(e,t){const s=this;if(n(e)&&"code"in e&&e.code&&200===e.code&&"response"in e&&e.response){let s=r(e.response);"string"==typeof s?-1===s.indexOf("Parse error")&&-1===s.indexOf("syntax error")||(t="error",e={response:{title:"Error",message:"Something went wrong, please repeat later"},text:"Something went wrong, please repeat later"}):"errors"in s&&r(s.errors)&&(t=r(s.errors)?"error":"success")}s._params.alert.enabled&&("modal"===s._params.alert.type&&s._alertModal(e,t),"collapse"===s._params.alert.type&&s._alertCollapse(e,t))}_alertModal(e,t){const s=this;[...document.getElementsByClassName("modal")].forEach((function(e){e&&e.classList.contains("show")&&bootstrap.Modal.getOrCreateInstance(e).hide()})),[...document.getElementsByClassName("vg-modal")].forEach((function(e){e&&e.classList.contains("show")&&wt.getOrCreateInstance(e).hide()}));let a=s._params.classes.general+"-"+h(),i=_.find("."+s._params.classes.alertModal);i&&i.remove(),setTimeout((()=>{wt.init(a,{classes:{alert:s._params.classes.alertModal}},(function(a){let i=a._element;i.classList.add(s._params.classes.alertModal);let n=_.find(".vg-modal-body",i);n&&n.append(s.setDataRelationStatus(i,t,e,"modal")),a.toggle()}))}),800)}_alertCollapse(e,t){const s=this;let a=_.find("."+s._params.classes.alertCollapse);a||(a=document.createElement("div"),a.classList.add(s._params.classes.alertCollapse),a.classList.add("vg-collapse"),a.id=s._params.classes.general+"-"+h(),a.append(s.setDataRelationStatus(a,t,e,"collapse")),s._element.prepend(a)),be.getOrCreateInstance(a,{toggle:!1}).toggle()}setDataRelationStatus(e,t,s,a){let i=_.find(".vg-alert-"+t,e);if(n(s)){if("error"===t&&"code"in s&&200!==s.code&&"text"in s&&!s.text)switch(s.text="Something went wrong, please repeat later",s.code){case 400:s.text="Bad Request";break;case 401:case 403:s.text="Unauthorized";break;case 413:s.text="Forbidden";break;case 404:s.text="Not Found";break;case 422:s.text="Unprocessable Entity";break;case 500:s.text="Internal Server Error";break;case 504:s.text="Gateway Timeout"}if("response"in s){let e=r(s.response),a="",i="",o="";if("string"!=typeof e){if(!("view"in e)){if("title"in e&&(a=e.title),"error"===t&&200!==s.code&&(o=" "+s.text+" ("+s.code+")"),i+='<h4 class="vg-alert-content--title">'+a+o+"</h4>","message"in e&&(i+='<div class="vg-alert-content--message">'+e.message+"</div>"),"errors"in e){let t=r(e.errors)||null;if(n(t))for(const e in t)Array.isArray(t[e])?t[e].forEach((function(e){i+="<div>"+e+"</div>"})):i="<div>"+t[e]+"</div>"}s={view:i}}}else s.view=e}}if(i)_.find(".vg-alert-content--text",i).innerHTML=s.view;else{i=document.createElement("div"),i.classList.add("vg-alert","vg-alert-"+t,"vg-alert-"+a);let e=document.createElement("div");e.classList.add("vg-alert-content");let n=document.createElement("div");n.classList.add("vg-alert-content--icon");let r=document.createElement("i");r.innerHTML=D(t),n.append(r),e.append(n);let o=document.createElement("div");o.classList.add("vg-alert-content--text"),o.innerHTML=s.view,e.append(o),i.append(e)}return i}static init(e,t={}){xt.getOrCreateInstance(e,t).build()}}q.on(document,kt,(function(e){if(!b.has(e.target,"data-vgformsender"))return;const t=xt.getOrCreateInstance(e.target,{});if(t){if(t._params.validate&&!t._element.checkValidity())return e.preventDefault(),e.stopPropagation(),t._element.classList.add(t._params.classes.wasValidate),!1;if(!t._params.submit){e.preventDefault();let s=new FormData(t._element);return t.request(s,e)}}}));const Lt=xt,Et="vg.rollup",At=`click.${Et}.data.api`;class Ct extends F{constructor(e,t={}){super(e,t),this._params=this._getParams(e,o({},t))}static get NAME(){return"rollup"}static get NAME_KEY(){return Et}build(){}toggle(e){return this._isShown()?this.hide():this.show(e)}show(e){}_isShown(){return this._element.classList.contains("show")}static init(e,t={}){Ct.getOrCreateInstance(e,t).toggle()}}q.on(document,At,'[data-vg-toggle="rollup"]',(function(e){const t=_.getElementFromSelector(this);t&&(["A","AREA"].includes(this.tagName)&&e.preventDefault(),i(this)||(this.setAttribute("aria-expanded",!0),Ct.getOrCreateInstance(t).toggle(this)))}));const St=Ct;function Tt(e){for(let t=1;t<arguments.length;t++){let s=arguments[t];for(let t in s)e[t]=s[t]}return e}const Mt=function e(t,s){function a(e,a,i){if("undefined"==typeof document)return;"number"==typeof(i=Tt({},s,i)).expires&&(i.expires=new Date(Date.now()+864e5*i.expires)),i.expires&&(i.expires=i.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);let n="";for(let e in i)i[e]&&(n+="; "+e,!0!==i[e]&&(n+="="+i[e].split(";")[0]));return document.cookie=e+"="+t.write(a,e)+n}return Object.create({set:a,get:function(e){if("undefined"==typeof document||arguments.length&&!e)return;let s=document.cookie?document.cookie.split("; "):[],a={};for(let i=0;i<s.length;i++){let n=s[i].split("="),r=n.slice(1).join("=");try{let s=decodeURIComponent(n[0]);if(a[s]=t.read(r,s),e===s)break}catch(e){}}return e?a[e]:a},remove:function(e,t){a(e,"",Tt({},t,{expires:-1}))},withAttributes:function(t){return e(this.converter,Tt({},this.attributes,t))},withConverter:function(t){return e(Tt({},this.converter,t),this.attributes)}},{attributes:{value:Object.freeze(s)},converter:{value:Object.freeze(t)}})}({read:function(e){return'"'===e[0]&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"}),Ot="vg.lawcookie",$t="show",jt=`${Ot}.hide`,Pt=`${Ot}.hidden`,Nt=`${Ot}.show`,It=`${Ot}.shown`,qt=`click.${Ot}.data.api`;class Dt extends F{static sParams={};constructor(e,t={}){super(e,t),this._params=this._getParams(e,o({storage:"local",delay:500,cookie:{name:"lawCookie",value:"yes",attributes:{}},animation:{enable:!0,in:"animate__fadeInUp",out:"animate__fadeOutDown",delay:800},ajax:{route:"",target:"",method:"get"}},t)),Dt.sParams=this._params,this._params.animation.delay=this._params.animation.enable?this._params.animation.delay:0,this._animation(this._element,Dt.NAME_KEY,this._params.animation)}static get NAME(){return"lawcookie"}static get NAME_KEY(){return Ot}toggle(){return this._isShown()?this.hide():this.show()}_isShown(){return this.storage().get()}show(){i(this._element)||q.trigger(this._element,Nt,{}).defaultPrevented||(this._element.classList.add($t),this._queueCallback((()=>{q.trigger(this._element,It,{})}),this._element,!0,this._params.delay))}hide(){q.trigger(this._element,jt).defaultPrevented||setTimeout((()=>{this._element.classList.remove($t),this._queueCallback((()=>q.trigger(this._element,Pt)),this._element,!0)}),this._params.animation.delay)}storage(){return this._storage={isCookie:"cookie"===this._params.storage,storage:"cookie"===this._params.storage?Mt:localStorage,name:this._params.cookie.name,value:this._params.cookie.value,attributes:this._params.cookie.attributes},this}get(){return this._storage.isCookie?this._storage.storage.get(this._storage.name):this._storage.storage.getItem(this._storage.name)}set(){this._storage.isCookie?this._storage.storage.set(this._storage.name,this._storage.value,this._storage.attributes):this._storage.storage.setItem(this._storage.name,this._storage.value)}dispose(){super.dispose()}static reset(){Mt.remove(Dt.sParams.cookie.name),localStorage.clear(),location.reload()}static init(e,t={}){Dt.getOrCreateInstance(e,t).toggle()}}H(Dt),q.on(document,qt,'[data-vg-toggle="lawcookie"]',(function(e){if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),i(this))return;const t=_.find("#vg-lawcookie");if(!t)return;const s=Dt.getOrCreateInstance(t);s.storage().set(),s.hide()})),q.on(document,qt,'[data-vg-toggle="lawcookie-clear"]',(function(e){if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),i(this))return;const t=_.find("#vg-lawcookie");t&&(Dt.getOrCreateInstance(t).dispose(),location.reload())}));const Ht=Dt,Bt="vg.select",Rt="show",Ft="active",Xt="vg-select",Yt="vg-select-dropdown",zt="vg-select-list",Kt="vg-select-list--option",Vt="vg-select-list--optgroup",Wt="vg-select-current",Ut=`click.${Bt}.data.api`,Gt=`keyup.${Bt}.data.api`,Jt=`${Bt}.change`,Zt=`${Bt}.hide`,Qt=`${Bt}.hidden`,es=`${Bt}.show`,ts=`${Bt}.shown`,ss='[data-vg-toggle="select"]';let as;class is extends F{constructor(e,t={}){super(e,t),this._params=this._getParams(e,o({search:!1,placeholder:"",ajax:{route:"",target:"",method:"get",loader:!1},render:{option:m,item:m}},t)),this._drop=_.find("."+Yt,this._element)}static get NAME(){return"select"}static get NAME_KEY(){return Bt}static buildListOptions(e,t){let a=e.options,i=document.createElement("ul");i.classList.add(zt);let n=e.querySelectorAll("optgroup");if(n.length){let e=!1;[...n].forEach((function(t){let s=document.createElement("ol");s.classList.add(Vt);let a=document.createElement("li");a.innerHTML=t.label.trim(),a.classList.add("vg-select-list--optgroup-title"),s.prepend(a),r(_.findAll("option",t),s,e),i.append(s),e=!0}))}else r(a,i,!1);return t.append(i),i;function r(t,a,i){let n=0;for(const r of t){let t=document.createElement("li");t.innerHTML=r.innerHTML.trim().replace(/<\/[^>]+(>|$)/g,""),t.dataset.value=b.get(r,"value"),t.classList.add(Kt),b.set(t,"data-vg-toggle","select-option");let o=b.get(r);if(!s(o))for(const e of Object.keys(o))b.set(t,"data-"+e,o[e]);n!==e.selectedIndex||i||t.classList.add("selected"),b.has(r,"disabled")&&t.classList.add("disabled"),b.has(r,"hidden")&&t.classList.add("hidden"),a.append(t),n++}}}static build(e){let t,a=e.dataset.placeholder||"",i=e.dataset.search||!1;e.parentElement.style.position="relative",t=a&&0===e.selectedIndex?'<span class="vg-select-current--placeholder">'+a+"<span>":e.options[e.selectedIndex].innerText;let n=b.get(e,"class"),r=document.createElement("div");n=n.split(" ");for(const e of n)r.classList.add(e);b.has(e,"disabled")&&r.classList.add("disabled");let o=b.get(e);if(!s(o))for(const e of Object.keys(o))b.set(r,"data-"+e,o[e]);let l=document.createElement("div");l.classList.add(Wt),b.set(l,"data-vg-toggle","select"),b.set(l,"aria-expanded","false"),l.innerHTML=t.trim(),r.append(l);let d=document.createElement("div");if(d.classList.add(Yt),r.append(d),is.buildListOptions(e,d),e.insertAdjacentElement("afterend",r),e.dataset.inited="true",i){let e=document.createElement("div");e.classList.add("vg-select-search");let t=document.createElement("input");b.set(t,"name","vg-select-search"),b.set(t,"type","text"),b.set(t,"placeholder","Поиск..."),e.append(t),d.prepend(e)}return r}render(e,t){let s=_.find("."+zt,this._drop);s&&s.remove(),is.buildListOptions(e,this._drop)}toggle(e){return this._isShown()?this.hide():this.show(e)}show(e){if(!i(this._element)&&!q.trigger(this._element,es,{relatedTarget:e}).defaultPrevented){if("ontouchstart"in document.documentElement)for(const e of[].concat(...document.body.children))q.on(e,"mouseover",m);if(this._element.classList.add(Rt),this._params.search){let e=_.find("input",this._element);e&&e.focus()}this._queueCallback((()=>{this._element.classList.add(Ft),q.trigger(this._element,ts,{relatedTarget:e})}),this._drop,!0,50)}}hide(){!i(this._element)&&this._isShown()&&this._completeHide()}_completeHide(){if(q.trigger(this._element,Zt,{}).defaultPrevented)return;this._element.classList.remove(Ft);let e=_.find(ss,this._element);if(b.set(e,"aria-expanded","false"),"ontouchstart"in document.documentElement)for(const e of[].concat(...document.body.children))q.off(e,"mouseover",m);this._queueCallback((()=>{this._element.classList.remove(Rt),q.trigger(this._element,Qt,{})}),this._element,!0,10)}_isShown(){return this._element.classList.contains(Rt)}destroy(e){let t=e.nextElementSibling;t&&t.classList.contains(Xt)&&(t.remove(),e.selectedIndex=0,[...e.querySelectorAll("option")].forEach((function(t,s){t.hasAttribute("selected")&&(e.selectedIndex=s)})))}refresh(e){const t=this;new MutationObserver((()=>{clearTimeout(as),as=setTimeout((()=>{t.build(!0,e)}),100)})).observe(e,{attributeFilter:["disabled","required","style","hidden"],childList:!0,subtree:!0,characterDataOldValue:!0})}search(e){}dispose(){super.dispose()}static hideOpenToggles(e){const t=_.findAll(".vg-select:not(.disabled):not(:disabled).show");for(const s of t){const t=is.getInstance(s);if(!t)continue;if(e.target.closest("."+Xt)===t._element)return;if(e.composedPath().includes(t._element))continue;const a={relatedTarget:t._element};"click"===e.type&&(a.clickEvent=e),t._completeHide(a)}}static clearDrops(e){2===e.button||"keyup"===e.type&&"Tab"!==e.key||is.hideOpenToggles(e)}static init(e,t={},s=!1){let a=is.build(e);is.getOrCreateInstance(a,t)}}q.on(document,Ut,is.clearDrops),q.on(document,Ut,ss,(function(){const e=this.closest("."+Xt);b.set(this,"aria-expanded",!0);const t=_.find(".vg-select.show");t&&t!==e&&is.getInstance(t).hide(),is.getOrCreateInstance(e).toggle(this)})),q.on(document,Ut,'[data-vg-toggle="select-option"]',(function(e){let t=e.target;if(!t.classList.contains("disabled")){let e=t.closest("."+Xt),s=e.querySelectorAll("."+Kt);if(s.length)for(const e of s)e.classList.remove("selected");t.classList.add("selected"),e.querySelector("."+Wt).innerText=t.innerText,e.classList.remove("show");let a=e.previousSibling;a.value=t.dataset.value,q.trigger(a,Jt,{value:t.dataset.value})}})),q.on(document,Gt,"[name=vg-select-search]",(function(e){let t=this,s=t?.closest("."+Yt).querySelector("."+zt);if(s){let e=[...s.querySelectorAll("."+Kt)],a=[...s.querySelectorAll("."+Vt)],i=t?.value;e=e.concat(a);for(const t of e)b.show(t);if(i.length){i=i.trim(),i=i.toLowerCase(),i=function(e){let t,s="й ц у к е н г ш щ з х ъ ф ы в а п р о л д ж э я ч с м и т ь б ю".split(/ +/g),a="q w e r t y u i o p [ ] a s d f g h j k l ; ' z x c v b n m , .".split(/ +/g);for(t=0;t<s.length;t++)e=(e=e.split(a[t]).join(s[t])).split(a[t].toUpperCase()).join(s[t].toUpperCase());return e}(i);for(const t of e)-1===t.innerText.toLowerCase().indexOf(i)&&b.hide(t)}}}));const ns=is;vg=t})();
3
+ //# sourceMappingURL=vgapp.js.map