ably-ui 8.7.0.dev.7021bee → 8.7.0.dev.7072b07
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +6 -6
- data/README.md +15 -4
- data/lib/ably_ui/core/code/component.css +2 -0
- data/lib/ably_ui/core/code/component.js +739 -1
- data/lib/ably_ui/core/company_autocomplete/component.css +2 -0
- data/lib/ably_ui/core/company_autocomplete/component.js +1161 -1
- data/lib/ably_ui/core/connect_state_wrapper/component.js +22 -1
- data/lib/ably_ui/core/contact_footer/component.css +2 -0
- data/lib/ably_ui/core/contact_footer/component.js +211 -1
- data/lib/ably_ui/core/cookie_message/component.css +2 -0
- data/lib/ably_ui/core/cookie_message/component.js +82 -1
- data/lib/ably_ui/core/core.rb +12 -4
- data/lib/ably_ui/core/customer_logos/component.js +22 -1
- data/lib/ably_ui/core/dropdown_menu/component.js +22 -1
- data/lib/ably_ui/core/feature_footer/component.css +2 -0
- data/lib/ably_ui/core/feature_footer/component.js +211 -1
- data/lib/ably_ui/core/featured_link/component.css +2 -0
- data/lib/ably_ui/core/featured_link/component.js +82 -1
- data/lib/ably_ui/core/flash/component.css +2 -0
- data/lib/ably_ui/core/flash/component.js +82 -1
- data/lib/ably_ui/core/footer/component.css +23 -1
- data/lib/ably_ui/core/footer/component.js +82 -1
- data/lib/ably_ui/core/footer/footer.html.erb +120 -63
- data/lib/ably_ui/core/icon/component.js +22 -1
- data/lib/ably_ui/core/images/best-support-2023.svg +1 -0
- data/lib/ably_ui/core/images/fastest-implementation-2023.svg +1 -0
- data/lib/ably_ui/core/images/high-performer-2022.png +0 -0
- data/lib/ably_ui/core/images/high-performer-2023.svg +1 -0
- data/lib/ably_ui/core/images/highest-user-adoption-2022.png +0 -0
- data/lib/ably_ui/core/images/highest-user-adoption-2023.svg +1 -0
- data/lib/ably_ui/core/images/users-love-us-2022.png +0 -0
- data/lib/ably_ui/core/loader/component.js +22 -1
- data/lib/ably_ui/core/logo/component.js +22 -1
- data/lib/ably_ui/core/meganav/component.css +3 -3
- data/lib/ably_ui/core/meganav/component.js +992 -1
- data/lib/ably_ui/core/meganav/component.json +2 -2
- data/lib/ably_ui/core/meganav/meganav.rb +6 -6
- data/lib/ably_ui/core/meganav_blog_posts_list/component.js +1159 -1
- data/lib/ably_ui/core/meganav_content_company/component.js +22 -1
- data/lib/ably_ui/core/meganav_content_company/meganav_content_company.html.erb +9 -0
- data/lib/ably_ui/core/meganav_content_developers/component.js +22 -1
- data/lib/ably_ui/core/meganav_content_developers/meganav_content_developers.html.erb +30 -14
- data/lib/ably_ui/core/meganav_content_products/component.js +22 -0
- data/lib/ably_ui/core/{meganav_content_platform/meganav_content_platform.html.erb → meganav_content_products/meganav_content_products.html.erb} +15 -33
- data/lib/ably_ui/core/{meganav_content_platform/meganav_content_platform.rb → meganav_content_products/meganav_content_products.rb} +1 -1
- data/lib/ably_ui/core/meganav_content_use_cases/component.js +22 -1
- data/lib/ably_ui/core/meganav_content_use_cases/meganav_content_use_cases.html.erb +42 -38
- data/lib/ably_ui/core/meganav_control/component.js +241 -1
- data/lib/ably_ui/core/meganav_control_mobile_dropdown/component.js +180 -1
- data/lib/ably_ui/core/meganav_control_mobile_panel_close/component.js +142 -1
- data/lib/ably_ui/core/meganav_control_mobile_panel_open/component.js +170 -1
- data/lib/ably_ui/core/meganav_items_desktop/component.js +22 -1
- data/lib/ably_ui/core/meganav_items_desktop/meganav_items_desktop.rb +1 -1
- data/lib/ably_ui/core/meganav_items_mobile/component.js +22 -1
- data/lib/ably_ui/core/meganav_items_signed_in/component.js +22 -1
- data/lib/ably_ui/core/meganav_search/component.js +22 -1
- data/lib/ably_ui/core/meganav_search_autocomplete/component.js +295 -1
- data/lib/ably_ui/core/meganav_search_panel/component.js +22 -1
- data/lib/ably_ui/core/meganav_search_suggestions/component.js +258 -1
- data/lib/ably_ui/core/notice/component.css +2 -0
- data/lib/ably_ui/core/notice/component.js +872 -1
- data/lib/ably_ui/core/scripts.js +1465 -1
- data/lib/ably_ui/core/showcase/component.css +2 -0
- data/lib/ably_ui/core/showcase/component.js +343 -1
- data/lib/ably_ui/core/sign_out_link/component.js +22 -1
- data/lib/ably_ui/core/slider/component.css +2 -0
- data/lib/ably_ui/core/slider/component.js +255 -1
- data/lib/ably_ui/core/sprites.svg +99 -0
- data/lib/ably_ui/core/styles.css +3 -7
- data/lib/ably_ui/core/uptime/component.css +2 -0
- data/lib/ably_ui/core/uptime/component.js +82 -1
- data/lib/ably_ui/reset/scripts.js +1 -1
- data/lib/ably_ui/reset/styles.css +1 -11
- data/lib/ably_ui/version.rb +1 -1
- metadata +12 -7
- data/lib/ably_ui/core/meganav_content_platform/component.js +0 -1
- data/lib/ably_ui/react/connect_state_wrapper/component.js +0 -1
- data/lib/ably_ui/react/scripts.js +0 -1
@@ -1 +1,255 @@
|
|
1
|
-
|
1
|
+
(function webpackUniversalModuleDefinition(root, factory) {
|
2
|
+
if(typeof exports === 'object' && typeof module === 'object')
|
3
|
+
module.exports = factory(require("lodash.throttle"));
|
4
|
+
else if(typeof define === 'function' && define.amd)
|
5
|
+
define([], factory);
|
6
|
+
else if(typeof exports === 'object')
|
7
|
+
exports["AblyUi"] = factory(require("lodash.throttle"));
|
8
|
+
else
|
9
|
+
root["AblyUi"] = root["AblyUi"] || {}, root["AblyUi"]["Core"] = root["AblyUi"]["Core"] || {}, root["AblyUi"]["Core"]["Slider"] = factory(root[undefined]);
|
10
|
+
})(this, (__WEBPACK_EXTERNAL_MODULE_lodash_throttle__) => {
|
11
|
+
return /******/ (() => { // webpackBootstrap
|
12
|
+
/******/ "use strict";
|
13
|
+
/******/ var __webpack_modules__ = ({
|
14
|
+
|
15
|
+
/***/ "./src/core/dom-query.js":
|
16
|
+
/*!*******************************!*\
|
17
|
+
!*** ./src/core/dom-query.js ***!
|
18
|
+
\*******************************/
|
19
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
20
|
+
|
21
|
+
__webpack_require__.r(__webpack_exports__);
|
22
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
23
|
+
/* harmony export */ "queryId": () => (/* binding */ queryId),
|
24
|
+
/* harmony export */ "queryIdAll": () => (/* binding */ queryIdAll)
|
25
|
+
/* harmony export */ });
|
26
|
+
var queryId = function queryId(val) {
|
27
|
+
var root = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;
|
28
|
+
return root.querySelector("[data-id=".concat(val, "]"));
|
29
|
+
};
|
30
|
+
var queryIdAll = function queryIdAll(val) {
|
31
|
+
var root = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;
|
32
|
+
return root.querySelectorAll("[data-id=".concat(val, "]"));
|
33
|
+
};
|
34
|
+
|
35
|
+
/***/ }),
|
36
|
+
|
37
|
+
/***/ "./src/core/Slider/component.css":
|
38
|
+
/*!***************************************!*\
|
39
|
+
!*** ./src/core/Slider/component.css ***!
|
40
|
+
\***************************************/
|
41
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
42
|
+
|
43
|
+
__webpack_require__.r(__webpack_exports__);
|
44
|
+
// extracted by mini-css-extract-plugin
|
45
|
+
|
46
|
+
|
47
|
+
/***/ }),
|
48
|
+
|
49
|
+
/***/ "lodash.throttle":
|
50
|
+
/*!*****************************************************************************!*\
|
51
|
+
!*** external {"commonjs":"lodash.throttle","commonjs2":"lodash.throttle"} ***!
|
52
|
+
\*****************************************************************************/
|
53
|
+
/***/ ((module) => {
|
54
|
+
|
55
|
+
module.exports = __WEBPACK_EXTERNAL_MODULE_lodash_throttle__;
|
56
|
+
|
57
|
+
/***/ })
|
58
|
+
|
59
|
+
/******/ });
|
60
|
+
/************************************************************************/
|
61
|
+
/******/ // The module cache
|
62
|
+
/******/ var __webpack_module_cache__ = {};
|
63
|
+
/******/
|
64
|
+
/******/ // The require function
|
65
|
+
/******/ function __webpack_require__(moduleId) {
|
66
|
+
/******/ // Check if module is in cache
|
67
|
+
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
68
|
+
/******/ if (cachedModule !== undefined) {
|
69
|
+
/******/ return cachedModule.exports;
|
70
|
+
/******/ }
|
71
|
+
/******/ // Create a new module (and put it into the cache)
|
72
|
+
/******/ var module = __webpack_module_cache__[moduleId] = {
|
73
|
+
/******/ // no module.id needed
|
74
|
+
/******/ // no module.loaded needed
|
75
|
+
/******/ exports: {}
|
76
|
+
/******/ };
|
77
|
+
/******/
|
78
|
+
/******/ // Execute the module function
|
79
|
+
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
80
|
+
/******/
|
81
|
+
/******/ // Return the exports of the module
|
82
|
+
/******/ return module.exports;
|
83
|
+
/******/ }
|
84
|
+
/******/
|
85
|
+
/************************************************************************/
|
86
|
+
/******/ /* webpack/runtime/compat get default export */
|
87
|
+
/******/ (() => {
|
88
|
+
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
89
|
+
/******/ __webpack_require__.n = (module) => {
|
90
|
+
/******/ var getter = module && module.__esModule ?
|
91
|
+
/******/ () => (module['default']) :
|
92
|
+
/******/ () => (module);
|
93
|
+
/******/ __webpack_require__.d(getter, { a: getter });
|
94
|
+
/******/ return getter;
|
95
|
+
/******/ };
|
96
|
+
/******/ })();
|
97
|
+
/******/
|
98
|
+
/******/ /* webpack/runtime/define property getters */
|
99
|
+
/******/ (() => {
|
100
|
+
/******/ // define getter functions for harmony exports
|
101
|
+
/******/ __webpack_require__.d = (exports, definition) => {
|
102
|
+
/******/ for(var key in definition) {
|
103
|
+
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
104
|
+
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
105
|
+
/******/ }
|
106
|
+
/******/ }
|
107
|
+
/******/ };
|
108
|
+
/******/ })();
|
109
|
+
/******/
|
110
|
+
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
111
|
+
/******/ (() => {
|
112
|
+
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
113
|
+
/******/ })();
|
114
|
+
/******/
|
115
|
+
/******/ /* webpack/runtime/make namespace object */
|
116
|
+
/******/ (() => {
|
117
|
+
/******/ // define __esModule on exports
|
118
|
+
/******/ __webpack_require__.r = (exports) => {
|
119
|
+
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
120
|
+
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
121
|
+
/******/ }
|
122
|
+
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
123
|
+
/******/ };
|
124
|
+
/******/ })();
|
125
|
+
/******/
|
126
|
+
/************************************************************************/
|
127
|
+
var __webpack_exports__ = {};
|
128
|
+
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
|
129
|
+
(() => {
|
130
|
+
/*!**************************************!*\
|
131
|
+
!*** ./src/core/Slider/component.js ***!
|
132
|
+
\**************************************/
|
133
|
+
__webpack_require__.r(__webpack_exports__);
|
134
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
135
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
136
|
+
/* harmony export */ });
|
137
|
+
/* harmony import */ var _component_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./component.css */ "./src/core/Slider/component.css");
|
138
|
+
/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.throttle */ "lodash.throttle");
|
139
|
+
/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_1__);
|
140
|
+
/* harmony import */ var _dom_query__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom-query */ "./src/core/dom-query.js");
|
141
|
+
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
var mdBreakpoint = function mdBreakpoint() {
|
146
|
+
return window.matchMedia("(min-width: 48rem)").matches;
|
147
|
+
};
|
148
|
+
|
149
|
+
var DRAG_BUFFER = 20;
|
150
|
+
|
151
|
+
var init = function init(slidesContainer) {
|
152
|
+
var transformContainer = (0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryId)("slider-strip", slidesContainer);
|
153
|
+
var slides = Array.from((0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryIdAll)("slider-slide", slidesContainer));
|
154
|
+
var slideLeftChevron = (0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryId)("slider-previous", slidesContainer);
|
155
|
+
var slideRightChevron = (0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryId)("slider-next", slidesContainer);
|
156
|
+
var slideMarkers = Array.from((0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryIdAll)("slider-marker", slidesContainer));
|
157
|
+
var sliderControls = (0,_dom_query__WEBPACK_IMPORTED_MODULE_2__.queryId)("slider-controls", slidesContainer);
|
158
|
+
sliderControls.classList.replace("hidden", "flex");
|
159
|
+
var slidesLength = slides.length;
|
160
|
+
var slidesWidth = slidesContainer.getBoundingClientRect().width;
|
161
|
+
|
162
|
+
var _slides$0$getBounding = slides[0].getBoundingClientRect(),
|
163
|
+
slideWidth = _slides$0$getBounding.width,
|
164
|
+
slideLeftDistance = _slides$0$getBounding.left;
|
165
|
+
|
166
|
+
var _slides$1$getBounding = slides[1].getBoundingClientRect(),
|
167
|
+
slideLeftDistanceSecond = _slides$1$getBounding.left;
|
168
|
+
|
169
|
+
var slideGap = slideLeftDistanceSecond - slideLeftDistance - slideWidth;
|
170
|
+
var adjustment = (slidesWidth - slideWidth) / 2;
|
171
|
+
var currentIndex = 0;
|
172
|
+
var touchStartX = 0;
|
173
|
+
|
174
|
+
var calculateTransform = function calculateTransform(index) {
|
175
|
+
return index * -slideWidth + adjustment + index * -slideGap;
|
176
|
+
};
|
177
|
+
|
178
|
+
var updateSlide = function updateSlide(index) {
|
179
|
+
return transformContainer.style.transform = "translateX(".concat(calculateTransform(index), "px)");
|
180
|
+
};
|
181
|
+
|
182
|
+
var updateMarkers = function updateMarkers(index) {
|
183
|
+
slideMarkers.forEach(function (marker) {
|
184
|
+
return marker.classList.remove("text-active-orange");
|
185
|
+
});
|
186
|
+
slideMarkers[index].classList.remove("text-cool-black");
|
187
|
+
slideMarkers[index].classList.add("text-active-orange");
|
188
|
+
};
|
189
|
+
|
190
|
+
var slideLeft = function slideLeft() {
|
191
|
+
currentIndex = currentIndex - 1 <= 0 ? 0 : currentIndex - 1;
|
192
|
+
updateSlide(currentIndex);
|
193
|
+
updateMarkers(currentIndex);
|
194
|
+
};
|
195
|
+
|
196
|
+
var slideRight = function slideRight() {
|
197
|
+
currentIndex = currentIndex + 1 >= slidesLength ? currentIndex : currentIndex + 1;
|
198
|
+
updateSlide(currentIndex);
|
199
|
+
updateMarkers(currentIndex);
|
200
|
+
};
|
201
|
+
|
202
|
+
updateSlide(0);
|
203
|
+
updateMarkers(0);
|
204
|
+
slideLeftChevron.addEventListener("click", slideLeft);
|
205
|
+
transformContainer.addEventListener("touchstart", function (e) {
|
206
|
+
var _e$touches$;
|
207
|
+
|
208
|
+
touchStartX = (_e$touches$ = e.touches[0]) === null || _e$touches$ === void 0 ? void 0 : _e$touches$.clientX;
|
209
|
+
});
|
210
|
+
transformContainer.addEventListener("touchend", function (e) {
|
211
|
+
var _e$changedTouches$;
|
212
|
+
|
213
|
+
var distance = ((_e$changedTouches$ = e.changedTouches[0]) === null || _e$changedTouches$ === void 0 ? void 0 : _e$changedTouches$.clientX) - touchStartX; // Prevent sliding on clicks
|
214
|
+
|
215
|
+
if (Math.abs(distance) < DRAG_BUFFER) return;
|
216
|
+
var direction = distance > 0 ? slideLeft : slideRight;
|
217
|
+
direction();
|
218
|
+
});
|
219
|
+
slideRightChevron.addEventListener("click", slideRight);
|
220
|
+
return function () {
|
221
|
+
transformContainer.style.transform = null;
|
222
|
+
sliderControls.classList.replace("flex", "hidden");
|
223
|
+
};
|
224
|
+
};
|
225
|
+
|
226
|
+
var Slider = function Slider(_ref) {
|
227
|
+
var container = _ref.container,
|
228
|
+
mqEnableThreshold = _ref.mqEnableThreshold;
|
229
|
+
if (!container) return;
|
230
|
+
|
231
|
+
var breakpointCheck = mqEnableThreshold || function () {
|
232
|
+
return !mdBreakpoint();
|
233
|
+
};
|
234
|
+
|
235
|
+
var unmount = function unmount() {};
|
236
|
+
|
237
|
+
if (breakpointCheck()) unmount = init(container);
|
238
|
+
window.addEventListener("resize", lodash_throttle__WEBPACK_IMPORTED_MODULE_1___default()(function () {
|
239
|
+
if (breakpointCheck()) {
|
240
|
+
unmount = init(container);
|
241
|
+
} else {
|
242
|
+
unmount();
|
243
|
+
}
|
244
|
+
}, 100));
|
245
|
+
};
|
246
|
+
|
247
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Slider);
|
248
|
+
})();
|
249
|
+
|
250
|
+
__webpack_exports__ = __webpack_exports__["default"];
|
251
|
+
/******/ return __webpack_exports__;
|
252
|
+
/******/ })()
|
253
|
+
;
|
254
|
+
});
|
255
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxTQUF6QixHQUFxQyxJQUFyQztBQUNBcEIsSUFBQUEsY0FBYyxDQUFDQyxTQUFmLENBQXlCQyxPQUF6QixDQUFpQyxNQUFqQyxFQUF5QyxRQUF6QztBQUNELEdBSEQ7QUFJRCxDQTNFRDs7QUE2RUEsSUFBTW1DLE1BQU0sR0FBRyxTQUFUQSxNQUFTLE9BQXNDO0FBQUEsTUFBbkNDLFNBQW1DLFFBQW5DQSxTQUFtQztBQUFBLE1BQXhCQyxpQkFBd0IsUUFBeEJBLGlCQUF3QjtBQUNuRCxNQUFJLENBQUNELFNBQUwsRUFBZ0I7O0FBRWhCLE1BQU1FLGVBQWUsR0FBR0QsaUJBQWlCLElBQUs7QUFBQSxXQUFNLENBQUNyRCxZQUFZLEVBQW5CO0FBQUEsR0FBOUM7O0FBRUEsTUFBSXVELE9BQU8sR0FBRyxtQkFBTSxDQUFFLENBQXRCOztBQUNBLE1BQUlELGVBQWUsRUFBbkIsRUFBdUJDLE9BQU8sR0FBR2xELElBQUksQ0FBQytDLFNBQUQsQ0FBZDtBQUV2Qm5ELEVBQUFBLE1BQU0sQ0FBQ3lDLGdCQUFQLENBQ0UsUUFERixFQUVFM0Msc0RBQVEsQ0FBQyxZQUFNO0FBQ2IsUUFBSXVELGVBQWUsRUFBbkIsRUFBdUI7QUFDckJDLE1BQUFBLE9BQU8sR0FBR2xELElBQUksQ0FBQytDLFNBQUQsQ0FBZDtBQUNELEtBRkQsTUFFTztBQUNMRyxNQUFBQSxPQUFPO0FBQ1I7QUFDRixHQU5PLEVBTUwsR0FOSyxDQUZWO0FBVUQsQ0FsQkQ7O0FBb0JBLGlFQUFlSixNQUFmLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUvLi9zcmMvY29yZS9kb20tcXVlcnkuanMiLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUvLi9zcmMvY29yZS9TbGlkZXIvY29tcG9uZW50LmNzcz8xZTg1Iiwid2VicGFjazovL0FibHlVaS5Db3JlL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOlwibG9kYXNoLnRocm90dGxlXCIsXCJjb21tb25qczJcIjpcImxvZGFzaC50aHJvdHRsZVwifSIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0FibHlVaS5Db3JlLy4vc3JjL2NvcmUvU2xpZGVyL2NvbXBvbmVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJsb2Rhc2gudGhyb3R0bGVcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiQWJseVVpXCJdID0gZmFjdG9yeShyZXF1aXJlKFwibG9kYXNoLnRocm90dGxlXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJBYmx5VWlcIl0gPSByb290W1wiQWJseVVpXCJdIHx8IHt9LCByb290W1wiQWJseVVpXCJdW1wiQ29yZVwiXSA9IHJvb3RbXCJBYmx5VWlcIl1bXCJDb3JlXCJdIHx8IHt9LCByb290W1wiQWJseVVpXCJdW1wiQ29yZVwiXVtcIlNsaWRlclwiXSA9IGZhY3Rvcnkocm9vdFt1bmRlZmluZWRdKTtcbn0pKHRoaXMsIChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2xvZGFzaF90aHJvdHRsZV9fKSA9PiB7XG5yZXR1cm4gIiwiZXhwb3J0IGNvbnN0IHF1ZXJ5SWQgPSAodmFsLCByb290ID0gZG9jdW1lbnQpID0+XG4gIHJvb3QucXVlcnlTZWxlY3RvcihgW2RhdGEtaWQ9JHt2YWx9XWApO1xuXG5leHBvcnQgY29uc3QgcXVlcnlJZEFsbCA9ICh2YWwsIHJvb3QgPSBkb2N1bWVudCkgPT5cbiAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbZGF0YS1pZD0ke3ZhbH1dYCk7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfbG9kYXNoX3Rocm90dGxlX187IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCBcIi4vY29tcG9uZW50LmNzc1wiO1xuXG5pbXBvcnQgdGhyb3R0bGUgZnJvbSBcImxvZGFzaC50aHJvdHRsZVwiO1xuXG5pbXBvcnQgeyBxdWVyeUlkLCBxdWVyeUlkQWxsIH0gZnJvbSBcIi4uL2RvbS1xdWVyeVwiO1xuXG5jb25zdCBtZEJyZWFrcG9pbnQgPSAoKSA9PiB3aW5kb3cubWF0Y2hNZWRpYShcIihtaW4td2lkdGg6IDQ4cmVtKVwiKS5tYXRjaGVzO1xuY29uc3QgRFJBR19CVUZGRVIgPSAyMDtcblxuY29uc3QgaW5pdCA9IChzbGlkZXNDb250YWluZXIpID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtQ29udGFpbmVyID0gcXVlcnlJZChcInNsaWRlci1zdHJpcFwiLCBzbGlkZXNDb250YWluZXIpO1xuICBjb25zdCBzbGlkZXMgPSBBcnJheS5mcm9tKHF1ZXJ5SWRBbGwoXCJzbGlkZXItc2xpZGVcIiwgc2xpZGVzQ29udGFpbmVyKSk7XG4gIGNvbnN0IHNsaWRlTGVmdENoZXZyb24gPSBxdWVyeUlkKFwic2xpZGVyLXByZXZpb3VzXCIsIHNsaWRlc0NvbnRhaW5lcik7XG4gIGNvbnN0IHNsaWRlUmlnaHRDaGV2cm9uID0gcXVlcnlJZChcInNsaWRlci1uZXh0XCIsIHNsaWRlc0NvbnRhaW5lcik7XG4gIGNvbnN0IHNsaWRlTWFya2VycyA9IEFycmF5LmZyb20ocXVlcnlJZEFsbChcInNsaWRlci1tYXJrZXJcIiwgc2xpZGVzQ29udGFpbmVyKSk7XG4gIGNvbnN0IHNsaWRlckNvbnRyb2xzID0gcXVlcnlJZChcInNsaWRlci1jb250cm9sc1wiLCBzbGlkZXNDb250YWluZXIpO1xuXG4gIHNsaWRlckNvbnRyb2xzLmNsYXNzTGlzdC5yZXBsYWNlKFwiaGlkZGVuXCIsIFwiZmxleFwiKTtcbiAgY29uc3Qgc2xpZGVzTGVuZ3RoID0gc2xpZGVzLmxlbmd0aDtcblxuICBjb25zdCBzbGlkZXNXaWR0aCA9IHNsaWRlc0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgY29uc3QgeyB3aWR0aDogc2xpZGVXaWR0aCwgbGVmdDogc2xpZGVMZWZ0RGlzdGFuY2UgfSA9XG4gICAgc2xpZGVzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCB7IGxlZnQ6IHNsaWRlTGVmdERpc3RhbmNlU2Vjb25kIH0gPSBzbGlkZXNbMV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHNsaWRlR2FwID0gc2xpZGVMZWZ0RGlzdGFuY2VTZWNvbmQgLSBzbGlkZUxlZnREaXN0YW5jZSAtIHNsaWRlV2lkdGg7XG4gIGNvbnN0IGFkanVzdG1lbnQgPSAoc2xpZGVzV2lkdGggLSBzbGlkZVdpZHRoKSAvIDI7XG5cbiAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XG4gIGxldCB0b3VjaFN0YXJ0WCA9IDA7XG5cbiAgY29uc3QgY2FsY3VsYXRlVHJhbnNmb3JtID0gKGluZGV4KSA9PlxuICAgIGluZGV4ICogLXNsaWRlV2lkdGggKyBhZGp1c3RtZW50ICsgaW5kZXggKiAtc2xpZGVHYXA7XG5cbiAgY29uc3QgdXBkYXRlU2xpZGUgPSAoaW5kZXgpID0+XG4gICAgKHRyYW5zZm9ybUNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgke2NhbGN1bGF0ZVRyYW5zZm9ybShcbiAgICAgIGluZGV4XG4gICAgKX1weClgKTtcblxuICBjb25zdCB1cGRhdGVNYXJrZXJzID0gKGluZGV4KSA9PiB7XG4gICAgc2xpZGVNYXJrZXJzLmZvckVhY2goKG1hcmtlcikgPT5cbiAgICAgIG1hcmtlci5jbGFzc0xpc3QucmVtb3ZlKFwidGV4dC1hY3RpdmUtb3JhbmdlXCIpXG4gICAgKTtcbiAgICBzbGlkZU1hcmtlcnNbaW5kZXhdLmNsYXNzTGlzdC5yZW1vdmUoXCJ0ZXh0LWNvb2wtYmxhY2tcIik7XG4gICAgc2xpZGVNYXJrZXJzW2luZGV4XS5jbGFzc0xpc3QuYWRkKFwidGV4dC1hY3RpdmUtb3JhbmdlXCIpO1xuICB9O1xuXG4gIGNvbnN0IHNsaWRlTGVmdCA9ICgpID0+IHtcbiAgICBjdXJyZW50SW5kZXggPSBjdXJyZW50SW5kZXggLSAxIDw9IDAgPyAwIDogY3VycmVudEluZGV4IC0gMTtcbiAgICB1cGRhdGVTbGlkZShjdXJyZW50SW5kZXgpO1xuICAgIHVwZGF0ZU1hcmtlcnMoY3VycmVudEluZGV4KTtcbiAgfTtcblxuICBjb25zdCBzbGlkZVJpZ2h0ID0gKCkgPT4ge1xuICAgIGN1cnJlbnRJbmRleCA9XG4gICAgICBjdXJyZW50SW5kZXggKyAxID49IHNsaWRlc0xlbmd0aCA/IGN1cnJlbnRJbmRleCA6IGN1cnJlbnRJbmRleCArIDE7XG4gICAgdXBkYXRlU2xpZGUoY3VycmVudEluZGV4KTtcbiAgICB1cGRhdGVNYXJrZXJzKGN1cnJlbnRJbmRleCk7XG4gIH07XG5cbiAgdXBkYXRlU2xpZGUoMCk7XG4gIHVwZGF0ZU1hcmtlcnMoMCk7XG5cbiAgc2xpZGVMZWZ0Q2hldnJvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgc2xpZGVMZWZ0KTtcblxuICB0cmFuc2Zvcm1Db250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgKGUpID0+IHtcbiAgICB0b3VjaFN0YXJ0WCA9IGUudG91Y2hlc1swXT8uY2xpZW50WDtcbiAgfSk7XG5cbiAgdHJhbnNmb3JtQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCAoZSkgPT4ge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gZS5jaGFuZ2VkVG91Y2hlc1swXT8uY2xpZW50WCAtIHRvdWNoU3RhcnRYO1xuXG4gICAgLy8gUHJldmVudCBzbGlkaW5nIG9uIGNsaWNrc1xuICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZSkgPCBEUkFHX0JVRkZFUikgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyZWN0aW9uID0gZGlzdGFuY2UgPiAwID8gc2xpZGVMZWZ0IDogc2xpZGVSaWdodDtcbiAgICBkaXJlY3Rpb24oKTtcbiAgfSk7XG5cbiAgc2xpZGVSaWdodENoZXZyb24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHNsaWRlUmlnaHQpO1xuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgdHJhbnNmb3JtQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSA9IG51bGw7XG4gICAgc2xpZGVyQ29udHJvbHMuY2xhc3NMaXN0LnJlcGxhY2UoXCJmbGV4XCIsIFwiaGlkZGVuXCIpO1xuICB9O1xufTtcblxuY29uc3QgU2xpZGVyID0gKHsgY29udGFpbmVyLCBtcUVuYWJsZVRocmVzaG9sZCB9KSA9PiB7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgY29uc3QgYnJlYWtwb2ludENoZWNrID0gbXFFbmFibGVUaHJlc2hvbGQgfHwgKCgpID0+ICFtZEJyZWFrcG9pbnQoKSk7XG5cbiAgbGV0IHVubW91bnQgPSAoKSA9PiB7fTtcbiAgaWYgKGJyZWFrcG9pbnRDaGVjaygpKSB1bm1vdW50ID0gaW5pdChjb250YWluZXIpO1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgIFwicmVzaXplXCIsXG4gICAgdGhyb3R0bGUoKCkgPT4ge1xuICAgICAgaWYgKGJyZWFrcG9pbnRDaGVjaygpKSB7XG4gICAgICAgIHVubW91bnQgPSBpbml0KGNvbnRhaW5lcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bm1vdW50KCk7XG4gICAgICB9XG4gICAgfSwgMTAwKVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2xpZGVyO1xuIl0sIm5hbWVzIjpbInF1ZXJ5SWQiLCJ2YWwiLCJyb290IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicXVlcnlJZEFsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJ0aHJvdHRsZSIsIm1kQnJlYWtwb2ludCIsIndpbmRvdyIsIm1hdGNoTWVkaWEiLCJtYXRjaGVzIiwiRFJBR19CVUZGRVIiLCJpbml0Iiwic2xpZGVzQ29udGFpbmVyIiwidHJhbnNmb3JtQ29udGFpbmVyIiwic2xpZGVzIiwiQXJyYXkiLCJmcm9tIiwic2xpZGVMZWZ0Q2hldnJvbiIsInNsaWRlUmlnaHRDaGV2cm9uIiwic2xpZGVNYXJrZXJzIiwic2xpZGVyQ29udHJvbHMiLCJjbGFzc0xpc3QiLCJyZXBsYWNlIiwic2xpZGVzTGVuZ3RoIiwibGVuZ3RoIiwic2xpZGVzV2lkdGgiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ3aWR0aCIsInNsaWRlV2lkdGgiLCJzbGlkZUxlZnREaXN0YW5jZSIsImxlZnQiLCJzbGlkZUxlZnREaXN0YW5jZVNlY29uZCIsInNsaWRlR2FwIiwiYWRqdXN0bWVudCIsImN1cnJlbnRJbmRleCIsInRvdWNoU3RhcnRYIiwiY2FsY3VsYXRlVHJhbnNmb3JtIiwiaW5kZXgiLCJ1cGRhdGVTbGlkZSIsInN0eWxlIiwidHJhbnNmb3JtIiwidXBkYXRlTWFya2VycyIsImZvckVhY2giLCJtYXJrZXIiLCJyZW1vdmUiLCJhZGQiLCJzbGlkZUxlZnQiLCJzbGlkZVJpZ2h0IiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJ0b3VjaGVzIiwiY2xpZW50WCIsImRpc3RhbmNlIiwiY2hhbmdlZFRvdWNoZXMiLCJNYXRoIiwiYWJzIiwiZGlyZWN0aW9uIiwiU2xpZGVyIiwiY29udGFpbmVyIiwibXFFbmFibGVUaHJlc2hvbGQiLCJicmVha3BvaW50Q2hlY2siLCJ1bm1vdW50Il0sInNvdXJjZVJvb3QiOiIifQ==
|