1 | /******/ (function(modules) { // webpackBootstrap
|
2 | /******/ // The module cache
|
3 | /******/ var installedModules = {};
|
4 |
|
5 | /******/ // The require function
|
6 | /******/ function __webpack_require__(moduleId) {
|
7 |
|
8 | /******/ // Check if module is in cache
|
9 | /******/ if(installedModules[moduleId])
|
10 | /******/ return installedModules[moduleId].exports;
|
11 |
|
12 | /******/ // Create a new module (and put it into the cache)
|
13 | /******/ var module = installedModules[moduleId] = {
|
14 | /******/ exports: {},
|
15 | /******/ id: moduleId,
|
16 | /******/ loaded: false
|
17 | /******/ };
|
18 |
|
19 | /******/ // Execute the module function
|
20 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
21 |
|
22 | /******/ // Flag the module as loaded
|
23 | /******/ module.loaded = true;
|
24 |
|
25 | /******/ // Return the exports of the module
|
26 | /******/ return module.exports;
|
27 | /******/ }
|
28 |
|
29 |
|
30 | /******/ // expose the modules object (__webpack_modules__)
|
31 | /******/ __webpack_require__.m = modules;
|
32 |
|
33 | /******/ // expose the module cache
|
34 | /******/ __webpack_require__.c = installedModules;
|
35 |
|
36 | /******/ // __webpack_public_path__
|
37 | /******/ __webpack_require__.p = "";
|
38 |
|
39 | /******/ // Load entry module and return exports
|
40 | /******/ return __webpack_require__(0);
|
41 | /******/ })
|
42 | /************************************************************************/
|
43 | /******/ ([
|
44 | /* 0 */
|
45 | /***/ (function(module, exports, __webpack_require__) {
|
46 |
|
47 | ;
|
48 |
|
49 | var _beeLayout = __webpack_require__(1);
|
50 |
|
51 | var _beePanel = __webpack_require__(7);
|
52 |
|
53 | var _react = __webpack_require__(4);
|
54 |
|
55 | var _react2 = _interopRequireDefault(_react);
|
56 |
|
57 | var _reactDom = __webpack_require__(11);
|
58 |
|
59 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
60 |
|
61 | var _src = __webpack_require__(74);
|
62 |
|
63 | var _src2 = _interopRequireDefault(_src);
|
64 |
|
65 | var _beeIcon = __webpack_require__(77);
|
66 |
|
67 | var _beeIcon2 = _interopRequireDefault(_beeIcon);
|
68 |
|
69 | var _beeMessage = __webpack_require__(79);
|
70 |
|
71 | var _beeMessage2 = _interopRequireDefault(_beeMessage);
|
72 |
|
73 | var _beeButton = __webpack_require__(89);
|
74 |
|
75 | var _beeButton2 = _interopRequireDefault(_beeButton);
|
76 |
|
77 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
78 |
|
79 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
80 |
|
81 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
82 |
|
83 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
84 |
|
85 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
86 |
|
87 | var Steps = _src2['default'].Steps;
|
88 | var CARET = _react2['default'].createElement('i', { className: 'uf uf-arrow-down' });
|
89 |
|
90 | var CARETUP = _react2['default'].createElement('i', { className: 'uf uf-arrow-up' });
|
91 |
|
92 | var Demo1 = __webpack_require__(91);var Demo2 = __webpack_require__(92);var Demo3 = __webpack_require__(93);var Demo4 = __webpack_require__(94);var Demo5 = __webpack_require__(95);var DemoArray = [{ "example": _react2['default'].createElement(Demo1, null), "title": " 常用基础 Step", "code": "/**\n*\n* @title 常用基础 Step\n* @description current 标记当前机型哪一步\n*\n*/\n\nimport React, { Component } from 'react';\nimport Step from 'tinper-bee';\n\nclass Demo1 extends Component {\n render () {\n return (\n <div>\n <Step.Steps current={1}>\n <Step title=\"Finished\" description=\"This is a description.\" />\n <Step title=\"In Progress\" description=\"This is a description.\" />\n <Step title=\"Waiting\" description=\"This is a description.\" />\n </Step.Steps>\n </div>\n \n )\n }\n}\n\n\n", "desc": " current 标记当前机型哪一步" }, { "example": _react2['default'].createElement(Demo2, null), "title": " 自定义icon Step", "code": "/**\n*\n* @title 自定义icon Step\n* @description\n*\n*/\n\nimport React, { Component } from 'react';\nimport Icon from 'bee-icon';\nimport Step from 'tinper-bee';\n\nclass Demo2 extends Component {\n render () {\n return (\n <Step.Steps>\n <Step status=\"finish\" title=\"Login\" icon={<Icon type=\"uf-users-o\" />} />\n <Step status=\"finish\" title=\"Verification\" icon={<Icon type=\"uf-personin-o\" />} />\n <Step status=\"process\" title=\"Pay\" icon={<Icon type=\"uf-creditcard\" />} />\n <Step status=\"wait\" title=\"Done\" icon={<Icon type=\"uf-correct-2\" />} />\n </Step.Steps>\n )\n }\n}\n\n", "desc": "" }, { "example": _react2['default'].createElement(Demo3, null), "title": " 结合切换事件的 Step", "code": "\n/**\n*\n* @title 结合切换事件的 Step\n* @description 点击next,Step的流程跟进\n*\n*/\nimport React, { Component } from 'react';\nimport Icon from 'bee-icon';\nimport Message from 'bee-message';\nimport Button from 'bee-button';\nimport Step from 'tinper-bee';\n\nconst Steps = Step.Steps;\n\nconst steps = [{\n title: 'First',\n content: 'First-content',\n}, {\n title: 'Second',\n content: 'Second-content',\n}, {\n title: 'Last',\n content: 'Last-content',\n}];\n\nclass Demo3 extends Component {\n constructor(props) {\n super(props);\n this.state = {\n current: 0,\n };\n }\n next() {\n const current = this.state.current + 1;\n this.setState({ current });\n }\n prev() {\n const current = this.state.current - 1;\n this.setState({ current });\n }\n\n alertDone() {\n Message.create({content: 'done', color: 'info'});\n }\n\n render() {\n const { current } = this.state;\n return (\n <div>\n <Steps current={current}>\n {steps.map(item => <Step key={item.title} title={item.title} />)}\n </Steps>\n <div className=\"steps-content\">{steps[this.state.current].content}</div>\n <div className=\"steps-action\">\n {\n this.state.current < steps.length - 1\n &&\n <Button type=\"primary\" onClick={() => this.next()}>Next</Button>\n }\n {\n this.state.current === steps.length - 1\n &&\n <Button type=\"primary\" onClick={() => this.alertDone()}>Done</Button>\n }\n {\n this.state.current > 0\n &&\n <Button style={{ marginLeft: 8 }} onClick={() => this.prev()}>\n Previous\n </Button>\n }\n </div>\n </div>\n );\n }\n}\n\n", "desc": " 点击next,Step的流程跟进" }, { "example": _react2['default'].createElement(Demo4, null), "title": " vertical Step", "code": "/**\n*\n* @title vertical Step\n* @description \n*\n*/\n\nimport React, { Component } from 'react';\nimport Step from 'tinper-bee';\n\nconst Steps = Step.Steps;\n\nclass Demo4 extends Component {\n render () {\n return (\n <div>\n <Steps direction=\"vertical\" size=\"small\" current={1}>\n <Step title=\"Finished\" description=\"This is a description.\" />\n <Step title=\"In Progress\" description=\"This is a description.\" />\n <Step title=\"Waiting\" description=\"This is a description.\" />\n </Steps>\n </div>\n )\n }\n}\n\n", "desc": " " }, { "example": _react2['default'].createElement(Demo5, null), "title": " 指定状态的Step", "code": "/**\n*\n* @title 指定状态的Step\n* @description 用step的status属性,指定当前step的状态\n*\n*/\n\nimport React, { Component } from 'react';\nimport Step from 'tinper-bee';\n\nconst Steps = Step.Steps;\n\nclass Demo5 extends Component {\n render () {\n return (\n <div>\n <Steps current={1} status=\"error\">\n <Step title=\"Finished\" description=\"This is a description\" />\n <Step title=\"In Process\" description=\"This is a description\" />\n <Step title=\"Waiting\" description=\"This is a description\" />\n </Steps>\n </div>\n )\n }\n}\n\n", "desc": " 用step的status属性,指定当前step的状态" }];
|
93 |
|
94 | var Demo = function (_Component) {
|
95 | _inherits(Demo, _Component);
|
96 |
|
97 | function Demo(props) {
|
98 | _classCallCheck(this, Demo);
|
99 |
|
100 | var _this = _possibleConstructorReturn(this, _Component.call(this, props));
|
101 |
|
102 | _this.state = {
|
103 | open: false
|
104 | };
|
105 | _this.handleClick = _this.handleClick.bind(_this);
|
106 | return _this;
|
107 | }
|
108 |
|
109 | Demo.prototype.handleClick = function handleClick() {
|
110 | this.setState({ open: !this.state.open });
|
111 | };
|
112 |
|
113 | Demo.prototype.render = function render() {
|
114 | var _props = this.props,
|
115 | title = _props.title,
|
116 | example = _props.example,
|
117 | code = _props.code,
|
118 | desc = _props.desc;
|
119 |
|
120 | var caret = this.state.open ? CARETUP : CARET;
|
121 | var text = this.state.open ? "隐藏代码" : "查看代码";
|
122 |
|
123 | var footer = _react2['default'].createElement(
|
124 | _beeButton2['default'],
|
125 | { shape: 'block', onClick: this.handleClick },
|
126 | text
|
127 | );
|
128 | var header = _react2['default'].createElement(
|
129 | _beeLayout.Row,
|
130 | null,
|
131 | _react2['default'].createElement(
|
132 | _beeLayout.Col,
|
133 | { md: 11 },
|
134 | example
|
135 | ),
|
136 | _react2['default'].createElement(_beeLayout.Col, { md: 1 })
|
137 | );
|
138 | return _react2['default'].createElement(
|
139 | _beeLayout.Col,
|
140 | { md: 12 },
|
141 | _react2['default'].createElement(
|
142 | 'h3',
|
143 | null,
|
144 | title
|
145 | ),
|
146 | _react2['default'].createElement(
|
147 | 'p',
|
148 | null,
|
149 | desc
|
150 | ),
|
151 | _react2['default'].createElement(
|
152 | _beePanel.Panel,
|
153 | { collapsible: true, headerContent: true, expanded: this.state.open, colors: 'bordered', header: header, footer: footer, footerStyle: { padding: 0 } },
|
154 | _react2['default'].createElement(
|
155 | 'pre',
|
156 | null,
|
157 | _react2['default'].createElement(
|
158 | 'code',
|
159 | { className: 'hljs javascript' },
|
160 | code
|
161 | )
|
162 | )
|
163 | )
|
164 | );
|
165 | };
|
166 |
|
167 | return Demo;
|
168 | }(_react.Component);
|
169 |
|
170 | var DemoGroup = function (_Component2) {
|
171 | _inherits(DemoGroup, _Component2);
|
172 |
|
173 | function DemoGroup(props) {
|
174 | _classCallCheck(this, DemoGroup);
|
175 |
|
176 | return _possibleConstructorReturn(this, _Component2.call(this, props));
|
177 | }
|
178 |
|
179 | DemoGroup.prototype.render = function render() {
|
180 | return _react2['default'].createElement(
|
181 | _beeLayout.Row,
|
182 | null,
|
183 | DemoArray.map(function (child, index) {
|
184 |
|
185 | return _react2['default'].createElement(Demo, { example: child.example, title: child.title, code: child.code, desc: child.desc, key: index });
|
186 | })
|
187 | );
|
188 | };
|
189 |
|
190 | return DemoGroup;
|
191 | }(_react.Component);
|
192 |
|
193 | _reactDom2['default'].render(_react2['default'].createElement(DemoGroup, null), document.getElementById('tinperBeeDemo'));
|
194 |
|
195 | /***/ }),
|
196 | /* 1 */
|
197 | /***/ (function(module, exports, __webpack_require__) {
|
198 |
|
199 | ;
|
200 |
|
201 | Object.defineProperty(exports, "__esModule", {
|
202 | value: true
|
203 | });
|
204 | exports.Con = exports.Row = exports.Col = undefined;
|
205 |
|
206 | var _Col2 = __webpack_require__(2);
|
207 |
|
208 | var _Col3 = _interopRequireDefault(_Col2);
|
209 |
|
210 | var _Row2 = __webpack_require__(5);
|
211 |
|
212 | var _Row3 = _interopRequireDefault(_Row2);
|
213 |
|
214 | var _Layout = __webpack_require__(6);
|
215 |
|
216 | var _Layout2 = _interopRequireDefault(_Layout);
|
217 |
|
218 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
219 |
|
220 | exports.Col = _Col3["default"];
|
221 | exports.Row = _Row3["default"];
|
222 | exports.Con = _Layout2["default"];
|
223 |
|
224 | /***/ }),
|
225 | /* 2 */
|
226 | /***/ (function(module, exports, __webpack_require__) {
|
227 |
|
228 | ;
|
229 |
|
230 | Object.defineProperty(exports, "__esModule", {
|
231 | value: true
|
232 | });
|
233 |
|
234 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
235 |
|
236 | var _classnames = __webpack_require__(3);
|
237 |
|
238 | var _classnames2 = _interopRequireDefault(_classnames);
|
239 |
|
240 | var _react = __webpack_require__(4);
|
241 |
|
242 | var _react2 = _interopRequireDefault(_react);
|
243 |
|
244 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
245 |
|
246 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
247 |
|
248 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
249 |
|
250 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
251 |
|
252 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
253 |
|
254 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
255 |
|
256 | var propTypes = {
|
257 | componentClass: _react.PropTypes.oneOfType([_react2["default"].PropTypes.element, _react2["default"].PropTypes.string]),
|
258 |
|
259 | /**
|
260 | * xs显示列数
|
261 | */
|
262 | xs: _react.PropTypes.number,
|
263 | /**
|
264 | * sm显示列数
|
265 | */
|
266 | sm: _react.PropTypes.number,
|
267 | /**
|
268 | * md显示列数
|
269 | */
|
270 | md: _react.PropTypes.number,
|
271 | /**
|
272 | * lg显示列数
|
273 | */
|
274 | lg: _react.PropTypes.number,
|
275 | /**
|
276 | * xs偏移列数
|
277 | */
|
278 | xsOffset: _react.PropTypes.number,
|
279 | /**
|
280 | * sm偏移列数
|
281 | */
|
282 | smOffset: _react.PropTypes.number,
|
283 | /**
|
284 | * md偏移列数
|
285 | */
|
286 | mdOffset: _react.PropTypes.number,
|
287 | /**
|
288 | * lg偏移列数
|
289 | */
|
290 | lgOffset: _react.PropTypes.number,
|
291 | /**
|
292 | * xs右偏移列数
|
293 | */
|
294 | xsPush: _react.PropTypes.number,
|
295 | /**
|
296 | * sm右偏移列数
|
297 | */
|
298 | smPush: _react.PropTypes.number,
|
299 | /**
|
300 | * md右偏移列数
|
301 | */
|
302 | mdPush: _react.PropTypes.number,
|
303 | /**
|
304 | * lg右偏移列数
|
305 | */
|
306 | lgPush: _react.PropTypes.number,
|
307 | /**
|
308 | * xs左偏移列数
|
309 | */
|
310 | xsPull: _react.PropTypes.number,
|
311 | /**
|
312 | * sm左偏移列数
|
313 | */
|
314 | smPull: _react.PropTypes.number,
|
315 | /**
|
316 | * md左偏移列数
|
317 | */
|
318 | mdPull: _react.PropTypes.number,
|
319 | /**
|
320 | * lg左偏移列数
|
321 | */
|
322 | lgPull: _react.PropTypes.number
|
323 | };
|
324 |
|
325 | var defaultProps = {
|
326 | componentClass: 'div',
|
327 | clsPrefix: 'u-col'
|
328 | };
|
329 |
|
330 | var DEVICE_SIZES = ['lg', 'md', 'sm', 'xs'];
|
331 |
|
332 | var Col = function (_Component) {
|
333 | _inherits(Col, _Component);
|
334 |
|
335 | function Col() {
|
336 | _classCallCheck(this, Col);
|
337 |
|
338 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
339 | }
|
340 |
|
341 | Col.prototype.render = function render() {
|
342 | var _props = this.props,
|
343 | Component = _props.componentClass,
|
344 | className = _props.className,
|
345 | clsPrefix = _props.clsPrefix,
|
346 | others = _objectWithoutProperties(_props, ['componentClass', 'className', 'clsPrefix']);
|
347 |
|
348 | var tbClass = [];
|
349 | /**
|
350 | * 对传入props做样式转化
|
351 | * @type {[type]}
|
352 | */
|
353 | DEVICE_SIZES.forEach(function (size) {
|
354 | function popProp(propSuffix, modifier) {
|
355 | var propName = '' + size + propSuffix;
|
356 | var propValue = others[propName];
|
357 |
|
358 | if (propValue != undefined && propValue != null) {
|
359 | tbClass.push(clsPrefix + '-' + size + modifier + '-' + propValue);
|
360 | }
|
361 |
|
362 | delete others[propName];
|
363 | }
|
364 |
|
365 | popProp('', '');
|
366 | popProp('Offset', '-offset');
|
367 | popProp('Push', '-push');
|
368 | popProp('Pull', '-pull');
|
369 | });
|
370 |
|
371 | return _react2["default"].createElement(
|
372 | Component,
|
373 | _extends({
|
374 | className: (0, _classnames2["default"])(tbClass, className)
|
375 | }, others),
|
376 | this.props.children
|
377 | );
|
378 | };
|
379 |
|
380 | return Col;
|
381 | }(_react.Component);
|
382 |
|
383 | Col.propTypes = propTypes;
|
384 | Col.defaultProps = defaultProps;
|
385 |
|
386 | exports["default"] = Col;
|
387 | module.exports = exports['default'];
|
388 |
|
389 | /***/ }),
|
390 | /* 3 */
|
391 | /***/ (function(module, exports, __webpack_require__) {
|
392 |
|
393 | var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
|
394 | Copyright (c) 2016 Jed Watson.
|
395 | Licensed under the MIT License (MIT), see
|
396 | http://jedwatson.github.io/classnames
|
397 | */
|
398 | /* global define */
|
399 |
|
400 | (function () {
|
401 | ;
|
402 |
|
403 | var hasOwn = {}.hasOwnProperty;
|
404 |
|
405 | function classNames () {
|
406 | var classes = [];
|
407 |
|
408 | for (var i = 0; i < arguments.length; i++) {
|
409 | var arg = arguments[i];
|
410 | if (!arg) continue;
|
411 |
|
412 | var argType = typeof arg;
|
413 |
|
414 | if (argType === 'string' || argType === 'number') {
|
415 | classes.push(arg);
|
416 | } else if (Array.isArray(arg)) {
|
417 | classes.push(classNames.apply(null, arg));
|
418 | } else if (argType === 'object') {
|
419 | for (var key in arg) {
|
420 | if (hasOwn.call(arg, key) && arg[key]) {
|
421 | classes.push(key);
|
422 | }
|
423 | }
|
424 | }
|
425 | }
|
426 |
|
427 | return classes.join(' ');
|
428 | }
|
429 |
|
430 | if (typeof module !== 'undefined' && module.exports) {
|
431 | module.exports = classNames;
|
432 | } else if (true) {
|
433 | // register as 'classnames', consistent with npm package name
|
434 | !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () {
|
435 | return classNames;
|
436 | }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
|
437 | } else {
|
438 | window.classNames = classNames;
|
439 | }
|
440 | }());
|
441 |
|
442 |
|
443 | /***/ }),
|
444 | /* 4 */
|
445 | /***/ (function(module, exports) {
|
446 |
|
447 | module.exports = React;
|
448 |
|
449 | /***/ }),
|
450 | /* 5 */
|
451 | /***/ (function(module, exports, __webpack_require__) {
|
452 |
|
453 | ;
|
454 |
|
455 | Object.defineProperty(exports, "__esModule", {
|
456 | value: true
|
457 | });
|
458 |
|
459 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
460 |
|
461 | var _classnames = __webpack_require__(3);
|
462 |
|
463 | var _classnames2 = _interopRequireDefault(_classnames);
|
464 |
|
465 | var _react = __webpack_require__(4);
|
466 |
|
467 | var _react2 = _interopRequireDefault(_react);
|
468 |
|
469 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
470 |
|
471 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
472 |
|
473 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
474 |
|
475 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
476 |
|
477 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
478 |
|
479 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
480 |
|
481 | var propTypes = {
|
482 | componentClass: _react.PropTypes.oneOfType([_react2["default"].PropTypes.element, _react2["default"].PropTypes.string])
|
483 | };
|
484 |
|
485 | var defaultProps = {
|
486 | componentClass: 'div',
|
487 | clsPrefix: 'u-row'
|
488 | };
|
489 |
|
490 | var Row = function (_Component) {
|
491 | _inherits(Row, _Component);
|
492 |
|
493 | function Row() {
|
494 | _classCallCheck(this, Row);
|
495 |
|
496 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
497 | }
|
498 |
|
499 | Row.prototype.render = function render() {
|
500 | var _props = this.props,
|
501 | Component = _props.componentClass,
|
502 | clsPrefix = _props.clsPrefix,
|
503 | className = _props.className,
|
504 | others = _objectWithoutProperties(_props, ['componentClass', 'clsPrefix', 'className']);
|
505 |
|
506 | var bsclass = '' + clsPrefix;
|
507 |
|
508 | return _react2["default"].createElement(
|
509 | Component,
|
510 | _extends({}, others, {
|
511 | className: (0, _classnames2["default"])(bsclass, className)
|
512 | }),
|
513 | this.props.children
|
514 | );
|
515 | };
|
516 |
|
517 | return Row;
|
518 | }(_react.Component);
|
519 |
|
520 | Row.propTypes = propTypes;
|
521 | Row.defaultProps = defaultProps;
|
522 |
|
523 | exports["default"] = Row;
|
524 | module.exports = exports['default'];
|
525 |
|
526 | /***/ }),
|
527 | /* 6 */
|
528 | /***/ (function(module, exports, __webpack_require__) {
|
529 |
|
530 | ;
|
531 |
|
532 | Object.defineProperty(exports, "__esModule", {
|
533 | value: true
|
534 | });
|
535 |
|
536 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
537 |
|
538 | var _classnames = __webpack_require__(3);
|
539 |
|
540 | var _classnames2 = _interopRequireDefault(_classnames);
|
541 |
|
542 | var _react = __webpack_require__(4);
|
543 |
|
544 | var _react2 = _interopRequireDefault(_react);
|
545 |
|
546 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
547 |
|
548 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
549 |
|
550 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
551 |
|
552 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
553 |
|
554 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
555 |
|
556 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
557 |
|
558 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
559 |
|
560 | var propTypes = {
|
561 | /**
|
562 | * Adds `container-fluid` class.
|
563 | */
|
564 | fluid: _react.PropTypes.bool,
|
565 | /**
|
566 | * You can use a custom element for this component
|
567 | */
|
568 | componentClass: _react.PropTypes.oneOfType([_react2["default"].PropTypes.element, _react2["default"].PropTypes.string])
|
569 | };
|
570 |
|
571 | var defaultProps = {
|
572 | componentClass: 'div',
|
573 | fluid: false,
|
574 | clsPrefix: 'u-container'
|
575 | };
|
576 |
|
577 | var Con = function (_React$Component) {
|
578 | _inherits(Con, _React$Component);
|
579 |
|
580 | function Con() {
|
581 | _classCallCheck(this, Con);
|
582 |
|
583 | return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
584 | }
|
585 |
|
586 | Con.prototype.render = function render() {
|
587 | var _tbclass;
|
588 |
|
589 | var _props = this.props,
|
590 | fluid = _props.fluid,
|
591 | Component = _props.componentClass,
|
592 | clsPrefix = _props.clsPrefix,
|
593 | className = _props.className,
|
594 | others = _objectWithoutProperties(_props, ['fluid', 'componentClass', 'clsPrefix', 'className']);
|
595 |
|
596 | var tbclass = (_tbclass = {}, _defineProperty(_tbclass, '' + clsPrefix, !fluid), _defineProperty(_tbclass, clsPrefix + '-fluid', fluid), _tbclass);
|
597 |
|
598 | return _react2["default"].createElement(
|
599 | Component,
|
600 | _extends({}, others, {
|
601 | className: (0, _classnames2["default"])(tbclass, className)
|
602 | }),
|
603 | this.props.children
|
604 | );
|
605 | };
|
606 |
|
607 | return Con;
|
608 | }(_react2["default"].Component);
|
609 |
|
610 | Con.propTypes = propTypes;
|
611 | Con.defaultProps = defaultProps;
|
612 |
|
613 | exports["default"] = Con;
|
614 | module.exports = exports['default'];
|
615 |
|
616 | /***/ }),
|
617 | /* 7 */
|
618 | /***/ (function(module, exports, __webpack_require__) {
|
619 |
|
620 | ;
|
621 |
|
622 | Object.defineProperty(exports, "__esModule", {
|
623 | value: true
|
624 | });
|
625 | exports.PanelGroup = exports.Panel = undefined;
|
626 |
|
627 | var _Panel2 = __webpack_require__(8);
|
628 |
|
629 | var _Panel3 = _interopRequireDefault(_Panel2);
|
630 |
|
631 | var _PanelGroup2 = __webpack_require__(73);
|
632 |
|
633 | var _PanelGroup3 = _interopRequireDefault(_PanelGroup2);
|
634 |
|
635 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
636 |
|
637 | exports.Panel = _Panel3["default"];
|
638 | exports.PanelGroup = _PanelGroup3["default"];
|
639 |
|
640 | /***/ }),
|
641 | /* 8 */
|
642 | /***/ (function(module, exports, __webpack_require__) {
|
643 |
|
644 | ;
|
645 |
|
646 | Object.defineProperty(exports, "__esModule", {
|
647 | value: true
|
648 | });
|
649 |
|
650 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
651 |
|
652 | var _classnames = __webpack_require__(3);
|
653 |
|
654 | var _classnames2 = _interopRequireDefault(_classnames);
|
655 |
|
656 | var _react = __webpack_require__(4);
|
657 |
|
658 | var _react2 = _interopRequireDefault(_react);
|
659 |
|
660 | var _beeTransition = __webpack_require__(9);
|
661 |
|
662 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
663 |
|
664 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
665 |
|
666 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
667 |
|
668 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
669 |
|
670 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
671 |
|
672 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
673 |
|
674 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
675 |
|
676 | var propTypes = {
|
677 | //是否添加折叠
|
678 | collapsible: _react2["default"].PropTypes.bool,
|
679 | onSelect: _react2["default"].PropTypes.func,
|
680 | //头部组件
|
681 | header: _react2["default"].PropTypes.node,
|
682 | headerStyle: _react2["default"].PropTypes.object,
|
683 | id: _react2["default"].PropTypes.oneOfType([_react2["default"].PropTypes.string, _react2["default"].PropTypes.number]),
|
684 | headerContent: _react2["default"].PropTypes.bool,
|
685 | //footer组件
|
686 | footer: _react2["default"].PropTypes.node,
|
687 | footerStyle: _react2["default"].PropTypes.object,
|
688 | //默认是否打开
|
689 | defaultExpanded: _react2["default"].PropTypes.bool,
|
690 | //是否打开
|
691 | expanded: _react2["default"].PropTypes.bool,
|
692 | //每个panel的标记
|
693 | eventKey: _react2["default"].PropTypes.any,
|
694 | headerRole: _react2["default"].PropTypes.string,
|
695 | panelRole: _react2["default"].PropTypes.string,
|
696 | //颜色
|
697 | colors: _react2["default"].PropTypes.oneOf(['primary', 'accent', 'success', 'info', 'warning', 'danger', 'default', 'bordered']),
|
698 |
|
699 | // From Collapse.的扩展动画
|
700 | onEnter: _react2["default"].PropTypes.func,
|
701 | onEntering: _react2["default"].PropTypes.func,
|
702 | onEntered: _react2["default"].PropTypes.func,
|
703 | onExit: _react2["default"].PropTypes.func,
|
704 | onExiting: _react2["default"].PropTypes.func,
|
705 | onExited: _react2["default"].PropTypes.func
|
706 | };
|
707 |
|
708 | var defaultProps = {
|
709 | defaultExpanded: false,
|
710 | clsPrefix: "u-panel",
|
711 | colors: "default"
|
712 | };
|
713 |
|
714 | var Panel = function (_React$Component) {
|
715 | _inherits(Panel, _React$Component);
|
716 |
|
717 | function Panel(props, context) {
|
718 | _classCallCheck(this, Panel);
|
719 |
|
720 | var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context));
|
721 |
|
722 | _this.handleClickTitle = _this.handleClickTitle.bind(_this);
|
723 |
|
724 | _this.state = {
|
725 | expanded: _this.props.defaultExpanded
|
726 | };
|
727 | return _this;
|
728 | }
|
729 |
|
730 | //头部点击事件
|
731 |
|
732 |
|
733 | Panel.prototype.handleClickTitle = function handleClickTitle(e) {
|
734 | // 不让事件进入事件池
|
735 | e.persist();
|
736 | e.selected = true;
|
737 |
|
738 | if (this.props.onSelect) {
|
739 | this.props.onSelect(this.props.eventKey, e);
|
740 | } else {
|
741 | e.preventDefault();
|
742 | }
|
743 |
|
744 | if (e.selected) {
|
745 | this.setState({ expanded: !this.state.expanded });
|
746 | }
|
747 | };
|
748 |
|
749 | //渲染panelheader
|
750 |
|
751 |
|
752 | Panel.prototype.renderHeader = function renderHeader(collapsible, header, id, role, expanded, clsPrefix) {
|
753 | var titleClassName = clsPrefix + '-title';
|
754 |
|
755 | if (!collapsible) {
|
756 | if (!_react2["default"].isValidElement(header)) {
|
757 | return header;
|
758 | }
|
759 |
|
760 | return (0, _react.cloneElement)(header, {
|
761 | className: (0, _classnames2["default"])(header.props.className, titleClassName)
|
762 | });
|
763 | }
|
764 |
|
765 | if (!_react2["default"].isValidElement(header)) {
|
766 | return _react2["default"].createElement(
|
767 | 'h4',
|
768 | { role: 'presentation', className: titleClassName },
|
769 | this.renderAnchor(header, id, role, expanded)
|
770 | );
|
771 | }
|
772 | if (this.props.headerContent) {
|
773 | return (0, _react.cloneElement)(header, {
|
774 | className: (0, _classnames2["default"])(header.props.className, titleClassName)
|
775 | });
|
776 | }
|
777 |
|
778 | return (0, _react.cloneElement)(header, {
|
779 | className: (0, _classnames2["default"])(header.props.className, titleClassName),
|
780 | children: this.renderAnchor(header.props.children, id, role, expanded)
|
781 | });
|
782 | };
|
783 |
|
784 | //如果使用链接,渲染为a标签
|
785 |
|
786 |
|
787 | Panel.prototype.renderAnchor = function renderAnchor(header, id, role, expanded) {
|
788 | return _react2["default"].createElement(
|
789 | 'a',
|
790 | {
|
791 | role: role,
|
792 | href: id && '#' + id,
|
793 | 'aria-controls': id,
|
794 | 'aria-expanded': expanded,
|
795 | 'aria-selected': expanded,
|
796 | className: expanded ? null : 'collapsed'
|
797 | },
|
798 | header
|
799 | );
|
800 | };
|
801 |
|
802 | //如果有折叠动画,渲染折叠动画
|
803 |
|
804 |
|
805 | Panel.prototype.renderCollapsibleBody = function renderCollapsibleBody(id, expanded, role, children, clsPrefix, animationHooks) {
|
806 | return _react2["default"].createElement(
|
807 | _beeTransition.Collapse,
|
808 | _extends({ 'in': expanded }, animationHooks),
|
809 | _react2["default"].createElement(
|
810 | 'div',
|
811 | {
|
812 | id: id,
|
813 | role: role,
|
814 | className: clsPrefix + '-collapse',
|
815 | 'aria-hidden': !expanded
|
816 | },
|
817 | this.renderBody(children, clsPrefix)
|
818 | )
|
819 | );
|
820 | };
|
821 |
|
822 | //渲染panelbody
|
823 |
|
824 |
|
825 | Panel.prototype.renderBody = function renderBody(rawChildren, clsPrefix) {
|
826 | var children = [];
|
827 | var bodyChildren = [];
|
828 |
|
829 | var bodyClassName = clsPrefix + '-body';
|
830 |
|
831 | //添加到body的children中
|
832 | function maybeAddBody() {
|
833 | if (!bodyChildren.length) {
|
834 | return;
|
835 | }
|
836 |
|
837 | // 给子组件添加key,为了之后触发事件时使用
|
838 | children.push(_react2["default"].createElement(
|
839 | 'div',
|
840 | { key: children.length, className: bodyClassName },
|
841 | bodyChildren
|
842 | ));
|
843 |
|
844 | bodyChildren = [];
|
845 | }
|
846 |
|
847 | //转换为数组,方便复用
|
848 | _react2["default"].Children.toArray(rawChildren).forEach(function (child) {
|
849 | if (_react2["default"].isValidElement(child) && child.props.fill) {
|
850 | maybeAddBody();
|
851 |
|
852 | //将标示fill设置为undefined
|
853 | children.push((0, _react.cloneElement)(child, { fill: undefined }));
|
854 |
|
855 | return;
|
856 | }
|
857 |
|
858 | bodyChildren.push(child);
|
859 | });
|
860 |
|
861 | maybeAddBody();
|
862 |
|
863 | return children;
|
864 | };
|
865 |
|
866 | Panel.prototype.render = function render() {
|
867 | var _props = this.props;
|
868 | var collapsible = _props.collapsible;
|
869 | var header = _props.header;
|
870 | var id = _props.id;
|
871 | var footer = _props.footer;
|
872 | var propsExpanded = _props.expanded;
|
873 | var footerStyle = _props.footerStyle;
|
874 | var headerStyle = _props.headerStyle;
|
875 | var headerRole = _props.headerRole;
|
876 | var panelRole = _props.panelRole;
|
877 | var className = _props.className;
|
878 | var colors = _props.colors;
|
879 | var children = _props.children;
|
880 | var onEnter = _props.onEnter;
|
881 | var onEntering = _props.onEntering;
|
882 | var onEntered = _props.onEntered;
|
883 | var clsPrefix = _props.clsPrefix;
|
884 | var onExit = _props.onExit;
|
885 | var headerContent = _props.headerContent;
|
886 | var style = _props.style;
|
887 | var onExiting = _props.onExiting;
|
888 | var onExited = _props.onExited;
|
889 | var defaultExpanded = _props.defaultExpanded;
|
890 | var eventKey = _props.eventKey;
|
891 | var onSelect = _props.onSelect;
|
892 |
|
893 | var props = _objectWithoutProperties(_props, ['collapsible', 'header', 'id', 'footer', 'expanded', 'footerStyle', 'headerStyle', 'headerRole', 'panelRole', 'className', 'colors', 'children', 'onEnter', 'onEntering', 'onEntered', 'clsPrefix', 'onExit', 'headerContent', 'style', 'onExiting', 'onExited', 'defaultExpanded', 'eventKey', 'onSelect']);
|
894 |
|
895 | var expanded = propsExpanded != null ? propsExpanded : this.state.expanded;
|
896 |
|
897 | var classes = {};
|
898 | classes['' + clsPrefix] = true;
|
899 | classes[clsPrefix + '-' + colors] = true;
|
900 |
|
901 | var headerClass = _defineProperty({}, clsPrefix + '-heading', true);
|
902 |
|
903 | return _react2["default"].createElement(
|
904 | 'div',
|
905 | _extends({}, props, {
|
906 | className: (0, _classnames2["default"])(className, classes),
|
907 | id: collapsible ? null : id
|
908 | }),
|
909 | header && _react2["default"].createElement(
|
910 | 'div',
|
911 | { className: (0, _classnames2["default"])(headerClass), style: headerStyle, onClick: this.handleClickTitle },
|
912 | this.renderHeader(collapsible, header, id, headerRole, expanded, clsPrefix)
|
913 | ),
|
914 | collapsible ? this.renderCollapsibleBody(id, expanded, panelRole, children, clsPrefix, { onEnter: onEnter, onEntering: onEntering, onEntered: onEntered, onExit: onExit, onExiting: onExiting, onExited: onExited }) : this.renderBody(children, clsPrefix),
|
915 | footer && _react2["default"].createElement(
|
916 | 'div',
|
917 | { className: clsPrefix + '-footer', style: footerStyle },
|
918 | footer
|
919 | )
|
920 | );
|
921 | };
|
922 |
|
923 | return Panel;
|
924 | }(_react2["default"].Component);
|
925 |
|
926 | Panel.propTypes = propTypes;
|
927 | Panel.defaultProps = defaultProps;
|
928 |
|
929 | exports["default"] = Panel;
|
930 | module.exports = exports['default'];
|
931 |
|
932 | /***/ }),
|
933 | /* 9 */
|
934 | /***/ (function(module, exports, __webpack_require__) {
|
935 |
|
936 | ;
|
937 |
|
938 | Object.defineProperty(exports, "__esModule", {
|
939 | value: true
|
940 | });
|
941 | exports.Fade = exports.Collapse = exports.Transition = undefined;
|
942 |
|
943 | var _Transition2 = __webpack_require__(10);
|
944 |
|
945 | var _Transition3 = _interopRequireDefault(_Transition2);
|
946 |
|
947 | var _Collapse2 = __webpack_require__(15);
|
948 |
|
949 | var _Collapse3 = _interopRequireDefault(_Collapse2);
|
950 |
|
951 | var _Fade2 = __webpack_require__(72);
|
952 |
|
953 | var _Fade3 = _interopRequireDefault(_Fade2);
|
954 |
|
955 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
956 |
|
957 | exports.Transition = _Transition3["default"];
|
958 | exports.Collapse = _Collapse3["default"];
|
959 | exports.Fade = _Fade3["default"];
|
960 |
|
961 | /***/ }),
|
962 | /* 10 */
|
963 | /***/ (function(module, exports, __webpack_require__) {
|
964 |
|
965 | ;
|
966 |
|
967 | Object.defineProperty(exports, "__esModule", {
|
968 | value: true
|
969 | });
|
970 | exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = undefined;
|
971 |
|
972 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
973 |
|
974 | var _react = __webpack_require__(4);
|
975 |
|
976 | var _react2 = _interopRequireDefault(_react);
|
977 |
|
978 | var _reactDom = __webpack_require__(11);
|
979 |
|
980 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
981 |
|
982 | var _properties = __webpack_require__(12);
|
983 |
|
984 | var _properties2 = _interopRequireDefault(_properties);
|
985 |
|
986 | var _on = __webpack_require__(14);
|
987 |
|
988 | var _on2 = _interopRequireDefault(_on);
|
989 |
|
990 | var _classnames = __webpack_require__(3);
|
991 |
|
992 | var _classnames2 = _interopRequireDefault(_classnames);
|
993 |
|
994 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
995 |
|
996 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
997 |
|
998 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
999 |
|
1000 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
1001 |
|
1002 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
1003 |
|
1004 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
1005 |
|
1006 | var transitionEndEvent = _properties2["default"].end;
|
1007 |
|
1008 | //设置状态码
|
1009 | var UNMOUNTED = exports.UNMOUNTED = 0;
|
1010 | var EXITED = exports.EXITED = 1;
|
1011 | var ENTERING = exports.ENTERING = 2;
|
1012 | var ENTERED = exports.ENTERED = 3;
|
1013 | var EXITING = exports.EXITING = 4;
|
1014 |
|
1015 | var propTypes = {
|
1016 | /**
|
1017 | * 是否触发动画
|
1018 | */
|
1019 | "in": _react.PropTypes.bool,
|
1020 |
|
1021 | /**
|
1022 | * 不显示的时候是否移除组件
|
1023 | */
|
1024 | unmountOnExit: _react.PropTypes.bool,
|
1025 |
|
1026 | /**
|
1027 | * 如果设置为默认显示,挂载时显示动画
|
1028 | */
|
1029 | transitionAppear: _react.PropTypes.bool,
|
1030 |
|
1031 | /**
|
1032 | * 设置超时时间,防止出现问题,可设置为>=动画时间
|
1033 | */
|
1034 | timeout: _react.PropTypes.number,
|
1035 |
|
1036 | /**
|
1037 | * 退出组件时添加的class
|
1038 | */
|
1039 | exitedClassName: _react.PropTypes.string,
|
1040 | /**
|
1041 | * 退出组件中添加的class
|
1042 | */
|
1043 | exitingClassName: _react.PropTypes.string,
|
1044 | /**
|
1045 | * 进入动画后添加的class
|
1046 | */
|
1047 | enteredClassName: _react.PropTypes.string,
|
1048 | /**
|
1049 | * 进入动画时添加的class
|
1050 | */
|
1051 | enteringClassName: _react.PropTypes.string,
|
1052 |
|
1053 | /**
|
1054 | * 进入动画开始时的钩子函数
|
1055 | */
|
1056 | onEnter: _react.PropTypes.func,
|
1057 | /**
|
1058 | * 进入动画中的钩子函数
|
1059 | */
|
1060 | onEntering: _react.PropTypes.func,
|
1061 | /**
|
1062 | * 进入动画后的钩子函数
|
1063 | */
|
1064 | onEntered: _react.PropTypes.func,
|
1065 | /**
|
1066 | * 退出动画开始时的钩子函数
|
1067 | */
|
1068 | onExit: _react.PropTypes.func,
|
1069 | /**
|
1070 | * 退出动画中的钩子函数
|
1071 | */
|
1072 | onExiting: _react.PropTypes.func,
|
1073 | /**
|
1074 | * 退出动画后的钩子函数
|
1075 | */
|
1076 | onExited: _react.PropTypes.func
|
1077 | };
|
1078 |
|
1079 | function noop() {}
|
1080 |
|
1081 | var defaultProps = {
|
1082 | "in": false,
|
1083 | unmountOnExit: false,
|
1084 | transitionAppear: false,
|
1085 | timeout: 5000,
|
1086 | onEnter: noop,
|
1087 | onEntering: noop,
|
1088 | onEntered: noop,
|
1089 | onExit: noop,
|
1090 | onExiting: noop,
|
1091 | onExited: noop
|
1092 | };
|
1093 |
|
1094 | /**
|
1095 | * 动画组件
|
1096 | */
|
1097 |
|
1098 | var Transition = function (_Component) {
|
1099 | _inherits(Transition, _Component);
|
1100 |
|
1101 | function Transition(props, context) {
|
1102 | _classCallCheck(this, Transition);
|
1103 |
|
1104 | var _this = _possibleConstructorReturn(this, _Component.call(this, props, context));
|
1105 |
|
1106 | var initialStatus = void 0;
|
1107 | if (props["in"]) {
|
1108 | // 在componentdidmount时开始执行动画
|
1109 | initialStatus = props.transitionAppear ? EXITED : ENTERED;
|
1110 | } else {
|
1111 | initialStatus = props.unmountOnExit ? UNMOUNTED : EXITED;
|
1112 | }
|
1113 | _this.state = { status: initialStatus };
|
1114 |
|
1115 | _this.nextCallback = null;
|
1116 | return _this;
|
1117 | }
|
1118 |
|
1119 | Transition.prototype.componentDidMount = function componentDidMount() {
|
1120 | if (this.props.transitionAppear && this.props["in"]) {
|
1121 | this.performEnter(this.props);
|
1122 | }
|
1123 | };
|
1124 |
|
1125 | Transition.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
|
1126 | if (nextProps["in"] && this.props.unmountOnExit) {
|
1127 | if (this.state.status === UNMOUNTED) {
|
1128 | // 在componentDidUpdate执行动画.
|
1129 | this.setState({ status: EXITED });
|
1130 | }
|
1131 | } else {
|
1132 | this._needsUpdate = true;
|
1133 | }
|
1134 | };
|
1135 |
|
1136 | Transition.prototype.componentDidUpdate = function componentDidUpdate() {
|
1137 | var status = this.state.status;
|
1138 |
|
1139 | if (this.props.unmountOnExit && status === EXITED) {
|
1140 | // 当使用unmountOnExit时,exited为exiting和unmont的过渡状态
|
1141 | if (this.props["in"]) {
|
1142 | this.performEnter(this.props);
|
1143 | } else {
|
1144 | this.setState({ status: UNMOUNTED });
|
1145 | }
|
1146 |
|
1147 | return;
|
1148 | }
|
1149 |
|
1150 | // 确保只响应prop变化
|
1151 | if (this._needsUpdate) {
|
1152 | this._needsUpdate = false;
|
1153 |
|
1154 | if (this.props["in"]) {
|
1155 | if (status === EXITING) {
|
1156 | this.performEnter(this.props);
|
1157 | } else if (status === EXITED) {
|
1158 | this.performEnter(this.props);
|
1159 | }
|
1160 | // 其他,当我们已经输入或输出
|
1161 | } else {
|
1162 | if (status === ENTERING || status === ENTERED) {
|
1163 | this.performExit(this.props);
|
1164 | }
|
1165 | // 我们已经输入或输出完成
|
1166 | }
|
1167 | }
|
1168 | };
|
1169 |
|
1170 | Transition.prototype.componentWillUnmount = function componentWillUnmount() {
|
1171 | this.cancelNextCallback();
|
1172 | };
|
1173 |
|
1174 | Transition.prototype.performEnter = function performEnter(props) {
|
1175 | var _this2 = this;
|
1176 |
|
1177 | this.cancelNextCallback();
|
1178 | var node = _reactDom2["default"].findDOMNode(this);
|
1179 |
|
1180 | // 这里接收新props
|
1181 | props.onEnter(node);
|
1182 |
|
1183 | this.safeSetState({ status: ENTERING }, function () {
|
1184 | _this2.props.onEntering(node);
|
1185 |
|
1186 | _this2.onTransitionEnd(node, function () {
|
1187 | _this2.safeSetState({ status: ENTERED }, function () {
|
1188 | _this2.props.onEntered(node);
|
1189 | });
|
1190 | });
|
1191 | });
|
1192 | };
|
1193 |
|
1194 | Transition.prototype.performExit = function performExit(props) {
|
1195 | var _this3 = this;
|
1196 |
|
1197 | this.cancelNextCallback();
|
1198 | var node = _reactDom2["default"].findDOMNode(this);
|
1199 |
|
1200 | props.onExit(node);
|
1201 |
|
1202 | this.safeSetState({ status: EXITING }, function () {
|
1203 | _this3.props.onExiting(node);
|
1204 |
|
1205 | _this3.onTransitionEnd(node, function () {
|
1206 | _this3.safeSetState({ status: EXITED }, function () {
|
1207 | _this3.props.onExited(node);
|
1208 | });
|
1209 | });
|
1210 | });
|
1211 | };
|
1212 |
|
1213 | Transition.prototype.cancelNextCallback = function cancelNextCallback() {
|
1214 | if (this.nextCallback !== null) {
|
1215 | this.nextCallback.cancel();
|
1216 | this.nextCallback = null;
|
1217 | }
|
1218 | };
|
1219 |
|
1220 | Transition.prototype.safeSetState = function safeSetState(nextState, callback) {
|
1221 | // 确保在组件销毁后挂起的setState被消除
|
1222 | this.setState(nextState, this.setNextCallback(callback));
|
1223 | };
|
1224 |
|
1225 | Transition.prototype.setNextCallback = function setNextCallback(callback) {
|
1226 | var _this4 = this;
|
1227 |
|
1228 | var active = true;
|
1229 |
|
1230 | this.nextCallback = function (event) {
|
1231 | if (active) {
|
1232 | active = false;
|
1233 | _this4.nextCallback = null;
|
1234 |
|
1235 | callback(event);
|
1236 | }
|
1237 | };
|
1238 |
|
1239 | this.nextCallback.cancel = function () {
|
1240 | active = false;
|
1241 | };
|
1242 |
|
1243 | return this.nextCallback;
|
1244 | };
|
1245 |
|
1246 | Transition.prototype.onTransitionEnd = function onTransitionEnd(node, handler) {
|
1247 | this.setNextCallback(handler);
|
1248 |
|
1249 | if (node) {
|
1250 | if (transitionEndEvent == undefined) {
|
1251 | this.nextCallback();
|
1252 | } else {
|
1253 | (0, _on2["default"])(node, transitionEndEvent, this.nextCallback);
|
1254 | }
|
1255 | setTimeout(this.nextCallback, this.props.timeout);
|
1256 | } else {
|
1257 | setTimeout(this.nextCallback, 0);
|
1258 | }
|
1259 | };
|
1260 |
|
1261 | Transition.prototype.render = function render() {
|
1262 | var status = this.state.status;
|
1263 | if (status === UNMOUNTED) {
|
1264 | return null;
|
1265 | }
|
1266 |
|
1267 | var _props = this.props;
|
1268 | var children = _props.children;
|
1269 | var className = _props.className;
|
1270 |
|
1271 | var childProps = _objectWithoutProperties(_props, ['children', 'className']);
|
1272 |
|
1273 | Object.keys(Transition.propTypes).forEach(function (key) {
|
1274 | return delete childProps[key];
|
1275 | });
|
1276 |
|
1277 | var transitionClassName = void 0;
|
1278 | if (status === EXITED) {
|
1279 | transitionClassName = this.props.exitedClassName;
|
1280 | } else if (status === ENTERING) {
|
1281 | transitionClassName = this.props.enteringClassName;
|
1282 | } else if (status === ENTERED) {
|
1283 | transitionClassName = this.props.enteredClassName;
|
1284 | } else if (status === EXITING) {
|
1285 | transitionClassName = this.props.exitingClassName;
|
1286 | }
|
1287 |
|
1288 | var child = _react2["default"].Children.only(children);
|
1289 | return _react2["default"].cloneElement(child, _extends({}, childProps, {
|
1290 | className: (0, _classnames2["default"])(child.props.className, className, transitionClassName)
|
1291 | }));
|
1292 | };
|
1293 |
|
1294 | return Transition;
|
1295 | }(_react.Component);
|
1296 |
|
1297 | Transition.propTypes = propTypes;
|
1298 |
|
1299 | Transition.defaultProps = defaultProps;
|
1300 |
|
1301 | exports["default"] = Transition;
|
1302 |
|
1303 | /***/ }),
|
1304 | /* 11 */
|
1305 | /***/ (function(module, exports) {
|
1306 |
|
1307 | module.exports = ReactDOM;
|
1308 |
|
1309 | /***/ }),
|
1310 | /* 12 */
|
1311 | /***/ (function(module, exports, __webpack_require__) {
|
1312 |
|
1313 | ;
|
1314 |
|
1315 | Object.defineProperty(exports, "__esModule", {
|
1316 | value: true
|
1317 | });
|
1318 | exports.transitionEnd = exports.transitionDuration = exports.transitionDelay = exports.transitionTiming = exports.transitionProperty = exports.transform = undefined;
|
1319 |
|
1320 | var _inDOM = __webpack_require__(13);
|
1321 |
|
1322 | var _inDOM2 = _interopRequireDefault(_inDOM);
|
1323 |
|
1324 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
1325 |
|
1326 | var transform = 'transform';
|
1327 | var prefix = void 0,
|
1328 | transitionEnd = void 0;
|
1329 | var transitionTiming = void 0,
|
1330 | transitionDuration = void 0;
|
1331 | var transitionProperty = void 0,
|
1332 | transitionDelay = void 0;
|
1333 |
|
1334 | if (_inDOM2.default) {
|
1335 | var _getTransitionPropert = getTransitionProperties();
|
1336 |
|
1337 | prefix = _getTransitionPropert.prefix;
|
1338 | exports.transitionEnd = transitionEnd = _getTransitionPropert.transitionEnd;
|
1339 |
|
1340 |
|
1341 | exports.transform = transform = prefix + '-' + transform;
|
1342 | exports.transitionProperty = transitionProperty = prefix + '-transition-property';
|
1343 | exports.transitionDuration = transitionDuration = prefix + '-transition-duration';
|
1344 | exports.transitionDelay = transitionDelay = prefix + '-transition-delay';
|
1345 | exports.transitionTiming = transitionTiming = prefix + '-transition-timing-function';
|
1346 | }
|
1347 |
|
1348 | exports.transform = transform;
|
1349 | exports.transitionProperty = transitionProperty;
|
1350 | exports.transitionTiming = transitionTiming;
|
1351 | exports.transitionDelay = transitionDelay;
|
1352 | exports.transitionDuration = transitionDuration;
|
1353 | exports.transitionEnd = transitionEnd;
|
1354 | exports.default = {
|
1355 | transform: transform,
|
1356 | end: transitionEnd,
|
1357 | property: transitionProperty,
|
1358 | timing: transitionTiming,
|
1359 | delay: transitionDelay,
|
1360 | duration: transitionDuration
|
1361 | };
|
1362 |
|
1363 |
|
1364 | function getTransitionProperties() {
|
1365 | var transitionEnd = void 0;
|
1366 | var prefix = '';
|
1367 | var eventNames = {
|
1368 | O: 'otransitionend',
|
1369 | Moz: 'transitionend',
|
1370 | Webkit: 'webkitTransitionEnd',
|
1371 | ms: 'MSTransitionEnd'
|
1372 | };
|
1373 |
|
1374 | var element = document.createElement('div');
|
1375 | for (var vendor in eventNames) {
|
1376 | if (eventNames.hasOwnProperty(vendor)) {
|
1377 | if (element.style[vendor + 'TransitionProperty'] !== undefined) {
|
1378 | prefix = '-' + vendor.toLowerCase();
|
1379 | transitionEnd = eventNames[vendor];
|
1380 | break;
|
1381 | }
|
1382 | }
|
1383 | }if (!transitionEnd && element.style.transitionProperty !== undefined) transitionEnd = 'transitionend';
|
1384 |
|
1385 | element = null;
|
1386 |
|
1387 | return { transitionEnd: transitionEnd, prefix: prefix };
|
1388 | }
|
1389 |
|
1390 | /***/ }),
|
1391 | /* 13 */
|
1392 | /***/ (function(module, exports) {
|
1393 |
|
1394 | ;
|
1395 |
|
1396 | Object.defineProperty(exports, "__esModule", {
|
1397 | value: true
|
1398 | });
|
1399 | exports.default = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
|
1400 | module.exports = exports['default'];
|
1401 |
|
1402 | /***/ }),
|
1403 | /* 14 */
|
1404 | /***/ (function(module, exports, __webpack_require__) {
|
1405 |
|
1406 | ;
|
1407 |
|
1408 | Object.defineProperty(exports, "__esModule", {
|
1409 | value: true
|
1410 | });
|
1411 |
|
1412 | var _inDOM = __webpack_require__(13);
|
1413 |
|
1414 | var _inDOM2 = _interopRequireDefault(_inDOM);
|
1415 |
|
1416 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
1417 |
|
1418 | var on = function on() {};
|
1419 | if (_inDOM2.default) {
|
1420 | on = function () {
|
1421 |
|
1422 | if (document.addEventListener) return function (node, eventName, handler, capture) {
|
1423 | return node.addEventListener(eventName, handler, capture || false);
|
1424 | };else if (document.attachEvent) return function (node, eventName, handler) {
|
1425 | return node.attachEvent('on' + eventName, handler);
|
1426 | };
|
1427 | }();
|
1428 | }
|
1429 |
|
1430 | exports.default = on;
|
1431 | module.exports = exports['default'];
|
1432 |
|
1433 | /***/ }),
|
1434 | /* 15 */
|
1435 | /***/ (function(module, exports, __webpack_require__) {
|
1436 |
|
1437 | ;
|
1438 |
|
1439 | Object.defineProperty(exports, "__esModule", {
|
1440 | value: true
|
1441 | });
|
1442 |
|
1443 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
1444 |
|
1445 | var _classnames = __webpack_require__(3);
|
1446 |
|
1447 | var _classnames2 = _interopRequireDefault(_classnames);
|
1448 |
|
1449 | var _style = __webpack_require__(16);
|
1450 |
|
1451 | var _style2 = _interopRequireDefault(_style);
|
1452 |
|
1453 | var _react = __webpack_require__(4);
|
1454 |
|
1455 | var _react2 = _interopRequireDefault(_react);
|
1456 |
|
1457 | var _Transition = __webpack_require__(10);
|
1458 |
|
1459 | var _Transition2 = _interopRequireDefault(_Transition);
|
1460 |
|
1461 | var _capitalize = __webpack_require__(24);
|
1462 |
|
1463 | var _capitalize2 = _interopRequireDefault(_capitalize);
|
1464 |
|
1465 | var _tinperBeeCore = __webpack_require__(25);
|
1466 |
|
1467 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
1468 |
|
1469 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
1470 |
|
1471 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
1472 |
|
1473 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
1474 |
|
1475 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
1476 |
|
1477 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
1478 |
|
1479 | var MARGINS = {
|
1480 | height: ['marginTop', 'marginBottom'],
|
1481 | width: ['marginLeft', 'marginRight']
|
1482 | };
|
1483 |
|
1484 | // reading a dimension prop will cause the browser to recalculate,
|
1485 | // which will let our animations work
|
1486 | function triggerBrowserReflow(node) {
|
1487 | node.offsetHeight; // eslint-disable-line no-unused-expressions
|
1488 | }
|
1489 |
|
1490 | function getDimensionValue(dimension, elem) {
|
1491 | var value = elem['offset' + (0, _capitalize2["default"])(dimension)];
|
1492 | var margins = MARGINS[dimension];
|
1493 |
|
1494 | return value + parseInt((0, _style2["default"])(elem, margins[0]), 10) + parseInt((0, _style2["default"])(elem, margins[1]), 10);
|
1495 | }
|
1496 |
|
1497 | var propTypes = {
|
1498 | /**
|
1499 | * Show the component; triggers the expand or collapse animation
|
1500 | */
|
1501 | "in": _react2["default"].PropTypes.bool,
|
1502 |
|
1503 | /**
|
1504 | * Unmount the component (remove it from the DOM) when it is collapsed
|
1505 | */
|
1506 | unmountOnExit: _react2["default"].PropTypes.bool,
|
1507 |
|
1508 | /**
|
1509 | * Run the expand animation when the component mounts, if it is initially
|
1510 | * shown
|
1511 | */
|
1512 | transitionAppear: _react2["default"].PropTypes.bool,
|
1513 |
|
1514 | /**
|
1515 | * Duration of the collapse animation in milliseconds, to ensure that
|
1516 | * finishing callbacks are fired even if the original browser transition end
|
1517 | * events are canceled
|
1518 | */
|
1519 | timeout: _react2["default"].PropTypes.number,
|
1520 |
|
1521 | /**
|
1522 | * Callback fired before the component expands
|
1523 | */
|
1524 | onEnter: _react2["default"].PropTypes.func,
|
1525 | /**
|
1526 | * Callback fired after the component starts to expand
|
1527 | */
|
1528 | onEntering: _react2["default"].PropTypes.func,
|
1529 | /**
|
1530 | * Callback fired after the component has expanded
|
1531 | */
|
1532 | onEntered: _react2["default"].PropTypes.func,
|
1533 | /**
|
1534 | * Callback fired before the component collapses
|
1535 | */
|
1536 | onExit: _react2["default"].PropTypes.func,
|
1537 | /**
|
1538 | * Callback fired after the component starts to collapse
|
1539 | */
|
1540 | onExiting: _react2["default"].PropTypes.func,
|
1541 | /**
|
1542 | * Callback fired after the component has collapsed
|
1543 | */
|
1544 | onExited: _react2["default"].PropTypes.func,
|
1545 |
|
1546 | /**
|
1547 | * The dimension used when collapsing, or a function that returns the
|
1548 | * dimension
|
1549 | *
|
1550 | * _Note: Bootstrap only partially supports 'width'!
|
1551 | * You will need to supply your own CSS animation for the `.width` CSS class._
|
1552 | */
|
1553 | dimension: _react2["default"].PropTypes.oneOfType([_react2["default"].PropTypes.oneOf(['height', 'width']), _react2["default"].PropTypes.func]),
|
1554 |
|
1555 | /**
|
1556 | * Function that returns the height or width of the animating DOM node
|
1557 | *
|
1558 | * Allows for providing some custom logic for how much the Collapse component
|
1559 | * should animate in its specified dimension. Called with the current
|
1560 | * dimension prop value and the DOM node.
|
1561 | */
|
1562 | getDimensionValue: _react2["default"].PropTypes.func,
|
1563 |
|
1564 | /**
|
1565 | * ARIA role of collapsible element
|
1566 | */
|
1567 | role: _react2["default"].PropTypes.string
|
1568 | };
|
1569 |
|
1570 | var defaultProps = {
|
1571 | "in": false,
|
1572 | timeout: 300,
|
1573 | unmountOnExit: false,
|
1574 | transitionAppear: false,
|
1575 |
|
1576 | dimension: 'height',
|
1577 | getDimensionValue: getDimensionValue
|
1578 | };
|
1579 |
|
1580 | var Collapse = function (_React$Component) {
|
1581 | _inherits(Collapse, _React$Component);
|
1582 |
|
1583 | function Collapse(props, context) {
|
1584 | _classCallCheck(this, Collapse);
|
1585 |
|
1586 | var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context));
|
1587 |
|
1588 | _this.handleEnter = _this.handleEnter.bind(_this);
|
1589 | _this.handleEntering = _this.handleEntering.bind(_this);
|
1590 | _this.handleEntered = _this.handleEntered.bind(_this);
|
1591 | _this.handleExit = _this.handleExit.bind(_this);
|
1592 | _this.handleExiting = _this.handleExiting.bind(_this);
|
1593 | return _this;
|
1594 | }
|
1595 |
|
1596 | /* -- Expanding -- */
|
1597 |
|
1598 |
|
1599 | Collapse.prototype.handleEnter = function handleEnter(elem) {
|
1600 | var dimension = this._dimension();
|
1601 | elem.style[dimension] = '0';
|
1602 | };
|
1603 |
|
1604 | Collapse.prototype.handleEntering = function handleEntering(elem) {
|
1605 | var dimension = this._dimension();
|
1606 | elem.style[dimension] = this._getScrollDimensionValue(elem, dimension);
|
1607 | };
|
1608 |
|
1609 | Collapse.prototype.handleEntered = function handleEntered(elem) {
|
1610 | var dimension = this._dimension();
|
1611 | elem.style[dimension] = null;
|
1612 | };
|
1613 |
|
1614 | /* -- Collapsing -- */
|
1615 |
|
1616 |
|
1617 | Collapse.prototype.handleExit = function handleExit(elem) {
|
1618 | var dimension = this._dimension();
|
1619 | elem.style[dimension] = this.props.getDimensionValue(dimension, elem) + 'px';
|
1620 | triggerBrowserReflow(elem);
|
1621 | };
|
1622 |
|
1623 | Collapse.prototype.handleExiting = function handleExiting(elem) {
|
1624 | var dimension = this._dimension();
|
1625 | elem.style[dimension] = '0';
|
1626 | };
|
1627 |
|
1628 | Collapse.prototype._dimension = function _dimension() {
|
1629 | return typeof this.props.dimension === 'function' ? this.props.dimension() : this.props.dimension;
|
1630 | };
|
1631 |
|
1632 | // for testing
|
1633 |
|
1634 |
|
1635 | Collapse.prototype._getScrollDimensionValue = function _getScrollDimensionValue(elem, dimension) {
|
1636 | return elem['scroll' + (0, _capitalize2["default"])(dimension)] + 'px';
|
1637 | };
|
1638 |
|
1639 | Collapse.prototype.render = function render() {
|
1640 | var _props = this.props;
|
1641 | var onEnter = _props.onEnter;
|
1642 | var onEntering = _props.onEntering;
|
1643 | var onEntered = _props.onEntered;
|
1644 | var onExit = _props.onExit;
|
1645 | var onExiting = _props.onExiting;
|
1646 | var className = _props.className;
|
1647 |
|
1648 | var props = _objectWithoutProperties(_props, ['onEnter', 'onEntering', 'onEntered', 'onExit', 'onExiting', 'className']);
|
1649 |
|
1650 | delete props.dimension;
|
1651 | delete props.getDimensionValue;
|
1652 |
|
1653 | var handleEnter = (0, _tinperBeeCore.createChainedFunction)(this.handleEnter, onEnter);
|
1654 | var handleEntering = (0, _tinperBeeCore.createChainedFunction)(this.handleEntering, onEntering);
|
1655 | var handleEntered = (0, _tinperBeeCore.createChainedFunction)(this.handleEntered, onEntered);
|
1656 | var handleExit = (0, _tinperBeeCore.createChainedFunction)(this.handleExit, onExit);
|
1657 | var handleExiting = (0, _tinperBeeCore.createChainedFunction)(this.handleExiting, onExiting);
|
1658 |
|
1659 | var classes = {
|
1660 | width: this._dimension() === 'width'
|
1661 | };
|
1662 |
|
1663 | return _react2["default"].createElement(_Transition2["default"], _extends({}, props, {
|
1664 | 'aria-expanded': props.role ? props["in"] : null,
|
1665 | className: (0, _classnames2["default"])(className, classes),
|
1666 | exitedClassName: 'collapse',
|
1667 | exitingClassName: 'collapsing',
|
1668 | enteredClassName: 'collapse in',
|
1669 | enteringClassName: 'collapsing',
|
1670 | onEnter: handleEnter,
|
1671 | onEntering: handleEntering,
|
1672 | onEntered: handleEntered,
|
1673 | onExit: handleExit,
|
1674 | onExiting: handleExiting
|
1675 | }));
|
1676 | };
|
1677 |
|
1678 | return Collapse;
|
1679 | }(_react2["default"].Component);
|
1680 |
|
1681 | Collapse.propTypes = propTypes;
|
1682 | Collapse.defaultProps = defaultProps;
|
1683 |
|
1684 | exports["default"] = Collapse;
|
1685 | module.exports = exports['default'];
|
1686 |
|
1687 | /***/ }),
|
1688 | /* 16 */
|
1689 | /***/ (function(module, exports, __webpack_require__) {
|
1690 |
|
1691 | ;
|
1692 |
|
1693 | Object.defineProperty(exports, "__esModule", {
|
1694 | value: true
|
1695 | });
|
1696 | exports.default = style;
|
1697 |
|
1698 | var _camelizeStyle = __webpack_require__(17);
|
1699 |
|
1700 | var _camelizeStyle2 = _interopRequireDefault(_camelizeStyle);
|
1701 |
|
1702 | var _hyphenateStyle = __webpack_require__(19);
|
1703 |
|
1704 | var _hyphenateStyle2 = _interopRequireDefault(_hyphenateStyle);
|
1705 |
|
1706 | var _getComputedStyle2 = __webpack_require__(21);
|
1707 |
|
1708 | var _getComputedStyle3 = _interopRequireDefault(_getComputedStyle2);
|
1709 |
|
1710 | var _removeStyle = __webpack_require__(22);
|
1711 |
|
1712 | var _removeStyle2 = _interopRequireDefault(_removeStyle);
|
1713 |
|
1714 | var _properties = __webpack_require__(12);
|
1715 |
|
1716 | var _isTransform = __webpack_require__(23);
|
1717 |
|
1718 | var _isTransform2 = _interopRequireDefault(_isTransform);
|
1719 |
|
1720 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
1721 |
|
1722 | function style(node, property, value) {
|
1723 | var css = '';
|
1724 | var transforms = '';
|
1725 | var props = property;
|
1726 |
|
1727 | if (typeof property === 'string') {
|
1728 | if (value === undefined) {
|
1729 | return node.style[(0, _camelizeStyle2.default)(property)] || (0, _getComputedStyle3.default)(node).getPropertyValue((0, _hyphenateStyle2.default)(property));
|
1730 | } else {
|
1731 | (props = {})[property] = value;
|
1732 | }
|
1733 | }
|
1734 |
|
1735 | Object.keys(props).forEach(function (key) {
|
1736 | var value = props[key];
|
1737 | if (!value && value !== 0) {
|
1738 | (0, _removeStyle2.default)(node, (0, _hyphenateStyle2.default)(key));
|
1739 | } else if ((0, _isTransform2.default)(key)) {
|
1740 | transforms += key + '(' + value + ') ';
|
1741 | } else {
|
1742 | css += (0, _hyphenateStyle2.default)(key) + ': ' + value + ';';
|
1743 | }
|
1744 | });
|
1745 |
|
1746 | if (transforms) {
|
1747 | css += _properties.transform + ': ' + transforms + ';';
|
1748 | }
|
1749 |
|
1750 | node.style.cssText += ';' + css;
|
1751 | }
|
1752 | module.exports = exports['default'];
|
1753 |
|
1754 | /***/ }),
|
1755 | /* 17 */
|
1756 | /***/ (function(module, exports, __webpack_require__) {
|
1757 |
|
1758 | ;
|
1759 |
|
1760 | Object.defineProperty(exports, "__esModule", {
|
1761 | value: true
|
1762 | });
|
1763 | exports.default = camelizeStyleName;
|
1764 |
|
1765 | var _camelize = __webpack_require__(18);
|
1766 |
|
1767 | var _camelize2 = _interopRequireDefault(_camelize);
|
1768 |
|
1769 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
1770 |
|
1771 | var msPattern = /^-ms-/; /**
|
1772 | * Copyright 2014-2015, Facebook, Inc.
|
1773 | * All rights reserved.
|
1774 | * https://github.com/facebook/react/blob/2aeb8a2a6beb00617a4217f7f8284924fa2ad819/src/vendor/core/camelizeStyleName.js
|
1775 | */
|
1776 | function camelizeStyleName(string) {
|
1777 | return (0, _camelize2.default)(string.replace(msPattern, 'ms-'));
|
1778 | }
|
1779 | module.exports = exports['default'];
|
1780 |
|
1781 | /***/ }),
|
1782 | /* 18 */
|
1783 | /***/ (function(module, exports) {
|
1784 |
|
1785 | ;
|
1786 |
|
1787 | Object.defineProperty(exports, "__esModule", {
|
1788 | value: true
|
1789 | });
|
1790 | exports.default = camelize;
|
1791 | var rHyphen = /-(.)/g;
|
1792 |
|
1793 | function camelize(string) {
|
1794 | return string.replace(rHyphen, function (_, chr) {
|
1795 | return chr.toUpperCase();
|
1796 | });
|
1797 | }
|
1798 | module.exports = exports["default"];
|
1799 |
|
1800 | /***/ }),
|
1801 | /* 19 */
|
1802 | /***/ (function(module, exports, __webpack_require__) {
|
1803 |
|
1804 | ;
|
1805 |
|
1806 | Object.defineProperty(exports, "__esModule", {
|
1807 | value: true
|
1808 | });
|
1809 | exports.default = hyphenateStyleName;
|
1810 |
|
1811 | var _hyphenate = __webpack_require__(20);
|
1812 |
|
1813 | var _hyphenate2 = _interopRequireDefault(_hyphenate);
|
1814 |
|
1815 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
1816 |
|
1817 | var msPattern = /^ms-/; /**
|
1818 | * Copyright 2013-2014, Facebook, Inc.
|
1819 | * All rights reserved.
|
1820 | * https://github.com/facebook/react/blob/2aeb8a2a6beb00617a4217f7f8284924fa2ad819/src/vendor/core/hyphenateStyleName.js
|
1821 | */
|
1822 |
|
1823 | function hyphenateStyleName(string) {
|
1824 | return (0, _hyphenate2.default)(string).replace(msPattern, '-ms-');
|
1825 | }
|
1826 | module.exports = exports['default'];
|
1827 |
|
1828 | /***/ }),
|
1829 | /* 20 */
|
1830 | /***/ (function(module, exports) {
|
1831 |
|
1832 | ;
|
1833 |
|
1834 | Object.defineProperty(exports, "__esModule", {
|
1835 | value: true
|
1836 | });
|
1837 | exports.default = hyphenate;
|
1838 |
|
1839 | var rUpper = /([A-Z])/g;
|
1840 |
|
1841 | function hyphenate(string) {
|
1842 | return string.replace(rUpper, '-$1').toLowerCase();
|
1843 | }
|
1844 | module.exports = exports['default'];
|
1845 |
|
1846 | /***/ }),
|
1847 | /* 21 */
|
1848 | /***/ (function(module, exports, __webpack_require__) {
|
1849 |
|
1850 | ;
|
1851 |
|
1852 | Object.defineProperty(exports, "__esModule", {
|
1853 | value: true
|
1854 | });
|
1855 | exports.default = _getComputedStyle;
|
1856 |
|
1857 | var _camelizeStyle = __webpack_require__(17);
|
1858 |
|
1859 | var _camelizeStyle2 = _interopRequireDefault(_camelizeStyle);
|
1860 |
|
1861 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
1862 |
|
1863 | var rposition = /^(top|right|bottom|left)$/;
|
1864 | var rnumnonpx = /^([+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/i;
|
1865 |
|
1866 | function _getComputedStyle(node) {
|
1867 | if (!node) throw new TypeError('No Element passed to `getComputedStyle()`');
|
1868 | var doc = node.ownerDocument;
|
1869 |
|
1870 | return 'defaultView' in doc ? doc.defaultView.opener ? node.ownerDocument.defaultView.getComputedStyle(node, null) : window.getComputedStyle(node, null) : {
|
1871 | //ie 8 "magic" from: https://github.com/jquery/jquery/blob/1.11-stable/src/css/curCSS.js#L72
|
1872 | getPropertyValue: function getPropertyValue(prop) {
|
1873 | var style = node.style;
|
1874 |
|
1875 | prop = (0, _camelizeStyle2.default)(prop);
|
1876 |
|
1877 | if (prop == 'float') prop = 'styleFloat';
|
1878 |
|
1879 | var current = node.currentStyle[prop] || null;
|
1880 |
|
1881 | if (current == null && style && style[prop]) current = style[prop];
|
1882 |
|
1883 | if (rnumnonpx.test(current) && !rposition.test(prop)) {
|
1884 | // Remember the original values
|
1885 | var left = style.left;
|
1886 | var runStyle = node.runtimeStyle;
|
1887 | var rsLeft = runStyle && runStyle.left;
|
1888 |
|
1889 | // Put in the new values to get a computed value out
|
1890 | if (rsLeft) runStyle.left = node.currentStyle.left;
|
1891 |
|
1892 | style.left = prop === 'fontSize' ? '1em' : current;
|
1893 | current = style.pixelLeft + 'px';
|
1894 |
|
1895 | // Revert the changed values
|
1896 | style.left = left;
|
1897 | if (rsLeft) runStyle.left = rsLeft;
|
1898 | }
|
1899 |
|
1900 | return current;
|
1901 | }
|
1902 | };
|
1903 | }
|
1904 | module.exports = exports['default'];
|
1905 |
|
1906 | /***/ }),
|
1907 | /* 22 */
|
1908 | /***/ (function(module, exports) {
|
1909 |
|
1910 | ;
|
1911 |
|
1912 | Object.defineProperty(exports, "__esModule", {
|
1913 | value: true
|
1914 | });
|
1915 | exports.default = removeStyle;
|
1916 | function removeStyle(node, key) {
|
1917 | return 'removeProperty' in node.style ? node.style.removeProperty(key) : node.style.removeAttribute(key);
|
1918 | }
|
1919 | module.exports = exports['default'];
|
1920 |
|
1921 | /***/ }),
|
1922 | /* 23 */
|
1923 | /***/ (function(module, exports) {
|
1924 |
|
1925 | ;
|
1926 |
|
1927 | Object.defineProperty(exports, "__esModule", {
|
1928 | value: true
|
1929 | });
|
1930 | exports.default = isTransform;
|
1931 | var supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i;
|
1932 |
|
1933 | function isTransform(property) {
|
1934 | return !!(property && supportedTransforms.test(property));
|
1935 | }
|
1936 | module.exports = exports["default"];
|
1937 |
|
1938 | /***/ }),
|
1939 | /* 24 */
|
1940 | /***/ (function(module, exports) {
|
1941 |
|
1942 | ;
|
1943 |
|
1944 | Object.defineProperty(exports, "__esModule", {
|
1945 | value: true
|
1946 | });
|
1947 | exports["default"] = capitalize;
|
1948 | function capitalize(string) {
|
1949 | return "" + string.charAt(0).toUpperCase() + string.slice(1);
|
1950 | }
|
1951 | module.exports = exports["default"];
|
1952 |
|
1953 | /***/ }),
|
1954 | /* 25 */
|
1955 | /***/ (function(module, exports, __webpack_require__) {
|
1956 |
|
1957 | ;
|
1958 |
|
1959 | exports.__esModule = true;
|
1960 | exports.Align = exports.toArray = exports.cssAnimation = exports.addEventListener = exports.contains = exports.KeyCode = exports.createChainedFunction = exports.splitComponent = exports.isRequiredForA11y = exports.elementType = exports.deprecated = exports.componentOrElement = exports.all = undefined;
|
1961 |
|
1962 | var _all2 = __webpack_require__(26);
|
1963 |
|
1964 | var _all3 = _interopRequireDefault(_all2);
|
1965 |
|
1966 | var _componentOrElement2 = __webpack_require__(28);
|
1967 |
|
1968 | var _componentOrElement3 = _interopRequireDefault(_componentOrElement2);
|
1969 |
|
1970 | var _deprecated2 = __webpack_require__(29);
|
1971 |
|
1972 | var _deprecated3 = _interopRequireDefault(_deprecated2);
|
1973 |
|
1974 | var _elementType2 = __webpack_require__(32);
|
1975 |
|
1976 | var _elementType3 = _interopRequireDefault(_elementType2);
|
1977 |
|
1978 | var _isRequiredForA11y2 = __webpack_require__(33);
|
1979 |
|
1980 | var _isRequiredForA11y3 = _interopRequireDefault(_isRequiredForA11y2);
|
1981 |
|
1982 | var _splitComponent2 = __webpack_require__(34);
|
1983 |
|
1984 | var _splitComponent3 = _interopRequireDefault(_splitComponent2);
|
1985 |
|
1986 | var _createChainedFunction2 = __webpack_require__(49);
|
1987 |
|
1988 | var _createChainedFunction3 = _interopRequireDefault(_createChainedFunction2);
|
1989 |
|
1990 | var _keyCode = __webpack_require__(50);
|
1991 |
|
1992 | var _keyCode2 = _interopRequireDefault(_keyCode);
|
1993 |
|
1994 | var _contains2 = __webpack_require__(51);
|
1995 |
|
1996 | var _contains3 = _interopRequireDefault(_contains2);
|
1997 |
|
1998 | var _addEventListener2 = __webpack_require__(52);
|
1999 |
|
2000 | var _addEventListener3 = _interopRequireDefault(_addEventListener2);
|
2001 |
|
2002 | var _cssAnimation2 = __webpack_require__(57);
|
2003 |
|
2004 | var _cssAnimation3 = _interopRequireDefault(_cssAnimation2);
|
2005 |
|
2006 | var _toArray2 = __webpack_require__(61);
|
2007 |
|
2008 | var _toArray3 = _interopRequireDefault(_toArray2);
|
2009 |
|
2010 | var _Align2 = __webpack_require__(62);
|
2011 |
|
2012 | var _Align3 = _interopRequireDefault(_Align2);
|
2013 |
|
2014 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2015 |
|
2016 | exports.all = _all3.default;
|
2017 | exports.componentOrElement = _componentOrElement3.default;
|
2018 | exports.deprecated = _deprecated3.default;
|
2019 | exports.elementType = _elementType3.default;
|
2020 | exports.isRequiredForA11y = _isRequiredForA11y3.default;
|
2021 | exports.splitComponent = _splitComponent3.default;
|
2022 | exports.createChainedFunction = _createChainedFunction3.default;
|
2023 | exports.KeyCode = _keyCode2.default;
|
2024 | exports.contains = _contains3.default;
|
2025 | exports.addEventListener = _addEventListener3.default;
|
2026 | exports.cssAnimation = _cssAnimation3.default;
|
2027 | exports.toArray = _toArray3.default;
|
2028 | //export getContainerRenderMixin from './getContainerRenderMixin';
|
2029 |
|
2030 | exports.Align = _Align3.default;
|
2031 |
|
2032 | /***/ }),
|
2033 | /* 26 */
|
2034 | /***/ (function(module, exports, __webpack_require__) {
|
2035 |
|
2036 | ;
|
2037 |
|
2038 | exports.__esModule = true;
|
2039 | exports.default = all;
|
2040 |
|
2041 | var _createChainableTypeChecker = __webpack_require__(27);
|
2042 |
|
2043 | var _createChainableTypeChecker2 = _interopRequireDefault(_createChainableTypeChecker);
|
2044 |
|
2045 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2046 |
|
2047 | function all() {
|
2048 | for (var _len = arguments.length, validators = Array(_len), _key = 0; _key < _len; _key++) {
|
2049 | validators[_key] = arguments[_key];
|
2050 | }
|
2051 |
|
2052 | function allPropTypes() {
|
2053 | for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
2054 | args[_key2] = arguments[_key2];
|
2055 | }
|
2056 |
|
2057 | var error = null;
|
2058 |
|
2059 | validators.forEach(function (validator) {
|
2060 | if (error != null) {
|
2061 | return;
|
2062 | }
|
2063 |
|
2064 | var result = validator.apply(undefined, args);
|
2065 | if (result != null) {
|
2066 | error = result;
|
2067 | }
|
2068 | });
|
2069 |
|
2070 | return error;
|
2071 | }
|
2072 |
|
2073 | return (0, _createChainableTypeChecker2.default)(allPropTypes);
|
2074 | }
|
2075 |
|
2076 | /***/ }),
|
2077 | /* 27 */
|
2078 | /***/ (function(module, exports) {
|
2079 |
|
2080 | ;
|
2081 |
|
2082 | exports.__esModule = true;
|
2083 | exports.default = createChainableTypeChecker;
|
2084 | /**
|
2085 | * Copyright 2013-present, Facebook, Inc.
|
2086 | * All rights reserved.
|
2087 | *
|
2088 | * This source code is licensed under the BSD-style license found in the
|
2089 | * LICENSE file in the root directory of this source tree. An additional grant
|
2090 | * of patent rights can be found in the PATENTS file in the same directory.
|
2091 | */
|
2092 |
|
2093 | // Mostly taken from ReactPropTypes.
|
2094 |
|
2095 | function createChainableTypeChecker(validate) {
|
2096 | function checkType(isRequired, props, propName, componentName, location, propFullName) {
|
2097 | var componentNameSafe = componentName || '<<anonymous>>';
|
2098 | var propFullNameSafe = propFullName || propName;
|
2099 |
|
2100 | if (props[propName] == null) {
|
2101 | if (isRequired) {
|
2102 | return new Error('Required ' + location + ' `' + propFullNameSafe + '` was not specified ' + ('in `' + componentNameSafe + '`.'));
|
2103 | }
|
2104 |
|
2105 | return null;
|
2106 | }
|
2107 |
|
2108 | for (var _len = arguments.length, args = Array(_len > 6 ? _len - 6 : 0), _key = 6; _key < _len; _key++) {
|
2109 | args[_key - 6] = arguments[_key];
|
2110 | }
|
2111 |
|
2112 | return validate.apply(undefined, [props, propName, componentNameSafe, location, propFullNameSafe].concat(args));
|
2113 | }
|
2114 |
|
2115 | var chainedCheckType = checkType.bind(null, false);
|
2116 | chainedCheckType.isRequired = checkType.bind(null, true);
|
2117 |
|
2118 | return chainedCheckType;
|
2119 | }
|
2120 |
|
2121 | /***/ }),
|
2122 | /* 28 */
|
2123 | /***/ (function(module, exports, __webpack_require__) {
|
2124 |
|
2125 | ;
|
2126 |
|
2127 | exports.__esModule = true;
|
2128 |
|
2129 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
2130 |
|
2131 | var _react = __webpack_require__(4);
|
2132 |
|
2133 | var _react2 = _interopRequireDefault(_react);
|
2134 |
|
2135 | var _createChainableTypeChecker = __webpack_require__(27);
|
2136 |
|
2137 | var _createChainableTypeChecker2 = _interopRequireDefault(_createChainableTypeChecker);
|
2138 |
|
2139 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2140 |
|
2141 | function validate(props, propName, componentName, location, propFullName) {
|
2142 | var propValue = props[propName];
|
2143 | var propType = typeof propValue === 'undefined' ? 'undefined' : _typeof(propValue);
|
2144 |
|
2145 | if (_react2.default.isValidElement(propValue)) {
|
2146 | return new Error('Invalid ' + location + ' `' + propFullName + '` of type ReactElement ' + ('supplied to `' + componentName + '`, expected a ReactComponent or a ') + 'DOMElement. You can usually obtain a ReactComponent or DOMElement ' + 'from a ReactElement by attaching a ref to it.');
|
2147 | }
|
2148 |
|
2149 | if ((propType !== 'object' || typeof propValue.render !== 'function') && propValue.nodeType !== 1) {
|
2150 | return new Error('Invalid ' + location + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected a ReactComponent or a ') + 'DOMElement.');
|
2151 | }
|
2152 |
|
2153 | return null;
|
2154 | }
|
2155 |
|
2156 | exports.default = (0, _createChainableTypeChecker2.default)(validate);
|
2157 |
|
2158 | /***/ }),
|
2159 | /* 29 */
|
2160 | /***/ (function(module, exports, __webpack_require__) {
|
2161 |
|
2162 | ;
|
2163 |
|
2164 | exports.__esModule = true;
|
2165 | exports.default = deprecated;
|
2166 |
|
2167 | var _warning = __webpack_require__(30);
|
2168 |
|
2169 | var _warning2 = _interopRequireDefault(_warning);
|
2170 |
|
2171 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2172 |
|
2173 | var warned = {};
|
2174 |
|
2175 | function deprecated(validator, reason) {
|
2176 | return function validate(props, propName, componentName, location, propFullName) {
|
2177 | var componentNameSafe = componentName || '<<anonymous>>';
|
2178 | var propFullNameSafe = propFullName || propName;
|
2179 |
|
2180 | if (props[propName] != null) {
|
2181 | var messageKey = componentName + '.' + propName;
|
2182 |
|
2183 | (0, _warning2.default)(warned[messageKey], 'The ' + location + ' `' + propFullNameSafe + '` of ' + ('`' + componentNameSafe + '` is deprecated. ' + reason + '.'));
|
2184 |
|
2185 | warned[messageKey] = true;
|
2186 | }
|
2187 |
|
2188 | for (var _len = arguments.length, args = Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) {
|
2189 | args[_key - 5] = arguments[_key];
|
2190 | }
|
2191 |
|
2192 | return validator.apply(undefined, [props, propName, componentName, location, propFullName].concat(args));
|
2193 | };
|
2194 | }
|
2195 |
|
2196 | /* eslint-disable no-underscore-dangle */
|
2197 | function _resetWarned() {
|
2198 | warned = {};
|
2199 | }
|
2200 |
|
2201 | deprecated._resetWarned = _resetWarned;
|
2202 | /* eslint-enable no-underscore-dangle */
|
2203 |
|
2204 | /***/ }),
|
2205 | /* 30 */
|
2206 | /***/ (function(module, exports, __webpack_require__) {
|
2207 |
|
2208 | /* WEBPACK VAR INJECTION */(function(process) {/**
|
2209 | * Copyright 2014-2015, Facebook, Inc.
|
2210 | * All rights reserved.
|
2211 | *
|
2212 | * This source code is licensed under the BSD-style license found in the
|
2213 | * LICENSE file in the root directory of this source tree. An additional grant
|
2214 | * of patent rights can be found in the PATENTS file in the same directory.
|
2215 | */
|
2216 |
|
2217 | ;
|
2218 |
|
2219 | /**
|
2220 | * Similar to invariant but only logs a warning if the condition is not met.
|
2221 | * This can be used to log issues in development environments in critical
|
2222 | * paths. Removing the logging code for production environments will keep the
|
2223 | * same logic and follow the same code paths.
|
2224 | */
|
2225 |
|
2226 | var warning = function() {};
|
2227 |
|
2228 | if (process.env.NODE_ENV !== 'production') {
|
2229 | warning = function(condition, format, args) {
|
2230 | var len = arguments.length;
|
2231 | args = new Array(len > 2 ? len - 2 : 0);
|
2232 | for (var key = 2; key < len; key++) {
|
2233 | args[key - 2] = arguments[key];
|
2234 | }
|
2235 | if (format === undefined) {
|
2236 | throw new Error(
|
2237 | '`warning(condition, format, ...args)` requires a warning ' +
|
2238 | 'message argument'
|
2239 | );
|
2240 | }
|
2241 |
|
2242 | if (format.length < 10 || (/^[s\W]*$/).test(format)) {
|
2243 | throw new Error(
|
2244 | 'The warning format should be able to uniquely identify this ' +
|
2245 | 'warning. Please, use a more descriptive format than: ' + format
|
2246 | );
|
2247 | }
|
2248 |
|
2249 | if (!condition) {
|
2250 | var argIndex = 0;
|
2251 | var message = 'Warning: ' +
|
2252 | format.replace(/%s/g, function() {
|
2253 | return args[argIndex++];
|
2254 | });
|
2255 | if (typeof console !== 'undefined') {
|
2256 | console.error(message);
|
2257 | }
|
2258 | try {
|
2259 | // This error was thrown as a convenience so that you can use this stack
|
2260 | // to find the callsite that caused this warning to fire.
|
2261 | throw new Error(message);
|
2262 | } catch(x) {}
|
2263 | }
|
2264 | };
|
2265 | }
|
2266 |
|
2267 | module.exports = warning;
|
2268 |
|
2269 | /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(31)))
|
2270 |
|
2271 | /***/ }),
|
2272 | /* 31 */
|
2273 | /***/ (function(module, exports) {
|
2274 |
|
2275 | // shim for using process in browser
|
2276 | var process = module.exports = {};
|
2277 |
|
2278 | // cached from whatever global is present so that test runners that stub it
|
2279 | // don't break things. But we need to wrap it in a try catch in case it is
|
2280 | // wrapped in strict mode code which doesn't define any globals. It's inside a
|
2281 | // function because try/catches deoptimize in certain engines.
|
2282 |
|
2283 | var cachedSetTimeout;
|
2284 | var cachedClearTimeout;
|
2285 |
|
2286 | function defaultSetTimout() {
|
2287 | throw new Error('setTimeout has not been defined');
|
2288 | }
|
2289 | function defaultClearTimeout () {
|
2290 | throw new Error('clearTimeout has not been defined');
|
2291 | }
|
2292 | (function () {
|
2293 | try {
|
2294 | if (typeof setTimeout === 'function') {
|
2295 | cachedSetTimeout = setTimeout;
|
2296 | } else {
|
2297 | cachedSetTimeout = defaultSetTimout;
|
2298 | }
|
2299 | } catch (e) {
|
2300 | cachedSetTimeout = defaultSetTimout;
|
2301 | }
|
2302 | try {
|
2303 | if (typeof clearTimeout === 'function') {
|
2304 | cachedClearTimeout = clearTimeout;
|
2305 | } else {
|
2306 | cachedClearTimeout = defaultClearTimeout;
|
2307 | }
|
2308 | } catch (e) {
|
2309 | cachedClearTimeout = defaultClearTimeout;
|
2310 | }
|
2311 | } ())
|
2312 | function runTimeout(fun) {
|
2313 | if (cachedSetTimeout === setTimeout) {
|
2314 | //normal enviroments in sane situations
|
2315 | return setTimeout(fun, 0);
|
2316 | }
|
2317 | // if setTimeout wasn't available but was latter defined
|
2318 | if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
2319 | cachedSetTimeout = setTimeout;
|
2320 | return setTimeout(fun, 0);
|
2321 | }
|
2322 | try {
|
2323 | // when when somebody has screwed with setTimeout but no I.E. maddness
|
2324 | return cachedSetTimeout(fun, 0);
|
2325 | } catch(e){
|
2326 | try {
|
2327 | // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
2328 | return cachedSetTimeout.call(null, fun, 0);
|
2329 | } catch(e){
|
2330 | // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
|
2331 | return cachedSetTimeout.call(this, fun, 0);
|
2332 | }
|
2333 | }
|
2334 |
|
2335 |
|
2336 | }
|
2337 | function runClearTimeout(marker) {
|
2338 | if (cachedClearTimeout === clearTimeout) {
|
2339 | //normal enviroments in sane situations
|
2340 | return clearTimeout(marker);
|
2341 | }
|
2342 | // if clearTimeout wasn't available but was latter defined
|
2343 | if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
2344 | cachedClearTimeout = clearTimeout;
|
2345 | return clearTimeout(marker);
|
2346 | }
|
2347 | try {
|
2348 | // when when somebody has screwed with setTimeout but no I.E. maddness
|
2349 | return cachedClearTimeout(marker);
|
2350 | } catch (e){
|
2351 | try {
|
2352 | // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
2353 | return cachedClearTimeout.call(null, marker);
|
2354 | } catch (e){
|
2355 | // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
|
2356 | // Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
2357 | return cachedClearTimeout.call(this, marker);
|
2358 | }
|
2359 | }
|
2360 |
|
2361 |
|
2362 |
|
2363 | }
|
2364 | var queue = [];
|
2365 | var draining = false;
|
2366 | var currentQueue;
|
2367 | var queueIndex = -1;
|
2368 |
|
2369 | function cleanUpNextTick() {
|
2370 | if (!draining || !currentQueue) {
|
2371 | return;
|
2372 | }
|
2373 | draining = false;
|
2374 | if (currentQueue.length) {
|
2375 | queue = currentQueue.concat(queue);
|
2376 | } else {
|
2377 | queueIndex = -1;
|
2378 | }
|
2379 | if (queue.length) {
|
2380 | drainQueue();
|
2381 | }
|
2382 | }
|
2383 |
|
2384 | function drainQueue() {
|
2385 | if (draining) {
|
2386 | return;
|
2387 | }
|
2388 | var timeout = runTimeout(cleanUpNextTick);
|
2389 | draining = true;
|
2390 |
|
2391 | var len = queue.length;
|
2392 | while(len) {
|
2393 | currentQueue = queue;
|
2394 | queue = [];
|
2395 | while (++queueIndex < len) {
|
2396 | if (currentQueue) {
|
2397 | currentQueue[queueIndex].run();
|
2398 | }
|
2399 | }
|
2400 | queueIndex = -1;
|
2401 | len = queue.length;
|
2402 | }
|
2403 | currentQueue = null;
|
2404 | draining = false;
|
2405 | runClearTimeout(timeout);
|
2406 | }
|
2407 |
|
2408 | process.nextTick = function (fun) {
|
2409 | var args = new Array(arguments.length - 1);
|
2410 | if (arguments.length > 1) {
|
2411 | for (var i = 1; i < arguments.length; i++) {
|
2412 | args[i - 1] = arguments[i];
|
2413 | }
|
2414 | }
|
2415 | queue.push(new Item(fun, args));
|
2416 | if (queue.length === 1 && !draining) {
|
2417 | runTimeout(drainQueue);
|
2418 | }
|
2419 | };
|
2420 |
|
2421 | // v8 likes predictible objects
|
2422 | function Item(fun, array) {
|
2423 | this.fun = fun;
|
2424 | this.array = array;
|
2425 | }
|
2426 | Item.prototype.run = function () {
|
2427 | this.fun.apply(null, this.array);
|
2428 | };
|
2429 | process.title = 'browser';
|
2430 | process.browser = true;
|
2431 | process.env = {};
|
2432 | process.argv = [];
|
2433 | process.version = ''; // empty string to avoid regexp issues
|
2434 | process.versions = {};
|
2435 |
|
2436 | function noop() {}
|
2437 |
|
2438 | process.on = noop;
|
2439 | process.addListener = noop;
|
2440 | process.once = noop;
|
2441 | process.off = noop;
|
2442 | process.removeListener = noop;
|
2443 | process.removeAllListeners = noop;
|
2444 | process.emit = noop;
|
2445 | process.prependListener = noop;
|
2446 | process.prependOnceListener = noop;
|
2447 |
|
2448 | process.listeners = function (name) { return [] }
|
2449 |
|
2450 | process.binding = function (name) {
|
2451 | throw new Error('process.binding is not supported');
|
2452 | };
|
2453 |
|
2454 | process.cwd = function () { return '/' };
|
2455 | process.chdir = function (dir) {
|
2456 | throw new Error('process.chdir is not supported');
|
2457 | };
|
2458 | process.umask = function() { return 0; };
|
2459 |
|
2460 |
|
2461 | /***/ }),
|
2462 | /* 32 */
|
2463 | /***/ (function(module, exports, __webpack_require__) {
|
2464 |
|
2465 | ;
|
2466 |
|
2467 | exports.__esModule = true;
|
2468 |
|
2469 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
2470 |
|
2471 | var _react = __webpack_require__(4);
|
2472 |
|
2473 | var _react2 = _interopRequireDefault(_react);
|
2474 |
|
2475 | var _createChainableTypeChecker = __webpack_require__(27);
|
2476 |
|
2477 | var _createChainableTypeChecker2 = _interopRequireDefault(_createChainableTypeChecker);
|
2478 |
|
2479 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2480 |
|
2481 | function elementType(props, propName, componentName, location, propFullName) {
|
2482 | var propValue = props[propName];
|
2483 | var propType = typeof propValue === 'undefined' ? 'undefined' : _typeof(propValue);
|
2484 |
|
2485 | if (_react2.default.isValidElement(propValue)) {
|
2486 | return new Error('Invalid ' + location + ' `' + propFullName + '` of type ReactElement ' + ('supplied to `' + componentName + '`, expected an element type (a string ') + 'or a ReactClass).');
|
2487 | }
|
2488 |
|
2489 | if (propType !== 'function' && propType !== 'string') {
|
2490 | return new Error('Invalid ' + location + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected an element type (a string ') + 'or a ReactClass).');
|
2491 | }
|
2492 |
|
2493 | return null;
|
2494 | }
|
2495 |
|
2496 | exports.default = (0, _createChainableTypeChecker2.default)(elementType);
|
2497 |
|
2498 | /***/ }),
|
2499 | /* 33 */
|
2500 | /***/ (function(module, exports) {
|
2501 |
|
2502 | ;
|
2503 |
|
2504 | exports.__esModule = true;
|
2505 | exports.default = isRequiredForA11y;
|
2506 | function isRequiredForA11y(validator) {
|
2507 | return function validate(props, propName, componentName, location, propFullName) {
|
2508 | var componentNameSafe = componentName || '<<anonymous>>';
|
2509 | var propFullNameSafe = propFullName || propName;
|
2510 |
|
2511 | if (props[propName] == null) {
|
2512 | return new Error('The ' + location + ' `' + propFullNameSafe + '` is required to make ' + ('`' + componentNameSafe + '` accessible for users of assistive ') + 'technologies such as screen readers.');
|
2513 | }
|
2514 |
|
2515 | for (var _len = arguments.length, args = Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) {
|
2516 | args[_key - 5] = arguments[_key];
|
2517 | }
|
2518 |
|
2519 | return validator.apply(undefined, [props, propName, componentName, location, propFullName].concat(args));
|
2520 | };
|
2521 | }
|
2522 |
|
2523 | /***/ }),
|
2524 | /* 34 */
|
2525 | /***/ (function(module, exports, __webpack_require__) {
|
2526 |
|
2527 | ;
|
2528 |
|
2529 | exports.__esModule = true;
|
2530 |
|
2531 | var _entries = __webpack_require__(35);
|
2532 |
|
2533 | var _entries2 = _interopRequireDefault(_entries);
|
2534 |
|
2535 | exports.default = splitComponentProps;
|
2536 |
|
2537 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2538 |
|
2539 | /**
|
2540 | * 分割要传入父元素和子元素的props
|
2541 | * @param {[object]} props 传入的属性
|
2542 | * @param {[reactElement]} Component 组件
|
2543 | * @return {[array]} 返回数组,第一个元素为父元素props对象,第二个子元素props对象
|
2544 | */
|
2545 | function splitComponentProps(props, Component) {
|
2546 | var componentPropTypes = Component.propTypes;
|
2547 |
|
2548 | var parentProps = {};
|
2549 | var childProps = {};
|
2550 |
|
2551 | (0, _entries2.default)(props).forEach(function (_ref) {
|
2552 | var propName = _ref[0],
|
2553 | propValue = _ref[1];
|
2554 |
|
2555 | if (componentPropTypes[propName]) {
|
2556 | parentProps[propName] = propValue;
|
2557 | } else {
|
2558 | childProps[propName] = propValue;
|
2559 | }
|
2560 | });
|
2561 |
|
2562 | return [parentProps, childProps];
|
2563 | }
|
2564 |
|
2565 | /***/ }),
|
2566 | /* 35 */
|
2567 | /***/ (function(module, exports, __webpack_require__) {
|
2568 |
|
2569 | module.exports = { "default": __webpack_require__(36), __esModule: true };
|
2570 |
|
2571 | /***/ }),
|
2572 | /* 36 */
|
2573 | /***/ (function(module, exports, __webpack_require__) {
|
2574 |
|
2575 | __webpack_require__(37);
|
2576 | module.exports = __webpack_require__(40).Object.entries;
|
2577 |
|
2578 | /***/ }),
|
2579 | /* 37 */
|
2580 | /***/ (function(module, exports, __webpack_require__) {
|
2581 |
|
2582 | // http://goo.gl/XkBrjD
|
2583 | var $export = __webpack_require__(38)
|
2584 | , $entries = __webpack_require__(43)(true);
|
2585 |
|
2586 | $export($export.S, 'Object', {
|
2587 | entries: function entries(it){
|
2588 | return $entries(it);
|
2589 | }
|
2590 | });
|
2591 |
|
2592 | /***/ }),
|
2593 | /* 38 */
|
2594 | /***/ (function(module, exports, __webpack_require__) {
|
2595 |
|
2596 | var global = __webpack_require__(39)
|
2597 | , core = __webpack_require__(40)
|
2598 | , ctx = __webpack_require__(41)
|
2599 | , PROTOTYPE = 'prototype';
|
2600 |
|
2601 | var $export = function(type, name, source){
|
2602 | var IS_FORCED = type & $export.F
|
2603 | , IS_GLOBAL = type & $export.G
|
2604 | , IS_STATIC = type & $export.S
|
2605 | , IS_PROTO = type & $export.P
|
2606 | , IS_BIND = type & $export.B
|
2607 | , IS_WRAP = type & $export.W
|
2608 | , exports = IS_GLOBAL ? core : core[name] || (core[name] = {})
|
2609 | , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]
|
2610 | , key, own, out;
|
2611 | if(IS_GLOBAL)source = name;
|
2612 | for(key in source){
|
2613 | // contains in native
|
2614 | own = !IS_FORCED && target && key in target;
|
2615 | if(own && key in exports)continue;
|
2616 | // export native or passed
|
2617 | out = own ? target[key] : source[key];
|
2618 | // prevent global pollution for namespaces
|
2619 | exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
|
2620 | // bind timers to global for call from export context
|
2621 | : IS_BIND && own ? ctx(out, global)
|
2622 | // wrap global constructors for prevent change them in library
|
2623 | : IS_WRAP && target[key] == out ? (function(C){
|
2624 | var F = function(param){
|
2625 | return this instanceof C ? new C(param) : C(param);
|
2626 | };
|
2627 | F[PROTOTYPE] = C[PROTOTYPE];
|
2628 | return F;
|
2629 | // make static versions for prototype methods
|
2630 | })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
|
2631 | if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out;
|
2632 | }
|
2633 | };
|
2634 | // type bitmap
|
2635 | $export.F = 1; // forced
|
2636 | $export.G = 2; // global
|
2637 | $export.S = 4; // static
|
2638 | $export.P = 8; // proto
|
2639 | $export.B = 16; // bind
|
2640 | $export.W = 32; // wrap
|
2641 | module.exports = $export;
|
2642 |
|
2643 | /***/ }),
|
2644 | /* 39 */
|
2645 | /***/ (function(module, exports) {
|
2646 |
|
2647 | // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
|
2648 | var global = module.exports = typeof window != 'undefined' && window.Math == Math
|
2649 | ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
|
2650 | if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
|
2651 |
|
2652 | /***/ }),
|
2653 | /* 40 */
|
2654 | /***/ (function(module, exports) {
|
2655 |
|
2656 | var core = module.exports = {version: '1.2.6'};
|
2657 | if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
|
2658 |
|
2659 | /***/ }),
|
2660 | /* 41 */
|
2661 | /***/ (function(module, exports, __webpack_require__) {
|
2662 |
|
2663 | // optional / simple context binding
|
2664 | var aFunction = __webpack_require__(42);
|
2665 | module.exports = function(fn, that, length){
|
2666 | aFunction(fn);
|
2667 | if(that === undefined)return fn;
|
2668 | switch(length){
|
2669 | case 1: return function(a){
|
2670 | return fn.call(that, a);
|
2671 | };
|
2672 | case 2: return function(a, b){
|
2673 | return fn.call(that, a, b);
|
2674 | };
|
2675 | case 3: return function(a, b, c){
|
2676 | return fn.call(that, a, b, c);
|
2677 | };
|
2678 | }
|
2679 | return function(/* ...args */){
|
2680 | return fn.apply(that, arguments);
|
2681 | };
|
2682 | };
|
2683 |
|
2684 | /***/ }),
|
2685 | /* 42 */
|
2686 | /***/ (function(module, exports) {
|
2687 |
|
2688 | module.exports = function(it){
|
2689 | if(typeof it != 'function')throw TypeError(it + ' is not a function!');
|
2690 | return it;
|
2691 | };
|
2692 |
|
2693 | /***/ }),
|
2694 | /* 43 */
|
2695 | /***/ (function(module, exports, __webpack_require__) {
|
2696 |
|
2697 | var $ = __webpack_require__(44)
|
2698 | , toIObject = __webpack_require__(45)
|
2699 | , isEnum = $.isEnum;
|
2700 | module.exports = function(isEntries){
|
2701 | return function(it){
|
2702 | var O = toIObject(it)
|
2703 | , keys = $.getKeys(O)
|
2704 | , length = keys.length
|
2705 | , i = 0
|
2706 | , result = []
|
2707 | , key;
|
2708 | while(length > i)if(isEnum.call(O, key = keys[i++])){
|
2709 | result.push(isEntries ? [key, O[key]] : O[key]);
|
2710 | } return result;
|
2711 | };
|
2712 | };
|
2713 |
|
2714 | /***/ }),
|
2715 | /* 44 */
|
2716 | /***/ (function(module, exports) {
|
2717 |
|
2718 | var $Object = Object;
|
2719 | module.exports = {
|
2720 | create: $Object.create,
|
2721 | getProto: $Object.getPrototypeOf,
|
2722 | isEnum: {}.propertyIsEnumerable,
|
2723 | getDesc: $Object.getOwnPropertyDescriptor,
|
2724 | setDesc: $Object.defineProperty,
|
2725 | setDescs: $Object.defineProperties,
|
2726 | getKeys: $Object.keys,
|
2727 | getNames: $Object.getOwnPropertyNames,
|
2728 | getSymbols: $Object.getOwnPropertySymbols,
|
2729 | each: [].forEach
|
2730 | };
|
2731 |
|
2732 | /***/ }),
|
2733 | /* 45 */
|
2734 | /***/ (function(module, exports, __webpack_require__) {
|
2735 |
|
2736 | // to indexed object, toObject with fallback for non-array-like ES3 strings
|
2737 | var IObject = __webpack_require__(46)
|
2738 | , defined = __webpack_require__(48);
|
2739 | module.exports = function(it){
|
2740 | return IObject(defined(it));
|
2741 | };
|
2742 |
|
2743 | /***/ }),
|
2744 | /* 46 */
|
2745 | /***/ (function(module, exports, __webpack_require__) {
|
2746 |
|
2747 | // fallback for non-array-like ES3 and non-enumerable old V8 strings
|
2748 | var cof = __webpack_require__(47);
|
2749 | module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){
|
2750 | return cof(it) == 'String' ? it.split('') : Object(it);
|
2751 | };
|
2752 |
|
2753 | /***/ }),
|
2754 | /* 47 */
|
2755 | /***/ (function(module, exports) {
|
2756 |
|
2757 | var toString = {}.toString;
|
2758 |
|
2759 | module.exports = function(it){
|
2760 | return toString.call(it).slice(8, -1);
|
2761 | };
|
2762 |
|
2763 | /***/ }),
|
2764 | /* 48 */
|
2765 | /***/ (function(module, exports) {
|
2766 |
|
2767 | // 7.2.1 RequireObjectCoercible(argument)
|
2768 | module.exports = function(it){
|
2769 | if(it == undefined)throw TypeError("Can't call method on " + it);
|
2770 | return it;
|
2771 | };
|
2772 |
|
2773 | /***/ }),
|
2774 | /* 49 */
|
2775 | /***/ (function(module, exports) {
|
2776 |
|
2777 | ;
|
2778 |
|
2779 | exports.__esModule = true;
|
2780 | function createChainedFunction() {
|
2781 | for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
|
2782 | funcs[_key] = arguments[_key];
|
2783 | }
|
2784 |
|
2785 | return funcs.filter(function (f) {
|
2786 | return f != null;
|
2787 | }).reduce(function (acc, f) {
|
2788 | if (typeof f !== 'function') {
|
2789 | throw new Error('Invalid Argument Type, must only provide functions, undefined, or null.');
|
2790 | }
|
2791 |
|
2792 | if (acc === null) {
|
2793 | return f;
|
2794 | }
|
2795 |
|
2796 | return function chainedFunction() {
|
2797 | for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
2798 | args[_key2] = arguments[_key2];
|
2799 | }
|
2800 |
|
2801 | acc.apply(this, args);
|
2802 | f.apply(this, args);
|
2803 | };
|
2804 | }, null);
|
2805 | }
|
2806 | exports.default = createChainedFunction;
|
2807 |
|
2808 | /***/ }),
|
2809 | /* 50 */
|
2810 | /***/ (function(module, exports) {
|
2811 |
|
2812 | ;
|
2813 |
|
2814 | /**
|
2815 | * @ignore
|
2816 | * some key-codes definition and utils from closure-library
|
2817 | * @author yiminghe@gmail.com
|
2818 | */
|
2819 |
|
2820 | var KeyCode = {
|
2821 | /**
|
2822 | * MAC_ENTER
|
2823 | */
|
2824 | MAC_ENTER: 3,
|
2825 | /**
|
2826 | * BACKSPACE
|
2827 | */
|
2828 | BACKSPACE: 8,
|
2829 | /**
|
2830 | * TAB
|
2831 | */
|
2832 | TAB: 9,
|
2833 | /**
|
2834 | * NUMLOCK on FF/Safari Mac
|
2835 | */
|
2836 | NUM_CENTER: 12, // NUMLOCK on FF/Safari Mac
|
2837 | /**
|
2838 | * ENTER
|
2839 | */
|
2840 | ENTER: 13,
|
2841 | /**
|
2842 | * SHIFT
|
2843 | */
|
2844 | SHIFT: 16,
|
2845 | /**
|
2846 | * CTRL
|
2847 | */
|
2848 | CTRL: 17,
|
2849 | /**
|
2850 | * ALT
|
2851 | */
|
2852 | ALT: 18,
|
2853 | /**
|
2854 | * PAUSE
|
2855 | */
|
2856 | PAUSE: 19,
|
2857 | /**
|
2858 | * CAPS_LOCK
|
2859 | */
|
2860 | CAPS_LOCK: 20,
|
2861 | /**
|
2862 | * ESC
|
2863 | */
|
2864 | ESC: 27,
|
2865 | /**
|
2866 | * SPACE
|
2867 | */
|
2868 | SPACE: 32,
|
2869 | /**
|
2870 | * PAGE_UP
|
2871 | */
|
2872 | PAGE_UP: 33, // also NUM_NORTH_EAST
|
2873 | /**
|
2874 | * PAGE_DOWN
|
2875 | */
|
2876 | PAGE_DOWN: 34, // also NUM_SOUTH_EAST
|
2877 | /**
|
2878 | * END
|
2879 | */
|
2880 | END: 35, // also NUM_SOUTH_WEST
|
2881 | /**
|
2882 | * HOME
|
2883 | */
|
2884 | HOME: 36, // also NUM_NORTH_WEST
|
2885 | /**
|
2886 | * LEFT
|
2887 | */
|
2888 | LEFT: 37, // also NUM_WEST
|
2889 | /**
|
2890 | * UP
|
2891 | */
|
2892 | UP: 38, // also NUM_NORTH
|
2893 | /**
|
2894 | * RIGHT
|
2895 | */
|
2896 | RIGHT: 39, // also NUM_EAST
|
2897 | /**
|
2898 | * DOWN
|
2899 | */
|
2900 | DOWN: 40, // also NUM_SOUTH
|
2901 | /**
|
2902 | * PRINT_SCREEN
|
2903 | */
|
2904 | PRINT_SCREEN: 44,
|
2905 | /**
|
2906 | * INSERT
|
2907 | */
|
2908 | INSERT: 45, // also NUM_INSERT
|
2909 | /**
|
2910 | * DELETE
|
2911 | */
|
2912 | DELETE: 46, // also NUM_DELETE
|
2913 | /**
|
2914 | * ZERO
|
2915 | */
|
2916 | ZERO: 48,
|
2917 | /**
|
2918 | * ONE
|
2919 | */
|
2920 | ONE: 49,
|
2921 | /**
|
2922 | * TWO
|
2923 | */
|
2924 | TWO: 50,
|
2925 | /**
|
2926 | * THREE
|
2927 | */
|
2928 | THREE: 51,
|
2929 | /**
|
2930 | * FOUR
|
2931 | */
|
2932 | FOUR: 52,
|
2933 | /**
|
2934 | * FIVE
|
2935 | */
|
2936 | FIVE: 53,
|
2937 | /**
|
2938 | * SIX
|
2939 | */
|
2940 | SIX: 54,
|
2941 | /**
|
2942 | * SEVEN
|
2943 | */
|
2944 | SEVEN: 55,
|
2945 | /**
|
2946 | * EIGHT
|
2947 | */
|
2948 | EIGHT: 56,
|
2949 | /**
|
2950 | * NINE
|
2951 | */
|
2952 | NINE: 57,
|
2953 | /**
|
2954 | * QUESTION_MARK
|
2955 | */
|
2956 | QUESTION_MARK: 63, // needs localization
|
2957 | /**
|
2958 | * A
|
2959 | */
|
2960 | A: 65,
|
2961 | /**
|
2962 | * B
|
2963 | */
|
2964 | B: 66,
|
2965 | /**
|
2966 | * C
|
2967 | */
|
2968 | C: 67,
|
2969 | /**
|
2970 | * D
|
2971 | */
|
2972 | D: 68,
|
2973 | /**
|
2974 | * E
|
2975 | */
|
2976 | E: 69,
|
2977 | /**
|
2978 | * F
|
2979 | */
|
2980 | F: 70,
|
2981 | /**
|
2982 | * G
|
2983 | */
|
2984 | G: 71,
|
2985 | /**
|
2986 | * H
|
2987 | */
|
2988 | H: 72,
|
2989 | /**
|
2990 | * I
|
2991 | */
|
2992 | I: 73,
|
2993 | /**
|
2994 | * J
|
2995 | */
|
2996 | J: 74,
|
2997 | /**
|
2998 | * K
|
2999 | */
|
3000 | K: 75,
|
3001 | /**
|
3002 | * L
|
3003 | */
|
3004 | L: 76,
|
3005 | /**
|
3006 | * M
|
3007 | */
|
3008 | M: 77,
|
3009 | /**
|
3010 | * N
|
3011 | */
|
3012 | N: 78,
|
3013 | /**
|
3014 | * O
|
3015 | */
|
3016 | O: 79,
|
3017 | /**
|
3018 | * P
|
3019 | */
|
3020 | P: 80,
|
3021 | /**
|
3022 | * Q
|
3023 | */
|
3024 | Q: 81,
|
3025 | /**
|
3026 | * R
|
3027 | */
|
3028 | R: 82,
|
3029 | /**
|
3030 | * S
|
3031 | */
|
3032 | S: 83,
|
3033 | /**
|
3034 | * T
|
3035 | */
|
3036 | T: 84,
|
3037 | /**
|
3038 | * U
|
3039 | */
|
3040 | U: 85,
|
3041 | /**
|
3042 | * V
|
3043 | */
|
3044 | V: 86,
|
3045 | /**
|
3046 | * W
|
3047 | */
|
3048 | W: 87,
|
3049 | /**
|
3050 | * X
|
3051 | */
|
3052 | X: 88,
|
3053 | /**
|
3054 | * Y
|
3055 | */
|
3056 | Y: 89,
|
3057 | /**
|
3058 | * Z
|
3059 | */
|
3060 | Z: 90,
|
3061 | /**
|
3062 | * META
|
3063 | */
|
3064 | META: 91, // WIN_KEY_LEFT
|
3065 | /**
|
3066 | * WIN_KEY_RIGHT
|
3067 | */
|
3068 | WIN_KEY_RIGHT: 92,
|
3069 | /**
|
3070 | * CONTEXT_MENU
|
3071 | */
|
3072 | CONTEXT_MENU: 93,
|
3073 | /**
|
3074 | * NUM_ZERO
|
3075 | */
|
3076 | NUM_ZERO: 96,
|
3077 | /**
|
3078 | * NUM_ONE
|
3079 | */
|
3080 | NUM_ONE: 97,
|
3081 | /**
|
3082 | * NUM_TWO
|
3083 | */
|
3084 | NUM_TWO: 98,
|
3085 | /**
|
3086 | * NUM_THREE
|
3087 | */
|
3088 | NUM_THREE: 99,
|
3089 | /**
|
3090 | * NUM_FOUR
|
3091 | */
|
3092 | NUM_FOUR: 100,
|
3093 | /**
|
3094 | * NUM_FIVE
|
3095 | */
|
3096 | NUM_FIVE: 101,
|
3097 | /**
|
3098 | * NUM_SIX
|
3099 | */
|
3100 | NUM_SIX: 102,
|
3101 | /**
|
3102 | * NUM_SEVEN
|
3103 | */
|
3104 | NUM_SEVEN: 103,
|
3105 | /**
|
3106 | * NUM_EIGHT
|
3107 | */
|
3108 | NUM_EIGHT: 104,
|
3109 | /**
|
3110 | * NUM_NINE
|
3111 | */
|
3112 | NUM_NINE: 105,
|
3113 | /**
|
3114 | * NUM_MULTIPLY
|
3115 | */
|
3116 | NUM_MULTIPLY: 106,
|
3117 | /**
|
3118 | * NUM_PLUS
|
3119 | */
|
3120 | NUM_PLUS: 107,
|
3121 | /**
|
3122 | * NUM_MINUS
|
3123 | */
|
3124 | NUM_MINUS: 109,
|
3125 | /**
|
3126 | * NUM_PERIOD
|
3127 | */
|
3128 | NUM_PERIOD: 110,
|
3129 | /**
|
3130 | * NUM_DIVISION
|
3131 | */
|
3132 | NUM_DIVISION: 111,
|
3133 | /**
|
3134 | * F1
|
3135 | */
|
3136 | F1: 112,
|
3137 | /**
|
3138 | * F2
|
3139 | */
|
3140 | F2: 113,
|
3141 | /**
|
3142 | * F3
|
3143 | */
|
3144 | F3: 114,
|
3145 | /**
|
3146 | * F4
|
3147 | */
|
3148 | F4: 115,
|
3149 | /**
|
3150 | * F5
|
3151 | */
|
3152 | F5: 116,
|
3153 | /**
|
3154 | * F6
|
3155 | */
|
3156 | F6: 117,
|
3157 | /**
|
3158 | * F7
|
3159 | */
|
3160 | F7: 118,
|
3161 | /**
|
3162 | * F8
|
3163 | */
|
3164 | F8: 119,
|
3165 | /**
|
3166 | * F9
|
3167 | */
|
3168 | F9: 120,
|
3169 | /**
|
3170 | * F10
|
3171 | */
|
3172 | F10: 121,
|
3173 | /**
|
3174 | * F11
|
3175 | */
|
3176 | F11: 122,
|
3177 | /**
|
3178 | * F12
|
3179 | */
|
3180 | F12: 123,
|
3181 | /**
|
3182 | * NUMLOCK
|
3183 | */
|
3184 | NUMLOCK: 144,
|
3185 | /**
|
3186 | * SEMICOLON
|
3187 | */
|
3188 | SEMICOLON: 186, // needs localization
|
3189 | /**
|
3190 | * DASH
|
3191 | */
|
3192 | DASH: 189, // needs localization
|
3193 | /**
|
3194 | * EQUALS
|
3195 | */
|
3196 | EQUALS: 187, // needs localization
|
3197 | /**
|
3198 | * COMMA
|
3199 | */
|
3200 | COMMA: 188, // needs localization
|
3201 | /**
|
3202 | * PERIOD
|
3203 | */
|
3204 | PERIOD: 190, // needs localization
|
3205 | /**
|
3206 | * SLASH
|
3207 | */
|
3208 | SLASH: 191, // needs localization
|
3209 | /**
|
3210 | * APOSTROPHE
|
3211 | */
|
3212 | APOSTROPHE: 192, // needs localization
|
3213 | /**
|
3214 | * SINGLE_QUOTE
|
3215 | */
|
3216 | SINGLE_QUOTE: 222, // needs localization
|
3217 | /**
|
3218 | * OPEN_SQUARE_BRACKET
|
3219 | */
|
3220 | OPEN_SQUARE_BRACKET: 219, // needs localization
|
3221 | /**
|
3222 | * BACKSLASH
|
3223 | */
|
3224 | BACKSLASH: 220, // needs localization
|
3225 | /**
|
3226 | * CLOSE_SQUARE_BRACKET
|
3227 | */
|
3228 | CLOSE_SQUARE_BRACKET: 221, // needs localization
|
3229 | /**
|
3230 | * WIN_KEY
|
3231 | */
|
3232 | WIN_KEY: 224,
|
3233 | /**
|
3234 | * MAC_FF_META
|
3235 | */
|
3236 | MAC_FF_META: 224, // Firefox (Gecko) fires this for the meta key instead of 91
|
3237 | /**
|
3238 | * WIN_IME
|
3239 | */
|
3240 | WIN_IME: 229
|
3241 | };
|
3242 |
|
3243 | /*
|
3244 | whether text and modified key is entered at the same time.
|
3245 | */
|
3246 | KeyCode.isTextModifyingKeyEvent = function isTextModifyingKeyEvent(e) {
|
3247 | var keyCode = e.keyCode;
|
3248 | if (e.altKey && !e.ctrlKey || e.metaKey ||
|
3249 | // Function keys don't generate text
|
3250 | keyCode >= KeyCode.F1 && keyCode <= KeyCode.F12) {
|
3251 | return false;
|
3252 | }
|
3253 |
|
3254 | // The following keys are quite harmless, even in combination with
|
3255 | // CTRL, ALT or SHIFT.
|
3256 | switch (keyCode) {
|
3257 | case KeyCode.ALT:
|
3258 | case KeyCode.CAPS_LOCK:
|
3259 | case KeyCode.CONTEXT_MENU:
|
3260 | case KeyCode.CTRL:
|
3261 | case KeyCode.DOWN:
|
3262 | case KeyCode.END:
|
3263 | case KeyCode.ESC:
|
3264 | case KeyCode.HOME:
|
3265 | case KeyCode.INSERT:
|
3266 | case KeyCode.LEFT:
|
3267 | case KeyCode.MAC_FF_META:
|
3268 | case KeyCode.META:
|
3269 | case KeyCode.NUMLOCK:
|
3270 | case KeyCode.NUM_CENTER:
|
3271 | case KeyCode.PAGE_DOWN:
|
3272 | case KeyCode.PAGE_UP:
|
3273 | case KeyCode.PAUSE:
|
3274 | case KeyCode.PRINT_SCREEN:
|
3275 | case KeyCode.RIGHT:
|
3276 | case KeyCode.SHIFT:
|
3277 | case KeyCode.UP:
|
3278 | case KeyCode.WIN_KEY:
|
3279 | case KeyCode.WIN_KEY_RIGHT:
|
3280 | return false;
|
3281 | default:
|
3282 | return true;
|
3283 | }
|
3284 | };
|
3285 |
|
3286 | /*
|
3287 | whether character is entered.
|
3288 | */
|
3289 | KeyCode.isCharacterKey = function isCharacterKey(keyCode) {
|
3290 | if (keyCode >= KeyCode.ZERO && keyCode <= KeyCode.NINE) {
|
3291 | return true;
|
3292 | }
|
3293 |
|
3294 | if (keyCode >= KeyCode.NUM_ZERO && keyCode <= KeyCode.NUM_MULTIPLY) {
|
3295 | return true;
|
3296 | }
|
3297 |
|
3298 | if (keyCode >= KeyCode.A && keyCode <= KeyCode.Z) {
|
3299 | return true;
|
3300 | }
|
3301 |
|
3302 | // Safari sends zero key code for non-latin characters.
|
3303 | if (window.navigation.userAgent.indexOf('WebKit') !== -1 && keyCode === 0) {
|
3304 | return true;
|
3305 | }
|
3306 |
|
3307 | switch (keyCode) {
|
3308 | case KeyCode.SPACE:
|
3309 | case KeyCode.QUESTION_MARK:
|
3310 | case KeyCode.NUM_PLUS:
|
3311 | case KeyCode.NUM_MINUS:
|
3312 | case KeyCode.NUM_PERIOD:
|
3313 | case KeyCode.NUM_DIVISION:
|
3314 | case KeyCode.SEMICOLON:
|
3315 | case KeyCode.DASH:
|
3316 | case KeyCode.EQUALS:
|
3317 | case KeyCode.COMMA:
|
3318 | case KeyCode.PERIOD:
|
3319 | case KeyCode.SLASH:
|
3320 | case KeyCode.APOSTROPHE:
|
3321 | case KeyCode.SINGLE_QUOTE:
|
3322 | case KeyCode.OPEN_SQUARE_BRACKET:
|
3323 | case KeyCode.BACKSLASH:
|
3324 | case KeyCode.CLOSE_SQUARE_BRACKET:
|
3325 | return true;
|
3326 | default:
|
3327 | return false;
|
3328 | }
|
3329 | };
|
3330 |
|
3331 | module.exports = KeyCode;
|
3332 |
|
3333 | /***/ }),
|
3334 | /* 51 */
|
3335 | /***/ (function(module, exports) {
|
3336 |
|
3337 | ;
|
3338 |
|
3339 | exports.__esModule = true;
|
3340 | exports.default = contains;
|
3341 | function contains(root, n) {
|
3342 | var node = n;
|
3343 | while (node) {
|
3344 | if (node === root) {
|
3345 | return true;
|
3346 | }
|
3347 | node = node.parentNode;
|
3348 | }
|
3349 |
|
3350 | return false;
|
3351 | }
|
3352 |
|
3353 | /***/ }),
|
3354 | /* 52 */
|
3355 | /***/ (function(module, exports, __webpack_require__) {
|
3356 |
|
3357 | ;
|
3358 |
|
3359 | exports.__esModule = true;
|
3360 | exports.default = addEventListenerWrap;
|
3361 |
|
3362 | var _addDomEventListener = __webpack_require__(53);
|
3363 |
|
3364 | var _addDomEventListener2 = _interopRequireDefault(_addDomEventListener);
|
3365 |
|
3366 | var _reactDom = __webpack_require__(11);
|
3367 |
|
3368 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
3369 |
|
3370 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
3371 |
|
3372 | function addEventListenerWrap(target, eventType, cb) {
|
3373 | /* eslint camelcase: 2 */
|
3374 | var callback = _reactDom2.default.unstable_batchedUpdates ? function run(e) {
|
3375 | _reactDom2.default.unstable_batchedUpdates(cb, e);
|
3376 | } : cb;
|
3377 | return (0, _addDomEventListener2.default)(target, eventType, callback);
|
3378 | }
|
3379 |
|
3380 | /***/ }),
|
3381 | /* 53 */
|
3382 | /***/ (function(module, exports, __webpack_require__) {
|
3383 |
|
3384 | ;
|
3385 |
|
3386 | Object.defineProperty(exports, "__esModule", {
|
3387 | value: true
|
3388 | });
|
3389 | exports["default"] = addEventListener;
|
3390 |
|
3391 | var _EventObject = __webpack_require__(54);
|
3392 |
|
3393 | var _EventObject2 = _interopRequireDefault(_EventObject);
|
3394 |
|
3395 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
3396 |
|
3397 | function addEventListener(target, eventType, callback) {
|
3398 | function wrapCallback(e) {
|
3399 | var ne = new _EventObject2["default"](e);
|
3400 | callback.call(target, ne);
|
3401 | }
|
3402 |
|
3403 | if (target.addEventListener) {
|
3404 | target.addEventListener(eventType, wrapCallback, false);
|
3405 | return {
|
3406 | remove: function remove() {
|
3407 | target.removeEventListener(eventType, wrapCallback, false);
|
3408 | }
|
3409 | };
|
3410 | } else if (target.attachEvent) {
|
3411 | target.attachEvent('on' + eventType, wrapCallback);
|
3412 | return {
|
3413 | remove: function remove() {
|
3414 | target.detachEvent('on' + eventType, wrapCallback);
|
3415 | }
|
3416 | };
|
3417 | }
|
3418 | }
|
3419 | module.exports = exports['default'];
|
3420 |
|
3421 | /***/ }),
|
3422 | /* 54 */
|
3423 | /***/ (function(module, exports, __webpack_require__) {
|
3424 |
|
3425 | ;
|
3426 |
|
3427 | Object.defineProperty(exports, "__esModule", {
|
3428 | value: true
|
3429 | });
|
3430 |
|
3431 | var _EventBaseObject = __webpack_require__(55);
|
3432 |
|
3433 | var _EventBaseObject2 = _interopRequireDefault(_EventBaseObject);
|
3434 |
|
3435 | var _objectAssign = __webpack_require__(56);
|
3436 |
|
3437 | var _objectAssign2 = _interopRequireDefault(_objectAssign);
|
3438 |
|
3439 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
3440 |
|
3441 | /**
|
3442 | * @ignore
|
3443 | * event object for dom
|
3444 | * @author yiminghe@gmail.com
|
3445 | */
|
3446 |
|
3447 | var TRUE = true;
|
3448 | var FALSE = false;
|
3449 | var commonProps = ['altKey', 'bubbles', 'cancelable', 'ctrlKey', 'currentTarget', 'eventPhase', 'metaKey', 'shiftKey', 'target', 'timeStamp', 'view', 'type'];
|
3450 |
|
3451 | function isNullOrUndefined(w) {
|
3452 | return w === null || w === undefined;
|
3453 | }
|
3454 |
|
3455 | var eventNormalizers = [{
|
3456 | reg: /^key/,
|
3457 | props: ['char', 'charCode', 'key', 'keyCode', 'which'],
|
3458 | fix: function fix(event, nativeEvent) {
|
3459 | if (isNullOrUndefined(event.which)) {
|
3460 | event.which = !isNullOrUndefined(nativeEvent.charCode) ? nativeEvent.charCode : nativeEvent.keyCode;
|
3461 | }
|
3462 |
|
3463 | // add metaKey to non-Mac browsers (use ctrl for PC 's and Meta for Macs)
|
3464 | if (event.metaKey === undefined) {
|
3465 | event.metaKey = event.ctrlKey;
|
3466 | }
|
3467 | }
|
3468 | }, {
|
3469 | reg: /^touch/,
|
3470 | props: ['touches', 'changedTouches', 'targetTouches']
|
3471 | }, {
|
3472 | reg: /^hashchange$/,
|
3473 | props: ['newURL', 'oldURL']
|
3474 | }, {
|
3475 | reg: /^gesturechange$/i,
|
3476 | props: ['rotation', 'scale']
|
3477 | }, {
|
3478 | reg: /^(mousewheel|DOMMouseScroll)$/,
|
3479 | props: [],
|
3480 | fix: function fix(event, nativeEvent) {
|
3481 | var deltaX = void 0;
|
3482 | var deltaY = void 0;
|
3483 | var delta = void 0;
|
3484 | var wheelDelta = nativeEvent.wheelDelta;
|
3485 | var axis = nativeEvent.axis;
|
3486 | var wheelDeltaY = nativeEvent.wheelDeltaY;
|
3487 | var wheelDeltaX = nativeEvent.wheelDeltaX;
|
3488 | var detail = nativeEvent.detail;
|
3489 |
|
3490 | // ie/webkit
|
3491 | if (wheelDelta) {
|
3492 | delta = wheelDelta / 120;
|
3493 | }
|
3494 |
|
3495 | // gecko
|
3496 | if (detail) {
|
3497 | // press control e.detail == 1 else e.detail == 3
|
3498 | delta = 0 - (detail % 3 === 0 ? detail / 3 : detail);
|
3499 | }
|
3500 |
|
3501 | // Gecko
|
3502 | if (axis !== undefined) {
|
3503 | if (axis === event.HORIZONTAL_AXIS) {
|
3504 | deltaY = 0;
|
3505 | deltaX = 0 - delta;
|
3506 | } else if (axis === event.VERTICAL_AXIS) {
|
3507 | deltaX = 0;
|
3508 | deltaY = delta;
|
3509 | }
|
3510 | }
|
3511 |
|
3512 | // Webkit
|
3513 | if (wheelDeltaY !== undefined) {
|
3514 | deltaY = wheelDeltaY / 120;
|
3515 | }
|
3516 | if (wheelDeltaX !== undefined) {
|
3517 | deltaX = -1 * wheelDeltaX / 120;
|
3518 | }
|
3519 |
|
3520 | // 默认 deltaY (ie)
|
3521 | if (!deltaX && !deltaY) {
|
3522 | deltaY = delta;
|
3523 | }
|
3524 |
|
3525 | if (deltaX !== undefined) {
|
3526 | /**
|
3527 | * deltaX of mousewheel event
|
3528 | * @property deltaX
|
3529 | * @member Event.DomEvent.Object
|
3530 | */
|
3531 | event.deltaX = deltaX;
|
3532 | }
|
3533 |
|
3534 | if (deltaY !== undefined) {
|
3535 | /**
|
3536 | * deltaY of mousewheel event
|
3537 | * @property deltaY
|
3538 | * @member Event.DomEvent.Object
|
3539 | */
|
3540 | event.deltaY = deltaY;
|
3541 | }
|
3542 |
|
3543 | if (delta !== undefined) {
|
3544 | /**
|
3545 | * delta of mousewheel event
|
3546 | * @property delta
|
3547 | * @member Event.DomEvent.Object
|
3548 | */
|
3549 | event.delta = delta;
|
3550 | }
|
3551 | }
|
3552 | }, {
|
3553 | reg: /^mouse|contextmenu|click|mspointer|(^DOMMouseScroll$)/i,
|
3554 | props: ['buttons', 'clientX', 'clientY', 'button', 'offsetX', 'relatedTarget', 'which', 'fromElement', 'toElement', 'offsetY', 'pageX', 'pageY', 'screenX', 'screenY'],
|
3555 | fix: function fix(event, nativeEvent) {
|
3556 | var eventDoc = void 0;
|
3557 | var doc = void 0;
|
3558 | var body = void 0;
|
3559 | var target = event.target;
|
3560 | var button = nativeEvent.button;
|
3561 |
|
3562 | // Calculate pageX/Y if missing and clientX/Y available
|
3563 | if (target && isNullOrUndefined(event.pageX) && !isNullOrUndefined(nativeEvent.clientX)) {
|
3564 | eventDoc = target.ownerDocument || document;
|
3565 | doc = eventDoc.documentElement;
|
3566 | body = eventDoc.body;
|
3567 | event.pageX = nativeEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
|
3568 | event.pageY = nativeEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
|
3569 | }
|
3570 |
|
3571 | // which for click: 1 === left; 2 === middle; 3 === right
|
3572 | // do not use button
|
3573 | if (!event.which && button !== undefined) {
|
3574 | if (button & 1) {
|
3575 | event.which = 1;
|
3576 | } else if (button & 2) {
|
3577 | event.which = 3;
|
3578 | } else if (button & 4) {
|
3579 | event.which = 2;
|
3580 | } else {
|
3581 | event.which = 0;
|
3582 | }
|
3583 | }
|
3584 |
|
3585 | // add relatedTarget, if necessary
|
3586 | if (!event.relatedTarget && event.fromElement) {
|
3587 | event.relatedTarget = event.fromElement === target ? event.toElement : event.fromElement;
|
3588 | }
|
3589 |
|
3590 | return event;
|
3591 | }
|
3592 | }];
|
3593 |
|
3594 | function retTrue() {
|
3595 | return TRUE;
|
3596 | }
|
3597 |
|
3598 | function retFalse() {
|
3599 | return FALSE;
|
3600 | }
|
3601 |
|
3602 | function DomEventObject(nativeEvent) {
|
3603 | var type = nativeEvent.type;
|
3604 |
|
3605 | var isNative = typeof nativeEvent.stopPropagation === 'function' || typeof nativeEvent.cancelBubble === 'boolean';
|
3606 |
|
3607 | _EventBaseObject2["default"].call(this);
|
3608 |
|
3609 | this.nativeEvent = nativeEvent;
|
3610 |
|
3611 | // in case dom event has been mark as default prevented by lower dom node
|
3612 | var isDefaultPrevented = retFalse;
|
3613 | if ('defaultPrevented' in nativeEvent) {
|
3614 | isDefaultPrevented = nativeEvent.defaultPrevented ? retTrue : retFalse;
|
3615 | } else if ('getPreventDefault' in nativeEvent) {
|
3616 | // https://bugzilla.mozilla.org/show_bug.cgi?id=691151
|
3617 | isDefaultPrevented = nativeEvent.getPreventDefault() ? retTrue : retFalse;
|
3618 | } else if ('returnValue' in nativeEvent) {
|
3619 | isDefaultPrevented = nativeEvent.returnValue === FALSE ? retTrue : retFalse;
|
3620 | }
|
3621 |
|
3622 | this.isDefaultPrevented = isDefaultPrevented;
|
3623 |
|
3624 | var fixFns = [];
|
3625 | var fixFn = void 0;
|
3626 | var l = void 0;
|
3627 | var prop = void 0;
|
3628 | var props = commonProps.concat();
|
3629 |
|
3630 | eventNormalizers.forEach(function (normalizer) {
|
3631 | if (type.match(normalizer.reg)) {
|
3632 | props = props.concat(normalizer.props);
|
3633 | if (normalizer.fix) {
|
3634 | fixFns.push(normalizer.fix);
|
3635 | }
|
3636 | }
|
3637 | });
|
3638 |
|
3639 | l = props.length;
|
3640 |
|
3641 | // clone properties of the original event object
|
3642 | while (l) {
|
3643 | prop = props[--l];
|
3644 | this[prop] = nativeEvent[prop];
|
3645 | }
|
3646 |
|
3647 | // fix target property, if necessary
|
3648 | if (!this.target && isNative) {
|
3649 | this.target = nativeEvent.srcElement || document; // srcElement might not be defined either
|
3650 | }
|
3651 |
|
3652 | // check if target is a text node (safari)
|
3653 | if (this.target && this.target.nodeType === 3) {
|
3654 | this.target = this.target.parentNode;
|
3655 | }
|
3656 |
|
3657 | l = fixFns.length;
|
3658 |
|
3659 | while (l) {
|
3660 | fixFn = fixFns[--l];
|
3661 | fixFn(this, nativeEvent);
|
3662 | }
|
3663 |
|
3664 | this.timeStamp = nativeEvent.timeStamp || Date.now();
|
3665 | }
|
3666 |
|
3667 | var EventBaseObjectProto = _EventBaseObject2["default"].prototype;
|
3668 |
|
3669 | (0, _objectAssign2["default"])(DomEventObject.prototype, EventBaseObjectProto, {
|
3670 | constructor: DomEventObject,
|
3671 |
|
3672 | preventDefault: function preventDefault() {
|
3673 | var e = this.nativeEvent;
|
3674 |
|
3675 | // if preventDefault exists run it on the original event
|
3676 | if (e.preventDefault) {
|
3677 | e.preventDefault();
|
3678 | } else {
|
3679 | // otherwise set the returnValue property of the original event to FALSE (IE)
|
3680 | e.returnValue = FALSE;
|
3681 | }
|
3682 |
|
3683 | EventBaseObjectProto.preventDefault.call(this);
|
3684 | },
|
3685 | stopPropagation: function stopPropagation() {
|
3686 | var e = this.nativeEvent;
|
3687 |
|
3688 | // if stopPropagation exists run it on the original event
|
3689 | if (e.stopPropagation) {
|
3690 | e.stopPropagation();
|
3691 | } else {
|
3692 | // otherwise set the cancelBubble property of the original event to TRUE (IE)
|
3693 | e.cancelBubble = TRUE;
|
3694 | }
|
3695 |
|
3696 | EventBaseObjectProto.stopPropagation.call(this);
|
3697 | }
|
3698 | });
|
3699 |
|
3700 | exports["default"] = DomEventObject;
|
3701 | module.exports = exports['default'];
|
3702 |
|
3703 | /***/ }),
|
3704 | /* 55 */
|
3705 | /***/ (function(module, exports) {
|
3706 |
|
3707 | ;
|
3708 |
|
3709 | Object.defineProperty(exports, "__esModule", {
|
3710 | value: true
|
3711 | });
|
3712 | /**
|
3713 | * @ignore
|
3714 | * base event object for custom and dom event.
|
3715 | * @author yiminghe@gmail.com
|
3716 | */
|
3717 |
|
3718 | function returnFalse() {
|
3719 | return false;
|
3720 | }
|
3721 |
|
3722 | function returnTrue() {
|
3723 | return true;
|
3724 | }
|
3725 |
|
3726 | function EventBaseObject() {
|
3727 | this.timeStamp = Date.now();
|
3728 | this.target = undefined;
|
3729 | this.currentTarget = undefined;
|
3730 | }
|
3731 |
|
3732 | EventBaseObject.prototype = {
|
3733 | isEventObject: 1,
|
3734 |
|
3735 | constructor: EventBaseObject,
|
3736 |
|
3737 | isDefaultPrevented: returnFalse,
|
3738 |
|
3739 | isPropagationStopped: returnFalse,
|
3740 |
|
3741 | isImmediatePropagationStopped: returnFalse,
|
3742 |
|
3743 | preventDefault: function preventDefault() {
|
3744 | this.isDefaultPrevented = returnTrue;
|
3745 | },
|
3746 | stopPropagation: function stopPropagation() {
|
3747 | this.isPropagationStopped = returnTrue;
|
3748 | },
|
3749 | stopImmediatePropagation: function stopImmediatePropagation() {
|
3750 | this.isImmediatePropagationStopped = returnTrue;
|
3751 | // fixed 1.2
|
3752 | // call stopPropagation implicitly
|
3753 | this.stopPropagation();
|
3754 | },
|
3755 | halt: function halt(immediate) {
|
3756 | if (immediate) {
|
3757 | this.stopImmediatePropagation();
|
3758 | } else {
|
3759 | this.stopPropagation();
|
3760 | }
|
3761 | this.preventDefault();
|
3762 | }
|
3763 | };
|
3764 |
|
3765 | exports["default"] = EventBaseObject;
|
3766 | module.exports = exports['default'];
|
3767 |
|
3768 | /***/ }),
|
3769 | /* 56 */
|
3770 | /***/ (function(module, exports) {
|
3771 |
|
3772 | /*
|
3773 | object-assign
|
3774 | (c) Sindre Sorhus
|
3775 | @license MIT
|
3776 | */
|
3777 |
|
3778 | ;
|
3779 | /* eslint-disable no-unused-vars */
|
3780 | var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
3781 | var hasOwnProperty = Object.prototype.hasOwnProperty;
|
3782 | var propIsEnumerable = Object.prototype.propertyIsEnumerable;
|
3783 |
|
3784 | function toObject(val) {
|
3785 | if (val === null || val === undefined) {
|
3786 | throw new TypeError('Object.assign cannot be called with null or undefined');
|
3787 | }
|
3788 |
|
3789 | return Object(val);
|
3790 | }
|
3791 |
|
3792 | function shouldUseNative() {
|
3793 | try {
|
3794 | if (!Object.assign) {
|
3795 | return false;
|
3796 | }
|
3797 |
|
3798 | // Detect buggy property enumeration order in older V8 versions.
|
3799 |
|
3800 | // https://bugs.chromium.org/p/v8/issues/detail?id=4118
|
3801 | var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
|
3802 | test1[5] = 'de';
|
3803 | if (Object.getOwnPropertyNames(test1)[0] === '5') {
|
3804 | return false;
|
3805 | }
|
3806 |
|
3807 | // https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
3808 | var test2 = {};
|
3809 | for (var i = 0; i < 10; i++) {
|
3810 | test2['_' + String.fromCharCode(i)] = i;
|
3811 | }
|
3812 | var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
|
3813 | return test2[n];
|
3814 | });
|
3815 | if (order2.join('') !== '0123456789') {
|
3816 | return false;
|
3817 | }
|
3818 |
|
3819 | // https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
3820 | var test3 = {};
|
3821 | 'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
|
3822 | test3[letter] = letter;
|
3823 | });
|
3824 | if (Object.keys(Object.assign({}, test3)).join('') !==
|
3825 | 'abcdefghijklmnopqrst') {
|
3826 | return false;
|
3827 | }
|
3828 |
|
3829 | return true;
|
3830 | } catch (err) {
|
3831 | // We don't expect any of the above to throw, but better to be safe.
|
3832 | return false;
|
3833 | }
|
3834 | }
|
3835 |
|
3836 | module.exports = shouldUseNative() ? Object.assign : function (target, source) {
|
3837 | var from;
|
3838 | var to = toObject(target);
|
3839 | var symbols;
|
3840 |
|
3841 | for (var s = 1; s < arguments.length; s++) {
|
3842 | from = Object(arguments[s]);
|
3843 |
|
3844 | for (var key in from) {
|
3845 | if (hasOwnProperty.call(from, key)) {
|
3846 | to[key] = from[key];
|
3847 | }
|
3848 | }
|
3849 |
|
3850 | if (getOwnPropertySymbols) {
|
3851 | symbols = getOwnPropertySymbols(from);
|
3852 | for (var i = 0; i < symbols.length; i++) {
|
3853 | if (propIsEnumerable.call(from, symbols[i])) {
|
3854 | to[symbols[i]] = from[symbols[i]];
|
3855 | }
|
3856 | }
|
3857 | }
|
3858 | }
|
3859 |
|
3860 | return to;
|
3861 | };
|
3862 |
|
3863 |
|
3864 | /***/ }),
|
3865 | /* 57 */
|
3866 | /***/ (function(module, exports, __webpack_require__) {
|
3867 |
|
3868 | ;
|
3869 |
|
3870 | exports.__esModule = true;
|
3871 |
|
3872 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
3873 |
|
3874 | var _Event = __webpack_require__(58);
|
3875 |
|
3876 | var _Event2 = _interopRequireDefault(_Event);
|
3877 |
|
3878 | var _componentClasses = __webpack_require__(59);
|
3879 |
|
3880 | var _componentClasses2 = _interopRequireDefault(_componentClasses);
|
3881 |
|
3882 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
3883 |
|
3884 | var isCssAnimationSupported = _Event2.default.endEvents.length !== 0;
|
3885 |
|
3886 |
|
3887 | var capitalPrefixes = ['Webkit', 'Moz', 'O',
|
3888 | // ms is special .... !
|
3889 | 'ms'];
|
3890 | var prefixes = ['-webkit-', '-moz-', '-o-', 'ms-', ''];
|
3891 |
|
3892 | function getStyleProperty(node, name) {
|
3893 | var style = window.getComputedStyle(node);
|
3894 |
|
3895 | var ret = '';
|
3896 | for (var i = 0; i < prefixes.length; i++) {
|
3897 | ret = style.getPropertyValue(prefixes[i] + name);
|
3898 | if (ret) {
|
3899 | break;
|
3900 | }
|
3901 | }
|
3902 | return ret;
|
3903 | }
|
3904 |
|
3905 | function fixBrowserByTimeout(node) {
|
3906 | if (isCssAnimationSupported) {
|
3907 | var transitionDelay = parseFloat(getStyleProperty(node, 'transition-delay')) || 0;
|
3908 | var transitionDuration = parseFloat(getStyleProperty(node, 'transition-duration')) || 0;
|
3909 | var animationDelay = parseFloat(getStyleProperty(node, 'animation-delay')) || 0;
|
3910 | var animationDuration = parseFloat(getStyleProperty(node, 'animation-duration')) || 0;
|
3911 | var time = Math.max(transitionDuration + transitionDelay, animationDuration + animationDelay);
|
3912 | // sometimes, browser bug
|
3913 | node.rcEndAnimTimeout = setTimeout(function () {
|
3914 | node.rcEndAnimTimeout = null;
|
3915 | if (node.rcEndListener) {
|
3916 | node.rcEndListener();
|
3917 | }
|
3918 | }, time * 1000 + 200);
|
3919 | }
|
3920 | }
|
3921 |
|
3922 | function clearBrowserBugTimeout(node) {
|
3923 | if (node.rcEndAnimTimeout) {
|
3924 | clearTimeout(node.rcEndAnimTimeout);
|
3925 | node.rcEndAnimTimeout = null;
|
3926 | }
|
3927 | }
|
3928 |
|
3929 | var cssAnimation = function cssAnimation(node, transitionName, endCallback) {
|
3930 | var nameIsObj = (typeof transitionName === 'undefined' ? 'undefined' : _typeof(transitionName)) === 'object';
|
3931 | var className = nameIsObj ? transitionName.name : transitionName;
|
3932 | var activeClassName = nameIsObj ? transitionName.active : transitionName + '-active';
|
3933 | var end = endCallback;
|
3934 | var start = void 0;
|
3935 | var active = void 0;
|
3936 | var nodeClasses = (0, _componentClasses2.default)(node);
|
3937 |
|
3938 | if (endCallback && Object.prototype.toString.call(endCallback) === '[object Object]') {
|
3939 | end = endCallback.end;
|
3940 | start = endCallback.start;
|
3941 | active = endCallback.active;
|
3942 | }
|
3943 |
|
3944 | if (node.rcEndListener) {
|
3945 | node.rcEndListener();
|
3946 | }
|
3947 |
|
3948 | node.rcEndListener = function (e) {
|
3949 | if (e && e.target !== node) {
|
3950 | return;
|
3951 | }
|
3952 |
|
3953 | if (node.rcAnimTimeout) {
|
3954 | clearTimeout(node.rcAnimTimeout);
|
3955 | node.rcAnimTimeout = null;
|
3956 | }
|
3957 |
|
3958 | clearBrowserBugTimeout(node);
|
3959 |
|
3960 | nodeClasses.remove(className);
|
3961 | nodeClasses.remove(activeClassName);
|
3962 |
|
3963 | _Event2.default.removeEndEventListener(node, node.rcEndListener);
|
3964 | node.rcEndListener = null;
|
3965 |
|
3966 | // Usually this optional end is used for informing an owner of
|
3967 | // a leave animation and telling it to remove the child.
|
3968 | if (end) {
|
3969 | end();
|
3970 | }
|
3971 | };
|
3972 |
|
3973 | _Event2.default.addEndEventListener(node, node.rcEndListener);
|
3974 |
|
3975 | if (start) {
|
3976 | start();
|
3977 | }
|
3978 | nodeClasses.add(className);
|
3979 |
|
3980 | node.rcAnimTimeout = setTimeout(function () {
|
3981 | node.rcAnimTimeout = null;
|
3982 | nodeClasses.add(activeClassName);
|
3983 | if (active) {
|
3984 | setTimeout(active, 0);
|
3985 | }
|
3986 | fixBrowserByTimeout(node);
|
3987 | // 30ms for firefox
|
3988 | }, 30);
|
3989 |
|
3990 | return {
|
3991 | stop: function stop() {
|
3992 | if (node.rcEndListener) {
|
3993 | node.rcEndListener();
|
3994 | }
|
3995 | }
|
3996 | };
|
3997 | };
|
3998 |
|
3999 | cssAnimation.style = function (node, style, callback) {
|
4000 | if (node.rcEndListener) {
|
4001 | node.rcEndListener();
|
4002 | }
|
4003 |
|
4004 | node.rcEndListener = function (e) {
|
4005 | if (e && e.target !== node) {
|
4006 | return;
|
4007 | }
|
4008 |
|
4009 | if (node.rcAnimTimeout) {
|
4010 | clearTimeout(node.rcAnimTimeout);
|
4011 | node.rcAnimTimeout = null;
|
4012 | }
|
4013 |
|
4014 | clearBrowserBugTimeout(node);
|
4015 |
|
4016 | _Event2.default.removeEndEventListener(node, node.rcEndListener);
|
4017 | node.rcEndListener = null;
|
4018 |
|
4019 | // Usually this optional callback is used for informing an owner of
|
4020 | // a leave animation and telling it to remove the child.
|
4021 | if (callback) {
|
4022 | callback();
|
4023 | }
|
4024 | };
|
4025 |
|
4026 | _Event2.default.addEndEventListener(node, node.rcEndListener);
|
4027 |
|
4028 | node.rcAnimTimeout = setTimeout(function () {
|
4029 | for (var s in style) {
|
4030 | if (style.hasOwnProperty(s)) {
|
4031 | node.style[s] = style[s];
|
4032 | }
|
4033 | }
|
4034 | node.rcAnimTimeout = null;
|
4035 | fixBrowserByTimeout(node);
|
4036 | }, 0);
|
4037 | };
|
4038 |
|
4039 | cssAnimation.setTransition = function (node, p, value) {
|
4040 | var property = p;
|
4041 | var v = value;
|
4042 | if (value === undefined) {
|
4043 | v = property;
|
4044 | property = '';
|
4045 | }
|
4046 | property = property || '';
|
4047 | capitalPrefixes.forEach(function (prefix) {
|
4048 | node.style[prefix + 'Transition' + property] = v;
|
4049 | });
|
4050 | };
|
4051 |
|
4052 | cssAnimation.isCssAnimationSupported = isCssAnimationSupported;
|
4053 |
|
4054 | exports.default = cssAnimation;
|
4055 |
|
4056 | /***/ }),
|
4057 | /* 58 */
|
4058 | /***/ (function(module, exports) {
|
4059 |
|
4060 | ;
|
4061 |
|
4062 | exports.__esModule = true;
|
4063 | var EVENT_NAME_MAP = {
|
4064 | transitionend: {
|
4065 | transition: 'transitionend',
|
4066 | WebkitTransition: 'webkitTransitionEnd',
|
4067 | MozTransition: 'mozTransitionEnd',
|
4068 | OTransition: 'oTransitionEnd',
|
4069 | msTransition: 'MSTransitionEnd'
|
4070 | },
|
4071 |
|
4072 | animationend: {
|
4073 | animation: 'animationend',
|
4074 | WebkitAnimation: 'webkitAnimationEnd',
|
4075 | MozAnimation: 'mozAnimationEnd',
|
4076 | OAnimation: 'oAnimationEnd',
|
4077 | msAnimation: 'MSAnimationEnd'
|
4078 | }
|
4079 | };
|
4080 |
|
4081 | var endEvents = [];
|
4082 |
|
4083 | function detectEvents() {
|
4084 | var testEl = document.createElement('div');
|
4085 | var style = testEl.style;
|
4086 |
|
4087 | if (!('AnimationEvent' in window)) {
|
4088 | delete EVENT_NAME_MAP.animationend.animation;
|
4089 | }
|
4090 |
|
4091 | if (!('TransitionEvent' in window)) {
|
4092 | delete EVENT_NAME_MAP.transitionend.transition;
|
4093 | }
|
4094 |
|
4095 | for (var baseEventName in EVENT_NAME_MAP) {
|
4096 | if (EVENT_NAME_MAP.hasOwnProperty(baseEventName)) {
|
4097 | var baseEvents = EVENT_NAME_MAP[baseEventName];
|
4098 | for (var styleName in baseEvents) {
|
4099 | if (styleName in style) {
|
4100 | endEvents.push(baseEvents[styleName]);
|
4101 | break;
|
4102 | }
|
4103 | }
|
4104 | }
|
4105 | }
|
4106 | }
|
4107 |
|
4108 | if (typeof window !== 'undefined' && typeof document !== 'undefined') {
|
4109 | detectEvents();
|
4110 | }
|
4111 |
|
4112 | function addEventListener(node, eventName, eventListener) {
|
4113 | node.addEventListener(eventName, eventListener, false);
|
4114 | }
|
4115 |
|
4116 | function removeEventListener(node, eventName, eventListener) {
|
4117 | node.removeEventListener(eventName, eventListener, false);
|
4118 | }
|
4119 |
|
4120 | var TransitionEvents = {
|
4121 | addEndEventListener: function addEndEventListener(node, eventListener) {
|
4122 | if (endEvents.length === 0) {
|
4123 | window.setTimeout(eventListener, 0);
|
4124 | return;
|
4125 | }
|
4126 | endEvents.forEach(function (endEvent) {
|
4127 | addEventListener(node, endEvent, eventListener);
|
4128 | });
|
4129 | },
|
4130 |
|
4131 |
|
4132 | endEvents: endEvents,
|
4133 |
|
4134 | removeEndEventListener: function removeEndEventListener(node, eventListener) {
|
4135 | if (endEvents.length === 0) {
|
4136 | return;
|
4137 | }
|
4138 | endEvents.forEach(function (endEvent) {
|
4139 | removeEventListener(node, endEvent, eventListener);
|
4140 | });
|
4141 | }
|
4142 | };
|
4143 |
|
4144 | exports.default = TransitionEvents;
|
4145 |
|
4146 | /***/ }),
|
4147 | /* 59 */
|
4148 | /***/ (function(module, exports, __webpack_require__) {
|
4149 |
|
4150 | /**
|
4151 | * Module dependencies.
|
4152 | */
|
4153 |
|
4154 | try {
|
4155 | var index = __webpack_require__(60);
|
4156 | } catch (err) {
|
4157 | var index = __webpack_require__(60);
|
4158 | }
|
4159 |
|
4160 | /**
|
4161 | * Whitespace regexp.
|
4162 | */
|
4163 |
|
4164 | var re = /\s+/;
|
4165 |
|
4166 | /**
|
4167 | * toString reference.
|
4168 | */
|
4169 |
|
4170 | var toString = Object.prototype.toString;
|
4171 |
|
4172 | /**
|
4173 | * Wrap `el` in a `ClassList`.
|
4174 | *
|
4175 | * @param {Element} el
|
4176 | * @return {ClassList}
|
4177 | * @api public
|
4178 | */
|
4179 |
|
4180 | module.exports = function(el){
|
4181 | return new ClassList(el);
|
4182 | };
|
4183 |
|
4184 | /**
|
4185 | * Initialize a new ClassList for `el`.
|
4186 | *
|
4187 | * @param {Element} el
|
4188 | * @api private
|
4189 | */
|
4190 |
|
4191 | function ClassList(el) {
|
4192 | if (!el || !el.nodeType) {
|
4193 | throw new Error('A DOM element reference is required');
|
4194 | }
|
4195 | this.el = el;
|
4196 | this.list = el.classList;
|
4197 | }
|
4198 |
|
4199 | /**
|
4200 | * Add class `name` if not already present.
|
4201 | *
|
4202 | * @param {String} name
|
4203 | * @return {ClassList}
|
4204 | * @api public
|
4205 | */
|
4206 |
|
4207 | ClassList.prototype.add = function(name){
|
4208 | // classList
|
4209 | if (this.list) {
|
4210 | this.list.add(name);
|
4211 | return this;
|
4212 | }
|
4213 |
|
4214 | // fallback
|
4215 | var arr = this.array();
|
4216 | var i = index(arr, name);
|
4217 | if (!~i) arr.push(name);
|
4218 | this.el.className = arr.join(' ');
|
4219 | return this;
|
4220 | };
|
4221 |
|
4222 | /**
|
4223 | * Remove class `name` when present, or
|
4224 | * pass a regular expression to remove
|
4225 | * any which match.
|
4226 | *
|
4227 | * @param {String|RegExp} name
|
4228 | * @return {ClassList}
|
4229 | * @api public
|
4230 | */
|
4231 |
|
4232 | ClassList.prototype.remove = function(name){
|
4233 | if ('[object RegExp]' == toString.call(name)) {
|
4234 | return this.removeMatching(name);
|
4235 | }
|
4236 |
|
4237 | // classList
|
4238 | if (this.list) {
|
4239 | this.list.remove(name);
|
4240 | return this;
|
4241 | }
|
4242 |
|
4243 | // fallback
|
4244 | var arr = this.array();
|
4245 | var i = index(arr, name);
|
4246 | if (~i) arr.splice(i, 1);
|
4247 | this.el.className = arr.join(' ');
|
4248 | return this;
|
4249 | };
|
4250 |
|
4251 | /**
|
4252 | * Remove all classes matching `re`.
|
4253 | *
|
4254 | * @param {RegExp} re
|
4255 | * @return {ClassList}
|
4256 | * @api private
|
4257 | */
|
4258 |
|
4259 | ClassList.prototype.removeMatching = function(re){
|
4260 | var arr = this.array();
|
4261 | for (var i = 0; i < arr.length; i++) {
|
4262 | if (re.test(arr[i])) {
|
4263 | this.remove(arr[i]);
|
4264 | }
|
4265 | }
|
4266 | return this;
|
4267 | };
|
4268 |
|
4269 | /**
|
4270 | * Toggle class `name`, can force state via `force`.
|
4271 | *
|
4272 | * For browsers that support classList, but do not support `force` yet,
|
4273 | * the mistake will be detected and corrected.
|
4274 | *
|
4275 | * @param {String} name
|
4276 | * @param {Boolean} force
|
4277 | * @return {ClassList}
|
4278 | * @api public
|
4279 | */
|
4280 |
|
4281 | ClassList.prototype.toggle = function(name, force){
|
4282 | // classList
|
4283 | if (this.list) {
|
4284 | if ("undefined" !== typeof force) {
|
4285 | if (force !== this.list.toggle(name, force)) {
|
4286 | this.list.toggle(name); // toggle again to correct
|
4287 | }
|
4288 | } else {
|
4289 | this.list.toggle(name);
|
4290 | }
|
4291 | return this;
|
4292 | }
|
4293 |
|
4294 | // fallback
|
4295 | if ("undefined" !== typeof force) {
|
4296 | if (!force) {
|
4297 | this.remove(name);
|
4298 | } else {
|
4299 | this.add(name);
|
4300 | }
|
4301 | } else {
|
4302 | if (this.has(name)) {
|
4303 | this.remove(name);
|
4304 | } else {
|
4305 | this.add(name);
|
4306 | }
|
4307 | }
|
4308 |
|
4309 | return this;
|
4310 | };
|
4311 |
|
4312 | /**
|
4313 | * Return an array of classes.
|
4314 | *
|
4315 | * @return {Array}
|
4316 | * @api public
|
4317 | */
|
4318 |
|
4319 | ClassList.prototype.array = function(){
|
4320 | var className = this.el.getAttribute('class') || '';
|
4321 | var str = className.replace(/^\s+|\s+$/g, '');
|
4322 | var arr = str.split(re);
|
4323 | if ('' === arr[0]) arr.shift();
|
4324 | return arr;
|
4325 | };
|
4326 |
|
4327 | /**
|
4328 | * Check if class `name` is present.
|
4329 | *
|
4330 | * @param {String} name
|
4331 | * @return {ClassList}
|
4332 | * @api public
|
4333 | */
|
4334 |
|
4335 | ClassList.prototype.has =
|
4336 | ClassList.prototype.contains = function(name){
|
4337 | return this.list
|
4338 | ? this.list.contains(name)
|
4339 | : !! ~index(this.array(), name);
|
4340 | };
|
4341 |
|
4342 |
|
4343 | /***/ }),
|
4344 | /* 60 */
|
4345 | /***/ (function(module, exports) {
|
4346 |
|
4347 | module.exports = function(arr, obj){
|
4348 | if (arr.indexOf) return arr.indexOf(obj);
|
4349 | for (var i = 0; i < arr.length; ++i) {
|
4350 | if (arr[i] === obj) return i;
|
4351 | }
|
4352 | return -1;
|
4353 | };
|
4354 |
|
4355 | /***/ }),
|
4356 | /* 61 */
|
4357 | /***/ (function(module, exports, __webpack_require__) {
|
4358 |
|
4359 | ;
|
4360 |
|
4361 | exports.__esModule = true;
|
4362 | exports.default = toArray;
|
4363 |
|
4364 | var _react = __webpack_require__(4);
|
4365 |
|
4366 | var _react2 = _interopRequireDefault(_react);
|
4367 |
|
4368 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
4369 |
|
4370 | function toArray(children) {
|
4371 | var ret = [];
|
4372 | _react2.default.Children.forEach(children, function (c) {
|
4373 | ret.push(c);
|
4374 | });
|
4375 | return ret;
|
4376 | }
|
4377 |
|
4378 | /***/ }),
|
4379 | /* 62 */
|
4380 | /***/ (function(module, exports, __webpack_require__) {
|
4381 |
|
4382 | ;
|
4383 |
|
4384 | exports.__esModule = true;
|
4385 |
|
4386 | var _react = __webpack_require__(4);
|
4387 |
|
4388 | var _react2 = _interopRequireDefault(_react);
|
4389 |
|
4390 | var _reactDom = __webpack_require__(11);
|
4391 |
|
4392 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
4393 |
|
4394 | var _domAlign = __webpack_require__(63);
|
4395 |
|
4396 | var _domAlign2 = _interopRequireDefault(_domAlign);
|
4397 |
|
4398 | var _addEventListener = __webpack_require__(52);
|
4399 |
|
4400 | var _addEventListener2 = _interopRequireDefault(_addEventListener);
|
4401 |
|
4402 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
4403 |
|
4404 | //import isWindow from './isWindow';
|
4405 |
|
4406 | function isWindow(obj) {
|
4407 | /* eslint no-eq-null: 0 */
|
4408 | /* eslint eqeqeq: 0 */
|
4409 | return obj != null && obj == obj.window;
|
4410 | }
|
4411 |
|
4412 | function buffer(fn, ms) {
|
4413 | var timer = void 0;
|
4414 |
|
4415 | function clear() {
|
4416 | if (timer) {
|
4417 | clearTimeout(timer);
|
4418 | timer = null;
|
4419 | }
|
4420 | }
|
4421 |
|
4422 | function bufferFn() {
|
4423 | clear();
|
4424 | timer = setTimeout(fn, ms);
|
4425 | }
|
4426 |
|
4427 | bufferFn.clear = clear;
|
4428 |
|
4429 | return bufferFn;
|
4430 | }
|
4431 |
|
4432 | var Align = _react2.default.createClass({
|
4433 | propTypes: {
|
4434 | childrenProps: _react.PropTypes.object,
|
4435 | align: _react.PropTypes.object.isRequired,
|
4436 | target: _react.PropTypes.func,
|
4437 | onAlign: _react.PropTypes.func,
|
4438 | monitorBufferTime: _react.PropTypes.number,
|
4439 | monitorWindowResize: _react.PropTypes.bool,
|
4440 | disabled: _react.PropTypes.bool,
|
4441 | children: _react.PropTypes.any
|
4442 | },
|
4443 |
|
4444 | getDefaultProps: function getDefaultProps() {
|
4445 | return {
|
4446 | target: function target() {
|
4447 | return window;
|
4448 | },
|
4449 | onAlign: function onAlign() {},
|
4450 |
|
4451 | monitorBufferTime: 50,
|
4452 | monitorWindowResize: false,
|
4453 | disabled: false
|
4454 | };
|
4455 | },
|
4456 | componentDidMount: function componentDidMount() {
|
4457 | var props = this.props;
|
4458 | // if parent ref not attached .... use document.getElementById
|
4459 | this.forceAlign();
|
4460 | if (!props.disabled && props.monitorWindowResize) {
|
4461 | this.startMonitorWindowResize();
|
4462 | }
|
4463 | },
|
4464 | componentDidUpdate: function componentDidUpdate(prevProps) {
|
4465 | var reAlign = false;
|
4466 | var props = this.props;
|
4467 |
|
4468 | if (!props.disabled) {
|
4469 | if (prevProps.disabled || prevProps.align !== props.align) {
|
4470 | reAlign = true;
|
4471 | } else {
|
4472 | var lastTarget = prevProps.target();
|
4473 | var currentTarget = props.target();
|
4474 | if (isWindow(lastTarget) && isWindow(currentTarget)) {
|
4475 | reAlign = false;
|
4476 | } else if (lastTarget !== currentTarget) {
|
4477 | reAlign = true;
|
4478 | }
|
4479 | }
|
4480 | }
|
4481 |
|
4482 | if (reAlign) {
|
4483 | this.forceAlign();
|
4484 | }
|
4485 |
|
4486 | if (props.monitorWindowResize && !props.disabled) {
|
4487 | this.startMonitorWindowResize();
|
4488 | } else {
|
4489 | this.stopMonitorWindowResize();
|
4490 | }
|
4491 | },
|
4492 | componentWillUnmount: function componentWillUnmount() {
|
4493 | this.stopMonitorWindowResize();
|
4494 | },
|
4495 | startMonitorWindowResize: function startMonitorWindowResize() {
|
4496 | if (!this.resizeHandler) {
|
4497 | this.bufferMonitor = buffer(this.forceAlign, this.props.monitorBufferTime);
|
4498 | this.resizeHandler = (0, _addEventListener2.default)(window, 'resize', this.bufferMonitor);
|
4499 | }
|
4500 | },
|
4501 | stopMonitorWindowResize: function stopMonitorWindowResize() {
|
4502 | if (this.resizeHandler) {
|
4503 | this.bufferMonitor.clear();
|
4504 | this.resizeHandler.remove();
|
4505 | this.resizeHandler = null;
|
4506 | }
|
4507 | },
|
4508 | forceAlign: function forceAlign() {
|
4509 | var props = this.props;
|
4510 | if (!props.disabled) {
|
4511 | var source = _reactDom2.default.findDOMNode(this);
|
4512 | props.onAlign(source, (0, _domAlign2.default)(source, props.target(), props.align));
|
4513 | }
|
4514 | },
|
4515 | render: function render() {
|
4516 | var _props = this.props,
|
4517 | childrenProps = _props.childrenProps,
|
4518 | children = _props.children;
|
4519 |
|
4520 | var child = _react2.default.Children.only(children);
|
4521 | if (childrenProps) {
|
4522 | var newProps = {};
|
4523 | for (var prop in childrenProps) {
|
4524 | if (childrenProps.hasOwnProperty(prop)) {
|
4525 | newProps[prop] = this.props[childrenProps[prop]];
|
4526 | }
|
4527 | }
|
4528 | return _react2.default.cloneElement(child, newProps);
|
4529 | }
|
4530 | return child;
|
4531 | }
|
4532 | });
|
4533 |
|
4534 | exports.default = Align;
|
4535 |
|
4536 | /***/ }),
|
4537 | /* 63 */
|
4538 | /***/ (function(module, exports, __webpack_require__) {
|
4539 |
|
4540 | ;
|
4541 |
|
4542 | Object.defineProperty(exports, "__esModule", {
|
4543 | value: true
|
4544 | });
|
4545 |
|
4546 | var _utils = __webpack_require__(64);
|
4547 |
|
4548 | var _utils2 = _interopRequireDefault(_utils);
|
4549 |
|
4550 | var _getOffsetParent = __webpack_require__(66);
|
4551 |
|
4552 | var _getOffsetParent2 = _interopRequireDefault(_getOffsetParent);
|
4553 |
|
4554 | var _getVisibleRectForElement = __webpack_require__(67);
|
4555 |
|
4556 | var _getVisibleRectForElement2 = _interopRequireDefault(_getVisibleRectForElement);
|
4557 |
|
4558 | var _adjustForViewport = __webpack_require__(68);
|
4559 |
|
4560 | var _adjustForViewport2 = _interopRequireDefault(_adjustForViewport);
|
4561 |
|
4562 | var _getRegion = __webpack_require__(69);
|
4563 |
|
4564 | var _getRegion2 = _interopRequireDefault(_getRegion);
|
4565 |
|
4566 | var _getElFuturePos = __webpack_require__(70);
|
4567 |
|
4568 | var _getElFuturePos2 = _interopRequireDefault(_getElFuturePos);
|
4569 |
|
4570 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
4571 |
|
4572 | // http://yiminghe.iteye.com/blog/1124720
|
4573 |
|
4574 | /**
|
4575 | * align dom node flexibly
|
4576 | * @author yiminghe@gmail.com
|
4577 | */
|
4578 |
|
4579 | function isFailX(elFuturePos, elRegion, visibleRect) {
|
4580 | return elFuturePos.left < visibleRect.left || elFuturePos.left + elRegion.width > visibleRect.right;
|
4581 | }
|
4582 |
|
4583 | function isFailY(elFuturePos, elRegion, visibleRect) {
|
4584 | return elFuturePos.top < visibleRect.top || elFuturePos.top + elRegion.height > visibleRect.bottom;
|
4585 | }
|
4586 |
|
4587 | function isCompleteFailX(elFuturePos, elRegion, visibleRect) {
|
4588 | return elFuturePos.left > visibleRect.right || elFuturePos.left + elRegion.width < visibleRect.left;
|
4589 | }
|
4590 |
|
4591 | function isCompleteFailY(elFuturePos, elRegion, visibleRect) {
|
4592 | return elFuturePos.top > visibleRect.bottom || elFuturePos.top + elRegion.height < visibleRect.top;
|
4593 | }
|
4594 |
|
4595 | function flip(points, reg, map) {
|
4596 | var ret = [];
|
4597 | _utils2["default"].each(points, function (p) {
|
4598 | ret.push(p.replace(reg, function (m) {
|
4599 | return map[m];
|
4600 | }));
|
4601 | });
|
4602 | return ret;
|
4603 | }
|
4604 |
|
4605 | function flipOffset(offset, index) {
|
4606 | offset[index] = -offset[index];
|
4607 | return offset;
|
4608 | }
|
4609 |
|
4610 | function convertOffset(str, offsetLen) {
|
4611 | var n = void 0;
|
4612 | if (/%$/.test(str)) {
|
4613 | n = parseInt(str.substring(0, str.length - 1), 10) / 100 * offsetLen;
|
4614 | } else {
|
4615 | n = parseInt(str, 10);
|
4616 | }
|
4617 | return n || 0;
|
4618 | }
|
4619 |
|
4620 | function normalizeOffset(offset, el) {
|
4621 | offset[0] = convertOffset(offset[0], el.width);
|
4622 | offset[1] = convertOffset(offset[1], el.height);
|
4623 | }
|
4624 |
|
4625 | function domAlign(el, refNode, align) {
|
4626 | var points = align.points;
|
4627 | var offset = align.offset || [0, 0];
|
4628 | var targetOffset = align.targetOffset || [0, 0];
|
4629 | var overflow = align.overflow;
|
4630 | var target = align.target || refNode;
|
4631 | var source = align.source || el;
|
4632 | offset = [].concat(offset);
|
4633 | targetOffset = [].concat(targetOffset);
|
4634 | overflow = overflow || {};
|
4635 | var newOverflowCfg = {};
|
4636 |
|
4637 | var fail = 0;
|
4638 | // 当前节点可以被放置的显示区域
|
4639 | var visibleRect = (0, _getVisibleRectForElement2["default"])(source);
|
4640 | // 当前节点所占的区域, left/top/width/height
|
4641 | var elRegion = (0, _getRegion2["default"])(source);
|
4642 | // 参照节点所占的区域, left/top/width/height
|
4643 | var refNodeRegion = (0, _getRegion2["default"])(target);
|
4644 | // 将 offset 转换成数值,支持百分比
|
4645 | normalizeOffset(offset, elRegion);
|
4646 | normalizeOffset(targetOffset, refNodeRegion);
|
4647 | // 当前节点将要被放置的位置
|
4648 | var elFuturePos = (0, _getElFuturePos2["default"])(elRegion, refNodeRegion, points, offset, targetOffset);
|
4649 | // 当前节点将要所处的区域
|
4650 | var newElRegion = _utils2["default"].merge(elRegion, elFuturePos);
|
4651 |
|
4652 | // 如果可视区域不能完全放置当前节点时允许调整
|
4653 | if (visibleRect && (overflow.adjustX || overflow.adjustY)) {
|
4654 | if (overflow.adjustX) {
|
4655 | // 如果横向不能放下
|
4656 | if (isFailX(elFuturePos, elRegion, visibleRect)) {
|
4657 | // 对齐位置反下
|
4658 | var newPoints = flip(points, /[lr]/ig, {
|
4659 | l: 'r',
|
4660 | r: 'l'
|
4661 | });
|
4662 | // 偏移量也反下
|
4663 | var newOffset = flipOffset(offset, 0);
|
4664 | var newTargetOffset = flipOffset(targetOffset, 0);
|
4665 | var newElFuturePos = (0, _getElFuturePos2["default"])(elRegion, refNodeRegion, newPoints, newOffset, newTargetOffset);
|
4666 | if (!isCompleteFailX(newElFuturePos, elRegion, visibleRect)) {
|
4667 | fail = 1;
|
4668 | points = newPoints;
|
4669 | offset = newOffset;
|
4670 | targetOffset = newTargetOffset;
|
4671 | }
|
4672 | }
|
4673 | }
|
4674 |
|
4675 | if (overflow.adjustY) {
|
4676 | // 如果纵向不能放下
|
4677 | if (isFailY(elFuturePos, elRegion, visibleRect)) {
|
4678 | // 对齐位置反下
|
4679 | var _newPoints = flip(points, /[tb]/ig, {
|
4680 | t: 'b',
|
4681 | b: 't'
|
4682 | });
|
4683 | // 偏移量也反下
|
4684 | var _newOffset = flipOffset(offset, 1);
|
4685 | var _newTargetOffset = flipOffset(targetOffset, 1);
|
4686 | var _newElFuturePos = (0, _getElFuturePos2["default"])(elRegion, refNodeRegion, _newPoints, _newOffset, _newTargetOffset);
|
4687 | if (!isCompleteFailY(_newElFuturePos, elRegion, visibleRect)) {
|
4688 | fail = 1;
|
4689 | points = _newPoints;
|
4690 | offset = _newOffset;
|
4691 | targetOffset = _newTargetOffset;
|
4692 | }
|
4693 | }
|
4694 | }
|
4695 |
|
4696 | // 如果失败,重新计算当前节点将要被放置的位置
|
4697 | if (fail) {
|
4698 | elFuturePos = (0, _getElFuturePos2["default"])(elRegion, refNodeRegion, points, offset, targetOffset);
|
4699 | _utils2["default"].mix(newElRegion, elFuturePos);
|
4700 | }
|
4701 |
|
4702 | // 检查反下后的位置是否可以放下了
|
4703 | // 如果仍然放不下只有指定了可以调整当前方向才调整
|
4704 | newOverflowCfg.adjustX = overflow.adjustX && isFailX(elFuturePos, elRegion, visibleRect);
|
4705 |
|
4706 | newOverflowCfg.adjustY = overflow.adjustY && isFailY(elFuturePos, elRegion, visibleRect);
|
4707 |
|
4708 | // 确实要调整,甚至可能会调整高度宽度
|
4709 | if (newOverflowCfg.adjustX || newOverflowCfg.adjustY) {
|
4710 | newElRegion = (0, _adjustForViewport2["default"])(elFuturePos, elRegion, visibleRect, newOverflowCfg);
|
4711 | }
|
4712 | }
|
4713 |
|
4714 | // need judge to in case set fixed with in css on height auto element
|
4715 | if (newElRegion.width !== elRegion.width) {
|
4716 | _utils2["default"].css(source, 'width', _utils2["default"].width(source) + newElRegion.width - elRegion.width);
|
4717 | }
|
4718 |
|
4719 | if (newElRegion.height !== elRegion.height) {
|
4720 | _utils2["default"].css(source, 'height', _utils2["default"].height(source) + newElRegion.height - elRegion.height);
|
4721 | }
|
4722 |
|
4723 | // https://github.com/kissyteam/kissy/issues/190
|
4724 | // 相对于屏幕位置没变,而 left/top 变了
|
4725 | // 例如 <div 'relative'><el absolute></div>
|
4726 | _utils2["default"].offset(source, {
|
4727 | left: newElRegion.left,
|
4728 | top: newElRegion.top
|
4729 | }, {
|
4730 | useCssRight: align.useCssRight,
|
4731 | useCssBottom: align.useCssBottom,
|
4732 | useCssTransform: align.useCssTransform
|
4733 | });
|
4734 |
|
4735 | return {
|
4736 | points: points,
|
4737 | offset: offset,
|
4738 | targetOffset: targetOffset,
|
4739 | overflow: newOverflowCfg
|
4740 | };
|
4741 | }
|
4742 |
|
4743 | domAlign.__getOffsetParent = _getOffsetParent2["default"];
|
4744 |
|
4745 | domAlign.__getVisibleRectForElement = _getVisibleRectForElement2["default"];
|
4746 |
|
4747 | exports["default"] = domAlign;
|
4748 | /**
|
4749 | * 2012-04-26 yiminghe@gmail.com
|
4750 | * - 优化智能对齐算法
|
4751 | * - 慎用 resizeXX
|
4752 | *
|
4753 | * 2011-07-13 yiminghe@gmail.com note:
|
4754 | * - 增加智能对齐,以及大小调整选项
|
4755 | **/
|
4756 |
|
4757 | module.exports = exports['default'];
|
4758 |
|
4759 | /***/ }),
|
4760 | /* 64 */
|
4761 | /***/ (function(module, exports, __webpack_require__) {
|
4762 |
|
4763 | ;
|
4764 |
|
4765 | Object.defineProperty(exports, "__esModule", {
|
4766 | value: true
|
4767 | });
|
4768 |
|
4769 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
4770 |
|
4771 | var _propertyUtils = __webpack_require__(65);
|
4772 |
|
4773 | var RE_NUM = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source;
|
4774 |
|
4775 | var getComputedStyleX = void 0;
|
4776 |
|
4777 | function force(x, y) {
|
4778 | return x + y;
|
4779 | }
|
4780 |
|
4781 | function css(el, name, v) {
|
4782 | var value = v;
|
4783 | if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {
|
4784 | for (var i in name) {
|
4785 | if (name.hasOwnProperty(i)) {
|
4786 | css(el, i, name[i]);
|
4787 | }
|
4788 | }
|
4789 | return undefined;
|
4790 | }
|
4791 | if (typeof value !== 'undefined') {
|
4792 | if (typeof value === 'number') {
|
4793 | value = value + 'px';
|
4794 | }
|
4795 | el.style[name] = value;
|
4796 | return undefined;
|
4797 | }
|
4798 | return getComputedStyleX(el, name);
|
4799 | }
|
4800 |
|
4801 | function getClientPosition(elem) {
|
4802 | var box = void 0;
|
4803 | var x = void 0;
|
4804 | var y = void 0;
|
4805 | var doc = elem.ownerDocument;
|
4806 | var body = doc.body;
|
4807 | var docElem = doc && doc.documentElement;
|
4808 | // 根据 GBS 最新数据,A-Grade Browsers 都已支持 getBoundingClientRect 方法,不用再考虑传统的实现方式
|
4809 | box = elem.getBoundingClientRect();
|
4810 |
|
4811 | // 注:jQuery 还考虑减去 docElem.clientLeft/clientTop
|
4812 | // 但测试发现,这样反而会导致当 html 和 body 有边距/边框样式时,获取的值不正确
|
4813 | // 此外,ie6 会忽略 html 的 margin 值,幸运地是没有谁会去设置 html 的 margin
|
4814 |
|
4815 | x = box.left;
|
4816 | y = box.top;
|
4817 |
|
4818 | // In IE, most of the time, 2 extra pixels are added to the top and left
|
4819 | // due to the implicit 2-pixel inset border. In IE6/7 quirks mode and
|
4820 | // IE6 standards mode, this border can be overridden by setting the
|
4821 | // document element's border to zero -- thus, we cannot rely on the
|
4822 | // offset always being 2 pixels.
|
4823 |
|
4824 | // In quirks mode, the offset can be determined by querying the body's
|
4825 | // clientLeft/clientTop, but in standards mode, it is found by querying
|
4826 | // the document element's clientLeft/clientTop. Since we already called
|
4827 | // getClientBoundingRect we have already forced a reflow, so it is not
|
4828 | // too expensive just to query them all.
|
4829 |
|
4830 | // ie 下应该减去窗口的边框吧,毕竟默认 absolute 都是相对窗口定位的
|
4831 | // 窗口边框标准是设 documentElement ,quirks 时设置 body
|
4832 | // 最好禁止在 body 和 html 上边框 ,但 ie < 9 html 默认有 2px ,减去
|
4833 | // 但是非 ie 不可能设置窗口边框,body html 也不是窗口 ,ie 可以通过 html,body 设置
|
4834 | // 标准 ie 下 docElem.clientTop 就是 border-top
|
4835 | // ie7 html 即窗口边框改变不了。永远为 2
|
4836 | // 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框,即使设了 border-top 也为 0
|
4837 |
|
4838 | x -= docElem.clientLeft || body.clientLeft || 0;
|
4839 | y -= docElem.clientTop || body.clientTop || 0;
|
4840 |
|
4841 | return {
|
4842 | left: x,
|
4843 | top: y
|
4844 | };
|
4845 | }
|
4846 |
|
4847 | function getScroll(w, top) {
|
4848 | var ret = w['page' + (top ? 'Y' : 'X') + 'Offset'];
|
4849 | var method = 'scroll' + (top ? 'Top' : 'Left');
|
4850 | if (typeof ret !== 'number') {
|
4851 | var d = w.document;
|
4852 | // ie6,7,8 standard mode
|
4853 | ret = d.documentElement[method];
|
4854 | if (typeof ret !== 'number') {
|
4855 | // quirks mode
|
4856 | ret = d.body[method];
|
4857 | }
|
4858 | }
|
4859 | return ret;
|
4860 | }
|
4861 |
|
4862 | function getScrollLeft(w) {
|
4863 | return getScroll(w);
|
4864 | }
|
4865 |
|
4866 | function getScrollTop(w) {
|
4867 | return getScroll(w, true);
|
4868 | }
|
4869 |
|
4870 | function getOffset(el) {
|
4871 | var pos = getClientPosition(el);
|
4872 | var doc = el.ownerDocument;
|
4873 | var w = doc.defaultView || doc.parentWindow;
|
4874 | pos.left += getScrollLeft(w);
|
4875 | pos.top += getScrollTop(w);
|
4876 | return pos;
|
4877 | }
|
4878 | function _getComputedStyle(elem, name, cs) {
|
4879 | var computedStyle = cs;
|
4880 | var val = '';
|
4881 | var d = elem.ownerDocument;
|
4882 | computedStyle = computedStyle || d.defaultView.getComputedStyle(elem, null);
|
4883 |
|
4884 | // https://github.com/kissyteam/kissy/issues/61
|
4885 | if (computedStyle) {
|
4886 | val = computedStyle.getPropertyValue(name) || computedStyle[name];
|
4887 | }
|
4888 |
|
4889 | return val;
|
4890 | }
|
4891 |
|
4892 | var _RE_NUM_NO_PX = new RegExp('^(' + RE_NUM + ')(?!px)[a-z%]+$', 'i');
|
4893 | var RE_POS = /^(top|right|bottom|left)$/;
|
4894 | var CURRENT_STYLE = 'currentStyle';
|
4895 | var RUNTIME_STYLE = 'runtimeStyle';
|
4896 | var LEFT = 'left';
|
4897 | var PX = 'px';
|
4898 |
|
4899 | function _getComputedStyleIE(elem, name) {
|
4900 | // currentStyle maybe null
|
4901 | // http://msdn.microsoft.com/en-us/library/ms535231.aspx
|
4902 | var ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name];
|
4903 |
|
4904 | // 当 width/height 设置为百分比时,通过 pixelLeft 方式转换的 width/height 值
|
4905 | // 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19
|
4906 | // 在 ie 下不对,需要直接用 offset 方式
|
4907 | // borderWidth 等值也有问题,但考虑到 borderWidth 设为百分比的概率很小,这里就不考虑了
|
4908 |
|
4909 | // From the awesome hack by Dean Edwards
|
4910 | // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
|
4911 | // If we're not dealing with a regular pixel number
|
4912 | // but a number that has a weird ending, we need to convert it to pixels
|
4913 | // exclude left right for relativity
|
4914 | if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) {
|
4915 | // Remember the original values
|
4916 | var style = elem.style;
|
4917 | var left = style[LEFT];
|
4918 | var rsLeft = elem[RUNTIME_STYLE][LEFT];
|
4919 |
|
4920 | // prevent flashing of content
|
4921 | elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT];
|
4922 |
|
4923 | // Put in the new values to get a computed value out
|
4924 | style[LEFT] = name === 'fontSize' ? '1em' : ret || 0;
|
4925 | ret = style.pixelLeft + PX;
|
4926 |
|
4927 | // Revert the changed values
|
4928 | style[LEFT] = left;
|
4929 |
|
4930 | elem[RUNTIME_STYLE][LEFT] = rsLeft;
|
4931 | }
|
4932 | return ret === '' ? 'auto' : ret;
|
4933 | }
|
4934 |
|
4935 | if (typeof window !== 'undefined') {
|
4936 | getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE;
|
4937 | }
|
4938 |
|
4939 | function getOffsetDirection(dir, option) {
|
4940 | if (dir === 'left') {
|
4941 | return option.useCssRight ? 'right' : dir;
|
4942 | }
|
4943 | return option.useCssBottom ? 'bottom' : dir;
|
4944 | }
|
4945 |
|
4946 | function oppositeOffsetDirection(dir) {
|
4947 | if (dir === 'left') {
|
4948 | return 'right';
|
4949 | } else if (dir === 'right') {
|
4950 | return 'left';
|
4951 | } else if (dir === 'top') {
|
4952 | return 'bottom';
|
4953 | } else if (dir === 'bottom') {
|
4954 | return 'top';
|
4955 | }
|
4956 | }
|
4957 |
|
4958 | // 设置 elem 相对 elem.ownerDocument 的坐标
|
4959 | function setLeftTop(elem, offset, option) {
|
4960 | // set position first, in-case top/left are set even on static elem
|
4961 | if (css(elem, 'position') === 'static') {
|
4962 | elem.style.position = 'relative';
|
4963 | }
|
4964 | var presetH = -999;
|
4965 | var presetV = -999;
|
4966 | var horizontalProperty = getOffsetDirection('left', option);
|
4967 | var verticalProperty = getOffsetDirection('top', option);
|
4968 | var oppositeHorizontalProperty = oppositeOffsetDirection(horizontalProperty);
|
4969 | var oppositeVerticalProperty = oppositeOffsetDirection(verticalProperty);
|
4970 |
|
4971 | if (horizontalProperty !== 'left') {
|
4972 | presetH = 999;
|
4973 | }
|
4974 |
|
4975 | if (verticalProperty !== 'top') {
|
4976 | presetV = 999;
|
4977 | }
|
4978 | var originalTransition = '';
|
4979 | var originalOffset = getOffset(elem);
|
4980 | if ('left' in offset || 'top' in offset) {
|
4981 | originalTransition = (0, _propertyUtils.getTransitionProperty)(elem) || '';
|
4982 | (0, _propertyUtils.setTransitionProperty)(elem, 'none');
|
4983 | }
|
4984 | if ('left' in offset) {
|
4985 | elem.style[oppositeHorizontalProperty] = '';
|
4986 | elem.style[horizontalProperty] = presetH + 'px';
|
4987 | }
|
4988 | if ('top' in offset) {
|
4989 | elem.style[oppositeVerticalProperty] = '';
|
4990 | elem.style[verticalProperty] = presetV + 'px';
|
4991 | }
|
4992 | var old = getOffset(elem);
|
4993 | var originalStyle = {};
|
4994 | for (var key in offset) {
|
4995 | if (offset.hasOwnProperty(key)) {
|
4996 | var dir = getOffsetDirection(key, option);
|
4997 | var preset = key === 'left' ? presetH : presetV;
|
4998 | var off = originalOffset[key] - old[key];
|
4999 | if (dir === key) {
|
5000 | originalStyle[dir] = preset + off;
|
5001 | } else {
|
5002 | originalStyle[dir] = preset - off;
|
5003 | }
|
5004 | }
|
5005 | }
|
5006 | css(elem, originalStyle);
|
5007 | // force relayout
|
5008 | force(elem.offsetTop, elem.offsetLeft);
|
5009 | if ('left' in offset || 'top' in offset) {
|
5010 | (0, _propertyUtils.setTransitionProperty)(elem, originalTransition);
|
5011 | }
|
5012 | var ret = {};
|
5013 | for (var _key in offset) {
|
5014 | if (offset.hasOwnProperty(_key)) {
|
5015 | var _dir = getOffsetDirection(_key, option);
|
5016 | var _off = offset[_key] - originalOffset[_key];
|
5017 | if (_key === _dir) {
|
5018 | ret[_dir] = originalStyle[_dir] + _off;
|
5019 | } else {
|
5020 | ret[_dir] = originalStyle[_dir] - _off;
|
5021 | }
|
5022 | }
|
5023 | }
|
5024 | css(elem, ret);
|
5025 | }
|
5026 |
|
5027 | function setTransform(elem, offset) {
|
5028 | var originalOffset = getOffset(elem);
|
5029 | var originalXY = (0, _propertyUtils.getTransformXY)(elem);
|
5030 | var resultXY = { x: originalXY.x, y: originalXY.y };
|
5031 | if ('left' in offset) {
|
5032 | resultXY.x = originalXY.x + offset.left - originalOffset.left;
|
5033 | }
|
5034 | if ('top' in offset) {
|
5035 | resultXY.y = originalXY.y + offset.top - originalOffset.top;
|
5036 | }
|
5037 | (0, _propertyUtils.setTransformXY)(elem, resultXY);
|
5038 | }
|
5039 |
|
5040 | function setOffset(elem, offset, option) {
|
5041 | if (option.useCssRight || option.useCssBottom) {
|
5042 | setLeftTop(elem, offset, option);
|
5043 | } else if (option.useCssTransform && (0, _propertyUtils.getTransformName)() in document.body.style) {
|
5044 | setTransform(elem, offset, option);
|
5045 | } else {
|
5046 | setLeftTop(elem, offset, option);
|
5047 | }
|
5048 | }
|
5049 |
|
5050 | function each(arr, fn) {
|
5051 | for (var i = 0; i < arr.length; i++) {
|
5052 | fn(arr[i]);
|
5053 | }
|
5054 | }
|
5055 |
|
5056 | function isBorderBoxFn(elem) {
|
5057 | return getComputedStyleX(elem, 'boxSizing') === 'border-box';
|
5058 | }
|
5059 |
|
5060 | var BOX_MODELS = ['margin', 'border', 'padding'];
|
5061 | var CONTENT_INDEX = -1;
|
5062 | var PADDING_INDEX = 2;
|
5063 | var BORDER_INDEX = 1;
|
5064 | var MARGIN_INDEX = 0;
|
5065 |
|
5066 | function swap(elem, options, callback) {
|
5067 | var old = {};
|
5068 | var style = elem.style;
|
5069 | var name = void 0;
|
5070 |
|
5071 | // Remember the old values, and insert the new ones
|
5072 | for (name in options) {
|
5073 | if (options.hasOwnProperty(name)) {
|
5074 | old[name] = style[name];
|
5075 | style[name] = options[name];
|
5076 | }
|
5077 | }
|
5078 |
|
5079 | callback.call(elem);
|
5080 |
|
5081 | // Revert the old values
|
5082 | for (name in options) {
|
5083 | if (options.hasOwnProperty(name)) {
|
5084 | style[name] = old[name];
|
5085 | }
|
5086 | }
|
5087 | }
|
5088 |
|
5089 | function getPBMWidth(elem, props, which) {
|
5090 | var value = 0;
|
5091 | var prop = void 0;
|
5092 | var j = void 0;
|
5093 | var i = void 0;
|
5094 | for (j = 0; j < props.length; j++) {
|
5095 | prop = props[j];
|
5096 | if (prop) {
|
5097 | for (i = 0; i < which.length; i++) {
|
5098 | var cssProp = void 0;
|
5099 | if (prop === 'border') {
|
5100 | cssProp = '' + prop + which[i] + 'Width';
|
5101 | } else {
|
5102 | cssProp = prop + which[i];
|
5103 | }
|
5104 | value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;
|
5105 | }
|
5106 | }
|
5107 | }
|
5108 | return value;
|
5109 | }
|
5110 |
|
5111 | /**
|
5112 | * A crude way of determining if an object is a window
|
5113 | * @member util
|
5114 | */
|
5115 | function isWindow(obj) {
|
5116 | // must use == for ie8
|
5117 | /* eslint eqeqeq:0 */
|
5118 | return obj !== null && obj !== undefined && obj == obj.window;
|
5119 | }
|
5120 |
|
5121 | var domUtils = {};
|
5122 |
|
5123 | each(['Width', 'Height'], function (name) {
|
5124 | domUtils['doc' + name] = function (refWin) {
|
5125 | var d = refWin.document;
|
5126 | return Math.max(
|
5127 | // firefox chrome documentElement.scrollHeight< body.scrollHeight
|
5128 | // ie standard mode : documentElement.scrollHeight> body.scrollHeight
|
5129 | d.documentElement['scroll' + name],
|
5130 | // quirks : documentElement.scrollHeight 最大等于可视窗口多一点?
|
5131 | d.body['scroll' + name], domUtils['viewport' + name](d));
|
5132 | };
|
5133 |
|
5134 | domUtils['viewport' + name] = function (win) {
|
5135 | // pc browser includes scrollbar in window.innerWidth
|
5136 | var prop = 'client' + name;
|
5137 | var doc = win.document;
|
5138 | var body = doc.body;
|
5139 | var documentElement = doc.documentElement;
|
5140 | var documentElementProp = documentElement[prop];
|
5141 | // 标准模式取 documentElement
|
5142 | // backcompat 取 body
|
5143 | return doc.compatMode === 'CSS1Compat' && documentElementProp || body && body[prop] || documentElementProp;
|
5144 | };
|
5145 | });
|
5146 |
|
5147 | /*
|
5148 | 得到元素的大小信息
|
5149 | @param elem
|
5150 | @param name
|
5151 | @param {String} [extra] 'padding' : (css width) + padding
|
5152 | 'border' : (css width) + padding + border
|
5153 | 'margin' : (css width) + padding + border + margin
|
5154 | */
|
5155 | function getWH(elem, name, ex) {
|
5156 | var extra = ex;
|
5157 | if (isWindow(elem)) {
|
5158 | return name === 'width' ? domUtils.viewportWidth(elem) : domUtils.viewportHeight(elem);
|
5159 | } else if (elem.nodeType === 9) {
|
5160 | return name === 'width' ? domUtils.docWidth(elem) : domUtils.docHeight(elem);
|
5161 | }
|
5162 | var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];
|
5163 | var borderBoxValue = name === 'width' ? elem.offsetWidth : elem.offsetHeight;
|
5164 | var computedStyle = getComputedStyleX(elem);
|
5165 | var isBorderBox = isBorderBoxFn(elem, computedStyle);
|
5166 | var cssBoxValue = 0;
|
5167 | if (borderBoxValue === null || borderBoxValue === undefined || borderBoxValue <= 0) {
|
5168 | borderBoxValue = undefined;
|
5169 | // Fall back to computed then un computed css if necessary
|
5170 | cssBoxValue = getComputedStyleX(elem, name);
|
5171 | if (cssBoxValue === null || cssBoxValue === undefined || Number(cssBoxValue) < 0) {
|
5172 | cssBoxValue = elem.style[name] || 0;
|
5173 | }
|
5174 | // Normalize '', auto, and prepare for extra
|
5175 | cssBoxValue = parseFloat(cssBoxValue) || 0;
|
5176 | }
|
5177 | if (extra === undefined) {
|
5178 | extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;
|
5179 | }
|
5180 | var borderBoxValueOrIsBorderBox = borderBoxValue !== undefined || isBorderBox;
|
5181 | var val = borderBoxValue || cssBoxValue;
|
5182 | if (extra === CONTENT_INDEX) {
|
5183 | if (borderBoxValueOrIsBorderBox) {
|
5184 | return val - getPBMWidth(elem, ['border', 'padding'], which, computedStyle);
|
5185 | }
|
5186 | return cssBoxValue;
|
5187 | } else if (borderBoxValueOrIsBorderBox) {
|
5188 | if (extra === BORDER_INDEX) {
|
5189 | return val;
|
5190 | }
|
5191 | return val + (extra === PADDING_INDEX ? -getPBMWidth(elem, ['border'], which, computedStyle) : getPBMWidth(elem, ['margin'], which, computedStyle));
|
5192 | }
|
5193 | return cssBoxValue + getPBMWidth(elem, BOX_MODELS.slice(extra), which, computedStyle);
|
5194 | }
|
5195 |
|
5196 | var cssShow = {
|
5197 | position: 'absolute',
|
5198 | visibility: 'hidden',
|
5199 | display: 'block'
|
5200 | };
|
5201 |
|
5202 | // fix #119 : https://github.com/kissyteam/kissy/issues/119
|
5203 | function getWHIgnoreDisplay() {
|
5204 | for (var _len = arguments.length, args = Array(_len), _key2 = 0; _key2 < _len; _key2++) {
|
5205 | args[_key2] = arguments[_key2];
|
5206 | }
|
5207 |
|
5208 | var val = void 0;
|
5209 | var elem = args[0];
|
5210 | // in case elem is window
|
5211 | // elem.offsetWidth === undefined
|
5212 | if (elem.offsetWidth !== 0) {
|
5213 | val = getWH.apply(undefined, args);
|
5214 | } else {
|
5215 | swap(elem, cssShow, function () {
|
5216 | val = getWH.apply(undefined, args);
|
5217 | });
|
5218 | }
|
5219 | return val;
|
5220 | }
|
5221 |
|
5222 | each(['width', 'height'], function (name) {
|
5223 | var first = name.charAt(0).toUpperCase() + name.slice(1);
|
5224 | domUtils['outer' + first] = function (el, includeMargin) {
|
5225 | return el && getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX);
|
5226 | };
|
5227 | var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];
|
5228 |
|
5229 | domUtils[name] = function (elem, v) {
|
5230 | var val = v;
|
5231 | if (val !== undefined) {
|
5232 | if (elem) {
|
5233 | var computedStyle = getComputedStyleX(elem);
|
5234 | var isBorderBox = isBorderBoxFn(elem);
|
5235 | if (isBorderBox) {
|
5236 | val += getPBMWidth(elem, ['padding', 'border'], which, computedStyle);
|
5237 | }
|
5238 | return css(elem, name, val);
|
5239 | }
|
5240 | return undefined;
|
5241 | }
|
5242 | return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX);
|
5243 | };
|
5244 | });
|
5245 |
|
5246 | function mix(to, from) {
|
5247 | for (var i in from) {
|
5248 | if (from.hasOwnProperty(i)) {
|
5249 | to[i] = from[i];
|
5250 | }
|
5251 | }
|
5252 | return to;
|
5253 | }
|
5254 |
|
5255 | var utils = {
|
5256 | getWindow: function getWindow(node) {
|
5257 | if (node && node.document && node.setTimeout) {
|
5258 | return node;
|
5259 | }
|
5260 | var doc = node.ownerDocument || node;
|
5261 | return doc.defaultView || doc.parentWindow;
|
5262 | },
|
5263 | offset: function offset(el, value, option) {
|
5264 | if (typeof value !== 'undefined') {
|
5265 | setOffset(el, value, option || {});
|
5266 | } else {
|
5267 | return getOffset(el);
|
5268 | }
|
5269 | },
|
5270 |
|
5271 | isWindow: isWindow,
|
5272 | each: each,
|
5273 | css: css,
|
5274 | clone: function clone(obj) {
|
5275 | var i = void 0;
|
5276 | var ret = {};
|
5277 | for (i in obj) {
|
5278 | if (obj.hasOwnProperty(i)) {
|
5279 | ret[i] = obj[i];
|
5280 | }
|
5281 | }
|
5282 | var overflow = obj.overflow;
|
5283 | if (overflow) {
|
5284 | for (i in obj) {
|
5285 | if (obj.hasOwnProperty(i)) {
|
5286 | ret.overflow[i] = obj.overflow[i];
|
5287 | }
|
5288 | }
|
5289 | }
|
5290 | return ret;
|
5291 | },
|
5292 |
|
5293 | mix: mix,
|
5294 | getWindowScrollLeft: function getWindowScrollLeft(w) {
|
5295 | return getScrollLeft(w);
|
5296 | },
|
5297 | getWindowScrollTop: function getWindowScrollTop(w) {
|
5298 | return getScrollTop(w);
|
5299 | },
|
5300 | merge: function merge() {
|
5301 | var ret = {};
|
5302 |
|
5303 | for (var _len2 = arguments.length, args = Array(_len2), _key3 = 0; _key3 < _len2; _key3++) {
|
5304 | args[_key3] = arguments[_key3];
|
5305 | }
|
5306 |
|
5307 | for (var i = 0; i < args.length; i++) {
|
5308 | utils.mix(ret, args[i]);
|
5309 | }
|
5310 | return ret;
|
5311 | },
|
5312 |
|
5313 | viewportWidth: 0,
|
5314 | viewportHeight: 0
|
5315 | };
|
5316 |
|
5317 | mix(utils, domUtils);
|
5318 |
|
5319 | exports["default"] = utils;
|
5320 | module.exports = exports['default'];
|
5321 |
|
5322 | /***/ }),
|
5323 | /* 65 */
|
5324 | /***/ (function(module, exports) {
|
5325 |
|
5326 | ;
|
5327 |
|
5328 | Object.defineProperty(exports, "__esModule", {
|
5329 | value: true
|
5330 | });
|
5331 | exports.getTransformName = getTransformName;
|
5332 | exports.setTransitionProperty = setTransitionProperty;
|
5333 | exports.getTransitionProperty = getTransitionProperty;
|
5334 | exports.getTransformXY = getTransformXY;
|
5335 | exports.setTransformXY = setTransformXY;
|
5336 | var vendorPrefix = void 0;
|
5337 |
|
5338 | var jsCssMap = {
|
5339 | Webkit: '-webkit-',
|
5340 | Moz: '-moz-',
|
5341 | // IE did it wrong again ...
|
5342 | ms: '-ms-',
|
5343 | O: '-o-'
|
5344 | };
|
5345 |
|
5346 | function getVendorPrefix() {
|
5347 | if (vendorPrefix !== undefined) {
|
5348 | return vendorPrefix;
|
5349 | }
|
5350 | vendorPrefix = '';
|
5351 | var style = document.createElement('p').style;
|
5352 | var testProp = 'Transform';
|
5353 | for (var key in jsCssMap) {
|
5354 | if (key + testProp in style) {
|
5355 | vendorPrefix = key;
|
5356 | }
|
5357 | }
|
5358 | return vendorPrefix;
|
5359 | }
|
5360 |
|
5361 | function getTransitionName() {
|
5362 | return getVendorPrefix() ? getVendorPrefix() + 'TransitionProperty' : 'transitionProperty';
|
5363 | }
|
5364 |
|
5365 | function getTransformName() {
|
5366 | return getVendorPrefix() ? getVendorPrefix() + 'Transform' : 'transform';
|
5367 | }
|
5368 |
|
5369 | function setTransitionProperty(node, value) {
|
5370 | var name = getTransitionName();
|
5371 | if (name) {
|
5372 | node.style[name] = value;
|
5373 | if (name !== 'transitionProperty') {
|
5374 | node.style.transitionProperty = value;
|
5375 | }
|
5376 | }
|
5377 | }
|
5378 |
|
5379 | function setTransform(node, value) {
|
5380 | var name = getTransformName();
|
5381 | if (name) {
|
5382 | node.style[name] = value;
|
5383 | if (name !== 'transform') {
|
5384 | node.style.transform = value;
|
5385 | }
|
5386 | }
|
5387 | }
|
5388 |
|
5389 | function getTransitionProperty(node) {
|
5390 | return node.style.transitionProperty || node.style[getTransitionName()];
|
5391 | }
|
5392 |
|
5393 | function getTransformXY(node) {
|
5394 | var style = window.getComputedStyle(node, null);
|
5395 | var transform = style.getPropertyValue('transform') || style.getPropertyValue(getTransformName());
|
5396 | if (transform && transform !== 'none') {
|
5397 | var matrix = transform.replace(/[^0-9\-.,]/g, '').split(',');
|
5398 | return { x: parseFloat(matrix[12] || matrix[4], 0), y: parseFloat(matrix[13] || matrix[5], 0) };
|
5399 | }
|
5400 | return {
|
5401 | x: 0,
|
5402 | y: 0
|
5403 | };
|
5404 | }
|
5405 |
|
5406 | var matrix2d = /matrix\((.*)\)/;
|
5407 | var matrix3d = /matrix3d\((.*)\)/;
|
5408 |
|
5409 | function setTransformXY(node, xy) {
|
5410 | var style = window.getComputedStyle(node, null);
|
5411 | var transform = style.getPropertyValue('transform') || style.getPropertyValue(getTransformName());
|
5412 | if (transform && transform !== 'none') {
|
5413 | var arr = void 0;
|
5414 | var match2d = transform.match(matrix2d);
|
5415 | if (match2d) {
|
5416 | match2d = match2d[1];
|
5417 | arr = match2d.split(',').map(function (item) {
|
5418 | return parseFloat(item, 10);
|
5419 | });
|
5420 | arr[4] = xy.x;
|
5421 | arr[5] = xy.y;
|
5422 | setTransform(node, 'matrix(' + arr.join(',') + ')');
|
5423 | } else {
|
5424 | var match3d = transform.match(matrix3d)[1];
|
5425 | arr = match3d.split(',').map(function (item) {
|
5426 | return parseFloat(item, 10);
|
5427 | });
|
5428 | arr[12] = xy.x;
|
5429 | arr[13] = xy.y;
|
5430 | setTransform(node, 'matrix3d(' + arr.join(',') + ')');
|
5431 | }
|
5432 | } else {
|
5433 | setTransform(node, 'translateX(' + xy.x + 'px) translateY(' + xy.y + 'px) translateZ(0)');
|
5434 | }
|
5435 | }
|
5436 |
|
5437 | /***/ }),
|
5438 | /* 66 */
|
5439 | /***/ (function(module, exports, __webpack_require__) {
|
5440 |
|
5441 | ;
|
5442 |
|
5443 | Object.defineProperty(exports, "__esModule", {
|
5444 | value: true
|
5445 | });
|
5446 |
|
5447 | var _utils = __webpack_require__(64);
|
5448 |
|
5449 | var _utils2 = _interopRequireDefault(_utils);
|
5450 |
|
5451 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5452 |
|
5453 | /**
|
5454 | * 得到会导致元素显示不全的祖先元素
|
5455 | */
|
5456 |
|
5457 | function getOffsetParent(element) {
|
5458 | // ie 这个也不是完全可行
|
5459 | /*
|
5460 | <div style="width: 50px;height: 100px;overflow: hidden">
|
5461 | <div style="width: 50px;height: 100px;position: relative;" id="d6">
|
5462 | 元素 6 高 100px 宽 50px<br/>
|
5463 | </div>
|
5464 | </div>
|
5465 | */
|
5466 | // element.offsetParent does the right thing in ie7 and below. Return parent with layout!
|
5467 | // In other browsers it only includes elements with position absolute, relative or
|
5468 | // fixed, not elements with overflow set to auto or scroll.
|
5469 | // if (UA.ie && ieMode < 8) {
|
5470 | // return element.offsetParent;
|
5471 | // }
|
5472 | // 统一的 offsetParent 方法
|
5473 | var doc = element.ownerDocument;
|
5474 | var body = doc.body;
|
5475 | var parent = void 0;
|
5476 | var positionStyle = _utils2["default"].css(element, 'position');
|
5477 | var skipStatic = positionStyle === 'fixed' || positionStyle === 'absolute';
|
5478 |
|
5479 | if (!skipStatic) {
|
5480 | return element.nodeName.toLowerCase() === 'html' ? null : element.parentNode;
|
5481 | }
|
5482 |
|
5483 | for (parent = element.parentNode; parent && parent !== body; parent = parent.parentNode) {
|
5484 | positionStyle = _utils2["default"].css(parent, 'position');
|
5485 | if (positionStyle !== 'static') {
|
5486 | return parent;
|
5487 | }
|
5488 | }
|
5489 | return null;
|
5490 | }
|
5491 |
|
5492 | exports["default"] = getOffsetParent;
|
5493 | module.exports = exports['default'];
|
5494 |
|
5495 | /***/ }),
|
5496 | /* 67 */
|
5497 | /***/ (function(module, exports, __webpack_require__) {
|
5498 |
|
5499 | ;
|
5500 |
|
5501 | Object.defineProperty(exports, "__esModule", {
|
5502 | value: true
|
5503 | });
|
5504 |
|
5505 | var _utils = __webpack_require__(64);
|
5506 |
|
5507 | var _utils2 = _interopRequireDefault(_utils);
|
5508 |
|
5509 | var _getOffsetParent = __webpack_require__(66);
|
5510 |
|
5511 | var _getOffsetParent2 = _interopRequireDefault(_getOffsetParent);
|
5512 |
|
5513 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5514 |
|
5515 | /**
|
5516 | * 获得元素的显示部分的区域
|
5517 | */
|
5518 | function getVisibleRectForElement(element) {
|
5519 | var visibleRect = {
|
5520 | left: 0,
|
5521 | right: Infinity,
|
5522 | top: 0,
|
5523 | bottom: Infinity
|
5524 | };
|
5525 | var el = (0, _getOffsetParent2["default"])(element);
|
5526 | var scrollX = void 0;
|
5527 | var scrollY = void 0;
|
5528 | var winSize = void 0;
|
5529 | var doc = element.ownerDocument;
|
5530 | var win = doc.defaultView || doc.parentWindow;
|
5531 | var body = doc.body;
|
5532 | var documentElement = doc.documentElement;
|
5533 |
|
5534 | // Determine the size of the visible rect by climbing the dom accounting for
|
5535 | // all scrollable containers.
|
5536 | while (el) {
|
5537 | // clientWidth is zero for inline block elements in ie.
|
5538 | if ((navigator.userAgent.indexOf('MSIE') === -1 || el.clientWidth !== 0) &&
|
5539 | // body may have overflow set on it, yet we still get the entire
|
5540 | // viewport. In some browsers, el.offsetParent may be
|
5541 | // document.documentElement, so check for that too.
|
5542 | el !== body && el !== documentElement && _utils2["default"].css(el, 'overflow') !== 'visible') {
|
5543 | var pos = _utils2["default"].offset(el);
|
5544 | // add border
|
5545 | pos.left += el.clientLeft;
|
5546 | pos.top += el.clientTop;
|
5547 | visibleRect.top = Math.max(visibleRect.top, pos.top);
|
5548 | visibleRect.right = Math.min(visibleRect.right,
|
5549 | // consider area without scrollBar
|
5550 | pos.left + el.clientWidth);
|
5551 | visibleRect.bottom = Math.min(visibleRect.bottom, pos.top + el.clientHeight);
|
5552 | visibleRect.left = Math.max(visibleRect.left, pos.left);
|
5553 | } else if (el === body || el === documentElement) {
|
5554 | break;
|
5555 | }
|
5556 | el = (0, _getOffsetParent2["default"])(el);
|
5557 | }
|
5558 |
|
5559 | // Clip by window's viewport.
|
5560 | scrollX = _utils2["default"].getWindowScrollLeft(win);
|
5561 | scrollY = _utils2["default"].getWindowScrollTop(win);
|
5562 | visibleRect.left = Math.max(visibleRect.left, scrollX);
|
5563 | visibleRect.top = Math.max(visibleRect.top, scrollY);
|
5564 | winSize = {
|
5565 | width: _utils2["default"].viewportWidth(win),
|
5566 | height: _utils2["default"].viewportHeight(win)
|
5567 | };
|
5568 | visibleRect.right = Math.min(visibleRect.right, scrollX + winSize.width);
|
5569 | visibleRect.bottom = Math.min(visibleRect.bottom, scrollY + winSize.height);
|
5570 | return visibleRect.top >= 0 && visibleRect.left >= 0 && visibleRect.bottom > visibleRect.top && visibleRect.right > visibleRect.left ? visibleRect : null;
|
5571 | }
|
5572 |
|
5573 | exports["default"] = getVisibleRectForElement;
|
5574 | module.exports = exports['default'];
|
5575 |
|
5576 | /***/ }),
|
5577 | /* 68 */
|
5578 | /***/ (function(module, exports, __webpack_require__) {
|
5579 |
|
5580 | ;
|
5581 |
|
5582 | Object.defineProperty(exports, "__esModule", {
|
5583 | value: true
|
5584 | });
|
5585 |
|
5586 | var _utils = __webpack_require__(64);
|
5587 |
|
5588 | var _utils2 = _interopRequireDefault(_utils);
|
5589 |
|
5590 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5591 |
|
5592 | function adjustForViewport(elFuturePos, elRegion, visibleRect, overflow) {
|
5593 | var pos = _utils2["default"].clone(elFuturePos);
|
5594 | var size = {
|
5595 | width: elRegion.width,
|
5596 | height: elRegion.height
|
5597 | };
|
5598 |
|
5599 | if (overflow.adjustX && pos.left < visibleRect.left) {
|
5600 | pos.left = visibleRect.left;
|
5601 | }
|
5602 |
|
5603 | // Left edge inside and right edge outside viewport, try to resize it.
|
5604 | if (overflow.resizeWidth && pos.left >= visibleRect.left && pos.left + size.width > visibleRect.right) {
|
5605 | size.width -= pos.left + size.width - visibleRect.right;
|
5606 | }
|
5607 |
|
5608 | // Right edge outside viewport, try to move it.
|
5609 | if (overflow.adjustX && pos.left + size.width > visibleRect.right) {
|
5610 | // 保证左边界和可视区域左边界对齐
|
5611 | pos.left = Math.max(visibleRect.right - size.width, visibleRect.left);
|
5612 | }
|
5613 |
|
5614 | // Top edge outside viewport, try to move it.
|
5615 | if (overflow.adjustY && pos.top < visibleRect.top) {
|
5616 | pos.top = visibleRect.top;
|
5617 | }
|
5618 |
|
5619 | // Top edge inside and bottom edge outside viewport, try to resize it.
|
5620 | if (overflow.resizeHeight && pos.top >= visibleRect.top && pos.top + size.height > visibleRect.bottom) {
|
5621 | size.height -= pos.top + size.height - visibleRect.bottom;
|
5622 | }
|
5623 |
|
5624 | // Bottom edge outside viewport, try to move it.
|
5625 | if (overflow.adjustY && pos.top + size.height > visibleRect.bottom) {
|
5626 | // 保证上边界和可视区域上边界对齐
|
5627 | pos.top = Math.max(visibleRect.bottom - size.height, visibleRect.top);
|
5628 | }
|
5629 |
|
5630 | return _utils2["default"].mix(pos, size);
|
5631 | }
|
5632 |
|
5633 | exports["default"] = adjustForViewport;
|
5634 | module.exports = exports['default'];
|
5635 |
|
5636 | /***/ }),
|
5637 | /* 69 */
|
5638 | /***/ (function(module, exports, __webpack_require__) {
|
5639 |
|
5640 | ;
|
5641 |
|
5642 | Object.defineProperty(exports, "__esModule", {
|
5643 | value: true
|
5644 | });
|
5645 |
|
5646 | var _utils = __webpack_require__(64);
|
5647 |
|
5648 | var _utils2 = _interopRequireDefault(_utils);
|
5649 |
|
5650 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5651 |
|
5652 | function getRegion(node) {
|
5653 | var offset = void 0;
|
5654 | var w = void 0;
|
5655 | var h = void 0;
|
5656 | if (!_utils2["default"].isWindow(node) && node.nodeType !== 9) {
|
5657 | offset = _utils2["default"].offset(node);
|
5658 | w = _utils2["default"].outerWidth(node);
|
5659 | h = _utils2["default"].outerHeight(node);
|
5660 | } else {
|
5661 | var win = _utils2["default"].getWindow(node);
|
5662 | offset = {
|
5663 | left: _utils2["default"].getWindowScrollLeft(win),
|
5664 | top: _utils2["default"].getWindowScrollTop(win)
|
5665 | };
|
5666 | w = _utils2["default"].viewportWidth(win);
|
5667 | h = _utils2["default"].viewportHeight(win);
|
5668 | }
|
5669 | offset.width = w;
|
5670 | offset.height = h;
|
5671 | return offset;
|
5672 | }
|
5673 |
|
5674 | exports["default"] = getRegion;
|
5675 | module.exports = exports['default'];
|
5676 |
|
5677 | /***/ }),
|
5678 | /* 70 */
|
5679 | /***/ (function(module, exports, __webpack_require__) {
|
5680 |
|
5681 | ;
|
5682 |
|
5683 | Object.defineProperty(exports, "__esModule", {
|
5684 | value: true
|
5685 | });
|
5686 |
|
5687 | var _getAlignOffset = __webpack_require__(71);
|
5688 |
|
5689 | var _getAlignOffset2 = _interopRequireDefault(_getAlignOffset);
|
5690 |
|
5691 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5692 |
|
5693 | function getElFuturePos(elRegion, refNodeRegion, points, offset, targetOffset) {
|
5694 | var xy = void 0;
|
5695 | var diff = void 0;
|
5696 | var p1 = void 0;
|
5697 | var p2 = void 0;
|
5698 |
|
5699 | xy = {
|
5700 | left: elRegion.left,
|
5701 | top: elRegion.top
|
5702 | };
|
5703 |
|
5704 | p1 = (0, _getAlignOffset2["default"])(refNodeRegion, points[1]);
|
5705 | p2 = (0, _getAlignOffset2["default"])(elRegion, points[0]);
|
5706 |
|
5707 | diff = [p2.left - p1.left, p2.top - p1.top];
|
5708 |
|
5709 | return {
|
5710 | left: xy.left - diff[0] + offset[0] - targetOffset[0],
|
5711 | top: xy.top - diff[1] + offset[1] - targetOffset[1]
|
5712 | };
|
5713 | }
|
5714 |
|
5715 | exports["default"] = getElFuturePos;
|
5716 | module.exports = exports['default'];
|
5717 |
|
5718 | /***/ }),
|
5719 | /* 71 */
|
5720 | /***/ (function(module, exports) {
|
5721 |
|
5722 | ;
|
5723 |
|
5724 | Object.defineProperty(exports, "__esModule", {
|
5725 | value: true
|
5726 | });
|
5727 | /**
|
5728 | * 获取 node 上的 align 对齐点 相对于页面的坐标
|
5729 | */
|
5730 |
|
5731 | function getAlignOffset(region, align) {
|
5732 | var V = align.charAt(0);
|
5733 | var H = align.charAt(1);
|
5734 | var w = region.width;
|
5735 | var h = region.height;
|
5736 | var x = void 0;
|
5737 | var y = void 0;
|
5738 |
|
5739 | x = region.left;
|
5740 | y = region.top;
|
5741 |
|
5742 | if (V === 'c') {
|
5743 | y += h / 2;
|
5744 | } else if (V === 'b') {
|
5745 | y += h;
|
5746 | }
|
5747 |
|
5748 | if (H === 'c') {
|
5749 | x += w / 2;
|
5750 | } else if (H === 'r') {
|
5751 | x += w;
|
5752 | }
|
5753 |
|
5754 | return {
|
5755 | left: x,
|
5756 | top: y
|
5757 | };
|
5758 | }
|
5759 |
|
5760 | exports["default"] = getAlignOffset;
|
5761 | module.exports = exports['default'];
|
5762 |
|
5763 | /***/ }),
|
5764 | /* 72 */
|
5765 | /***/ (function(module, exports, __webpack_require__) {
|
5766 |
|
5767 | ;
|
5768 |
|
5769 | Object.defineProperty(exports, "__esModule", {
|
5770 | value: true
|
5771 | });
|
5772 |
|
5773 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
5774 |
|
5775 | var _classnames = __webpack_require__(3);
|
5776 |
|
5777 | var _classnames2 = _interopRequireDefault(_classnames);
|
5778 |
|
5779 | var _react = __webpack_require__(4);
|
5780 |
|
5781 | var _react2 = _interopRequireDefault(_react);
|
5782 |
|
5783 | var _Transition = __webpack_require__(10);
|
5784 |
|
5785 | var _Transition2 = _interopRequireDefault(_Transition);
|
5786 |
|
5787 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5788 |
|
5789 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
5790 |
|
5791 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
5792 |
|
5793 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
5794 |
|
5795 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
5796 |
|
5797 | var propTypes = {
|
5798 | /**
|
5799 | * Show the component; triggers the fade in or fade out animation
|
5800 | */
|
5801 | "in": _react2["default"].PropTypes.bool,
|
5802 |
|
5803 | /**
|
5804 | * Unmount the component (remove it from the DOM) when it is faded out
|
5805 | */
|
5806 | unmountOnExit: _react2["default"].PropTypes.bool,
|
5807 |
|
5808 | /**
|
5809 | * Run the fade in animation when the component mounts, if it is initially
|
5810 | * shown
|
5811 | */
|
5812 | transitionAppear: _react2["default"].PropTypes.bool,
|
5813 |
|
5814 | /**
|
5815 | * Duration of the fade animation in milliseconds, to ensure that finishing
|
5816 | * callbacks are fired even if the original browser transition end events are
|
5817 | * canceled
|
5818 | */
|
5819 | timeout: _react2["default"].PropTypes.number,
|
5820 |
|
5821 | /**
|
5822 | * Callback fired before the component fades in
|
5823 | */
|
5824 | onEnter: _react2["default"].PropTypes.func,
|
5825 | /**
|
5826 | * Callback fired after the component starts to fade in
|
5827 | */
|
5828 | onEntering: _react2["default"].PropTypes.func,
|
5829 | /**
|
5830 | * Callback fired after the has component faded in
|
5831 | */
|
5832 | onEntered: _react2["default"].PropTypes.func,
|
5833 | /**
|
5834 | * Callback fired before the component fades out
|
5835 | */
|
5836 | onExit: _react2["default"].PropTypes.func,
|
5837 | /**
|
5838 | * Callback fired after the component starts to fade out
|
5839 | */
|
5840 | onExiting: _react2["default"].PropTypes.func,
|
5841 | /**
|
5842 | * Callback fired after the component has faded out
|
5843 | */
|
5844 | onExited: _react2["default"].PropTypes.func
|
5845 | };
|
5846 |
|
5847 | var defaultProps = {
|
5848 | "in": false,
|
5849 | timeout: 300,
|
5850 | unmountOnExit: false,
|
5851 | transitionAppear: false
|
5852 | };
|
5853 |
|
5854 | var Fade = function (_React$Component) {
|
5855 | _inherits(Fade, _React$Component);
|
5856 |
|
5857 | function Fade() {
|
5858 | _classCallCheck(this, Fade);
|
5859 |
|
5860 | return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
5861 | }
|
5862 |
|
5863 | Fade.prototype.render = function render() {
|
5864 | return _react2["default"].createElement(_Transition2["default"], _extends({}, this.props, {
|
5865 | className: (0, _classnames2["default"])(this.props.className, 'fade'),
|
5866 | enteredClassName: 'in',
|
5867 | enteringClassName: 'in'
|
5868 | }));
|
5869 | };
|
5870 |
|
5871 | return Fade;
|
5872 | }(_react2["default"].Component);
|
5873 |
|
5874 | Fade.propTypes = propTypes;
|
5875 | Fade.defaultProps = defaultProps;
|
5876 |
|
5877 | exports["default"] = Fade;
|
5878 | module.exports = exports['default'];
|
5879 |
|
5880 | /***/ }),
|
5881 | /* 73 */
|
5882 | /***/ (function(module, exports, __webpack_require__) {
|
5883 |
|
5884 | ;
|
5885 |
|
5886 | Object.defineProperty(exports, "__esModule", {
|
5887 | value: true
|
5888 | });
|
5889 |
|
5890 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
5891 |
|
5892 | var _classnames = __webpack_require__(3);
|
5893 |
|
5894 | var _classnames2 = _interopRequireDefault(_classnames);
|
5895 |
|
5896 | var _react = __webpack_require__(4);
|
5897 |
|
5898 | var _react2 = _interopRequireDefault(_react);
|
5899 |
|
5900 | var _tinperBeeCore = __webpack_require__(25);
|
5901 |
|
5902 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5903 |
|
5904 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
5905 |
|
5906 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
5907 |
|
5908 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
5909 |
|
5910 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
5911 |
|
5912 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
5913 |
|
5914 | var propTypes = {
|
5915 | //是否是手风琴效果
|
5916 | accordion: _react2["default"].PropTypes.bool,
|
5917 | //激活的项
|
5918 | activeKey: _react2["default"].PropTypes.any,
|
5919 | //默认的激活的项
|
5920 | defaultActiveKey: _react2["default"].PropTypes.any,
|
5921 | //选中函数
|
5922 | onSelect: _react2["default"].PropTypes.func,
|
5923 | role: _react2["default"].PropTypes.string
|
5924 | };
|
5925 |
|
5926 | var defaultProps = {
|
5927 | accordion: false,
|
5928 | clsPrefix: 'u-panel-group'
|
5929 | };
|
5930 |
|
5931 | // TODO: Use uncontrollable.
|
5932 |
|
5933 | var PanelGroup = function (_React$Component) {
|
5934 | _inherits(PanelGroup, _React$Component);
|
5935 |
|
5936 | function PanelGroup(props, context) {
|
5937 | _classCallCheck(this, PanelGroup);
|
5938 |
|
5939 | var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context));
|
5940 |
|
5941 | _this.handleSelect = _this.handleSelect.bind(_this);
|
5942 |
|
5943 | _this.state = {
|
5944 | activeKey: props.defaultActiveKey
|
5945 | };
|
5946 | return _this;
|
5947 | }
|
5948 |
|
5949 | PanelGroup.prototype.handleSelect = function handleSelect(key, e) {
|
5950 | e.preventDefault();
|
5951 |
|
5952 | if (this.props.onSelect) {
|
5953 | this.props.onSelect(key, e);
|
5954 | }
|
5955 |
|
5956 | if (this.state.activeKey === key) {
|
5957 | key = null;
|
5958 | }
|
5959 |
|
5960 | this.setState({ activeKey: key });
|
5961 | };
|
5962 |
|
5963 | PanelGroup.prototype.render = function render() {
|
5964 | var _this2 = this;
|
5965 |
|
5966 | var _props = this.props;
|
5967 | var accordion = _props.accordion;
|
5968 | var propsActiveKey = _props.activeKey;
|
5969 | var className = _props.className;
|
5970 | var children = _props.children;
|
5971 | var defaultActiveKey = _props.defaultActiveKey;
|
5972 | var onSelect = _props.onSelect;
|
5973 | var style = _props.style;
|
5974 | var clsPrefix = _props.clsPrefix;
|
5975 |
|
5976 | var others = _objectWithoutProperties(_props, ['accordion', 'activeKey', 'className', 'children', 'defaultActiveKey', 'onSelect', 'style', 'clsPrefix']);
|
5977 |
|
5978 | var activeKey = void 0;
|
5979 | if (accordion) {
|
5980 | activeKey = propsActiveKey != null ? propsActiveKey : this.state.activeKey;
|
5981 | others.role = others.role || 'tablist';
|
5982 | }
|
5983 |
|
5984 | var classes = {};
|
5985 | classes['' + clsPrefix] = true;
|
5986 |
|
5987 | return _react2["default"].createElement(
|
5988 | 'div',
|
5989 | _extends({}, others, {
|
5990 | className: (0, _classnames2["default"])(className, classes)
|
5991 | }),
|
5992 | _react2["default"].Children.map(children, function (child) {
|
5993 | if (!_react2["default"].isValidElement(child)) {
|
5994 | return child;
|
5995 | }
|
5996 | var childProps = {
|
5997 | style: child.props.style
|
5998 | };
|
5999 |
|
6000 | if (accordion) {
|
6001 | _extends(childProps, {
|
6002 | headerRole: 'tab',
|
6003 | panelRole: 'tabpanel',
|
6004 | collapsible: true,
|
6005 | expanded: child.props.eventKey === activeKey,
|
6006 | onSelect: (0, _tinperBeeCore.createChainedFunction)(_this2.handleSelect, child.props.onSelect)
|
6007 | });
|
6008 | }
|
6009 |
|
6010 | return (0, _react.cloneElement)(child, childProps);
|
6011 | })
|
6012 | );
|
6013 | };
|
6014 |
|
6015 | return PanelGroup;
|
6016 | }(_react2["default"].Component);
|
6017 |
|
6018 | PanelGroup.propTypes = propTypes;
|
6019 | PanelGroup.defaultProps = defaultProps;
|
6020 |
|
6021 | exports["default"] = PanelGroup;
|
6022 | module.exports = exports['default'];
|
6023 |
|
6024 | /***/ }),
|
6025 | /* 74 */
|
6026 | /***/ (function(module, exports, __webpack_require__) {
|
6027 |
|
6028 | ;
|
6029 |
|
6030 | Object.defineProperty(exports, "__esModule", {
|
6031 | value: true
|
6032 | });
|
6033 |
|
6034 | var _Step = __webpack_require__(75);
|
6035 |
|
6036 | var _Step2 = _interopRequireDefault(_Step);
|
6037 |
|
6038 | var _Steps = __webpack_require__(76);
|
6039 |
|
6040 | var _Steps2 = _interopRequireDefault(_Steps);
|
6041 |
|
6042 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
6043 |
|
6044 | _Step2['default'].Steps = _Steps2['default'];
|
6045 | exports['default'] = _Step2['default'];
|
6046 | module.exports = exports['default'];
|
6047 |
|
6048 | /***/ }),
|
6049 | /* 75 */
|
6050 | /***/ (function(module, exports, __webpack_require__) {
|
6051 |
|
6052 | ;
|
6053 |
|
6054 | Object.defineProperty(exports, "__esModule", {
|
6055 | value: true
|
6056 | });
|
6057 |
|
6058 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
6059 |
|
6060 | var _react = __webpack_require__(4);
|
6061 |
|
6062 | var _react2 = _interopRequireDefault(_react);
|
6063 |
|
6064 | var _classnames = __webpack_require__(3);
|
6065 |
|
6066 | var _classnames2 = _interopRequireDefault(_classnames);
|
6067 |
|
6068 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
6069 |
|
6070 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6071 |
|
6072 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
6073 |
|
6074 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
6075 |
|
6076 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6077 |
|
6078 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6079 |
|
6080 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6081 |
|
6082 | function isString(str) {
|
6083 | return typeof str === 'string';
|
6084 | }
|
6085 |
|
6086 | var Step = function (_React$Component) {
|
6087 | _inherits(Step, _React$Component);
|
6088 |
|
6089 | function Step() {
|
6090 | _classCallCheck(this, Step);
|
6091 |
|
6092 | return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
6093 | }
|
6094 |
|
6095 | Step.prototype.render = function render() {
|
6096 | var _classNames, _classNames2;
|
6097 |
|
6098 | var _props = this.props,
|
6099 | className = _props.className,
|
6100 | prefixCls = _props.prefixCls,
|
6101 | style = _props.style,
|
6102 | tailWidth = _props.tailWidth,
|
6103 | _props$status = _props.status,
|
6104 | status = _props$status === undefined ? 'wait' : _props$status,
|
6105 | iconPrefix = _props.iconPrefix,
|
6106 | icon = _props.icon,
|
6107 | wrapperStyle = _props.wrapperStyle,
|
6108 | adjustMarginRight = _props.adjustMarginRight,
|
6109 | stepLast = _props.stepLast,
|
6110 | stepNumber = _props.stepNumber,
|
6111 | description = _props.description,
|
6112 | title = _props.title,
|
6113 | restProps = _objectWithoutProperties(_props, ['className', 'prefixCls', 'style', 'tailWidth', 'status', 'iconPrefix', 'icon', 'wrapperStyle', 'adjustMarginRight', 'stepLast', 'stepNumber', 'description', 'title']);
|
6114 |
|
6115 | var iconClassName = (0, _classnames2['default'])((_classNames = {}, _defineProperty(_classNames, prefixCls + '-icon', true), _defineProperty(_classNames, iconPrefix + 'icon', true), _defineProperty(_classNames, iconPrefix + 'icon-' + icon, icon && isString(icon)), _defineProperty(_classNames, iconPrefix + 'icon-check', !icon && status === 'finish'), _defineProperty(_classNames, iconPrefix + 'icon-cross', !icon && status === 'error'), _classNames));
|
6116 |
|
6117 | var iconNode = void 0;
|
6118 | if (icon && !isString(icon)) {
|
6119 | iconNode = _react2['default'].createElement(
|
6120 | 'span',
|
6121 | { className: prefixCls + '-icon' },
|
6122 | icon
|
6123 | );
|
6124 | } else if (icon || status === 'finish' || status === 'error') {
|
6125 | iconNode = _react2['default'].createElement('span', { className: iconClassName });
|
6126 | } else {
|
6127 | iconNode = _react2['default'].createElement(
|
6128 | 'span',
|
6129 | { className: prefixCls + '-icon' },
|
6130 | stepNumber
|
6131 | );
|
6132 | }
|
6133 |
|
6134 | var classString = (0, _classnames2['default'])((_classNames2 = {}, _defineProperty(_classNames2, prefixCls + '-item', true), _defineProperty(_classNames2, prefixCls + '-item-last', stepLast), _defineProperty(_classNames2, prefixCls + '-status-' + status, true), _defineProperty(_classNames2, prefixCls + '-custom', icon), _defineProperty(_classNames2, className, !!className), _classNames2));
|
6135 | return _react2['default'].createElement(
|
6136 | 'div',
|
6137 | _extends({}, restProps, {
|
6138 | className: classString,
|
6139 | style: _extends({ width: tailWidth, marginRight: adjustMarginRight }, style)
|
6140 | }),
|
6141 | stepLast ? '' : _react2['default'].createElement(
|
6142 | 'div',
|
6143 | { ref: 'tail', className: prefixCls + '-tail' },
|
6144 | _react2['default'].createElement('i', null)
|
6145 | ),
|
6146 | _react2['default'].createElement(
|
6147 | 'div',
|
6148 | { className: prefixCls + '-step' },
|
6149 | _react2['default'].createElement(
|
6150 | 'div',
|
6151 | {
|
6152 | className: prefixCls + '-head',
|
6153 | style: { background: wrapperStyle.background || wrapperStyle.backgroundColor }
|
6154 | },
|
6155 | _react2['default'].createElement(
|
6156 | 'div',
|
6157 | { className: prefixCls + '-head-inner' },
|
6158 | iconNode
|
6159 | )
|
6160 | ),
|
6161 | _react2['default'].createElement(
|
6162 | 'div',
|
6163 | { ref: 'main', className: prefixCls + '-main' },
|
6164 | _react2['default'].createElement(
|
6165 | 'div',
|
6166 | {
|
6167 | className: prefixCls + '-title',
|
6168 | style: { background: wrapperStyle.background || wrapperStyle.backgroundColor }
|
6169 | },
|
6170 | title
|
6171 | ),
|
6172 | description ? _react2['default'].createElement(
|
6173 | 'div',
|
6174 | { className: prefixCls + '-description' },
|
6175 | description
|
6176 | ) : ''
|
6177 | )
|
6178 | )
|
6179 | );
|
6180 | };
|
6181 |
|
6182 | return Step;
|
6183 | }(_react2['default'].Component);
|
6184 |
|
6185 | exports['default'] = Step;
|
6186 |
|
6187 |
|
6188 | Step.propTypes = {
|
6189 | className: _react.PropTypes.string,
|
6190 | prefixCls: _react.PropTypes.string,
|
6191 | style: _react.PropTypes.object,
|
6192 | wrapperStyle: _react.PropTypes.object,
|
6193 | tailWidth: _react.PropTypes.oneOfType([_react.PropTypes.number, _react.PropTypes.string]),
|
6194 | status: _react.PropTypes.string,
|
6195 | iconPrefix: _react.PropTypes.string,
|
6196 | icon: _react.PropTypes.node,
|
6197 | adjustMarginRight: _react.PropTypes.oneOfType([_react.PropTypes.number, _react.PropTypes.string]),
|
6198 | stepLast: _react.PropTypes.bool,
|
6199 | stepNumber: _react.PropTypes.string,
|
6200 | description: _react.PropTypes.any,
|
6201 | title: _react.PropTypes.any
|
6202 | };
|
6203 |
|
6204 | module.exports = Step;
|
6205 | module.exports = exports['default'];
|
6206 |
|
6207 | /***/ }),
|
6208 | /* 76 */
|
6209 | /***/ (function(module, exports, __webpack_require__) {
|
6210 |
|
6211 | ;
|
6212 |
|
6213 | Object.defineProperty(exports, "__esModule", {
|
6214 | value: true
|
6215 | });
|
6216 |
|
6217 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
6218 |
|
6219 | var _react = __webpack_require__(4);
|
6220 |
|
6221 | var _react2 = _interopRequireDefault(_react);
|
6222 |
|
6223 | var _reactDom = __webpack_require__(11);
|
6224 |
|
6225 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
6226 |
|
6227 | var _classnames = __webpack_require__(3);
|
6228 |
|
6229 | var _classnames2 = _interopRequireDefault(_classnames);
|
6230 |
|
6231 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
6232 |
|
6233 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6234 |
|
6235 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
6236 |
|
6237 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
6238 |
|
6239 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6240 |
|
6241 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6242 |
|
6243 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6244 |
|
6245 | var propTypes = {
|
6246 | prefixCls: _react.PropTypes.string,
|
6247 | iconPrefix: _react.PropTypes.string,
|
6248 | labelPlacement: _react.PropTypes.string,
|
6249 | children: _react.PropTypes.any,
|
6250 | current: _react.PropTypes.number,
|
6251 | status: _react.PropTypes.oneOf(['wait', 'process', 'finish', 'error']),
|
6252 | direction: _react.PropTypes.oneOf(['horizontal', 'vertical']),
|
6253 | size: _react.PropTypes.oneOf(['default', 'small'])
|
6254 | };
|
6255 |
|
6256 | var defaultProps = {
|
6257 | prefixCls: 'u-steps',
|
6258 | iconPrefix: 'u',
|
6259 | direction: 'horizontal',
|
6260 | labelPlacement: 'horizontal',
|
6261 | current: 0,
|
6262 | status: 'process',
|
6263 | size: 'default'
|
6264 | };
|
6265 |
|
6266 | var Steps = function (_React$Component) {
|
6267 | _inherits(Steps, _React$Component);
|
6268 |
|
6269 | function Steps(props) {
|
6270 | _classCallCheck(this, Steps);
|
6271 |
|
6272 | var _this = _possibleConstructorReturn(this, _React$Component.call(this, props));
|
6273 |
|
6274 | _this.calcLastStepOffsetWidth = function () {
|
6275 | var domNode = _reactDom2['default'].findDOMNode(_this);
|
6276 | if (domNode.children.length > 0) {
|
6277 | if (_this.calcTimeout) {
|
6278 | clearTimeout(_this.calcTimeout);
|
6279 | }
|
6280 | _this.calcTimeout = setTimeout(function () {
|
6281 | // +1 for fit edge bug of digit width, like 35.4px
|
6282 | var lastStepOffsetWidth = (domNode.lastChild.offsetWidth || 0) + 1;
|
6283 | if (_this.state.lastStepOffsetWidth === lastStepOffsetWidth) {
|
6284 | return;
|
6285 | }
|
6286 | _this.setState({ lastStepOffsetWidth: lastStepOffsetWidth });
|
6287 | });
|
6288 | }
|
6289 | };
|
6290 |
|
6291 | _this.state = {
|
6292 | lastStepOffsetWidth: 0
|
6293 | };
|
6294 | return _this;
|
6295 | }
|
6296 |
|
6297 | Steps.prototype.componentDidMount = function componentDidMount() {
|
6298 | this.calcLastStepOffsetWidth();
|
6299 | };
|
6300 |
|
6301 | Steps.prototype.componentDidUpdate = function componentDidUpdate() {
|
6302 | this.calcLastStepOffsetWidth();
|
6303 | };
|
6304 |
|
6305 | Steps.prototype.componentWillUnmount = function componentWillUnmount() {
|
6306 | if (this.calcTimeout) {
|
6307 | clearTimeout(this.calcTimeout);
|
6308 | }
|
6309 | };
|
6310 |
|
6311 | Steps.prototype.render = function render() {
|
6312 | var _classNames,
|
6313 | _this2 = this;
|
6314 |
|
6315 | var props = this.props;
|
6316 |
|
6317 | var prefixCls = props.prefixCls,
|
6318 | _props$style = props.style,
|
6319 | style = _props$style === undefined ? {} : _props$style,
|
6320 | className = props.className,
|
6321 | children = props.children,
|
6322 | direction = props.direction,
|
6323 | labelPlacement = props.labelPlacement,
|
6324 | iconPrefix = props.iconPrefix,
|
6325 | status = props.status,
|
6326 | size = props.size,
|
6327 | current = props.current,
|
6328 | restProps = _objectWithoutProperties(props, ['prefixCls', 'style', 'className', 'children', 'direction', 'labelPlacement', 'iconPrefix', 'status', 'size', 'current']);
|
6329 |
|
6330 | var lastIndex = children.length - 1;
|
6331 | var reLayouted = this.state.lastStepOffsetWidth > 0;
|
6332 | var classString = (0, _classnames2['default'])((_classNames = {}, _defineProperty(_classNames, prefixCls, true), _defineProperty(_classNames, prefixCls + '-' + size, size), _defineProperty(_classNames, prefixCls + '-' + direction, true), _defineProperty(_classNames, prefixCls + '-label-' + labelPlacement, direction === 'horizontal'), _defineProperty(_classNames, prefixCls + '-hidden', !reLayouted), _defineProperty(_classNames, className, className), _classNames));
|
6333 |
|
6334 | return _react2['default'].createElement(
|
6335 | 'div',
|
6336 | _extends({ className: classString, style: style }, restProps),
|
6337 | _react2['default'].Children.map(children, function (ele, idx) {
|
6338 | var tailWidth = direction === 'vertical' || idx === lastIndex || !reLayouted ? null : 100 / lastIndex + '%';
|
6339 | var adjustMarginRight = direction === 'vertical' || idx === lastIndex ? null : -Math.round(_this2.state.lastStepOffsetWidth / lastIndex + 1);
|
6340 | var np = {
|
6341 | stepNumber: (idx + 1).toString(),
|
6342 | stepLast: idx === lastIndex,
|
6343 | tailWidth: tailWidth,
|
6344 | adjustMarginRight: adjustMarginRight,
|
6345 | prefixCls: prefixCls,
|
6346 | iconPrefix: iconPrefix,
|
6347 | wrapperStyle: style
|
6348 | };
|
6349 |
|
6350 | // fix tail color
|
6351 | if (status === 'error' && idx === current - 1) {
|
6352 | np.className = props.prefixCls + '-next-error';
|
6353 | }
|
6354 |
|
6355 | if (!ele.props.status) {
|
6356 | if (idx === current) {
|
6357 | np.status = status;
|
6358 | } else if (idx < current) {
|
6359 | np.status = 'finish';
|
6360 | } else {
|
6361 | np.status = 'wait';
|
6362 | }
|
6363 | }
|
6364 | return _react2['default'].cloneElement(ele, np);
|
6365 | }, this)
|
6366 | );
|
6367 | };
|
6368 |
|
6369 | return Steps;
|
6370 | }(_react2['default'].Component);
|
6371 |
|
6372 | Steps.defaultProps = defaultProps;
|
6373 | Steps.propTypes = propTypes;
|
6374 |
|
6375 | exports['default'] = Steps;
|
6376 | module.exports = exports['default'];
|
6377 |
|
6378 | /***/ }),
|
6379 | /* 77 */
|
6380 | /***/ (function(module, exports, __webpack_require__) {
|
6381 |
|
6382 | ;
|
6383 |
|
6384 | Object.defineProperty(exports, "__esModule", {
|
6385 | value: true
|
6386 | });
|
6387 |
|
6388 | var _Icon = __webpack_require__(78);
|
6389 |
|
6390 | var _Icon2 = _interopRequireDefault(_Icon);
|
6391 |
|
6392 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6393 |
|
6394 | exports["default"] = _Icon2["default"];
|
6395 | module.exports = exports['default'];
|
6396 |
|
6397 | /***/ }),
|
6398 | /* 78 */
|
6399 | /***/ (function(module, exports, __webpack_require__) {
|
6400 |
|
6401 | ;
|
6402 |
|
6403 | Object.defineProperty(exports, "__esModule", {
|
6404 | value: true
|
6405 | });
|
6406 |
|
6407 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
6408 |
|
6409 | var _react = __webpack_require__(4);
|
6410 |
|
6411 | var _react2 = _interopRequireDefault(_react);
|
6412 |
|
6413 | var _classnames = __webpack_require__(3);
|
6414 |
|
6415 | var _classnames2 = _interopRequireDefault(_classnames);
|
6416 |
|
6417 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6418 |
|
6419 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6420 |
|
6421 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
6422 |
|
6423 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6424 |
|
6425 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6426 |
|
6427 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6428 |
|
6429 | var propTypes = {
|
6430 | type: _react.PropTypes.string
|
6431 |
|
6432 | };
|
6433 | /**
|
6434 | * badge 默认显示内容1
|
6435 | */
|
6436 | var defaultProps = {
|
6437 | clsPrefix: 'uf'
|
6438 | };
|
6439 |
|
6440 | var Icon = function (_Component) {
|
6441 | _inherits(Icon, _Component);
|
6442 |
|
6443 | function Icon(props) {
|
6444 | _classCallCheck(this, Icon);
|
6445 |
|
6446 | return _possibleConstructorReturn(this, _Component.call(this, props));
|
6447 | }
|
6448 |
|
6449 | Icon.prototype.render = function render() {
|
6450 | var _props = this.props,
|
6451 | type = _props.type,
|
6452 | className = _props.className,
|
6453 | clsPrefix = _props.clsPrefix,
|
6454 | others = _objectWithoutProperties(_props, ['type', 'className', 'clsPrefix']);
|
6455 |
|
6456 | var clsObj = {};
|
6457 |
|
6458 | var classNames = (0, _classnames2["default"])(clsPrefix, type);
|
6459 |
|
6460 | return _react2["default"].createElement('i', _extends({}, others, { className: (0, _classnames2["default"])(classNames, className) }));
|
6461 | };
|
6462 |
|
6463 | return Icon;
|
6464 | }(_react.Component);
|
6465 |
|
6466 | Icon.defaultProps = defaultProps;
|
6467 | Icon.PropTypes = _react.PropTypes;
|
6468 |
|
6469 | exports["default"] = Icon;
|
6470 | module.exports = exports['default'];
|
6471 |
|
6472 | /***/ }),
|
6473 | /* 79 */
|
6474 | /***/ (function(module, exports, __webpack_require__) {
|
6475 |
|
6476 | ;
|
6477 |
|
6478 | Object.defineProperty(exports, "__esModule", {
|
6479 | value: true
|
6480 | });
|
6481 |
|
6482 | var _Message = __webpack_require__(80);
|
6483 |
|
6484 | var _Message2 = _interopRequireDefault(_Message);
|
6485 |
|
6486 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6487 |
|
6488 | exports["default"] = _Message2["default"];
|
6489 | module.exports = exports['default'];
|
6490 |
|
6491 | /***/ }),
|
6492 | /* 80 */
|
6493 | /***/ (function(module, exports, __webpack_require__) {
|
6494 |
|
6495 | ;
|
6496 |
|
6497 | Object.defineProperty(exports, "__esModule", {
|
6498 | value: true
|
6499 | });
|
6500 |
|
6501 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
6502 |
|
6503 | var _react = __webpack_require__(4);
|
6504 |
|
6505 | var _react2 = _interopRequireDefault(_react);
|
6506 |
|
6507 | var _beeNotification = __webpack_require__(81);
|
6508 |
|
6509 | var _beeNotification2 = _interopRequireDefault(_beeNotification);
|
6510 |
|
6511 | var _classnames = __webpack_require__(3);
|
6512 |
|
6513 | var _classnames2 = _interopRequireDefault(_classnames);
|
6514 |
|
6515 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6516 |
|
6517 | var defaultDuration = 1.5;
|
6518 | var defaultTop = 0;
|
6519 | var defaultBottom = 48;
|
6520 | var bottom = 90;
|
6521 | var padding = 30;
|
6522 | var width = 200;
|
6523 | var messageInstance = void 0;
|
6524 | var key = 1;
|
6525 | var clsPrefix = 'u-message';
|
6526 | var noop = function noop() {};
|
6527 |
|
6528 | var positionObj = {
|
6529 | "top": {
|
6530 | messageStyle: {
|
6531 | width: "100%"
|
6532 | },
|
6533 | notificationStyle: {
|
6534 | top: defaultTop,
|
6535 | width: "100%"
|
6536 | },
|
6537 | transitionName: 'top'
|
6538 | },
|
6539 | "bottom": {
|
6540 | messageStyle: {
|
6541 | width: "100%"
|
6542 | },
|
6543 | notificationStyle: {
|
6544 | bottom: defaultBottom,
|
6545 | width: "100%"
|
6546 | },
|
6547 | transitionName: 'bottom'
|
6548 | },
|
6549 | "topRight": {
|
6550 | messageStyle: {
|
6551 | width: width
|
6552 | },
|
6553 | notificationStyle: {
|
6554 | top: padding,
|
6555 | right: padding,
|
6556 | width: width
|
6557 | },
|
6558 | transitionName: 'right'
|
6559 | },
|
6560 | "bottomRight": {
|
6561 | messageStyle: {
|
6562 | width: width
|
6563 | },
|
6564 | notificationStyle: {
|
6565 | bottom: bottom,
|
6566 | right: padding,
|
6567 | width: width
|
6568 | },
|
6569 | transitionName: 'right'
|
6570 | },
|
6571 | "topLeft": {
|
6572 | messageStyle: {
|
6573 | width: width
|
6574 | },
|
6575 | notificationStyle: {
|
6576 | top: padding,
|
6577 | left: padding,
|
6578 | width: width
|
6579 | },
|
6580 | transitionName: 'left'
|
6581 | },
|
6582 | "bottomLeft": {
|
6583 | messageStyle: {
|
6584 | width: width
|
6585 | },
|
6586 | notificationStyle: {
|
6587 | bottom: bottom,
|
6588 | left: padding,
|
6589 | width: width
|
6590 | },
|
6591 | transitionName: 'left'
|
6592 | }
|
6593 | };
|
6594 |
|
6595 | function getMessageInstance() {
|
6596 | var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'top';
|
6597 |
|
6598 | var style = positionObj[position].notificationStyle;
|
6599 | messageInstance = messageInstance || _beeNotification2["default"].newInstance({
|
6600 | clsPrefix: clsPrefix,
|
6601 | transitionName: clsPrefix + '-' + positionObj[position].transitionName,
|
6602 | style: style, // 覆盖原来的样式
|
6603 | position: ''
|
6604 | });
|
6605 | return messageInstance;
|
6606 | }
|
6607 |
|
6608 | function notice(content, duration, type, onClose, position) {
|
6609 | var iconType = {
|
6610 | info: 'uf uf-i-c-2',
|
6611 | success: 'uf uf-correct',
|
6612 | danger: 'uf uf-close-c',
|
6613 | warning: 'uf uf-exc-t',
|
6614 | light: 'uf uf-notification',
|
6615 | dark: 'uf uf-bubble',
|
6616 | news: 'uf uf-bell',
|
6617 | infolight: 'uf uf-i-c-2',
|
6618 | successlight: 'uf uf-correct',
|
6619 | dangerlight: 'uf uf-close-c',
|
6620 | warninglight: 'uf uf-exc-t'
|
6621 | }[type];
|
6622 |
|
6623 | var style = positionObj[position].messageStyle;
|
6624 |
|
6625 | var instance = getMessageInstance(position);
|
6626 |
|
6627 | instance.notice({
|
6628 | key: key,
|
6629 | duration: duration,
|
6630 | color: type,
|
6631 | style: style,
|
6632 | content: _react2["default"].createElement(
|
6633 | 'div',
|
6634 | null,
|
6635 | _react2["default"].createElement(
|
6636 | 'div',
|
6637 | { className: clsPrefix + '-notice-description-icon' },
|
6638 | _react2["default"].createElement('i', { className: (0, _classnames2["default"])(iconType) })
|
6639 | ),
|
6640 | _react2["default"].createElement(
|
6641 | 'div',
|
6642 | { className: clsPrefix + '-notice-description-content' },
|
6643 | content
|
6644 | )
|
6645 | ),
|
6646 | onClose: onClose
|
6647 | });
|
6648 | return function () {
|
6649 | var target = key++;
|
6650 | return function () {
|
6651 | instance.removeNotice(target);
|
6652 | };
|
6653 | }();
|
6654 | }
|
6655 |
|
6656 | exports["default"] = {
|
6657 | create: function create(obj) {
|
6658 | var content = obj.content || '';
|
6659 | var duration = _typeof(obj.duration) == undefined ? defaultDuration : obj.duration;
|
6660 | var color = obj.color || 'dark';
|
6661 | var onClose = obj.onClose || noop;
|
6662 | var position = obj.position || "top";
|
6663 | return notice(content, duration, color, onClose, position);
|
6664 | },
|
6665 | config: function config(options) {
|
6666 | if (options.top !== undefined) {
|
6667 | defaultTop = options.top;
|
6668 | }
|
6669 | if (options.duration !== undefined) {
|
6670 | defaultDuration = options.duration;
|
6671 | }
|
6672 | if (options.clsPrefix !== undefined) {
|
6673 | clsPrefix = options.clsPrefix;
|
6674 | }
|
6675 | if (options.defaultBottom !== undefined) {
|
6676 | defaultBottom = options.defaultBottom;
|
6677 | }
|
6678 | if (options.bottom !== undefined) {
|
6679 | bottom = options.bottom;
|
6680 | }
|
6681 | if (options.width !== undefined) {
|
6682 | bottom = options.width;
|
6683 | }
|
6684 | },
|
6685 | destroy: function destroy() {
|
6686 | if (messageInstance) {
|
6687 | messageInstance.destroy();
|
6688 | messageInstance = null;
|
6689 | }
|
6690 | }
|
6691 | };
|
6692 | module.exports = exports['default'];
|
6693 |
|
6694 | /***/ }),
|
6695 | /* 81 */
|
6696 | /***/ (function(module, exports, __webpack_require__) {
|
6697 |
|
6698 | ;
|
6699 |
|
6700 | Object.defineProperty(exports, "__esModule", {
|
6701 | value: true
|
6702 | });
|
6703 |
|
6704 | var _Notification = __webpack_require__(82);
|
6705 |
|
6706 | var _Notification2 = _interopRequireDefault(_Notification);
|
6707 |
|
6708 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6709 |
|
6710 | exports["default"] = _Notification2["default"];
|
6711 | module.exports = exports['default'];
|
6712 |
|
6713 | /***/ }),
|
6714 | /* 82 */
|
6715 | /***/ (function(module, exports, __webpack_require__) {
|
6716 |
|
6717 | ;
|
6718 |
|
6719 | Object.defineProperty(exports, "__esModule", {
|
6720 | value: true
|
6721 | });
|
6722 |
|
6723 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
6724 |
|
6725 | var _react = __webpack_require__(4);
|
6726 |
|
6727 | var _react2 = _interopRequireDefault(_react);
|
6728 |
|
6729 | var _reactDom = __webpack_require__(11);
|
6730 |
|
6731 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
6732 |
|
6733 | var _beeAnimate = __webpack_require__(83);
|
6734 |
|
6735 | var _beeAnimate2 = _interopRequireDefault(_beeAnimate);
|
6736 |
|
6737 | var _createChainedFunction = __webpack_require__(49);
|
6738 |
|
6739 | var _createChainedFunction2 = _interopRequireDefault(_createChainedFunction);
|
6740 |
|
6741 | var _classnames = __webpack_require__(3);
|
6742 |
|
6743 | var _classnames2 = _interopRequireDefault(_classnames);
|
6744 |
|
6745 | var _Notice = __webpack_require__(88);
|
6746 |
|
6747 | var _Notice2 = _interopRequireDefault(_Notice);
|
6748 |
|
6749 | var _elementType = __webpack_require__(32);
|
6750 |
|
6751 | var _elementType2 = _interopRequireDefault(_elementType);
|
6752 |
|
6753 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6754 |
|
6755 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6756 |
|
6757 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
6758 |
|
6759 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6760 |
|
6761 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6762 |
|
6763 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6764 |
|
6765 | var seed = 0;
|
6766 | var now = Date.now();
|
6767 |
|
6768 | function getUuid() {
|
6769 | return 'uNotification_' + now + '_' + seed++;
|
6770 | }
|
6771 |
|
6772 | var propTypes = {
|
6773 | show: _react.PropTypes.bool,
|
6774 | clsPrefix: _react.PropTypes.string,
|
6775 | style: _react.PropTypes.object,
|
6776 | position: _react.PropTypes.oneOf(['topRight', 'bottomRight', '']),
|
6777 | transitionName: _react.PropTypes.string,
|
6778 | animation: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.object])
|
6779 | };
|
6780 |
|
6781 | var defaultProps = {
|
6782 | clsPrefix: 'u-notification',
|
6783 | animation: 'fade',
|
6784 | position: 'topRight'
|
6785 | };
|
6786 |
|
6787 | var Notification = function (_Component) {
|
6788 | _inherits(Notification, _Component);
|
6789 |
|
6790 | function Notification(props) {
|
6791 | _classCallCheck(this, Notification);
|
6792 |
|
6793 | var _this = _possibleConstructorReturn(this, _Component.call(this, props));
|
6794 |
|
6795 | _this.state = {
|
6796 | notices: []
|
6797 | };
|
6798 | _this.add = _this.add.bind(_this);
|
6799 | _this.remove = _this.remove.bind(_this);
|
6800 |
|
6801 | return _this;
|
6802 | }
|
6803 |
|
6804 | Notification.prototype.getTransitionName = function getTransitionName() {
|
6805 | var props = this.props;
|
6806 | var transitionName = props.transitionName;
|
6807 | if (!transitionName && props.animation) {
|
6808 | transitionName = props.clsPrefix + '-' + props.animation;
|
6809 | }
|
6810 | return transitionName;
|
6811 | };
|
6812 |
|
6813 | Notification.prototype.add = function add(notice) {
|
6814 | var key = notice.key = notice.key || getUuid();
|
6815 | this.setState(function (previousState) {
|
6816 | var notices = previousState.notices;
|
6817 | if (!notices.filter(function (v) {
|
6818 | return v.key === key;
|
6819 | }).length) {
|
6820 | return {
|
6821 | notices: notices.concat(notice)
|
6822 | };
|
6823 | }
|
6824 | });
|
6825 | };
|
6826 |
|
6827 | Notification.prototype.remove = function remove(key) {
|
6828 | this.setState(function (previousState) {
|
6829 | return {
|
6830 | notices: previousState.notices.filter(function (notice) {
|
6831 | return notice.key !== key;
|
6832 | })
|
6833 | };
|
6834 | });
|
6835 | };
|
6836 |
|
6837 | Notification.prototype.render = function render() {
|
6838 | var _this2 = this,
|
6839 | _classes;
|
6840 |
|
6841 | var _props = this.props;
|
6842 | var clsPrefix = _props.clsPrefix;
|
6843 | var className = _props.className;
|
6844 | var position = _props.position;
|
6845 | var style = _props.style;
|
6846 |
|
6847 | var noticeNodes = this.state.notices.map(function (notice) {
|
6848 | var onClose = (0, _createChainedFunction2["default"])(_this2.remove.bind(_this2, notice.key), notice.onClose);
|
6849 | return _react2["default"].createElement(
|
6850 | _Notice2["default"],
|
6851 | _extends({
|
6852 | clsPrefix: clsPrefix
|
6853 | }, notice, {
|
6854 | onClose: onClose
|
6855 | }),
|
6856 | notice.content
|
6857 | );
|
6858 | });
|
6859 | var classes = (_classes = {}, _defineProperty(_classes, clsPrefix, 1), _defineProperty(_classes, className, !!className), _classes);
|
6860 | if (position) {
|
6861 | classes[clsPrefix + '-' + position] = !!position;
|
6862 | }
|
6863 |
|
6864 | return _react2["default"].createElement(
|
6865 | 'div',
|
6866 | { className: (0, _classnames2["default"])(className, classes), style: style },
|
6867 | _react2["default"].createElement(
|
6868 | _beeAnimate2["default"],
|
6869 | { transitionName: this.getTransitionName() },
|
6870 | noticeNodes
|
6871 | )
|
6872 | );
|
6873 | };
|
6874 |
|
6875 | return Notification;
|
6876 | }(_react.Component);
|
6877 |
|
6878 | ;
|
6879 |
|
6880 | Notification.propTypes = propTypes;
|
6881 | Notification.defaultProps = defaultProps;
|
6882 |
|
6883 | Notification.newInstance = function newNotificationInstance(properties) {
|
6884 | var props = properties || {};
|
6885 | var div = document.createElement('div');
|
6886 | document.body.appendChild(div);
|
6887 | var notification = _reactDom2["default"].render(_react2["default"].createElement(Notification, props), div);
|
6888 | return {
|
6889 | notice: function notice(noticeProps) {
|
6890 | notification.add(noticeProps);
|
6891 | },
|
6892 | removeNotice: function removeNotice(key) {
|
6893 | notification.remove(key);
|
6894 | },
|
6895 |
|
6896 | component: notification,
|
6897 | destroy: function destroy() {
|
6898 | _reactDom2["default"].unmountComponentAtNode(div);
|
6899 | document.body.removeChild(div);
|
6900 | }
|
6901 | };
|
6902 | };
|
6903 |
|
6904 | exports["default"] = Notification;
|
6905 | module.exports = exports['default'];
|
6906 |
|
6907 | /***/ }),
|
6908 | /* 83 */
|
6909 | /***/ (function(module, exports, __webpack_require__) {
|
6910 |
|
6911 | ;
|
6912 |
|
6913 | Object.defineProperty(exports, "__esModule", {
|
6914 | value: true
|
6915 | });
|
6916 |
|
6917 | var _Animate = __webpack_require__(84);
|
6918 |
|
6919 | var _Animate2 = _interopRequireDefault(_Animate);
|
6920 |
|
6921 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6922 |
|
6923 | exports["default"] = _Animate2["default"];
|
6924 | module.exports = exports['default'];
|
6925 |
|
6926 | /***/ }),
|
6927 | /* 84 */
|
6928 | /***/ (function(module, exports, __webpack_require__) {
|
6929 |
|
6930 | ;
|
6931 |
|
6932 | Object.defineProperty(exports, "__esModule", {
|
6933 | value: true
|
6934 | });
|
6935 |
|
6936 | var _react = __webpack_require__(4);
|
6937 |
|
6938 | var _react2 = _interopRequireDefault(_react);
|
6939 |
|
6940 | var _ChildrenUtils = __webpack_require__(85);
|
6941 |
|
6942 | var _AnimateChild = __webpack_require__(86);
|
6943 |
|
6944 | var _AnimateChild2 = _interopRequireDefault(_AnimateChild);
|
6945 |
|
6946 | var _util = __webpack_require__(87);
|
6947 |
|
6948 | var _util2 = _interopRequireDefault(_util);
|
6949 |
|
6950 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6951 |
|
6952 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6953 |
|
6954 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
6955 |
|
6956 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6957 |
|
6958 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6959 |
|
6960 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6961 |
|
6962 | var defaultKey = 'u_animate_' + Date.now();
|
6963 |
|
6964 |
|
6965 | function getChildrenFromProps(props) {
|
6966 | var children = props.children;
|
6967 | if (_react2["default"].isValidElement(children)) {
|
6968 | if (!children.key) {
|
6969 | return _react2["default"].cloneElement(children, {
|
6970 | key: defaultKey
|
6971 | });
|
6972 | }
|
6973 | }
|
6974 | return children;
|
6975 | }
|
6976 |
|
6977 | function noop() {}
|
6978 |
|
6979 | var propTypes = {
|
6980 | component: _react.PropTypes.any,
|
6981 | animation: _react.PropTypes.object,
|
6982 | transitionName: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.object]),
|
6983 | transitionEnter: _react.PropTypes.bool,
|
6984 | transitionAppear: _react.PropTypes.bool,
|
6985 | exclusive: _react.PropTypes.bool,
|
6986 | transitionLeave: _react.PropTypes.bool,
|
6987 | onEnd: _react.PropTypes.func,
|
6988 | onEnter: _react.PropTypes.func,
|
6989 | onLeave: _react.PropTypes.func,
|
6990 | onAppear: _react.PropTypes.func,
|
6991 | showProp: _react.PropTypes.string
|
6992 | };
|
6993 |
|
6994 | var defaultProps = {
|
6995 | animation: {},
|
6996 | component: 'span',
|
6997 | transitionEnter: true,
|
6998 | transitionLeave: true,
|
6999 | transitionAppear: false,
|
7000 | onEnd: noop,
|
7001 | onEnter: noop,
|
7002 | onLeave: noop,
|
7003 | onAppear: noop
|
7004 | };
|
7005 |
|
7006 | var Animate = function (_Component) {
|
7007 | _inherits(Animate, _Component);
|
7008 |
|
7009 | function Animate(props) {
|
7010 | _classCallCheck(this, Animate);
|
7011 |
|
7012 | var _this = _possibleConstructorReturn(this, _Component.call(this, props));
|
7013 |
|
7014 | _this.currentlyAnimatingKeys = {};
|
7015 | _this.keysToEnter = [];
|
7016 | _this.keysToLeave = [];
|
7017 | _this.state = {
|
7018 | children: (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(_this.props))
|
7019 | };
|
7020 |
|
7021 | _this.performEnter = _this.performEnter.bind(_this);
|
7022 | _this.performAppear = _this.performAppear.bind(_this);
|
7023 | _this.handleDoneAdding = _this.handleDoneAdding.bind(_this);
|
7024 | _this.performLeave = _this.performLeave.bind(_this);
|
7025 |
|
7026 | _this.performLeave = _this.performLeave.bind(_this);
|
7027 | _this.handleDoneLeaving = _this.handleDoneLeaving.bind(_this);
|
7028 | _this.isValidChildByKey = _this.isValidChildByKey.bind(_this);
|
7029 | _this.stop = _this.stop.bind(_this);
|
7030 | return _this;
|
7031 | }
|
7032 |
|
7033 | Animate.prototype.componentDidMount = function componentDidMount() {
|
7034 | var _this2 = this;
|
7035 |
|
7036 | this.mounted = true;
|
7037 | var showProp = this.props.showProp;
|
7038 | var children = this.state.children;
|
7039 | if (showProp) {
|
7040 | children = children.filter(function (child) {
|
7041 | return !!child.props[showProp];
|
7042 | });
|
7043 | }
|
7044 | children.forEach(function (child) {
|
7045 | if (child) {
|
7046 | _this2.performAppear(child.key);
|
7047 | }
|
7048 | });
|
7049 | };
|
7050 |
|
7051 | Animate.prototype.componentWillUnmount = function componentWillUnmount() {
|
7052 | this.mounted = false;
|
7053 | };
|
7054 |
|
7055 | Animate.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
|
7056 | var _this3 = this;
|
7057 |
|
7058 | this.nextProps = nextProps;
|
7059 | var nextChildren = (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(nextProps));
|
7060 | var props = this.props;
|
7061 | // exclusive needs immediate response
|
7062 | if (props.exclusive) {
|
7063 | Object.keys(this.currentlyAnimatingKeys).forEach(function (key) {
|
7064 | _this3.stop(key);
|
7065 | });
|
7066 | }
|
7067 | var showProp = props.showProp;
|
7068 | var currentlyAnimatingKeys = this.currentlyAnimatingKeys;
|
7069 | // last props children if exclusive
|
7070 | var currentChildren = props.exclusive ? (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(props)) : this.state.children;
|
7071 | // in case destroy in showProp mode
|
7072 | var newChildren = [];
|
7073 | if (showProp) {
|
7074 | currentChildren.forEach(function (currentChild) {
|
7075 | var nextChild = currentChild && (0, _ChildrenUtils.findChildInChildrenByKey)(nextChildren, currentChild.key);
|
7076 | var newChild = void 0;
|
7077 | if ((!nextChild || !nextChild.props[showProp]) && currentChild.props[showProp]) {
|
7078 | newChild = _react2["default"].cloneElement(nextChild || currentChild, _defineProperty({}, showProp, true));
|
7079 | } else {
|
7080 | newChild = nextChild;
|
7081 | }
|
7082 | if (newChild) {
|
7083 | newChildren.push(newChild);
|
7084 | }
|
7085 | });
|
7086 | nextChildren.forEach(function (nextChild) {
|
7087 | if (!nextChild || !(0, _ChildrenUtils.findChildInChildrenByKey)(currentChildren, nextChild.key)) {
|
7088 | newChildren.push(nextChild);
|
7089 | }
|
7090 | });
|
7091 | } else {
|
7092 | newChildren = (0, _ChildrenUtils.mergeChildren)(currentChildren, nextChildren);
|
7093 | }
|
7094 |
|
7095 | // need render to avoid update
|
7096 | this.setState({
|
7097 | children: newChildren
|
7098 | });
|
7099 |
|
7100 | nextChildren.forEach(function (child) {
|
7101 | var key = child && child.key;
|
7102 | if (child && currentlyAnimatingKeys[key]) {
|
7103 | return;
|
7104 | }
|
7105 | var hasPrev = child && (0, _ChildrenUtils.findChildInChildrenByKey)(currentChildren, key);
|
7106 | if (showProp) {
|
7107 | var showInNext = child.props[showProp];
|
7108 | if (hasPrev) {
|
7109 | var showInNow = (0, _ChildrenUtils.findShownChildInChildrenByKey)(currentChildren, key, showProp);
|
7110 | if (!showInNow && showInNext) {
|
7111 | _this3.keysToEnter.push(key);
|
7112 | }
|
7113 | } else if (showInNext) {
|
7114 | _this3.keysToEnter.push(key);
|
7115 | }
|
7116 | } else if (!hasPrev) {
|
7117 | _this3.keysToEnter.push(key);
|
7118 | }
|
7119 | });
|
7120 |
|
7121 | currentChildren.forEach(function (child) {
|
7122 | var key = child && child.key;
|
7123 | if (child && currentlyAnimatingKeys[key]) {
|
7124 | return;
|
7125 | }
|
7126 | var hasNext = child && (0, _ChildrenUtils.findChildInChildrenByKey)(nextChildren, key);
|
7127 | if (showProp) {
|
7128 | var showInNow = child.props[showProp];
|
7129 | if (hasNext) {
|
7130 | var showInNext = (0, _ChildrenUtils.findShownChildInChildrenByKey)(nextChildren, key, showProp);
|
7131 | if (!showInNext && showInNow) {
|
7132 | _this3.keysToLeave.push(key);
|
7133 | }
|
7134 | } else if (showInNow) {
|
7135 | _this3.keysToLeave.push(key);
|
7136 | }
|
7137 | } else if (!hasNext) {
|
7138 | _this3.keysToLeave.push(key);
|
7139 | }
|
7140 | });
|
7141 | };
|
7142 |
|
7143 | Animate.prototype.componentDidUpdate = function componentDidUpdate() {
|
7144 | var keysToEnter = this.keysToEnter;
|
7145 | this.keysToEnter = [];
|
7146 | keysToEnter.forEach(this.performEnter);
|
7147 | var keysToLeave = this.keysToLeave;
|
7148 | this.keysToLeave = [];
|
7149 | keysToLeave.forEach(this.performLeave);
|
7150 | };
|
7151 |
|
7152 | Animate.prototype.performEnter = function performEnter(key) {
|
7153 | // may already remove by exclusive
|
7154 | if (this.refs[key]) {
|
7155 | this.currentlyAnimatingKeys[key] = true;
|
7156 | this.refs[key].componentWillEnter(this.handleDoneAdding.bind(this, key, 'enter'));
|
7157 | }
|
7158 | };
|
7159 |
|
7160 | Animate.prototype.performAppear = function performAppear(key) {
|
7161 | if (this.refs[key]) {
|
7162 | this.currentlyAnimatingKeys[key] = true;
|
7163 | this.refs[key].componentWillAppear(this.handleDoneAdding.bind(this, key, 'appear'));
|
7164 | }
|
7165 | };
|
7166 |
|
7167 | Animate.prototype.handleDoneAdding = function handleDoneAdding(key, type) {
|
7168 | var props = this.props;
|
7169 | delete this.currentlyAnimatingKeys[key];
|
7170 | // if update on exclusive mode, skip check
|
7171 | if (props.exclusive && props !== this.nextProps) {
|
7172 | return;
|
7173 | }
|
7174 | var currentChildren = (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(props));
|
7175 | if (!this.isValidChildByKey(currentChildren, key)) {
|
7176 | // exclusive will not need this
|
7177 | this.performLeave(key);
|
7178 | } else {
|
7179 | if (type === 'appear') {
|
7180 | if (_util2["default"].allowAppearCallback(props)) {
|
7181 | props.onAppear(key);
|
7182 | props.onEnd(key, true);
|
7183 | }
|
7184 | } else {
|
7185 | if (_util2["default"].allowEnterCallback(props)) {
|
7186 | props.onEnter(key);
|
7187 | props.onEnd(key, true);
|
7188 | }
|
7189 | }
|
7190 | }
|
7191 | };
|
7192 |
|
7193 | Animate.prototype.performLeave = function performLeave(key) {
|
7194 | // may already remove by exclusive
|
7195 | if (this.refs[key]) {
|
7196 | this.currentlyAnimatingKeys[key] = true;
|
7197 | this.refs[key].componentWillLeave(this.handleDoneLeaving.bind(this, key));
|
7198 | }
|
7199 | };
|
7200 |
|
7201 | Animate.prototype.handleDoneLeaving = function handleDoneLeaving(key) {
|
7202 | var props = this.props;
|
7203 | delete this.currentlyAnimatingKeys[key];
|
7204 | // if update on exclusive mode, skip check
|
7205 | if (props.exclusive && props !== this.nextProps) {
|
7206 | return;
|
7207 | }
|
7208 | var currentChildren = (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(props));
|
7209 | // in case state change is too fast
|
7210 | if (this.isValidChildByKey(currentChildren, key)) {
|
7211 | this.performEnter(key);
|
7212 | } else {
|
7213 | var end = function end() {
|
7214 | if (_util2["default"].allowLeaveCallback(props)) {
|
7215 | props.onLeave(key);
|
7216 | props.onEnd(key, false);
|
7217 | }
|
7218 | };
|
7219 | /* eslint react/no-is-mounted:0 */
|
7220 | if (this.mounted && !(0, _ChildrenUtils.isSameChildren)(this.state.children, currentChildren, props.showProp)) {
|
7221 | this.setState({
|
7222 | children: currentChildren
|
7223 | }, end);
|
7224 | } else {
|
7225 | end();
|
7226 | }
|
7227 | }
|
7228 | };
|
7229 |
|
7230 | Animate.prototype.isValidChildByKey = function isValidChildByKey(currentChildren, key) {
|
7231 | var showProp = this.props.showProp;
|
7232 | if (showProp) {
|
7233 | return (0, _ChildrenUtils.findShownChildInChildrenByKey)(currentChildren, key, showProp);
|
7234 | }
|
7235 | return (0, _ChildrenUtils.findChildInChildrenByKey)(currentChildren, key);
|
7236 | };
|
7237 |
|
7238 | Animate.prototype.stop = function stop(key) {
|
7239 | delete this.currentlyAnimatingKeys[key];
|
7240 | var component = this.refs[key];
|
7241 | if (component) {
|
7242 | component.stop();
|
7243 | }
|
7244 | };
|
7245 |
|
7246 | Animate.prototype.render = function render() {
|
7247 | var props = this.props;
|
7248 | this.nextProps = props;
|
7249 | var stateChildren = this.state.children;
|
7250 | var children = null;
|
7251 | if (stateChildren) {
|
7252 | children = stateChildren.map(function (child) {
|
7253 | if (child === null || child === undefined) {
|
7254 | return child;
|
7255 | }
|
7256 | if (!child.key) {
|
7257 | throw new Error('must set key for <rc-animate> children');
|
7258 | }
|
7259 | return _react2["default"].createElement(
|
7260 | _AnimateChild2["default"],
|
7261 | {
|
7262 | key: child.key,
|
7263 | ref: child.key,
|
7264 | animation: props.animation,
|
7265 | transitionName: props.transitionName,
|
7266 | transitionEnter: props.transitionEnter,
|
7267 | transitionAppear: props.transitionAppear,
|
7268 | transitionLeave: props.transitionLeave
|
7269 | },
|
7270 | child
|
7271 | );
|
7272 | });
|
7273 | }
|
7274 | var Component = props.component;
|
7275 | if (Component) {
|
7276 | var passedProps = props;
|
7277 | if (typeof Component === 'string') {
|
7278 | passedProps = {
|
7279 | className: props.className,
|
7280 | style: props.style
|
7281 | };
|
7282 | }
|
7283 | return _react2["default"].createElement(
|
7284 | Component,
|
7285 | passedProps,
|
7286 | children
|
7287 | );
|
7288 | }
|
7289 | return children[0] || null;
|
7290 | };
|
7291 |
|
7292 | return Animate;
|
7293 | }(_react.Component);
|
7294 |
|
7295 | ;
|
7296 | Animate.defaultProps = defaultProps;
|
7297 | Animate.propTypes = Animate.propTypes;
|
7298 |
|
7299 | exports["default"] = Animate;
|
7300 | module.exports = exports['default'];
|
7301 |
|
7302 | /***/ }),
|
7303 | /* 85 */
|
7304 | /***/ (function(module, exports, __webpack_require__) {
|
7305 |
|
7306 | ;
|
7307 |
|
7308 | Object.defineProperty(exports, "__esModule", {
|
7309 | value: true
|
7310 | });
|
7311 | exports.toArrayChildren = toArrayChildren;
|
7312 | exports.findChildInChildrenByKey = findChildInChildrenByKey;
|
7313 | exports.findShownChildInChildrenByKey = findShownChildInChildrenByKey;
|
7314 | exports.findHiddenChildInChildrenByKey = findHiddenChildInChildrenByKey;
|
7315 | exports.isSameChildren = isSameChildren;
|
7316 | exports.mergeChildren = mergeChildren;
|
7317 |
|
7318 | var _react = __webpack_require__(4);
|
7319 |
|
7320 | var _react2 = _interopRequireDefault(_react);
|
7321 |
|
7322 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
7323 |
|
7324 | function toArrayChildren(children) {
|
7325 | var ret = [];
|
7326 | _react2["default"].Children.forEach(children, function (child) {
|
7327 | ret.push(child);
|
7328 | });
|
7329 | return ret;
|
7330 | }
|
7331 |
|
7332 | function findChildInChildrenByKey(children, key) {
|
7333 | var ret = null;
|
7334 | if (children) {
|
7335 | children.forEach(function (child) {
|
7336 | if (ret) {
|
7337 | return;
|
7338 | }
|
7339 | if (child && child.key === key) {
|
7340 | ret = child;
|
7341 | }
|
7342 | });
|
7343 | }
|
7344 | return ret;
|
7345 | }
|
7346 |
|
7347 | function findShownChildInChildrenByKey(children, key, showProp) {
|
7348 | var ret = null;
|
7349 | if (children) {
|
7350 | children.forEach(function (child) {
|
7351 | if (child && child.key === key && child.props[showProp]) {
|
7352 | if (ret) {
|
7353 | throw new Error('two child with same key for <rc-animate> children');
|
7354 | }
|
7355 | ret = child;
|
7356 | }
|
7357 | });
|
7358 | }
|
7359 | return ret;
|
7360 | }
|
7361 |
|
7362 | function findHiddenChildInChildrenByKey(children, key, showProp) {
|
7363 | var found = 0;
|
7364 | if (children) {
|
7365 | children.forEach(function (child) {
|
7366 | if (found) {
|
7367 | return;
|
7368 | }
|
7369 | found = child && child.key === key && !child.props[showProp];
|
7370 | });
|
7371 | }
|
7372 | return found;
|
7373 | }
|
7374 |
|
7375 | function isSameChildren(c1, c2, showProp) {
|
7376 | var same = c1.length === c2.length;
|
7377 | if (same) {
|
7378 | c1.forEach(function (child, index) {
|
7379 | var child2 = c2[index];
|
7380 | if (child && child2) {
|
7381 | if (child && !child2 || !child && child2) {
|
7382 | same = false;
|
7383 | } else if (child.key !== child2.key) {
|
7384 | same = false;
|
7385 | } else if (showProp && child.props[showProp] !== child2.props[showProp]) {
|
7386 | same = false;
|
7387 | }
|
7388 | }
|
7389 | });
|
7390 | }
|
7391 | return same;
|
7392 | }
|
7393 |
|
7394 | function mergeChildren(prev, next) {
|
7395 | var ret = [];
|
7396 |
|
7397 | // For each key of `next`, the list of keys to insert before that key in
|
7398 | // the combined list
|
7399 | var nextChildrenPending = {};
|
7400 | var pendingChildren = [];
|
7401 | prev.forEach(function (child) {
|
7402 | if (child && findChildInChildrenByKey(next, child.key)) {
|
7403 | if (pendingChildren.length) {
|
7404 | nextChildrenPending[child.key] = pendingChildren;
|
7405 | pendingChildren = [];
|
7406 | }
|
7407 | } else {
|
7408 | pendingChildren.push(child);
|
7409 | }
|
7410 | });
|
7411 |
|
7412 | next.forEach(function (child) {
|
7413 | if (child && nextChildrenPending.hasOwnProperty(child.key)) {
|
7414 | ret = ret.concat(nextChildrenPending[child.key]);
|
7415 | }
|
7416 | ret.push(child);
|
7417 | });
|
7418 |
|
7419 | ret = ret.concat(pendingChildren);
|
7420 |
|
7421 | return ret;
|
7422 | }
|
7423 |
|
7424 | /***/ }),
|
7425 | /* 86 */
|
7426 | /***/ (function(module, exports, __webpack_require__) {
|
7427 |
|
7428 | ;
|
7429 |
|
7430 | Object.defineProperty(exports, "__esModule", {
|
7431 | value: true
|
7432 | });
|
7433 |
|
7434 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
7435 |
|
7436 | var _react = __webpack_require__(4);
|
7437 |
|
7438 | var _react2 = _interopRequireDefault(_react);
|
7439 |
|
7440 | var _reactDom = __webpack_require__(11);
|
7441 |
|
7442 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
7443 |
|
7444 | var _tinperBeeCore = __webpack_require__(25);
|
7445 |
|
7446 | var _util = __webpack_require__(87);
|
7447 |
|
7448 | var _util2 = _interopRequireDefault(_util);
|
7449 |
|
7450 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
7451 |
|
7452 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
7453 |
|
7454 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
7455 |
|
7456 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
7457 |
|
7458 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
7459 |
|
7460 | var transitionMap = {
|
7461 | enter: 'transitionEnter',
|
7462 | appear: 'transitionAppear',
|
7463 | leave: 'transitionLeave'
|
7464 | };
|
7465 |
|
7466 | var propTypes = {
|
7467 | children: _react.PropTypes.any
|
7468 | };
|
7469 |
|
7470 | var AnimateChild = function (_Component) {
|
7471 | _inherits(AnimateChild, _Component);
|
7472 |
|
7473 | function AnimateChild(props) {
|
7474 | _classCallCheck(this, AnimateChild);
|
7475 |
|
7476 | var _this = _possibleConstructorReturn(this, _Component.call(this, props));
|
7477 |
|
7478 | _this.transition = _this.transition.bind(_this);
|
7479 | _this.stop = _this.stop.bind(_this);
|
7480 | return _this;
|
7481 | }
|
7482 |
|
7483 | AnimateChild.prototype.componentWillUnmount = function componentWillUnmount() {
|
7484 | this.stop();
|
7485 | };
|
7486 |
|
7487 | AnimateChild.prototype.componentWillEnter = function componentWillEnter(done) {
|
7488 | if (_util2["default"].isEnterSupported(this.props)) {
|
7489 | this.transition('enter', done);
|
7490 | } else {
|
7491 | done();
|
7492 | }
|
7493 | };
|
7494 |
|
7495 | AnimateChild.prototype.componentWillAppear = function componentWillAppear(done) {
|
7496 | if (_util2["default"].isAppearSupported(this.props)) {
|
7497 | this.transition('appear', done);
|
7498 | } else {
|
7499 | done();
|
7500 | }
|
7501 | };
|
7502 |
|
7503 | AnimateChild.prototype.componentWillLeave = function componentWillLeave(done) {
|
7504 | if (_util2["default"].isLeaveSupported(this.props)) {
|
7505 | this.transition('leave', done);
|
7506 | } else {
|
7507 | // always sync, do not interupt with react component life cycle
|
7508 | // update hidden -> animate hidden ->
|
7509 | // didUpdate -> animate leave -> unmount (if animate is none)
|
7510 | done();
|
7511 | }
|
7512 | };
|
7513 |
|
7514 | AnimateChild.prototype.transition = function transition(animationType, finishCallback) {
|
7515 | var _this2 = this;
|
7516 |
|
7517 | var node = _reactDom2["default"].findDOMNode(this);
|
7518 | var props = this.props;
|
7519 | var transitionName = props.transitionName;
|
7520 | var nameIsObj = (typeof transitionName === 'undefined' ? 'undefined' : _typeof(transitionName)) === 'object';
|
7521 | this.stop();
|
7522 | var end = function end() {
|
7523 | _this2.stopper = null;
|
7524 | finishCallback();
|
7525 | };
|
7526 | if ((_tinperBeeCore.cssAnimation.isCssAnimationSupported || !props.animation[animationType]) && transitionName && props[transitionMap[animationType]]) {
|
7527 | var name = nameIsObj ? transitionName[animationType] : transitionName + '-' + animationType;
|
7528 | var activeName = name + '-active';
|
7529 | if (nameIsObj && transitionName[animationType + 'Active']) {
|
7530 | activeName = transitionName[animationType + 'Active'];
|
7531 | }
|
7532 | this.stopper = (0, _tinperBeeCore.cssAnimation)(node, {
|
7533 | name: name,
|
7534 | active: activeName
|
7535 | }, end);
|
7536 | } else {
|
7537 | this.stopper = props.animation[animationType](node, end);
|
7538 | }
|
7539 | };
|
7540 |
|
7541 | AnimateChild.prototype.stop = function stop() {
|
7542 | var stopper = this.stopper;
|
7543 | if (stopper) {
|
7544 | this.stopper = null;
|
7545 | stopper.stop();
|
7546 | }
|
7547 | };
|
7548 |
|
7549 | AnimateChild.prototype.render = function render() {
|
7550 | return this.props.children;
|
7551 | };
|
7552 |
|
7553 | return AnimateChild;
|
7554 | }(_react.Component);
|
7555 |
|
7556 | ;
|
7557 |
|
7558 | AnimateChild.propTypes = propTypes;
|
7559 |
|
7560 | exports["default"] = AnimateChild;
|
7561 | module.exports = exports['default'];
|
7562 |
|
7563 | /***/ }),
|
7564 | /* 87 */
|
7565 | /***/ (function(module, exports) {
|
7566 |
|
7567 | ;
|
7568 |
|
7569 | Object.defineProperty(exports, "__esModule", {
|
7570 | value: true
|
7571 | });
|
7572 | var util = {
|
7573 | isAppearSupported: function isAppearSupported(props) {
|
7574 | return props.transitionName && props.transitionAppear || props.animation.appear;
|
7575 | },
|
7576 | isEnterSupported: function isEnterSupported(props) {
|
7577 | return props.transitionName && props.transitionEnter || props.animation.enter;
|
7578 | },
|
7579 | isLeaveSupported: function isLeaveSupported(props) {
|
7580 | return props.transitionName && props.transitionLeave || props.animation.leave;
|
7581 | },
|
7582 | allowAppearCallback: function allowAppearCallback(props) {
|
7583 | return props.transitionAppear || props.animation.appear;
|
7584 | },
|
7585 | allowEnterCallback: function allowEnterCallback(props) {
|
7586 | return props.transitionEnter || props.animation.enter;
|
7587 | },
|
7588 | allowLeaveCallback: function allowLeaveCallback(props) {
|
7589 | return props.transitionLeave || props.animation.leave;
|
7590 | }
|
7591 | };
|
7592 | exports["default"] = util;
|
7593 | module.exports = exports["default"];
|
7594 |
|
7595 | /***/ }),
|
7596 | /* 88 */
|
7597 | /***/ (function(module, exports, __webpack_require__) {
|
7598 |
|
7599 | ;
|
7600 |
|
7601 | Object.defineProperty(exports, "__esModule", {
|
7602 | value: true
|
7603 | });
|
7604 |
|
7605 | var _react = __webpack_require__(4);
|
7606 |
|
7607 | var _react2 = _interopRequireDefault(_react);
|
7608 |
|
7609 | var _classnames = __webpack_require__(3);
|
7610 |
|
7611 | var _classnames2 = _interopRequireDefault(_classnames);
|
7612 |
|
7613 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
7614 |
|
7615 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
7616 |
|
7617 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
7618 |
|
7619 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
7620 |
|
7621 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
7622 |
|
7623 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
7624 |
|
7625 | var propTypes = {
|
7626 | duration: _react.PropTypes.number,
|
7627 | onClose: _react.PropTypes.func,
|
7628 | children: _react.PropTypes.any,
|
7629 | color: _react.PropTypes.oneOf(['light']),
|
7630 | title: _react.PropTypes.any
|
7631 | };
|
7632 |
|
7633 | function noop() {}
|
7634 |
|
7635 | var defaultProps = {
|
7636 | onEnd: noop,
|
7637 | onClose: noop,
|
7638 | duration: 4.5,
|
7639 | closable: true
|
7640 | };
|
7641 |
|
7642 | var Notice = function (_React$Component) {
|
7643 | _inherits(Notice, _React$Component);
|
7644 |
|
7645 | function Notice(props) {
|
7646 | _classCallCheck(this, Notice);
|
7647 |
|
7648 | var _this = _possibleConstructorReturn(this, _React$Component.call(this, props));
|
7649 |
|
7650 | _this.clearCloseTimer = _this.clearCloseTimer.bind(_this);
|
7651 | _this.close = _this.close.bind(_this);
|
7652 | return _this;
|
7653 | }
|
7654 |
|
7655 | Notice.prototype.componentDidMount = function componentDidMount() {
|
7656 | var _this2 = this;
|
7657 |
|
7658 | if (this.props.duration) {
|
7659 | this.closeTimer = setTimeout(function () {
|
7660 | _this2.close();
|
7661 | }, this.props.duration * 1000);
|
7662 | }
|
7663 | };
|
7664 |
|
7665 | Notice.prototype.componentWillUnmount = function componentWillUnmount() {
|
7666 | this.clearCloseTimer();
|
7667 | };
|
7668 |
|
7669 | Notice.prototype.clearCloseTimer = function clearCloseTimer() {
|
7670 | if (this.closeTimer) {
|
7671 | clearTimeout(this.closeTimer);
|
7672 | this.closeTimer = null;
|
7673 | }
|
7674 | };
|
7675 |
|
7676 | Notice.prototype.close = function close() {
|
7677 | this.clearCloseTimer();
|
7678 | this.props.onClose();
|
7679 | };
|
7680 |
|
7681 | Notice.prototype.render = function render() {
|
7682 | var _classes;
|
7683 |
|
7684 | var _props = this.props;
|
7685 | var closable = _props.closable;
|
7686 | var clsPrefix = _props.clsPrefix;
|
7687 | var className = _props.className;
|
7688 | var style = _props.style;
|
7689 | var children = _props.children;
|
7690 | var color = _props.color;
|
7691 | var title = _props.title;
|
7692 |
|
7693 | var componentClass = clsPrefix + '-notice';
|
7694 | var classes = (_classes = {}, _defineProperty(_classes, '' + componentClass, 1), _defineProperty(_classes, componentClass + '-closable', closable), _defineProperty(_classes, className, !!className), _classes);
|
7695 | if (color) {
|
7696 | classes[componentClass + '-' + color] = true;
|
7697 | }
|
7698 | return _react2["default"].createElement(
|
7699 | 'div',
|
7700 | { className: (0, _classnames2["default"])(classes), style: style, onClick: this.close },
|
7701 | _react2["default"].createElement(
|
7702 | 'div',
|
7703 | { className: componentClass + '-content' },
|
7704 | title && _react2["default"].createElement(
|
7705 | 'div',
|
7706 | { className: componentClass + '-title' },
|
7707 | title
|
7708 | ),
|
7709 | _react2["default"].createElement(
|
7710 | 'div',
|
7711 | { className: componentClass + '-description' },
|
7712 | children
|
7713 | )
|
7714 | ),
|
7715 | closable ? _react2["default"].createElement(
|
7716 | 'a',
|
7717 | { tabIndex: '0', onClick: this.close, className: componentClass + '-close' },
|
7718 | _react2["default"].createElement('span', { className: componentClass + '-close-x' })
|
7719 | ) : null
|
7720 | );
|
7721 | };
|
7722 |
|
7723 | return Notice;
|
7724 | }(_react2["default"].Component);
|
7725 |
|
7726 | ;
|
7727 |
|
7728 | Notice.PropTypes = _react.PropTypes;
|
7729 | Notice.defaultProps = defaultProps;
|
7730 |
|
7731 | exports["default"] = Notice;
|
7732 | module.exports = exports['default'];
|
7733 |
|
7734 | /***/ }),
|
7735 | /* 89 */
|
7736 | /***/ (function(module, exports, __webpack_require__) {
|
7737 |
|
7738 | ;
|
7739 |
|
7740 | Object.defineProperty(exports, "__esModule", {
|
7741 | value: true
|
7742 | });
|
7743 |
|
7744 | var _Button = __webpack_require__(90);
|
7745 |
|
7746 | var _Button2 = _interopRequireDefault(_Button);
|
7747 |
|
7748 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
7749 |
|
7750 | exports["default"] = _Button2["default"];
|
7751 | module.exports = exports['default'];
|
7752 |
|
7753 | /***/ }),
|
7754 | /* 90 */
|
7755 | /***/ (function(module, exports, __webpack_require__) {
|
7756 |
|
7757 | ;
|
7758 |
|
7759 | Object.defineProperty(exports, "__esModule", {
|
7760 | value: true
|
7761 | });
|
7762 |
|
7763 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
7764 |
|
7765 | var _react = __webpack_require__(4);
|
7766 |
|
7767 | var _react2 = _interopRequireDefault(_react);
|
7768 |
|
7769 | var _reactDom = __webpack_require__(11);
|
7770 |
|
7771 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
7772 |
|
7773 | var _classnames = __webpack_require__(3);
|
7774 |
|
7775 | var _classnames2 = _interopRequireDefault(_classnames);
|
7776 |
|
7777 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
7778 |
|
7779 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
7780 |
|
7781 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
7782 |
|
7783 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
7784 |
|
7785 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
7786 |
|
7787 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
7788 |
|
7789 | var propTypes = {
|
7790 | /**
|
7791 | * @title 尺寸
|
7792 | */
|
7793 | size: _react.PropTypes.oneOf(['sm', 'xg', 'lg']),
|
7794 | /**
|
7795 | * @title 样式
|
7796 | */
|
7797 | style: _react.PropTypes.object,
|
7798 | /**
|
7799 | * @title 形状
|
7800 | */
|
7801 | shape: _react.PropTypes.oneOf(['block', 'round', 'squared', 'floating', 'pillRight', 'pillLeft', 'icon']),
|
7802 |
|
7803 | bordered: _react.PropTypes.bool,
|
7804 | /**
|
7805 | * @title 类型
|
7806 | */
|
7807 | colors: _react.PropTypes.oneOf(['primary', 'accent', 'success', 'info', 'warning', 'danger', 'default']),
|
7808 | /**
|
7809 | * @title 是否禁用
|
7810 | * @veIgnore
|
7811 | */
|
7812 | disabled: _react.PropTypes.bool,
|
7813 | /**
|
7814 | * @title 类名
|
7815 | * @veIgnore
|
7816 | */
|
7817 | className: _react.PropTypes.string,
|
7818 |
|
7819 | /**
|
7820 | * @title <button> 的 type
|
7821 | * @veIgnore
|
7822 | */
|
7823 | htmlType: _react.PropTypes.oneOf(['submit', 'button', 'reset'])
|
7824 | };
|
7825 |
|
7826 | var defaultProps = {
|
7827 | disabled: false,
|
7828 | htmlType: 'button',
|
7829 | clsPrefix: 'u-button',
|
7830 | bordered: false
|
7831 |
|
7832 | };
|
7833 |
|
7834 | var sizeMap = {
|
7835 | sm: 'sm',
|
7836 | xg: 'xg',
|
7837 | lg: 'lg'
|
7838 | },
|
7839 | colorsMap = {
|
7840 | primary: 'primary',
|
7841 | accent: 'accent',
|
7842 | success: 'success',
|
7843 | info: 'info',
|
7844 | warning: 'warning',
|
7845 | danger: 'danger'
|
7846 | },
|
7847 | shapeMap = {
|
7848 | block: 'block',
|
7849 | round: 'round',
|
7850 | squared: 'squared',
|
7851 | floating: 'floating',
|
7852 | pillRight: 'pill-right',
|
7853 | pillLeft: 'pill-left',
|
7854 | icon: 'icon'
|
7855 | };
|
7856 |
|
7857 | var Button = function (_Component) {
|
7858 | _inherits(Button, _Component);
|
7859 |
|
7860 | function Button(props) {
|
7861 | _classCallCheck(this, Button);
|
7862 |
|
7863 | return _possibleConstructorReturn(this, _Component.call(this, props));
|
7864 | }
|
7865 |
|
7866 | Button.prototype.render = function render() {
|
7867 | var _props = this.props;
|
7868 | var colors = _props.colors;
|
7869 | var shape = _props.shape;
|
7870 | var disabled = _props.disabled;
|
7871 | var className = _props.className;
|
7872 | var size = _props.size;
|
7873 | var bordered = _props.bordered;
|
7874 | var children = _props.children;
|
7875 | var htmlType = _props.htmlType;
|
7876 | var clsPrefix = _props.clsPrefix;
|
7877 |
|
7878 | var others = _objectWithoutProperties(_props, ['colors', 'shape', 'disabled', 'className', 'size', 'bordered', 'children', 'htmlType', 'clsPrefix']);
|
7879 |
|
7880 | var clsObj = {};
|
7881 | if (className) {
|
7882 | clsObj[className] = true;
|
7883 | }
|
7884 | if (sizeMap[size]) {
|
7885 | clsObj[clsPrefix + '-' + sizeMap[size]] = true;
|
7886 | }
|
7887 | if (shapeMap[shape]) {
|
7888 | clsObj[clsPrefix + '-' + shapeMap[shape]] = true;
|
7889 | }
|
7890 | if (colorsMap[colors]) {
|
7891 | clsObj[clsPrefix + '-' + colorsMap[colors]] = true;
|
7892 | }
|
7893 | clsObj[clsPrefix + '-border'] = bordered;
|
7894 | var classes = (0, _classnames2["default"])(clsPrefix, clsObj);
|
7895 | return _react2["default"].createElement(
|
7896 | 'button',
|
7897 | _extends({
|
7898 | type: htmlType,
|
7899 | className: classes,
|
7900 | disabled: disabled
|
7901 | }, others),
|
7902 | this.props.children
|
7903 | );
|
7904 | };
|
7905 |
|
7906 | return Button;
|
7907 | }(_react.Component);
|
7908 |
|
7909 | Button.propTypes = propTypes;
|
7910 | Button.defaultProps = defaultProps;
|
7911 |
|
7912 | exports["default"] = Button;
|
7913 | module.exports = exports['default'];
|
7914 |
|
7915 | /***/ }),
|
7916 | /* 91 */
|
7917 | /***/ (function(module, exports, __webpack_require__) {
|
7918 |
|
7919 | ;
|
7920 |
|
7921 | Object.defineProperty(exports, "__esModule", {
|
7922 | value: true
|
7923 | });
|
7924 |
|
7925 | var _react = __webpack_require__(4);
|
7926 |
|
7927 | var _react2 = _interopRequireDefault(_react);
|
7928 |
|
7929 | var _src = __webpack_require__(74);
|
7930 |
|
7931 | var _src2 = _interopRequireDefault(_src);
|
7932 |
|
7933 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
7934 |
|
7935 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
7936 |
|
7937 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
7938 |
|
7939 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
7940 |
|
7941 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } /**
|
7942 | *
|
7943 | * @title 常用基础 Step
|
7944 | * @description current 标记当前机型哪一步
|
7945 | *
|
7946 | */
|
7947 |
|
7948 | var Demo1 = function (_Component) {
|
7949 | _inherits(Demo1, _Component);
|
7950 |
|
7951 | function Demo1() {
|
7952 | _classCallCheck(this, Demo1);
|
7953 |
|
7954 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
7955 | }
|
7956 |
|
7957 | Demo1.prototype.render = function render() {
|
7958 | return _react2['default'].createElement(
|
7959 | 'div',
|
7960 | null,
|
7961 | _react2['default'].createElement(
|
7962 | _src2['default'].Steps,
|
7963 | { current: 1 },
|
7964 | _react2['default'].createElement(_src2['default'], { title: 'Finished', description: 'This is a description.' }),
|
7965 | _react2['default'].createElement(_src2['default'], { title: 'In Progress', description: 'This is a description.' }),
|
7966 | _react2['default'].createElement(_src2['default'], { title: 'Waiting', description: 'This is a description.' })
|
7967 | )
|
7968 | );
|
7969 | };
|
7970 |
|
7971 | return Demo1;
|
7972 | }(_react.Component);
|
7973 |
|
7974 | exports['default'] = Demo1;
|
7975 | module.exports = exports['default'];
|
7976 |
|
7977 | /***/ }),
|
7978 | /* 92 */
|
7979 | /***/ (function(module, exports, __webpack_require__) {
|
7980 |
|
7981 | ;
|
7982 |
|
7983 | Object.defineProperty(exports, "__esModule", {
|
7984 | value: true
|
7985 | });
|
7986 |
|
7987 | var _react = __webpack_require__(4);
|
7988 |
|
7989 | var _react2 = _interopRequireDefault(_react);
|
7990 |
|
7991 | var _beeIcon = __webpack_require__(77);
|
7992 |
|
7993 | var _beeIcon2 = _interopRequireDefault(_beeIcon);
|
7994 |
|
7995 | var _src = __webpack_require__(74);
|
7996 |
|
7997 | var _src2 = _interopRequireDefault(_src);
|
7998 |
|
7999 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
8000 |
|
8001 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
8002 |
|
8003 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
8004 |
|
8005 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
8006 |
|
8007 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } /**
|
8008 | *
|
8009 | * @title 自定义icon Step
|
8010 | * @description
|
8011 | *
|
8012 | */
|
8013 |
|
8014 | var Demo2 = function (_Component) {
|
8015 | _inherits(Demo2, _Component);
|
8016 |
|
8017 | function Demo2() {
|
8018 | _classCallCheck(this, Demo2);
|
8019 |
|
8020 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
8021 | }
|
8022 |
|
8023 | Demo2.prototype.render = function render() {
|
8024 | return _react2['default'].createElement(
|
8025 | _src2['default'].Steps,
|
8026 | null,
|
8027 | _react2['default'].createElement(_src2['default'], { status: 'finish', title: 'Login', icon: _react2['default'].createElement(_beeIcon2['default'], { type: 'uf-users-o' }) }),
|
8028 | _react2['default'].createElement(_src2['default'], { status: 'finish', title: 'Verification', icon: _react2['default'].createElement(_beeIcon2['default'], { type: 'uf-personin-o' }) }),
|
8029 | _react2['default'].createElement(_src2['default'], { status: 'process', title: 'Pay', icon: _react2['default'].createElement(_beeIcon2['default'], { type: 'uf-creditcard' }) }),
|
8030 | _react2['default'].createElement(_src2['default'], { status: 'wait', title: 'Done', icon: _react2['default'].createElement(_beeIcon2['default'], { type: 'uf-correct-2' }) })
|
8031 | );
|
8032 | };
|
8033 |
|
8034 | return Demo2;
|
8035 | }(_react.Component);
|
8036 |
|
8037 | exports['default'] = Demo2;
|
8038 | module.exports = exports['default'];
|
8039 |
|
8040 | /***/ }),
|
8041 | /* 93 */
|
8042 | /***/ (function(module, exports, __webpack_require__) {
|
8043 |
|
8044 | ;
|
8045 |
|
8046 | Object.defineProperty(exports, "__esModule", {
|
8047 | value: true
|
8048 | });
|
8049 |
|
8050 | var _react = __webpack_require__(4);
|
8051 |
|
8052 | var _react2 = _interopRequireDefault(_react);
|
8053 |
|
8054 | var _beeIcon = __webpack_require__(77);
|
8055 |
|
8056 | var _beeIcon2 = _interopRequireDefault(_beeIcon);
|
8057 |
|
8058 | var _beeMessage = __webpack_require__(79);
|
8059 |
|
8060 | var _beeMessage2 = _interopRequireDefault(_beeMessage);
|
8061 |
|
8062 | var _beeButton = __webpack_require__(89);
|
8063 |
|
8064 | var _beeButton2 = _interopRequireDefault(_beeButton);
|
8065 |
|
8066 | var _src = __webpack_require__(74);
|
8067 |
|
8068 | var _src2 = _interopRequireDefault(_src);
|
8069 |
|
8070 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
8071 |
|
8072 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
8073 |
|
8074 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
8075 |
|
8076 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
8077 |
|
8078 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
8079 | /**
|
8080 | *
|
8081 | * @title 结合切换事件的 Step
|
8082 | * @description 点击next,Step的流程跟进
|
8083 | *
|
8084 | */
|
8085 |
|
8086 |
|
8087 | var Steps = _src2['default'].Steps;
|
8088 |
|
8089 | var steps = [{
|
8090 | title: 'First',
|
8091 | content: 'First-content'
|
8092 | }, {
|
8093 | title: 'Second',
|
8094 | content: 'Second-content'
|
8095 | }, {
|
8096 | title: 'Last',
|
8097 | content: 'Last-content'
|
8098 | }];
|
8099 |
|
8100 | var Demo3 = function (_Component) {
|
8101 | _inherits(Demo3, _Component);
|
8102 |
|
8103 | function Demo3(props) {
|
8104 | _classCallCheck(this, Demo3);
|
8105 |
|
8106 | var _this = _possibleConstructorReturn(this, _Component.call(this, props));
|
8107 |
|
8108 | _this.state = {
|
8109 | current: 0
|
8110 | };
|
8111 | return _this;
|
8112 | }
|
8113 |
|
8114 | Demo3.prototype.next = function next() {
|
8115 | var current = this.state.current + 1;
|
8116 | this.setState({ current: current });
|
8117 | };
|
8118 |
|
8119 | Demo3.prototype.prev = function prev() {
|
8120 | var current = this.state.current - 1;
|
8121 | this.setState({ current: current });
|
8122 | };
|
8123 |
|
8124 | Demo3.prototype.alertDone = function alertDone() {
|
8125 | _beeMessage2['default'].create({ content: 'done', color: 'info' });
|
8126 | };
|
8127 |
|
8128 | Demo3.prototype.render = function render() {
|
8129 | var _this2 = this;
|
8130 |
|
8131 | var current = this.state.current;
|
8132 |
|
8133 | return _react2['default'].createElement(
|
8134 | 'div',
|
8135 | null,
|
8136 | _react2['default'].createElement(
|
8137 | Steps,
|
8138 | { current: current },
|
8139 | steps.map(function (item) {
|
8140 | return _react2['default'].createElement(_src2['default'], { key: item.title, title: item.title });
|
8141 | })
|
8142 | ),
|
8143 | _react2['default'].createElement(
|
8144 | 'div',
|
8145 | { className: 'steps-content' },
|
8146 | steps[this.state.current].content
|
8147 | ),
|
8148 | _react2['default'].createElement(
|
8149 | 'div',
|
8150 | { className: 'steps-action' },
|
8151 | this.state.current < steps.length - 1 && _react2['default'].createElement(
|
8152 | _beeButton2['default'],
|
8153 | { type: 'primary', onClick: function onClick() {
|
8154 | return _this2.next();
|
8155 | } },
|
8156 | 'Next'
|
8157 | ),
|
8158 | this.state.current === steps.length - 1 && _react2['default'].createElement(
|
8159 | _beeButton2['default'],
|
8160 | { type: 'primary', onClick: function onClick() {
|
8161 | return _this2.alertDone();
|
8162 | } },
|
8163 | 'Done'
|
8164 | ),
|
8165 | this.state.current > 0 && _react2['default'].createElement(
|
8166 | _beeButton2['default'],
|
8167 | { style: { marginLeft: 8 }, onClick: function onClick() {
|
8168 | return _this2.prev();
|
8169 | } },
|
8170 | 'Previous'
|
8171 | )
|
8172 | )
|
8173 | );
|
8174 | };
|
8175 |
|
8176 | return Demo3;
|
8177 | }(_react.Component);
|
8178 |
|
8179 | exports['default'] = Demo3;
|
8180 | module.exports = exports['default'];
|
8181 |
|
8182 | /***/ }),
|
8183 | /* 94 */
|
8184 | /***/ (function(module, exports, __webpack_require__) {
|
8185 |
|
8186 | ;
|
8187 |
|
8188 | Object.defineProperty(exports, "__esModule", {
|
8189 | value: true
|
8190 | });
|
8191 |
|
8192 | var _react = __webpack_require__(4);
|
8193 |
|
8194 | var _react2 = _interopRequireDefault(_react);
|
8195 |
|
8196 | var _src = __webpack_require__(74);
|
8197 |
|
8198 | var _src2 = _interopRequireDefault(_src);
|
8199 |
|
8200 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
8201 |
|
8202 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
8203 |
|
8204 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
8205 |
|
8206 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
8207 |
|
8208 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } /**
|
8209 | *
|
8210 | * @title vertical Step
|
8211 | * @description
|
8212 | *
|
8213 | */
|
8214 |
|
8215 | var Steps = _src2['default'].Steps;
|
8216 |
|
8217 | var Demo4 = function (_Component) {
|
8218 | _inherits(Demo4, _Component);
|
8219 |
|
8220 | function Demo4() {
|
8221 | _classCallCheck(this, Demo4);
|
8222 |
|
8223 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
8224 | }
|
8225 |
|
8226 | Demo4.prototype.render = function render() {
|
8227 | return _react2['default'].createElement(
|
8228 | 'div',
|
8229 | null,
|
8230 | _react2['default'].createElement(
|
8231 | Steps,
|
8232 | { direction: 'vertical', size: 'small', current: 1 },
|
8233 | _react2['default'].createElement(_src2['default'], { title: 'Finished', description: 'This is a description.' }),
|
8234 | _react2['default'].createElement(_src2['default'], { title: 'In Progress', description: 'This is a description.' }),
|
8235 | _react2['default'].createElement(_src2['default'], { title: 'Waiting', description: 'This is a description.' })
|
8236 | )
|
8237 | );
|
8238 | };
|
8239 |
|
8240 | return Demo4;
|
8241 | }(_react.Component);
|
8242 |
|
8243 | exports['default'] = Demo4;
|
8244 | module.exports = exports['default'];
|
8245 |
|
8246 | /***/ }),
|
8247 | /* 95 */
|
8248 | /***/ (function(module, exports, __webpack_require__) {
|
8249 |
|
8250 | ;
|
8251 |
|
8252 | Object.defineProperty(exports, "__esModule", {
|
8253 | value: true
|
8254 | });
|
8255 |
|
8256 | var _react = __webpack_require__(4);
|
8257 |
|
8258 | var _react2 = _interopRequireDefault(_react);
|
8259 |
|
8260 | var _src = __webpack_require__(74);
|
8261 |
|
8262 | var _src2 = _interopRequireDefault(_src);
|
8263 |
|
8264 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
8265 |
|
8266 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
8267 |
|
8268 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
8269 |
|
8270 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
8271 |
|
8272 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } /**
|
8273 | *
|
8274 | * @title 指定状态的Step
|
8275 | * @description 用step的status属性,指定当前step的状态
|
8276 | *
|
8277 | */
|
8278 |
|
8279 | var Steps = _src2['default'].Steps;
|
8280 |
|
8281 | var Demo5 = function (_Component) {
|
8282 | _inherits(Demo5, _Component);
|
8283 |
|
8284 | function Demo5() {
|
8285 | _classCallCheck(this, Demo5);
|
8286 |
|
8287 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
8288 | }
|
8289 |
|
8290 | Demo5.prototype.render = function render() {
|
8291 | return _react2['default'].createElement(
|
8292 | 'div',
|
8293 | null,
|
8294 | _react2['default'].createElement(
|
8295 | Steps,
|
8296 | { current: 1, status: 'error' },
|
8297 | _react2['default'].createElement(_src2['default'], { title: 'Finished', description: 'This is a description' }),
|
8298 | _react2['default'].createElement(_src2['default'], { title: 'In Process', description: 'This is a description' }),
|
8299 | _react2['default'].createElement(_src2['default'], { title: 'Waiting', description: 'This is a description' })
|
8300 | )
|
8301 | );
|
8302 | };
|
8303 |
|
8304 | return Demo5;
|
8305 | }(_react.Component);
|
8306 |
|
8307 | exports['default'] = Demo5;
|
8308 | module.exports = exports['default'];
|
8309 |
|
8310 | /***/ })
|
8311 | /******/ ]);
|
8312 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVtby5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBlODkyNGIxMDE0OWQ4ZGQ1NTQ2NSIsIndlYnBhY2s6Ly8vZGVtby9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1sYXlvdXQvYnVpbGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtbGF5b3V0L2J1aWxkL0NvbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NsYXNzbmFtZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiUmVhY3RcIiIsIndlYnBhY2s6Ly8vLi9+L2JlZS1sYXlvdXQvYnVpbGQvUm93LmpzIiwid2VicGFjazovLy8uL34vYmVlLWxheW91dC9idWlsZC9MYXlvdXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtcGFuZWwvYnVpbGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtcGFuZWwvYnVpbGQvUGFuZWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtdHJhbnNpdGlvbi9idWlsZC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS10cmFuc2l0aW9uL2J1aWxkL1RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiUmVhY3RET01cIiIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3RyYW5zaXRpb24vcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3V0aWwvaW5ET00uanMiLCJ3ZWJwYWNrOi8vLy4vfi9kb20taGVscGVycy9ldmVudHMvb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtdHJhbnNpdGlvbi9idWlsZC9Db2xsYXBzZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3N0eWxlL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vZG9tLWhlbHBlcnMvdXRpbC9jYW1lbGl6ZVN0eWxlLmpzIiwid2VicGFjazovLy8uL34vZG9tLWhlbHBlcnMvdXRpbC9jYW1lbGl6ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3V0aWwvaHlwaGVuYXRlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9kb20taGVscGVycy91dGlsL2h5cGhlbmF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3N0eWxlL2dldENvbXB1dGVkU3R5bGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9kb20taGVscGVycy9zdHlsZS9yZW1vdmVTdHlsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3RyYW5zaXRpb24vaXNUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtdHJhbnNpdGlvbi9idWlsZC91dGlsL2NhcGl0YWxpemUuanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vdGlucGVyLWJlZS1jb3JlL2xpYi9hbGwuanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL3V0aWxzL2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyLmpzIiwid2VicGFjazovLy8uL34vdGlucGVyLWJlZS1jb3JlL2xpYi9jb21wb25lbnRPckVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL2RlcHJlY2F0ZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi93YXJuaW5nL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy91c3IvbG9jYWwvbGliL34vYmVlLXRvb2xzL34vcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL34vdGlucGVyLWJlZS1jb3JlL2xpYi9lbGVtZW50VHlwZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3RpbnBlci1iZWUtY29yZS9saWIvaXNSZXF1aXJlZEZvckExMXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL3NwbGl0Q29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9lbnRyaWVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9lbnRyaWVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5leHBvcnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmdsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuY29yZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuY3R4LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5hLWZ1bmN0aW9uLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5vYmplY3QtdG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC50by1pb2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5pb2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5jb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmRlZmluZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL2NyZWF0ZUNoYWluZWRGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L3RpbnBlci1iZWUtY29yZS9saWIva2V5Q29kZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3RpbnBlci1iZWUtY29yZS9saWIvY29udGFpbnMuanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL2FkZEV2ZW50TGlzdGVuZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9hZGQtZG9tLWV2ZW50LWxpc3RlbmVyL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2FkZC1kb20tZXZlbnQtbGlzdGVuZXIvbGliL0V2ZW50T2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vYWRkLWRvbS1ldmVudC1saXN0ZW5lci9saWIvRXZlbnRCYXNlT2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3RpbnBlci1iZWUtY29yZS9saWIvY3NzQW5pbWF0aW9uLmpzIiwid2VicGFjazovLy8uL34vdGlucGVyLWJlZS1jb3JlL2xpYi9FdmVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvbXBvbmVudC1jbGFzc2VzL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vY29tcG9uZW50LWluZGV4b2YvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL3RvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL0FsaWduLmpzIiwid2VicGFjazovLy8uL34vZG9tLWFsaWduL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1hbGlnbi9saWIvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9kb20tYWxpZ24vbGliL3Byb3BlcnR5VXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9kb20tYWxpZ24vbGliL2dldE9mZnNldFBhcmVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1hbGlnbi9saWIvZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50LmpzIiwid2VicGFjazovLy8uL34vZG9tLWFsaWduL2xpYi9hZGp1c3RGb3JWaWV3cG9ydC5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1hbGlnbi9saWIvZ2V0UmVnaW9uLmpzIiwid2VicGFjazovLy8uL34vZG9tLWFsaWduL2xpYi9nZXRFbEZ1dHVyZVBvcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1hbGlnbi9saWIvZ2V0QWxpZ25PZmZzZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtdHJhbnNpdGlvbi9idWlsZC9GYWRlLmpzIiwid2VicGFjazovLy8uL34vYmVlLXBhbmVsL2J1aWxkL1BhbmVsR3JvdXAuanMiLCJ3ZWJwYWNrOi8vL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vc3JjL1N0ZXAuanMiLCJ3ZWJwYWNrOi8vL3NyYy9TdGVwcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1pY29uL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vYmVlLWljb24vYnVpbGQvSWNvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1tZXNzYWdlL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vYmVlLW1lc3NhZ2UvYnVpbGQvTWVzc2FnZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1ub3RpZmljYXRpb24vYnVpbGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtbm90aWZpY2F0aW9uL2J1aWxkL05vdGlmaWNhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1hbmltYXRlL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vYmVlLWFuaW1hdGUvYnVpbGQvQW5pbWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1hbmltYXRlL2J1aWxkL0NoaWxkcmVuVXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtYW5pbWF0ZS9idWlsZC9BbmltYXRlQ2hpbGQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtYW5pbWF0ZS9idWlsZC91dGlsLmpzIiwid2VicGFjazovLy8uL34vYmVlLW5vdGlmaWNhdGlvbi9idWlsZC9Ob3RpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtYnV0dG9uL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vYmVlLWJ1dHRvbi9idWlsZC9CdXR0b24uanMiLCJ3ZWJwYWNrOi8vL2RlbW8vZGVtb2xpc3QvRGVtbzEuanMiLCJ3ZWJwYWNrOi8vL2RlbW8vZGVtb2xpc3QvRGVtbzIuanMiLCJ3ZWJwYWNrOi8vL2RlbW8vZGVtb2xpc3QvRGVtbzMuanMiLCJ3ZWJwYWNrOi8vL2RlbW8vZGVtb2xpc3QvRGVtbzQuanMiLCJ3ZWJwYWNrOi8vL2RlbW8vZGVtb2xpc3QvRGVtbzUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGlkOiBtb2R1bGVJZCxcbiBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZTg5MjRiMTAxNDlkOGRkNTU0NjUiLCJcclxuaW1wb3J0IHsgQ29uLCBSb3csIENvbCB9IGZyb20gJ2JlZS1sYXlvdXQnO1xyXG5pbXBvcnQgeyBQYW5lbCB9IGZyb20gJ2JlZS1wYW5lbCc7XHJcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xyXG5pbXBvcnQgU3RlcCBmcm9tICcuLi9zcmMnO1xyXG5pbXBvcnQgSWNvbiBmcm9tICdiZWUtaWNvbic7XHJcbmltcG9ydCBNZXNzYWdlIGZyb20gJ2JlZS1tZXNzYWdlJztcclxuaW1wb3J0IEJ1dHRvbiBmcm9tICdiZWUtYnV0dG9uJztcclxuY29uc3QgU3RlcHMgPSBTdGVwLlN0ZXBzO1xyXG5jb25zdCBDQVJFVCA9IDxpIGNsYXNzTmFtZT1cInVmIHVmLWFycm93LWRvd25cIj48L2k+O1xyXG5cclxuY29uc3QgQ0FSRVRVUCA9IDxpIGNsYXNzTmFtZT1cInVmIHVmLWFycm93LXVwXCI+PC9pPjtcclxuXHJcblxyXG52YXIgRGVtbzEgPSByZXF1aXJlKFwiLi9kZW1vbGlzdC9EZW1vMVwiKTt2YXIgRGVtbzIgPSByZXF1aXJlKFwiLi9kZW1vbGlzdC9EZW1vMlwiKTt2YXIgRGVtbzMgPSByZXF1aXJlKFwiLi9kZW1vbGlzdC9EZW1vM1wiKTt2YXIgRGVtbzQgPSByZXF1aXJlKFwiLi9kZW1vbGlzdC9EZW1vNFwiKTt2YXIgRGVtbzUgPSByZXF1aXJlKFwiLi9kZW1vbGlzdC9EZW1vNVwiKTt2YXIgRGVtb0FycmF5ID0gW3tcImV4YW1wbGVcIjo8RGVtbzEgLz4sXCJ0aXRsZVwiOlwiIOW4uOeUqOWfuuehgCBTdGVwXCIsXCJjb2RlXCI6XCIvKipcXG4qXFxuKiBAdGl0bGUg5bi455So5Z+656GAIFN0ZXBcXG4qIEBkZXNjcmlwdGlvbiBjdXJyZW50IOagh+iusOW9k+WJjeacuuWei+WTquS4gOatpVxcbipcXG4qL1xcblxcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XFxuaW1wb3J0IFN0ZXAgZnJvbSAndGlucGVyLWJlZSc7XFxuXFxuY2xhc3MgRGVtbzEgZXh0ZW5kcyBDb21wb25lbnQge1xcbiAgcmVuZGVyICgpIHtcXG4gICAgICByZXR1cm4gKFxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgPFN0ZXAuU3RlcHMgY3VycmVudD17MX0+XFxuICAgICAgICAgICAgPFN0ZXAgdGl0bGU9XFxcIkZpbmlzaGVkXFxcIiBkZXNjcmlwdGlvbj1cXFwiVGhpcyBpcyBhIGRlc2NyaXB0aW9uLlxcXCIgLz5cXG4gICAgICAgICAgICA8U3RlcCB0aXRsZT1cXFwiSW4gUHJvZ3Jlc3NcXFwiIGRlc2NyaXB0aW9uPVxcXCJUaGlzIGlzIGEgZGVzY3JpcHRpb24uXFxcIiAvPlxcbiAgICAgICAgICAgIDxTdGVwIHRpdGxlPVxcXCJXYWl0aW5nXFxcIiBkZXNjcmlwdGlvbj1cXFwiVGhpcyBpcyBhIGRlc2NyaXB0aW9uLlxcXCIgLz5cXG4gICAgICAgICAgPC9TdGVwLlN0ZXBzPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgXFxuICAgICAgKVxcbiAgfVxcbn1cXG5cXG5cXG5cIixcImRlc2NcIjpcIiBjdXJyZW50IOagh+iusOW9k+WJjeacuuWei+WTquS4gOatpVwifSx7XCJleGFtcGxlXCI6PERlbW8yIC8+LFwidGl0bGVcIjpcIiDoh6rlrprkuYlpY29uIFN0ZXBcIixcImNvZGVcIjpcIi8qKlxcbipcXG4qIEB0aXRsZSDoh6rlrprkuYlpY29uIFN0ZXBcXG4qIEBkZXNjcmlwdGlvblxcbipcXG4qL1xcblxcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XFxuaW1wb3J0IEljb24gZnJvbSAnYmVlLWljb24nO1xcbmltcG9ydCBTdGVwIGZyb20gJ3RpbnBlci1iZWUnO1xcblxcbmNsYXNzIERlbW8yIGV4dGVuZHMgQ29tcG9uZW50IHtcXG4gIHJlbmRlciAoKSB7XFxuICAgICAgcmV0dXJuIChcXG4gICAgICAgIDxTdGVwLlN0ZXBzPlxcbiAgICAgICAgICA8U3RlcCBzdGF0dXM9XFxcImZpbmlzaFxcXCIgdGl0bGU9XFxcIkxvZ2luXFxcIiBpY29uPXs8SWNvbiB0eXBlPVxcXCJ1Zi11c2Vycy1vXFxcIiAvPn0gLz5cXG4gICAgICAgICAgPFN0ZXAgc3RhdHVzPVxcXCJmaW5pc2hcXFwiIHRpdGxlPVxcXCJWZXJpZmljYXRpb25cXFwiIGljb249ezxJY29uIHR5cGU9XFxcInVmLXBlcnNvbmluLW9cXFwiIC8+fSAvPlxcbiAgICAgICAgICA8U3RlcCBzdGF0dXM9XFxcInByb2Nlc3NcXFwiIHRpdGxlPVxcXCJQYXlcXFwiIGljb249ezxJY29uIHR5cGU9XFxcInVmLWNyZWRpdGNhcmRcXFwiIC8+fSAvPlxcbiAgICAgICAgICA8U3RlcCBzdGF0dXM9XFxcIndhaXRcXFwiIHRpdGxlPVxcXCJEb25lXFxcIiBpY29uPXs8SWNvbiB0eXBlPVxcXCJ1Zi1jb3JyZWN0LTJcXFwiIC8+fSAvPlxcbiAgICAgICAgPC9TdGVwLlN0ZXBzPlxcbiAgICAgIClcXG4gIH1cXG59XFxuXFxuXCIsXCJkZXNjXCI6XCJcIn0se1wiZXhhbXBsZVwiOjxEZW1vMyAvPixcInRpdGxlXCI6XCIg57uT5ZCI5YiH5o2i5LqL5Lu255qEIFN0ZXBcIixcImNvZGVcIjpcIlxcbi8qKlxcbipcXG4qIEB0aXRsZSDnu5PlkIjliIfmjaLkuovku7bnmoQgU3RlcFxcbiogQGRlc2NyaXB0aW9uIOeCueWHu25leHTvvIxTdGVw55qE5rWB56iL6Lef6L+bXFxuKlxcbiovXFxuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcXG5pbXBvcnQgSWNvbiBmcm9tICdiZWUtaWNvbic7XFxuaW1wb3J0IE1lc3NhZ2UgZnJvbSAnYmVlLW1lc3NhZ2UnO1xcbmltcG9ydCBCdXR0b24gZnJvbSAnYmVlLWJ1dHRvbic7XFxuaW1wb3J0IFN0ZXAgZnJvbSAndGlucGVyLWJlZSc7XFxuXFxuY29uc3QgU3RlcHMgPSBTdGVwLlN0ZXBzO1xcblxcbmNvbnN0IHN0ZXBzID0gW3tcXG4gIHRpdGxlOiAnRmlyc3QnLFxcbiAgY29udGVudDogJ0ZpcnN0LWNvbnRlbnQnLFxcbn0sIHtcXG4gIHRpdGxlOiAnU2Vjb25kJyxcXG4gIGNvbnRlbnQ6ICdTZWNvbmQtY29udGVudCcsXFxufSwge1xcbiAgdGl0bGU6ICdMYXN0JyxcXG4gIGNvbnRlbnQ6ICdMYXN0LWNvbnRlbnQnLFxcbn1dO1xcblxcbmNsYXNzIERlbW8zIGV4dGVuZHMgQ29tcG9uZW50IHtcXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XFxuICAgIHN1cGVyKHByb3BzKTtcXG4gICAgdGhpcy5zdGF0ZSA9IHtcXG4gICAgICBjdXJyZW50OiAwLFxcbiAgICB9O1xcbiAgfVxcbiAgbmV4dCgpIHtcXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RhdGUuY3VycmVudCArIDE7XFxuICAgIHRoaXMuc2V0U3RhdGUoeyBjdXJyZW50IH0pO1xcbiAgfVxcbiAgcHJldigpIHtcXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RhdGUuY3VycmVudCAtIDE7XFxuICAgIHRoaXMuc2V0U3RhdGUoeyBjdXJyZW50IH0pO1xcbiAgfVxcblxcbiAgYWxlcnREb25lKCkge1xcbiAgICBNZXNzYWdlLmNyZWF0ZSh7Y29udGVudDogJ2RvbmUnLCBjb2xvcjogJ2luZm8nfSk7XFxuICB9XFxuXFxuICByZW5kZXIoKSB7XFxuICAgIGNvbnN0IHsgY3VycmVudCB9ID0gdGhpcy5zdGF0ZTtcXG4gICAgcmV0dXJuIChcXG4gICAgICA8ZGl2PlxcbiAgICAgICAgPFN0ZXBzIGN1cnJlbnQ9e2N1cnJlbnR9PlxcbiAgICAgICAgICB7c3RlcHMubWFwKGl0ZW0gPT4gPFN0ZXAga2V5PXtpdGVtLnRpdGxlfSB0aXRsZT17aXRlbS50aXRsZX0gLz4pfVxcbiAgICAgICAgPC9TdGVwcz5cXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVxcXCJzdGVwcy1jb250ZW50XFxcIj57c3RlcHNbdGhpcy5zdGF0ZS5jdXJyZW50XS5jb250ZW50fTwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XFxcInN0ZXBzLWFjdGlvblxcXCI+XFxuICAgICAgICAgIHtcXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnQgPCBzdGVwcy5sZW5ndGggLSAxXFxuICAgICAgICAgICAgJiZcXG4gICAgICAgICAgICA8QnV0dG9uIHR5cGU9XFxcInByaW1hcnlcXFwiIG9uQ2xpY2s9eygpID0+IHRoaXMubmV4dCgpfT5OZXh0PC9CdXR0b24+XFxuICAgICAgICAgIH1cXG4gICAgICAgICAge1xcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY3VycmVudCA9PT0gc3RlcHMubGVuZ3RoIC0gMVxcbiAgICAgICAgICAgICYmXFxuICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVxcXCJwcmltYXJ5XFxcIiBvbkNsaWNrPXsoKSA9PiB0aGlzLmFsZXJ0RG9uZSgpfT5Eb25lPC9CdXR0b24+XFxuICAgICAgICAgIH1cXG4gICAgICAgICAge1xcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY3VycmVudCA+IDBcXG4gICAgICAgICAgICAmJlxcbiAgICAgICAgICAgIDxCdXR0b24gc3R5bGU9e3sgbWFyZ2luTGVmdDogOCB9fSBvbkNsaWNrPXsoKSA9PiB0aGlzLnByZXYoKX0+XFxuICAgICAgICAgICAgICBQcmV2aW91c1xcbiAgICAgICAgICAgIDwvQnV0dG9uPlxcbiAgICAgICAgICB9XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L2Rpdj5cXG4gICAgKTtcXG4gIH1cXG59XFxuXFxuXCIsXCJkZXNjXCI6XCIg54K55Ye7bmV4dO+8jFN0ZXDnmoTmtYHnqIvot5/ov5tcIn0se1wiZXhhbXBsZVwiOjxEZW1vNCAvPixcInRpdGxlXCI6XCIgdmVydGljYWwgU3RlcFwiLFwiY29kZVwiOlwiLyoqXFxuKlxcbiogQHRpdGxlIHZlcnRpY2FsIFN0ZXBcXG4qIEBkZXNjcmlwdGlvbiBcXG4qXFxuKi9cXG5cXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xcbmltcG9ydCBTdGVwIGZyb20gJ3RpbnBlci1iZWUnO1xcblxcbmNvbnN0IFN0ZXBzID0gU3RlcC5TdGVwcztcXG5cXG5jbGFzcyBEZW1vNCBleHRlbmRzIENvbXBvbmVudCB7XFxuICByZW5kZXIgKCkge1xcbiAgICAgIHJldHVybiAoXFxuICAgICAgICA8ZGl2PlxcbiAgICAgICAgICA8U3RlcHMgZGlyZWN0aW9uPVxcXCJ2ZXJ0aWNhbFxcXCIgc2l6ZT1cXFwic21hbGxcXFwiIGN1cnJlbnQ9ezF9PlxcbiAgICAgICAgICAgIDxTdGVwIHRpdGxlPVxcXCJGaW5pc2hlZFxcXCIgZGVzY3JpcHRpb249XFxcIlRoaXMgaXMgYSBkZXNjcmlwdGlvbi5cXFwiIC8+XFxuICAgICAgICAgICAgPFN0ZXAgdGl0bGU9XFxcIkluIFByb2dyZXNzXFxcIiBkZXNjcmlwdGlvbj1cXFwiVGhpcyBpcyBhIGRlc2NyaXB0aW9uLlxcXCIgLz5cXG4gICAgICAgICAgICA8U3RlcCB0aXRsZT1cXFwiV2FpdGluZ1xcXCIgZGVzY3JpcHRpb249XFxcIlRoaXMgaXMgYSBkZXNjcmlwdGlvbi5cXFwiIC8+XFxuICAgICAgICAgPC9TdGVwcz5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIClcXG4gIH1cXG59XFxuXFxuXCIsXCJkZXNjXCI6XCIgXCJ9LHtcImV4YW1wbGVcIjo8RGVtbzUgLz4sXCJ0aXRsZVwiOlwiIOaMh+WumueKtuaAgeeahFN0ZXBcIixcImNvZGVcIjpcIi8qKlxcbipcXG4qIEB0aXRsZSDmjIflrprnirbmgIHnmoRTdGVwXFxuKiBAZGVzY3JpcHRpb24gIOeUqHN0ZXDnmoRzdGF0dXPlsZ7mgKfvvIzmjIflrprlvZPliY1zdGVw55qE54q25oCBXFxuKlxcbiovXFxuXFxuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcXG5pbXBvcnQgU3RlcCBmcm9tICd0aW5wZXItYmVlJztcXG5cXG5jb25zdCBTdGVwcyA9IFN0ZXAuU3RlcHM7XFxuXFxuY2xhc3MgRGVtbzUgZXh0ZW5kcyBDb21wb25lbnQge1xcbiAgcmVuZGVyICgpIHtcXG4gICAgICByZXR1cm4gKFxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgPFN0ZXBzIGN1cnJlbnQ9ezF9IHN0YXR1cz1cXFwiZXJyb3JcXFwiPlxcbiAgICAgICAgICAgIDxTdGVwIHRpdGxlPVxcXCJGaW5pc2hlZFxcXCIgZGVzY3JpcHRpb249XFxcIlRoaXMgaXMgYSBkZXNjcmlwdGlvblxcXCIgLz5cXG4gICAgICAgICAgICA8U3RlcCB0aXRsZT1cXFwiSW4gUHJvY2Vzc1xcXCIgZGVzY3JpcHRpb249XFxcIlRoaXMgaXMgYSBkZXNjcmlwdGlvblxcXCIgLz5cXG4gICAgICAgICAgICA8U3RlcCB0aXRsZT1cXFwiV2FpdGluZ1xcXCIgZGVzY3JpcHRpb249XFxcIlRoaXMgaXMgYSBkZXNjcmlwdGlvblxcXCIgLz5cXG4gICAgICAgIDwvU3RlcHM+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICApXFxuICB9XFxufVxcblxcblwiLFwiZGVzY1wiOlwiICDnlKhzdGVw55qEc3RhdHVz5bGe5oCn77yM5oyH5a6a5b2T5YmNc3RlcOeahOeKtuaAgVwifV1cblxyXG5cclxuY2xhc3MgRGVtbyBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIG9wZW46IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGFuZGxlQ2xpY2sgPSB0aGlzLmhhbmRsZUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcbiAgICBoYW5kbGVDbGljaygpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbjogIXRoaXMuc3RhdGUub3BlbiB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlciAoKSB7XHJcbiAgICAgICAgY29uc3QgeyB0aXRsZSwgZXhhbXBsZSwgY29kZSwgZGVzYyAgfSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgbGV0IGNhcmV0ID0gdGhpcy5zdGF0ZS5vcGVuID8gQ0FSRVRVUCA6IENBUkVUO1xyXG4gICAgICAgIGxldCB0ZXh0ID0gdGhpcy5zdGF0ZS5vcGVuID8gXCLpmpDol4/ku6PnoIFcIiA6IFwi5p+l55yL5Luj56CBXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvb3RlciA9IChcclxuICAgICAgICAgICAgPEJ1dHRvbiBzaGFwZT1cImJsb2NrXCIgb25DbGljaz17IHRoaXMuaGFuZGxlQ2xpY2sgfT5cclxuICAgICAgICAgICAgICAgIHsgdGV4dCB9XHJcbiAgICAgICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyID0gKFxyXG4gICAgICAgICAgICA8Um93PlxyXG4gICAgICAgICAgICAgICAgPENvbCBtZD17MTF9PlxyXG4gICAgICAgICAgICAgICAgeyBleGFtcGxlIH1cclxuICAgICAgICAgICAgICAgIDwvQ29sPlxyXG4gICAgICAgICAgICAgICAgPENvbCBtZD17MX0+XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDwvQ29sPlxyXG4gICAgICAgICAgICA8L1Jvdz5cclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxDb2wgbWQ9ezEyfSA+XHJcbiAgICAgICAgICAgICAgICA8aDM+eyB0aXRsZSB9PC9oMz5cclxuICAgICAgICAgICAgICAgIDxwPnsgZGVzYyB9PC9wPlxyXG4gICAgICAgICAgICAgICAgPFBhbmVsIGNvbGxhcHNpYmxlIGhlYWRlckNvbnRlbnQgZXhwYW5kZWQ9eyB0aGlzLnN0YXRlLm9wZW4gfSBjb2xvcnM9J2JvcmRlcmVkJyBoZWFkZXI9eyBoZWFkZXIgfSBmb290ZXI9e2Zvb3Rlcn0gZm9vdGVyU3R5bGUgPSB7e3BhZGRpbmc6IDB9fT5cclxuICAgICAgICAgICAgICAgICAgICA8cHJlPjxjb2RlIGNsYXNzTmFtZT1cImhsanMgamF2YXNjcmlwdFwiPnsgY29kZSB9PC9jb2RlPjwvcHJlPlxyXG4gICAgICAgICAgICAgICAgPC9QYW5lbD5cclxuICAgICAgICAgICAgPC9Db2w+XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBEZW1vR3JvdXAgZXh0ZW5kcyBDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgfVxyXG4gICAgcmVuZGVyICgpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgPFJvdz5cclxuICAgICAgICAgICAgICAgICAgICB7RGVtb0FycmF5Lm1hcCgoY2hpbGQsaW5kZXgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RGVtbyBleGFtcGxlPSB7Y2hpbGQuZXhhbXBsZX0gdGl0bGU9IHtjaGlsZC50aXRsZX0gY29kZT0ge2NoaWxkLmNvZGV9IGRlc2M9IHtjaGlsZC5kZXNjfSBrZXk9IHtpbmRleH0vPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgPC9Sb3c+XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG59XHJcblxyXG5SZWFjdERPTS5yZW5kZXIoPERlbW9Hcm91cC8+LCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGlucGVyQmVlRGVtbycpKTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGRlbW8vaW5kZXguanMiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkNvbiA9IGV4cG9ydHMuUm93ID0gZXhwb3J0cy5Db2wgPSB1bmRlZmluZWQ7XG5cbnZhciBfQ29sMiA9IHJlcXVpcmUoJy4vQ29sJyk7XG5cbnZhciBfQ29sMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NvbDIpO1xuXG52YXIgX1JvdzIgPSByZXF1aXJlKCcuL1JvdycpO1xuXG52YXIgX1JvdzMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Sb3cyKTtcblxudmFyIF9MYXlvdXQgPSByZXF1aXJlKCcuL0xheW91dCcpO1xuXG52YXIgX0xheW91dDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9MYXlvdXQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0cy5Db2wgPSBfQ29sM1tcImRlZmF1bHRcIl07XG5leHBvcnRzLlJvdyA9IF9Sb3czW1wiZGVmYXVsdFwiXTtcbmV4cG9ydHMuQ29uID0gX0xheW91dDJbXCJkZWZhdWx0XCJdO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtbGF5b3V0L2J1aWxkL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfcmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmVsZW1lbnQsIF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKipcbiAgICogeHPmmL7npLrliJfmlbBcbiAgICovXG4gIHhzOiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIHNt5pi+56S65YiX5pWwXG4gICAqL1xuICBzbTogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiBtZOaYvuekuuWIl+aVsFxuICAgKi9cbiAgbWQ6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAvKipcbiAgICogbGfmmL7npLrliJfmlbBcbiAgICovXG4gIGxnOiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIHhz5YGP56e75YiX5pWwXG4gICAqL1xuICB4c09mZnNldDogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiBzbeWBj+enu+WIl+aVsFxuICAgKi9cbiAgc21PZmZzZXQ6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAvKipcbiAgICogbWTlgY/np7vliJfmlbBcbiAgICovXG4gIG1kT2Zmc2V0OiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIGxn5YGP56e75YiX5pWwXG4gICAqL1xuICBsZ09mZnNldDogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiB4c+WPs+WBj+enu+WIl+aVsFxuICAgKi9cbiAgeHNQdXNoOiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIHNt5Y+z5YGP56e75YiX5pWwXG4gICAqL1xuICBzbVB1c2g6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAvKipcbiAgICogbWTlj7PlgY/np7vliJfmlbBcbiAgICovXG4gIG1kUHVzaDogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiBsZ+WPs+WBj+enu+WIl+aVsFxuICAgKi9cbiAgbGdQdXNoOiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIHhz5bem5YGP56e75YiX5pWwXG4gICAqL1xuICB4c1B1bGw6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAvKipcbiAgICogc23lt6blgY/np7vliJfmlbBcbiAgICovXG4gIHNtUHVsbDogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiBtZOW3puWBj+enu+WIl+aVsFxuICAgKi9cbiAgbWRQdWxsOiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIGxn5bem5YGP56e75YiX5pWwXG4gICAqL1xuICBsZ1B1bGw6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2RpdicsXG4gIGNsc1ByZWZpeDogJ3UtY29sJ1xufTtcblxudmFyIERFVklDRV9TSVpFUyA9IFsnbGcnLCAnbWQnLCAnc20nLCAneHMnXTtcblxudmFyIENvbCA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhDb2wsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIENvbCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29sKTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQ29sLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2xzUHJlZml4ID0gX3Byb3BzLmNsc1ByZWZpeCxcbiAgICAgICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnLCAnY2xzUHJlZml4J10pO1xuXG4gICAgdmFyIHRiQ2xhc3MgPSBbXTtcbiAgICAvKipcbiAgICAgKiDlr7nkvKDlhaVwcm9wc+WBmuagt+W8j+i9rOWMllxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgREVWSUNFX1NJWkVTLmZvckVhY2goZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgIGZ1bmN0aW9uIHBvcFByb3AocHJvcFN1ZmZpeCwgbW9kaWZpZXIpIHtcbiAgICAgICAgdmFyIHByb3BOYW1lID0gJycgKyBzaXplICsgcHJvcFN1ZmZpeDtcbiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IG90aGVyc1twcm9wTmFtZV07XG5cbiAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSB1bmRlZmluZWQgJiYgcHJvcFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICB0YkNsYXNzLnB1c2goY2xzUHJlZml4ICsgJy0nICsgc2l6ZSArIG1vZGlmaWVyICsgJy0nICsgcHJvcFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBvdGhlcnNbcHJvcE5hbWVdO1xuICAgICAgfVxuXG4gICAgICBwb3BQcm9wKCcnLCAnJyk7XG4gICAgICBwb3BQcm9wKCdPZmZzZXQnLCAnLW9mZnNldCcpO1xuICAgICAgcG9wUHJvcCgnUHVzaCcsICctcHVzaCcpO1xuICAgICAgcG9wUHJvcCgnUHVsbCcsICctcHVsbCcpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBDb21wb25lbnQsXG4gICAgICBfZXh0ZW5kcyh7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKHRiQ2xhc3MsIGNsYXNzTmFtZSlcbiAgICAgIH0sIG90aGVycyksXG4gICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gQ29sO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuQ29sLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkNvbC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQ29sO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1sYXlvdXQvYnVpbGQvQ29sLmpzXG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICBDb3B5cmlnaHQgKGMpIDIwMTYgSmVkIFdhdHNvbi5cbiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWVcbiAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBoYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuXHRmdW5jdGlvbiBjbGFzc05hbWVzICgpIHtcblx0XHR2YXIgY2xhc3NlcyA9IFtdO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG5cdFx0XHRpZiAoIWFyZykgY29udGludWU7XG5cblx0XHRcdHZhciBhcmdUeXBlID0gdHlwZW9mIGFyZztcblxuXHRcdFx0aWYgKGFyZ1R5cGUgPT09ICdzdHJpbmcnIHx8IGFyZ1R5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdGNsYXNzZXMucHVzaChhcmcpO1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcblx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGNsYXNzTmFtZXMuYXBwbHkobnVsbCwgYXJnKSk7XG5cdFx0XHR9IGVsc2UgaWYgKGFyZ1R5cGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdGZvciAodmFyIGtleSBpbiBhcmcpIHtcblx0XHRcdFx0XHRpZiAoaGFzT3duLmNhbGwoYXJnLCBrZXkpICYmIGFyZ1trZXldKSB7XG5cdFx0XHRcdFx0XHRjbGFzc2VzLnB1c2goa2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG5cdH1cblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NsYXNzbmFtZXMvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBSZWFjdDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcIlJlYWN0XCJcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6IF9yZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZWxlbWVudCwgX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLnN0cmluZ10pXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2RpdicsXG4gIGNsc1ByZWZpeDogJ3Utcm93J1xufTtcblxudmFyIFJvdyA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhSb3csIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJvdygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUm93KTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgUm93LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xzUHJlZml4ID0gX3Byb3BzLmNsc1ByZWZpeCxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICdjbHNQcmVmaXgnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIGJzY2xhc3MgPSAnJyArIGNsc1ByZWZpeDtcblxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgX2V4dGVuZHMoe30sIG90aGVycywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShic2NsYXNzLCBjbGFzc05hbWUpXG4gICAgICB9KSxcbiAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBSb3c7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5Sb3cucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuUm93LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBSb3c7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWxheW91dC9idWlsZC9Sb3cuanNcbi8vIG1vZHVsZSBpZCA9IDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXHJcbiAgICogQWRkcyBgY29udGFpbmVyLWZsdWlkYCBjbGFzcy5cclxuICAgKi9cbiAgZmx1aWQ6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgLyoqXHJcbiAgICogWW91IGNhbiB1c2UgYSBjdXN0b20gZWxlbWVudCBmb3IgdGhpcyBjb21wb25lbnRcclxuICAgKi9cbiAgY29tcG9uZW50Q2xhc3M6IF9yZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZWxlbWVudCwgX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLnN0cmluZ10pXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2RpdicsXG4gIGZsdWlkOiBmYWxzZSxcbiAgY2xzUHJlZml4OiAndS1jb250YWluZXInXG59O1xuXG52YXIgQ29uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKENvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ29uKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb24pO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBDb24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RiY2xhc3M7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZmx1aWQgPSBfcHJvcHMuZmx1aWQsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xzUHJlZml4ID0gX3Byb3BzLmNsc1ByZWZpeCxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgWydmbHVpZCcsICdjb21wb25lbnRDbGFzcycsICdjbHNQcmVmaXgnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIHRiY2xhc3MgPSAoX3RiY2xhc3MgPSB7fSwgX2RlZmluZVByb3BlcnR5KF90YmNsYXNzLCAnJyArIGNsc1ByZWZpeCwgIWZsdWlkKSwgX2RlZmluZVByb3BlcnR5KF90YmNsYXNzLCBjbHNQcmVmaXggKyAnLWZsdWlkJywgZmx1aWQpLCBfdGJjbGFzcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgIENvbXBvbmVudCxcbiAgICAgIF9leHRlbmRzKHt9LCBvdGhlcnMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyW1wiZGVmYXVsdFwiXSkodGJjbGFzcywgY2xhc3NOYW1lKVxuICAgICAgfSksXG4gICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gQ29uO1xufShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXG5Db24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQ29uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBDb247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWxheW91dC9idWlsZC9MYXlvdXQuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5QYW5lbEdyb3VwID0gZXhwb3J0cy5QYW5lbCA9IHVuZGVmaW5lZDtcblxudmFyIF9QYW5lbDIgPSByZXF1aXJlKCcuL1BhbmVsJyk7XG5cbnZhciBfUGFuZWwzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFuZWwyKTtcblxudmFyIF9QYW5lbEdyb3VwMiA9IHJlcXVpcmUoJy4vUGFuZWxHcm91cCcpO1xuXG52YXIgX1BhbmVsR3JvdXAzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFuZWxHcm91cDIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0cy5QYW5lbCA9IF9QYW5lbDNbXCJkZWZhdWx0XCJdO1xuZXhwb3J0cy5QYW5lbEdyb3VwID0gX1BhbmVsR3JvdXAzW1wiZGVmYXVsdFwiXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLXBhbmVsL2J1aWxkL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9iZWVUcmFuc2l0aW9uID0gcmVxdWlyZSgnYmVlLXRyYW5zaXRpb24nKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8v5piv5ZCm5re75Yqg5oqY5Y+gXG4gIGNvbGxhcHNpYmxlOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuYm9vbCxcbiAgb25TZWxlY3Q6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jLFxuICAvL+WktOmDqOe7hOS7tlxuICBoZWFkZXI6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5ub2RlLFxuICBoZWFkZXJTdHlsZTogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLm9iamVjdCxcbiAgaWQ6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5vbmVPZlR5cGUoW19yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5zdHJpbmcsIF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5udW1iZXJdKSxcbiAgaGVhZGVyQ29udGVudDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmJvb2wsXG4gIC8vZm9vdGVy57uE5Lu2XG4gIGZvb3RlcjogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLm5vZGUsXG4gIGZvb3RlclN0eWxlOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMub2JqZWN0LFxuICAvL+m7mOiupOaYr+WQpuaJk+W8gFxuICBkZWZhdWx0RXhwYW5kZWQ6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5ib29sLFxuICAvL+aYr+WQpuaJk+W8gFxuICBleHBhbmRlZDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmJvb2wsXG4gIC8v5q+P5LiqcGFuZWznmoTmoIforrBcbiAgZXZlbnRLZXk6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5hbnksXG4gIGhlYWRlclJvbGU6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5zdHJpbmcsXG4gIHBhbmVsUm9sZTogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLnN0cmluZyxcbiAgLy/popzoibJcbiAgY29sb3JzOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMub25lT2YoWydwcmltYXJ5JywgJ2FjY2VudCcsICdzdWNjZXNzJywgJ2luZm8nLCAnd2FybmluZycsICdkYW5nZXInLCAnZGVmYXVsdCcsICdib3JkZXJlZCddKSxcblxuICAvLyBGcm9tIENvbGxhcHNlLueahOaJqeWxleWKqOeUu1xuICBvbkVudGVyOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcbiAgb25FbnRlcmluZzogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRW50ZXJlZDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRXhpdDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRXhpdGluZzogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRXhpdGVkOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuY1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgZGVmYXVsdEV4cGFuZGVkOiBmYWxzZSxcbiAgY2xzUHJlZml4OiBcInUtcGFuZWxcIixcbiAgY29sb3JzOiBcImRlZmF1bHRcIlxufTtcblxudmFyIFBhbmVsID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFBhbmVsLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQYW5lbChwcm9wcywgY29udGV4dCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYW5lbCk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrVGl0bGUgPSBfdGhpcy5oYW5kbGVDbGlja1RpdGxlLmJpbmQoX3RoaXMpO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBleHBhbmRlZDogX3RoaXMucHJvcHMuZGVmYXVsdEV4cGFuZGVkXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvL+WktOmDqOeCueWHu+S6i+S7tlxuXG5cbiAgUGFuZWwucHJvdG90eXBlLmhhbmRsZUNsaWNrVGl0bGUgPSBmdW5jdGlvbiBoYW5kbGVDbGlja1RpdGxlKGUpIHtcbiAgICAvLyDkuI3orqnkuovku7bov5vlhaXkuovku7bmsaBcbiAgICBlLnBlcnNpc3QoKTtcbiAgICBlLnNlbGVjdGVkID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnByb3BzLm9uU2VsZWN0KSB7XG4gICAgICB0aGlzLnByb3BzLm9uU2VsZWN0KHRoaXMucHJvcHMuZXZlbnRLZXksIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGUuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBleHBhbmRlZDogIXRoaXMuc3RhdGUuZXhwYW5kZWQgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8v5riy5p+TcGFuZWxoZWFkZXJcblxuXG4gIFBhbmVsLnByb3RvdHlwZS5yZW5kZXJIZWFkZXIgPSBmdW5jdGlvbiByZW5kZXJIZWFkZXIoY29sbGFwc2libGUsIGhlYWRlciwgaWQsIHJvbGUsIGV4cGFuZGVkLCBjbHNQcmVmaXgpIHtcbiAgICB2YXIgdGl0bGVDbGFzc05hbWUgPSBjbHNQcmVmaXggKyAnLXRpdGxlJztcblxuICAgIGlmICghY29sbGFwc2libGUpIHtcbiAgICAgIGlmICghX3JlYWN0MltcImRlZmF1bHRcIl0uaXNWYWxpZEVsZW1lbnQoaGVhZGVyKSkge1xuICAgICAgICByZXR1cm4gaGVhZGVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGhlYWRlciwge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShoZWFkZXIucHJvcHMuY2xhc3NOYW1lLCB0aXRsZUNsYXNzTmFtZSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghX3JlYWN0MltcImRlZmF1bHRcIl0uaXNWYWxpZEVsZW1lbnQoaGVhZGVyKSkge1xuICAgICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdoNCcsXG4gICAgICAgIHsgcm9sZTogJ3ByZXNlbnRhdGlvbicsIGNsYXNzTmFtZTogdGl0bGVDbGFzc05hbWUgfSxcbiAgICAgICAgdGhpcy5yZW5kZXJBbmNob3IoaGVhZGVyLCBpZCwgcm9sZSwgZXhwYW5kZWQpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5oZWFkZXJDb250ZW50KSB7XG4gICAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGhlYWRlciwge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShoZWFkZXIucHJvcHMuY2xhc3NOYW1lLCB0aXRsZUNsYXNzTmFtZSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoaGVhZGVyLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShoZWFkZXIucHJvcHMuY2xhc3NOYW1lLCB0aXRsZUNsYXNzTmFtZSksXG4gICAgICBjaGlsZHJlbjogdGhpcy5yZW5kZXJBbmNob3IoaGVhZGVyLnByb3BzLmNoaWxkcmVuLCBpZCwgcm9sZSwgZXhwYW5kZWQpXG4gICAgfSk7XG4gIH07XG5cbiAgLy/lpoLmnpzkvb/nlKjpk77mjqXvvIzmuLLmn5PkuLph5qCH562+XG5cblxuICBQYW5lbC5wcm90b3R5cGUucmVuZGVyQW5jaG9yID0gZnVuY3Rpb24gcmVuZGVyQW5jaG9yKGhlYWRlciwgaWQsIHJvbGUsIGV4cGFuZGVkKSB7XG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnYScsXG4gICAgICB7XG4gICAgICAgIHJvbGU6IHJvbGUsXG4gICAgICAgIGhyZWY6IGlkICYmICcjJyArIGlkLFxuICAgICAgICAnYXJpYS1jb250cm9scyc6IGlkLFxuICAgICAgICAnYXJpYS1leHBhbmRlZCc6IGV4cGFuZGVkLFxuICAgICAgICAnYXJpYS1zZWxlY3RlZCc6IGV4cGFuZGVkLFxuICAgICAgICBjbGFzc05hbWU6IGV4cGFuZGVkID8gbnVsbCA6ICdjb2xsYXBzZWQnXG4gICAgICB9LFxuICAgICAgaGVhZGVyXG4gICAgKTtcbiAgfTtcblxuICAvL+WmguaenOacieaKmOWPoOWKqOeUu++8jOa4suafk+aKmOWPoOWKqOeUu1xuXG5cbiAgUGFuZWwucHJvdG90eXBlLnJlbmRlckNvbGxhcHNpYmxlQm9keSA9IGZ1bmN0aW9uIHJlbmRlckNvbGxhcHNpYmxlQm9keShpZCwgZXhwYW5kZWQsIHJvbGUsIGNoaWxkcmVuLCBjbHNQcmVmaXgsIGFuaW1hdGlvbkhvb2tzKSB7XG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBfYmVlVHJhbnNpdGlvbi5Db2xsYXBzZSxcbiAgICAgIF9leHRlbmRzKHsgJ2luJzogZXhwYW5kZWQgfSwgYW5pbWF0aW9uSG9va3MpLFxuICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgcm9sZTogcm9sZSxcbiAgICAgICAgICBjbGFzc05hbWU6IGNsc1ByZWZpeCArICctY29sbGFwc2UnLFxuICAgICAgICAgICdhcmlhLWhpZGRlbic6ICFleHBhbmRlZFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnJlbmRlckJvZHkoY2hpbGRyZW4sIGNsc1ByZWZpeClcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIC8v5riy5p+TcGFuZWxib2R5XG5cblxuICBQYW5lbC5wcm90b3R5cGUucmVuZGVyQm9keSA9IGZ1bmN0aW9uIHJlbmRlckJvZHkocmF3Q2hpbGRyZW4sIGNsc1ByZWZpeCkge1xuICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgIHZhciBib2R5Q2hpbGRyZW4gPSBbXTtcblxuICAgIHZhciBib2R5Q2xhc3NOYW1lID0gY2xzUHJlZml4ICsgJy1ib2R5JztcblxuICAgIC8v5re75Yqg5YiwYm9keeeahGNoaWxkcmVu5LitXG4gICAgZnVuY3Rpb24gbWF5YmVBZGRCb2R5KCkge1xuICAgICAgaWYgKCFib2R5Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8g57uZ5a2Q57uE5Lu25re75Yqga2V577yM5Li65LqG5LmL5ZCO6Kem5Y+R5LqL5Lu25pe25L2/55SoXG4gICAgICBjaGlsZHJlbi5wdXNoKF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGtleTogY2hpbGRyZW4ubGVuZ3RoLCBjbGFzc05hbWU6IGJvZHlDbGFzc05hbWUgfSxcbiAgICAgICAgYm9keUNoaWxkcmVuXG4gICAgICApKTtcblxuICAgICAgYm9keUNoaWxkcmVuID0gW107XG4gICAgfVxuXG4gICAgLy/ovazmjaLkuLrmlbDnu4TvvIzmlrnkvr/lpI3nlKhcbiAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5DaGlsZHJlbi50b0FycmF5KHJhd0NoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgaWYgKF9yZWFjdDJbXCJkZWZhdWx0XCJdLmlzVmFsaWRFbGVtZW50KGNoaWxkKSAmJiBjaGlsZC5wcm9wcy5maWxsKSB7XG4gICAgICAgIG1heWJlQWRkQm9keSgpO1xuXG4gICAgICAgIC8v5bCG5qCH56S6ZmlsbOiuvue9ruS4unVuZGVmaW5lZFxuICAgICAgICBjaGlsZHJlbi5wdXNoKCgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgeyBmaWxsOiB1bmRlZmluZWQgfSkpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYm9keUNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIH0pO1xuXG4gICAgbWF5YmVBZGRCb2R5KCk7XG5cbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH07XG5cbiAgUGFuZWwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgY29sbGFwc2libGUgPSBfcHJvcHMuY29sbGFwc2libGU7XG4gICAgdmFyIGhlYWRlciA9IF9wcm9wcy5oZWFkZXI7XG4gICAgdmFyIGlkID0gX3Byb3BzLmlkO1xuICAgIHZhciBmb290ZXIgPSBfcHJvcHMuZm9vdGVyO1xuICAgIHZhciBwcm9wc0V4cGFuZGVkID0gX3Byb3BzLmV4cGFuZGVkO1xuICAgIHZhciBmb290ZXJTdHlsZSA9IF9wcm9wcy5mb290ZXJTdHlsZTtcbiAgICB2YXIgaGVhZGVyU3R5bGUgPSBfcHJvcHMuaGVhZGVyU3R5bGU7XG4gICAgdmFyIGhlYWRlclJvbGUgPSBfcHJvcHMuaGVhZGVyUm9sZTtcbiAgICB2YXIgcGFuZWxSb2xlID0gX3Byb3BzLnBhbmVsUm9sZTtcbiAgICB2YXIgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZTtcbiAgICB2YXIgY29sb3JzID0gX3Byb3BzLmNvbG9ycztcbiAgICB2YXIgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIG9uRW50ZXIgPSBfcHJvcHMub25FbnRlcjtcbiAgICB2YXIgb25FbnRlcmluZyA9IF9wcm9wcy5vbkVudGVyaW5nO1xuICAgIHZhciBvbkVudGVyZWQgPSBfcHJvcHMub25FbnRlcmVkO1xuICAgIHZhciBjbHNQcmVmaXggPSBfcHJvcHMuY2xzUHJlZml4O1xuICAgIHZhciBvbkV4aXQgPSBfcHJvcHMub25FeGl0O1xuICAgIHZhciBoZWFkZXJDb250ZW50ID0gX3Byb3BzLmhlYWRlckNvbnRlbnQ7XG4gICAgdmFyIHN0eWxlID0gX3Byb3BzLnN0eWxlO1xuICAgIHZhciBvbkV4aXRpbmcgPSBfcHJvcHMub25FeGl0aW5nO1xuICAgIHZhciBvbkV4aXRlZCA9IF9wcm9wcy5vbkV4aXRlZDtcbiAgICB2YXIgZGVmYXVsdEV4cGFuZGVkID0gX3Byb3BzLmRlZmF1bHRFeHBhbmRlZDtcbiAgICB2YXIgZXZlbnRLZXkgPSBfcHJvcHMuZXZlbnRLZXk7XG4gICAgdmFyIG9uU2VsZWN0ID0gX3Byb3BzLm9uU2VsZWN0O1xuXG4gICAgdmFyIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgWydjb2xsYXBzaWJsZScsICdoZWFkZXInLCAnaWQnLCAnZm9vdGVyJywgJ2V4cGFuZGVkJywgJ2Zvb3RlclN0eWxlJywgJ2hlYWRlclN0eWxlJywgJ2hlYWRlclJvbGUnLCAncGFuZWxSb2xlJywgJ2NsYXNzTmFtZScsICdjb2xvcnMnLCAnY2hpbGRyZW4nLCAnb25FbnRlcicsICdvbkVudGVyaW5nJywgJ29uRW50ZXJlZCcsICdjbHNQcmVmaXgnLCAnb25FeGl0JywgJ2hlYWRlckNvbnRlbnQnLCAnc3R5bGUnLCAnb25FeGl0aW5nJywgJ29uRXhpdGVkJywgJ2RlZmF1bHRFeHBhbmRlZCcsICdldmVudEtleScsICdvblNlbGVjdCddKTtcblxuICAgIHZhciBleHBhbmRlZCA9IHByb3BzRXhwYW5kZWQgIT0gbnVsbCA/IHByb3BzRXhwYW5kZWQgOiB0aGlzLnN0YXRlLmV4cGFuZGVkO1xuXG4gICAgdmFyIGNsYXNzZXMgPSB7fTtcbiAgICBjbGFzc2VzWycnICsgY2xzUHJlZml4XSA9IHRydWU7XG4gICAgY2xhc3Nlc1tjbHNQcmVmaXggKyAnLScgKyBjb2xvcnNdID0gdHJ1ZTtcblxuICAgIHZhciBoZWFkZXJDbGFzcyA9IF9kZWZpbmVQcm9wZXJ0eSh7fSwgY2xzUHJlZml4ICsgJy1oZWFkaW5nJywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKGNsYXNzTmFtZSwgY2xhc3NlcyksXG4gICAgICAgIGlkOiBjb2xsYXBzaWJsZSA/IG51bGwgOiBpZFxuICAgICAgfSksXG4gICAgICBoZWFkZXIgJiYgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyW1wiZGVmYXVsdFwiXSkoaGVhZGVyQ2xhc3MpLCBzdHlsZTogaGVhZGVyU3R5bGUsIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tUaXRsZSB9LFxuICAgICAgICB0aGlzLnJlbmRlckhlYWRlcihjb2xsYXBzaWJsZSwgaGVhZGVyLCBpZCwgaGVhZGVyUm9sZSwgZXhwYW5kZWQsIGNsc1ByZWZpeClcbiAgICAgICksXG4gICAgICBjb2xsYXBzaWJsZSA/IHRoaXMucmVuZGVyQ29sbGFwc2libGVCb2R5KGlkLCBleHBhbmRlZCwgcGFuZWxSb2xlLCBjaGlsZHJlbiwgY2xzUHJlZml4LCB7IG9uRW50ZXI6IG9uRW50ZXIsIG9uRW50ZXJpbmc6IG9uRW50ZXJpbmcsIG9uRW50ZXJlZDogb25FbnRlcmVkLCBvbkV4aXQ6IG9uRXhpdCwgb25FeGl0aW5nOiBvbkV4aXRpbmcsIG9uRXhpdGVkOiBvbkV4aXRlZCB9KSA6IHRoaXMucmVuZGVyQm9keShjaGlsZHJlbiwgY2xzUHJlZml4KSxcbiAgICAgIGZvb3RlciAmJiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6IGNsc1ByZWZpeCArICctZm9vdGVyJywgc3R5bGU6IGZvb3RlclN0eWxlIH0sXG4gICAgICAgIGZvb3RlclxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFBhbmVsO1xufShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXG5QYW5lbC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5QYW5lbC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gUGFuZWw7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLXBhbmVsL2J1aWxkL1BhbmVsLmpzXG4vLyBtb2R1bGUgaWQgPSA4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuRmFkZSA9IGV4cG9ydHMuQ29sbGFwc2UgPSBleHBvcnRzLlRyYW5zaXRpb24gPSB1bmRlZmluZWQ7XG5cbnZhciBfVHJhbnNpdGlvbjIgPSByZXF1aXJlKCcuL1RyYW5zaXRpb24nKTtcblxudmFyIF9UcmFuc2l0aW9uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RyYW5zaXRpb24yKTtcblxudmFyIF9Db2xsYXBzZTIgPSByZXF1aXJlKCcuL0NvbGxhcHNlJyk7XG5cbnZhciBfQ29sbGFwc2UzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ29sbGFwc2UyKTtcblxudmFyIF9GYWRlMiA9IHJlcXVpcmUoJy4vRmFkZScpO1xuXG52YXIgX0ZhZGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRmFkZTIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0cy5UcmFuc2l0aW9uID0gX1RyYW5zaXRpb24zW1wiZGVmYXVsdFwiXTtcbmV4cG9ydHMuQ29sbGFwc2UgPSBfQ29sbGFwc2UzW1wiZGVmYXVsdFwiXTtcbmV4cG9ydHMuRmFkZSA9IF9GYWRlM1tcImRlZmF1bHRcIl07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS10cmFuc2l0aW9uL2J1aWxkL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuRVhJVElORyA9IGV4cG9ydHMuRU5URVJFRCA9IGV4cG9ydHMuRU5URVJJTkcgPSBleHBvcnRzLkVYSVRFRCA9IGV4cG9ydHMuVU5NT1VOVEVEID0gdW5kZWZpbmVkO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfcHJvcGVydGllcyA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL3RyYW5zaXRpb24vcHJvcGVydGllcycpO1xuXG52YXIgX3Byb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcGVydGllcyk7XG5cbnZhciBfb24gPSByZXF1aXJlKCdkb20taGVscGVycy9ldmVudHMvb24nKTtcblxudmFyIF9vbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vbik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIHRyYW5zaXRpb25FbmRFdmVudCA9IF9wcm9wZXJ0aWVzMltcImRlZmF1bHRcIl0uZW5kO1xuXG4vL+iuvue9rueKtuaAgeeggVxudmFyIFVOTU9VTlRFRCA9IGV4cG9ydHMuVU5NT1VOVEVEID0gMDtcbnZhciBFWElURUQgPSBleHBvcnRzLkVYSVRFRCA9IDE7XG52YXIgRU5URVJJTkcgPSBleHBvcnRzLkVOVEVSSU5HID0gMjtcbnZhciBFTlRFUkVEID0gZXhwb3J0cy5FTlRFUkVEID0gMztcbnZhciBFWElUSU5HID0gZXhwb3J0cy5FWElUSU5HID0gNDtcblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIOaYr+WQpuinpuWPkeWKqOeUu1xuICAgKi9cbiAgXCJpblwiOiBfcmVhY3QuUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIOS4jeaYvuekuueahOaXtuWAmeaYr+WQpuenu+mZpOe7hOS7tlxuICAgKi9cbiAgdW5tb3VudE9uRXhpdDogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiDlpoLmnpzorr7nva7kuLrpu5jorqTmmL7npLrvvIzmjILovb3ml7bmmL7npLrliqjnlLtcbiAgICovXG4gIHRyYW5zaXRpb25BcHBlYXI6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICog6K6+572u6LaF5pe25pe26Ze077yM6Ziy5q2i5Ye6546w6Zeu6aKY77yM5Y+v6K6+572u5Li6Pj3liqjnlLvml7bpl7RcbiAgICovXG4gIHRpbWVvdXQ6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiDpgIDlh7rnu4Tku7bml7bmt7vliqDnmoRjbGFzc1xuICAgKi9cbiAgZXhpdGVkQ2xhc3NOYW1lOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIOmAgOWHuue7hOS7tuS4rea3u+WKoOeahGNsYXNzXG4gICAqL1xuICBleGl0aW5nQ2xhc3NOYW1lOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIOi/m+WFpeWKqOeUu+WQjua3u+WKoOeahGNsYXNzXG4gICAqL1xuICBlbnRlcmVkQ2xhc3NOYW1lOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIOi/m+WFpeWKqOeUu+aXtua3u+WKoOeahGNsYXNzXG4gICAqL1xuICBlbnRlcmluZ0NsYXNzTmFtZTogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIOi/m+WFpeWKqOeUu+W8gOWni+aXtueahOmSqeWtkOWHveaVsFxuICAgKi9cbiAgb25FbnRlcjogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICog6L+b5YWl5Yqo55S75Lit55qE6ZKp5a2Q5Ye95pWwXG4gICAqL1xuICBvbkVudGVyaW5nOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiDov5vlhaXliqjnlLvlkI7nmoTpkqnlrZDlh73mlbBcbiAgICovXG4gIG9uRW50ZXJlZDogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICog6YCA5Ye65Yqo55S75byA5aeL5pe255qE6ZKp5a2Q5Ye95pWwXG4gICAqL1xuICBvbkV4aXQ6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIOmAgOWHuuWKqOeUu+S4reeahOmSqeWtkOWHveaVsFxuICAgKi9cbiAgb25FeGl0aW5nOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiDpgIDlh7rliqjnlLvlkI7nmoTpkqnlrZDlh73mlbBcbiAgICovXG4gIG9uRXhpdGVkOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBcImluXCI6IGZhbHNlLFxuICB1bm1vdW50T25FeGl0OiBmYWxzZSxcbiAgdHJhbnNpdGlvbkFwcGVhcjogZmFsc2UsXG4gIHRpbWVvdXQ6IDUwMDAsXG4gIG9uRW50ZXI6IG5vb3AsXG4gIG9uRW50ZXJpbmc6IG5vb3AsXG4gIG9uRW50ZXJlZDogbm9vcCxcbiAgb25FeGl0OiBub29wLFxuICBvbkV4aXRpbmc6IG5vb3AsXG4gIG9uRXhpdGVkOiBub29wXG59O1xuXG4vKipcbiAqIOWKqOeUu+e7hOS7tlxuICovXG5cbnZhciBUcmFuc2l0aW9uID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFRyYW5zaXRpb24sIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRyYW5zaXRpb24ocHJvcHMsIGNvbnRleHQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhbnNpdGlvbik7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIHZhciBpbml0aWFsU3RhdHVzID0gdm9pZCAwO1xuICAgIGlmIChwcm9wc1tcImluXCJdKSB7XG4gICAgICAvLyDlnKhjb21wb25lbnRkaWRtb3VudOaXtuW8gOWni+aJp+ihjOWKqOeUu1xuICAgICAgaW5pdGlhbFN0YXR1cyA9IHByb3BzLnRyYW5zaXRpb25BcHBlYXIgPyBFWElURUQgOiBFTlRFUkVEO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbml0aWFsU3RhdHVzID0gcHJvcHMudW5tb3VudE9uRXhpdCA/IFVOTU9VTlRFRCA6IEVYSVRFRDtcbiAgICB9XG4gICAgX3RoaXMuc3RhdGUgPSB7IHN0YXR1czogaW5pdGlhbFN0YXR1cyB9O1xuXG4gICAgX3RoaXMubmV4dENhbGxiYWNrID0gbnVsbDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBUcmFuc2l0aW9uLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICh0aGlzLnByb3BzLnRyYW5zaXRpb25BcHBlYXIgJiYgdGhpcy5wcm9wc1tcImluXCJdKSB7XG4gICAgICB0aGlzLnBlcmZvcm1FbnRlcih0aGlzLnByb3BzKTtcbiAgICB9XG4gIH07XG5cbiAgVHJhbnNpdGlvbi5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgaWYgKG5leHRQcm9wc1tcImluXCJdICYmIHRoaXMucHJvcHMudW5tb3VudE9uRXhpdCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuc3RhdHVzID09PSBVTk1PVU5URUQpIHtcbiAgICAgICAgLy8g5ZyoY29tcG9uZW50RGlkVXBkYXRl5omn6KGM5Yqo55S7LlxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc3RhdHVzOiBFWElURUQgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX25lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgVHJhbnNpdGlvbi5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIHZhciBzdGF0dXMgPSB0aGlzLnN0YXRlLnN0YXR1cztcblxuICAgIGlmICh0aGlzLnByb3BzLnVubW91bnRPbkV4aXQgJiYgc3RhdHVzID09PSBFWElURUQpIHtcbiAgICAgIC8vIOW9k+S9v+eUqHVubW91bnRPbkV4aXTml7bvvIxleGl0ZWTkuLpleGl0aW5n5ZKMdW5tb25055qE6L+H5rih54q25oCBXG4gICAgICBpZiAodGhpcy5wcm9wc1tcImluXCJdKSB7XG4gICAgICAgIHRoaXMucGVyZm9ybUVudGVyKHRoaXMucHJvcHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN0YXR1czogVU5NT1VOVEVEIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g56Gu5L+d5Y+q5ZON5bqUcHJvcOWPmOWMllxuICAgIGlmICh0aGlzLl9uZWVkc1VwZGF0ZSkge1xuICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMucHJvcHNbXCJpblwiXSkge1xuICAgICAgICBpZiAoc3RhdHVzID09PSBFWElUSU5HKSB7XG4gICAgICAgICAgdGhpcy5wZXJmb3JtRW50ZXIodGhpcy5wcm9wcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBFWElURUQpIHtcbiAgICAgICAgICB0aGlzLnBlcmZvcm1FbnRlcih0aGlzLnByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDlhbbku5bvvIzlvZPmiJHku6zlt7Lnu4/ovpPlhaXmiJbovpPlh7pcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IEVOVEVSSU5HIHx8IHN0YXR1cyA9PT0gRU5URVJFRCkge1xuICAgICAgICAgIHRoaXMucGVyZm9ybUV4aXQodGhpcy5wcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5oiR5Lus5bey57uP6L6T5YWl5oiW6L6T5Ye65a6M5oiQXG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5jYW5jZWxOZXh0Q2FsbGJhY2soKTtcbiAgfTtcblxuICBUcmFuc2l0aW9uLnByb3RvdHlwZS5wZXJmb3JtRW50ZXIgPSBmdW5jdGlvbiBwZXJmb3JtRW50ZXIocHJvcHMpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHRoaXMuY2FuY2VsTmV4dENhbGxiYWNrKCk7XG4gICAgdmFyIG5vZGUgPSBfcmVhY3REb20yW1wiZGVmYXVsdFwiXS5maW5kRE9NTm9kZSh0aGlzKTtcblxuICAgIC8vIOi/memHjOaOpeaUtuaWsHByb3BzXG4gICAgcHJvcHMub25FbnRlcihub2RlKTtcblxuICAgIHRoaXMuc2FmZVNldFN0YXRlKHsgc3RhdHVzOiBFTlRFUklORyB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczIucHJvcHMub25FbnRlcmluZyhub2RlKTtcblxuICAgICAgX3RoaXMyLm9uVHJhbnNpdGlvbkVuZChub2RlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5zYWZlU2V0U3RhdGUoeyBzdGF0dXM6IEVOVEVSRUQgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMi5wcm9wcy5vbkVudGVyZWQobm9kZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgVHJhbnNpdGlvbi5wcm90b3R5cGUucGVyZm9ybUV4aXQgPSBmdW5jdGlvbiBwZXJmb3JtRXhpdChwcm9wcykge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdGhpcy5jYW5jZWxOZXh0Q2FsbGJhY2soKTtcbiAgICB2YXIgbm9kZSA9IF9yZWFjdERvbTJbXCJkZWZhdWx0XCJdLmZpbmRET01Ob2RlKHRoaXMpO1xuXG4gICAgcHJvcHMub25FeGl0KG5vZGUpO1xuXG4gICAgdGhpcy5zYWZlU2V0U3RhdGUoeyBzdGF0dXM6IEVYSVRJTkcgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMzLnByb3BzLm9uRXhpdGluZyhub2RlKTtcblxuICAgICAgX3RoaXMzLm9uVHJhbnNpdGlvbkVuZChub2RlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5zYWZlU2V0U3RhdGUoeyBzdGF0dXM6IEVYSVRFRCB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMzLnByb3BzLm9uRXhpdGVkKG5vZGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLmNhbmNlbE5leHRDYWxsYmFjayA9IGZ1bmN0aW9uIGNhbmNlbE5leHRDYWxsYmFjaygpIHtcbiAgICBpZiAodGhpcy5uZXh0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHRoaXMubmV4dENhbGxiYWNrLmNhbmNlbCgpO1xuICAgICAgdGhpcy5uZXh0Q2FsbGJhY2sgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICBUcmFuc2l0aW9uLnByb3RvdHlwZS5zYWZlU2V0U3RhdGUgPSBmdW5jdGlvbiBzYWZlU2V0U3RhdGUobmV4dFN0YXRlLCBjYWxsYmFjaykge1xuICAgIC8vIOehruS/neWcqOe7hOS7tumUgOavgeWQjuaMgui1t+eahHNldFN0YXRl6KKr5raI6ZmkXG4gICAgdGhpcy5zZXRTdGF0ZShuZXh0U3RhdGUsIHRoaXMuc2V0TmV4dENhbGxiYWNrKGNhbGxiYWNrKSk7XG4gIH07XG5cbiAgVHJhbnNpdGlvbi5wcm90b3R5cGUuc2V0TmV4dENhbGxiYWNrID0gZnVuY3Rpb24gc2V0TmV4dENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICB2YXIgYWN0aXZlID0gdHJ1ZTtcblxuICAgIHRoaXMubmV4dENhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICBfdGhpczQubmV4dENhbGxiYWNrID0gbnVsbDtcblxuICAgICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMubmV4dENhbGxiYWNrLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5uZXh0Q2FsbGJhY2s7XG4gIH07XG5cbiAgVHJhbnNpdGlvbi5wcm90b3R5cGUub25UcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24gb25UcmFuc2l0aW9uRW5kKG5vZGUsIGhhbmRsZXIpIHtcbiAgICB0aGlzLnNldE5leHRDYWxsYmFjayhoYW5kbGVyKTtcblxuICAgIGlmIChub2RlKSB7XG4gICAgICBpZiAodHJhbnNpdGlvbkVuZEV2ZW50ID09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm5leHRDYWxsYmFjaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKDAsIF9vbjJbXCJkZWZhdWx0XCJdKShub2RlLCB0cmFuc2l0aW9uRW5kRXZlbnQsIHRoaXMubmV4dENhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQodGhpcy5uZXh0Q2FsbGJhY2ssIHRoaXMucHJvcHMudGltZW91dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQodGhpcy5uZXh0Q2FsbGJhY2ssIDApO1xuICAgIH1cbiAgfTtcblxuICBUcmFuc2l0aW9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIHN0YXR1cyA9IHRoaXMuc3RhdGUuc3RhdHVzO1xuICAgIGlmIChzdGF0dXMgPT09IFVOTU9VTlRFRCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuO1xuICAgIHZhciBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lO1xuXG4gICAgdmFyIGNoaWxkUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbJ2NoaWxkcmVuJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIE9iamVjdC5rZXlzKFRyYW5zaXRpb24ucHJvcFR5cGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiBkZWxldGUgY2hpbGRQcm9wc1trZXldO1xuICAgIH0pO1xuXG4gICAgdmFyIHRyYW5zaXRpb25DbGFzc05hbWUgPSB2b2lkIDA7XG4gICAgaWYgKHN0YXR1cyA9PT0gRVhJVEVEKSB7XG4gICAgICB0cmFuc2l0aW9uQ2xhc3NOYW1lID0gdGhpcy5wcm9wcy5leGl0ZWRDbGFzc05hbWU7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IEVOVEVSSU5HKSB7XG4gICAgICB0cmFuc2l0aW9uQ2xhc3NOYW1lID0gdGhpcy5wcm9wcy5lbnRlcmluZ0NsYXNzTmFtZTtcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gRU5URVJFRCkge1xuICAgICAgdHJhbnNpdGlvbkNsYXNzTmFtZSA9IHRoaXMucHJvcHMuZW50ZXJlZENsYXNzTmFtZTtcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gRVhJVElORykge1xuICAgICAgdHJhbnNpdGlvbkNsYXNzTmFtZSA9IHRoaXMucHJvcHMuZXhpdGluZ0NsYXNzTmFtZTtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBfcmVhY3QyW1wiZGVmYXVsdFwiXS5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTtcbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY2xvbmVFbGVtZW50KGNoaWxkLCBfZXh0ZW5kcyh7fSwgY2hpbGRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyW1wiZGVmYXVsdFwiXSkoY2hpbGQucHJvcHMuY2xhc3NOYW1lLCBjbGFzc05hbWUsIHRyYW5zaXRpb25DbGFzc05hbWUpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBUcmFuc2l0aW9uO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuVHJhbnNpdGlvbi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cblRyYW5zaXRpb24uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFRyYW5zaXRpb247XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS10cmFuc2l0aW9uL2J1aWxkL1RyYW5zaXRpb24uanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gUmVhY3RET007XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJSZWFjdERPTVwiXG4vLyBtb2R1bGUgaWQgPSAxMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRyYW5zaXRpb25FbmQgPSBleHBvcnRzLnRyYW5zaXRpb25EdXJhdGlvbiA9IGV4cG9ydHMudHJhbnNpdGlvbkRlbGF5ID0gZXhwb3J0cy50cmFuc2l0aW9uVGltaW5nID0gZXhwb3J0cy50cmFuc2l0aW9uUHJvcGVydHkgPSBleHBvcnRzLnRyYW5zZm9ybSA9IHVuZGVmaW5lZDtcblxudmFyIF9pbkRPTSA9IHJlcXVpcmUoJy4uL3V0aWwvaW5ET00nKTtcblxudmFyIF9pbkRPTTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbkRPTSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciB0cmFuc2Zvcm0gPSAndHJhbnNmb3JtJztcbnZhciBwcmVmaXggPSB2b2lkIDAsXG4gICAgdHJhbnNpdGlvbkVuZCA9IHZvaWQgMDtcbnZhciB0cmFuc2l0aW9uVGltaW5nID0gdm9pZCAwLFxuICAgIHRyYW5zaXRpb25EdXJhdGlvbiA9IHZvaWQgMDtcbnZhciB0cmFuc2l0aW9uUHJvcGVydHkgPSB2b2lkIDAsXG4gICAgdHJhbnNpdGlvbkRlbGF5ID0gdm9pZCAwO1xuXG5pZiAoX2luRE9NMi5kZWZhdWx0KSB7XG4gIHZhciBfZ2V0VHJhbnNpdGlvblByb3BlcnQgPSBnZXRUcmFuc2l0aW9uUHJvcGVydGllcygpO1xuXG4gIHByZWZpeCA9IF9nZXRUcmFuc2l0aW9uUHJvcGVydC5wcmVmaXg7XG4gIGV4cG9ydHMudHJhbnNpdGlvbkVuZCA9IHRyYW5zaXRpb25FbmQgPSBfZ2V0VHJhbnNpdGlvblByb3BlcnQudHJhbnNpdGlvbkVuZDtcblxuXG4gIGV4cG9ydHMudHJhbnNmb3JtID0gdHJhbnNmb3JtID0gcHJlZml4ICsgJy0nICsgdHJhbnNmb3JtO1xuICBleHBvcnRzLnRyYW5zaXRpb25Qcm9wZXJ0eSA9IHRyYW5zaXRpb25Qcm9wZXJ0eSA9IHByZWZpeCArICctdHJhbnNpdGlvbi1wcm9wZXJ0eSc7XG4gIGV4cG9ydHMudHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uID0gcHJlZml4ICsgJy10cmFuc2l0aW9uLWR1cmF0aW9uJztcbiAgZXhwb3J0cy50cmFuc2l0aW9uRGVsYXkgPSB0cmFuc2l0aW9uRGVsYXkgPSBwcmVmaXggKyAnLXRyYW5zaXRpb24tZGVsYXknO1xuICBleHBvcnRzLnRyYW5zaXRpb25UaW1pbmcgPSB0cmFuc2l0aW9uVGltaW5nID0gcHJlZml4ICsgJy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbic7XG59XG5cbmV4cG9ydHMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuZXhwb3J0cy50cmFuc2l0aW9uUHJvcGVydHkgPSB0cmFuc2l0aW9uUHJvcGVydHk7XG5leHBvcnRzLnRyYW5zaXRpb25UaW1pbmcgPSB0cmFuc2l0aW9uVGltaW5nO1xuZXhwb3J0cy50cmFuc2l0aW9uRGVsYXkgPSB0cmFuc2l0aW9uRGVsYXk7XG5leHBvcnRzLnRyYW5zaXRpb25EdXJhdGlvbiA9IHRyYW5zaXRpb25EdXJhdGlvbjtcbmV4cG9ydHMudHJhbnNpdGlvbkVuZCA9IHRyYW5zaXRpb25FbmQ7XG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICBlbmQ6IHRyYW5zaXRpb25FbmQsXG4gIHByb3BlcnR5OiB0cmFuc2l0aW9uUHJvcGVydHksXG4gIHRpbWluZzogdHJhbnNpdGlvblRpbWluZyxcbiAgZGVsYXk6IHRyYW5zaXRpb25EZWxheSxcbiAgZHVyYXRpb246IHRyYW5zaXRpb25EdXJhdGlvblxufTtcblxuXG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uUHJvcGVydGllcygpIHtcbiAgdmFyIHRyYW5zaXRpb25FbmQgPSB2b2lkIDA7XG4gIHZhciBwcmVmaXggPSAnJztcbiAgdmFyIGV2ZW50TmFtZXMgPSB7XG4gICAgTzogJ290cmFuc2l0aW9uZW5kJyxcbiAgICBNb3o6ICd0cmFuc2l0aW9uZW5kJyxcbiAgICBXZWJraXQ6ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgICBtczogJ01TVHJhbnNpdGlvbkVuZCdcbiAgfTtcblxuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBmb3IgKHZhciB2ZW5kb3IgaW4gZXZlbnROYW1lcykge1xuICAgIGlmIChldmVudE5hbWVzLmhhc093blByb3BlcnR5KHZlbmRvcikpIHtcbiAgICAgIGlmIChlbGVtZW50LnN0eWxlW3ZlbmRvciArICdUcmFuc2l0aW9uUHJvcGVydHknXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByZWZpeCA9ICctJyArIHZlbmRvci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB0cmFuc2l0aW9uRW5kID0gZXZlbnROYW1lc1t2ZW5kb3JdO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1pZiAoIXRyYW5zaXRpb25FbmQgJiYgZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uUHJvcGVydHkgIT09IHVuZGVmaW5lZCkgdHJhbnNpdGlvbkVuZCA9ICd0cmFuc2l0aW9uZW5kJztcblxuICBlbGVtZW50ID0gbnVsbDtcblxuICByZXR1cm4geyB0cmFuc2l0aW9uRW5kOiB0cmFuc2l0aW9uRW5kLCBwcmVmaXg6IHByZWZpeCB9O1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20taGVscGVycy90cmFuc2l0aW9uL3Byb3BlcnRpZXMuanNcbi8vIG1vZHVsZSBpZCA9IDEyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWhlbHBlcnMvdXRpbC9pbkRPTS5qc1xuLy8gbW9kdWxlIGlkID0gMTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2luRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9pbkRPTScpO1xuXG52YXIgX2luRE9NMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luRE9NKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIG9uID0gZnVuY3Rpb24gb24oKSB7fTtcbmlmIChfaW5ET00yLmRlZmF1bHQpIHtcbiAgb24gPSBmdW5jdGlvbiAoKSB7XG5cbiAgICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuIGZ1bmN0aW9uIChub2RlLCBldmVudE5hbWUsIGhhbmRsZXIsIGNhcHR1cmUpIHtcbiAgICAgIHJldHVybiBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyLCBjYXB0dXJlIHx8IGZhbHNlKTtcbiAgICB9O2Vsc2UgaWYgKGRvY3VtZW50LmF0dGFjaEV2ZW50KSByZXR1cm4gZnVuY3Rpb24gKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikge1xuICAgICAgcmV0dXJuIG5vZGUuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgfTtcbiAgfSgpO1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20taGVscGVycy9ldmVudHMvb24uanNcbi8vIG1vZHVsZSBpZCA9IDE0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfc3R5bGUgPSByZXF1aXJlKCdkb20taGVscGVycy9zdHlsZScpO1xuXG52YXIgX3N0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0eWxlKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX1RyYW5zaXRpb24gPSByZXF1aXJlKCcuL1RyYW5zaXRpb24nKTtcblxudmFyIF9UcmFuc2l0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RyYW5zaXRpb24pO1xuXG52YXIgX2NhcGl0YWxpemUgPSByZXF1aXJlKCcuL3V0aWwvY2FwaXRhbGl6ZScpO1xuXG52YXIgX2NhcGl0YWxpemUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2FwaXRhbGl6ZSk7XG5cbnZhciBfdGlucGVyQmVlQ29yZSA9IHJlcXVpcmUoJ3RpbnBlci1iZWUtY29yZScpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIE1BUkdJTlMgPSB7XG4gIGhlaWdodDogWydtYXJnaW5Ub3AnLCAnbWFyZ2luQm90dG9tJ10sXG4gIHdpZHRoOiBbJ21hcmdpbkxlZnQnLCAnbWFyZ2luUmlnaHQnXVxufTtcblxuLy8gcmVhZGluZyBhIGRpbWVuc2lvbiBwcm9wIHdpbGwgY2F1c2UgdGhlIGJyb3dzZXIgdG8gcmVjYWxjdWxhdGUsXG4vLyB3aGljaCB3aWxsIGxldCBvdXIgYW5pbWF0aW9ucyB3b3JrXG5mdW5jdGlvbiB0cmlnZ2VyQnJvd3NlclJlZmxvdyhub2RlKSB7XG4gIG5vZGUub2Zmc2V0SGVpZ2h0OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xufVxuXG5mdW5jdGlvbiBnZXREaW1lbnNpb25WYWx1ZShkaW1lbnNpb24sIGVsZW0pIHtcbiAgdmFyIHZhbHVlID0gZWxlbVsnb2Zmc2V0JyArICgwLCBfY2FwaXRhbGl6ZTJbXCJkZWZhdWx0XCJdKShkaW1lbnNpb24pXTtcbiAgdmFyIG1hcmdpbnMgPSBNQVJHSU5TW2RpbWVuc2lvbl07XG5cbiAgcmV0dXJuIHZhbHVlICsgcGFyc2VJbnQoKDAsIF9zdHlsZTJbXCJkZWZhdWx0XCJdKShlbGVtLCBtYXJnaW5zWzBdKSwgMTApICsgcGFyc2VJbnQoKDAsIF9zdHlsZTJbXCJkZWZhdWx0XCJdKShlbGVtLCBtYXJnaW5zWzFdKSwgMTApO1xufVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcclxuICAgKiBTaG93IHRoZSBjb21wb25lbnQ7IHRyaWdnZXJzIHRoZSBleHBhbmQgb3IgY29sbGFwc2UgYW5pbWF0aW9uXHJcbiAgICovXG4gIFwiaW5cIjogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXHJcbiAgICogVW5tb3VudCB0aGUgY29tcG9uZW50IChyZW1vdmUgaXQgZnJvbSB0aGUgRE9NKSB3aGVuIGl0IGlzIGNvbGxhcHNlZFxyXG4gICAqL1xuICB1bm1vdW50T25FeGl0OiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuYm9vbCxcblxuICAvKipcclxuICAgKiBSdW4gdGhlIGV4cGFuZCBhbmltYXRpb24gd2hlbiB0aGUgY29tcG9uZW50IG1vdW50cywgaWYgaXQgaXMgaW5pdGlhbGx5XHJcbiAgICogc2hvd25cclxuICAgKi9cbiAgdHJhbnNpdGlvbkFwcGVhcjogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXHJcbiAgICogRHVyYXRpb24gb2YgdGhlIGNvbGxhcHNlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMsIHRvIGVuc3VyZSB0aGF0XHJcbiAgICogZmluaXNoaW5nIGNhbGxiYWNrcyBhcmUgZmlyZWQgZXZlbiBpZiB0aGUgb3JpZ2luYWwgYnJvd3NlciB0cmFuc2l0aW9uIGVuZFxyXG4gICAqIGV2ZW50cyBhcmUgY2FuY2VsZWRcclxuICAgKi9cbiAgdGltZW91dDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcclxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBleHBhbmRzXHJcbiAgICovXG4gIG9uRW50ZXI6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jLFxuICAvKipcclxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgY29tcG9uZW50IHN0YXJ0cyB0byBleHBhbmRcclxuICAgKi9cbiAgb25FbnRlcmluZzogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxyXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIGV4cGFuZGVkXHJcbiAgICovXG4gIG9uRW50ZXJlZDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxyXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGNvbGxhcHNlc1xyXG4gICAqL1xuICBvbkV4aXQ6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jLFxuICAvKipcclxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgY29tcG9uZW50IHN0YXJ0cyB0byBjb2xsYXBzZVxyXG4gICAqL1xuICBvbkV4aXRpbmc6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jLFxuICAvKipcclxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBjb2xsYXBzZWRcclxuICAgKi9cbiAgb25FeGl0ZWQ6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxyXG4gICAqIFRoZSBkaW1lbnNpb24gdXNlZCB3aGVuIGNvbGxhcHNpbmcsIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZVxyXG4gICAqIGRpbWVuc2lvblxyXG4gICAqXHJcbiAgICogX05vdGU6IEJvb3RzdHJhcCBvbmx5IHBhcnRpYWxseSBzdXBwb3J0cyAnd2lkdGgnIVxyXG4gICAqIFlvdSB3aWxsIG5lZWQgdG8gc3VwcGx5IHlvdXIgb3duIENTUyBhbmltYXRpb24gZm9yIHRoZSBgLndpZHRoYCBDU1MgY2xhc3MuX1xyXG4gICAqL1xuICBkaW1lbnNpb246IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5vbmVPZlR5cGUoW19yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5vbmVPZihbJ2hlaWdodCcsICd3aWR0aCddKSwgX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmNdKSxcblxuICAvKipcclxuICAgKiBGdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGhlaWdodCBvciB3aWR0aCBvZiB0aGUgYW5pbWF0aW5nIERPTSBub2RlXHJcbiAgICpcclxuICAgKiBBbGxvd3MgZm9yIHByb3ZpZGluZyBzb21lIGN1c3RvbSBsb2dpYyBmb3IgaG93IG11Y2ggdGhlIENvbGxhcHNlIGNvbXBvbmVudFxyXG4gICAqIHNob3VsZCBhbmltYXRlIGluIGl0cyBzcGVjaWZpZWQgZGltZW5zaW9uLiBDYWxsZWQgd2l0aCB0aGUgY3VycmVudFxyXG4gICAqIGRpbWVuc2lvbiBwcm9wIHZhbHVlIGFuZCB0aGUgRE9NIG5vZGUuXHJcbiAgICovXG4gIGdldERpbWVuc2lvblZhbHVlOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcblxuICAvKipcclxuICAgKiBBUklBIHJvbGUgb2YgY29sbGFwc2libGUgZWxlbWVudFxyXG4gICAqL1xuICByb2xlOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuc3RyaW5nXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBcImluXCI6IGZhbHNlLFxuICB0aW1lb3V0OiAzMDAsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlLFxuICB0cmFuc2l0aW9uQXBwZWFyOiBmYWxzZSxcblxuICBkaW1lbnNpb246ICdoZWlnaHQnLFxuICBnZXREaW1lbnNpb25WYWx1ZTogZ2V0RGltZW5zaW9uVmFsdWVcbn07XG5cbnZhciBDb2xsYXBzZSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhDb2xsYXBzZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ29sbGFwc2UocHJvcHMsIGNvbnRleHQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29sbGFwc2UpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVFbnRlciA9IF90aGlzLmhhbmRsZUVudGVyLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZUVudGVyaW5nID0gX3RoaXMuaGFuZGxlRW50ZXJpbmcuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlRW50ZXJlZCA9IF90aGlzLmhhbmRsZUVudGVyZWQuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlRXhpdCA9IF90aGlzLmhhbmRsZUV4aXQuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlRXhpdGluZyA9IF90aGlzLmhhbmRsZUV4aXRpbmcuYmluZChfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyogLS0gRXhwYW5kaW5nIC0tICovXG5cblxuICBDb2xsYXBzZS5wcm90b3R5cGUuaGFuZGxlRW50ZXIgPSBmdW5jdGlvbiBoYW5kbGVFbnRlcihlbGVtKSB7XG4gICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2RpbWVuc2lvbigpO1xuICAgIGVsZW0uc3R5bGVbZGltZW5zaW9uXSA9ICcwJztcbiAgfTtcblxuICBDb2xsYXBzZS5wcm90b3R5cGUuaGFuZGxlRW50ZXJpbmcgPSBmdW5jdGlvbiBoYW5kbGVFbnRlcmluZyhlbGVtKSB7XG4gICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2RpbWVuc2lvbigpO1xuICAgIGVsZW0uc3R5bGVbZGltZW5zaW9uXSA9IHRoaXMuX2dldFNjcm9sbERpbWVuc2lvblZhbHVlKGVsZW0sIGRpbWVuc2lvbik7XG4gIH07XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLmhhbmRsZUVudGVyZWQgPSBmdW5jdGlvbiBoYW5kbGVFbnRlcmVkKGVsZW0pIHtcbiAgICB2YXIgZGltZW5zaW9uID0gdGhpcy5fZGltZW5zaW9uKCk7XG4gICAgZWxlbS5zdHlsZVtkaW1lbnNpb25dID0gbnVsbDtcbiAgfTtcblxuICAvKiAtLSBDb2xsYXBzaW5nIC0tICovXG5cblxuICBDb2xsYXBzZS5wcm90b3R5cGUuaGFuZGxlRXhpdCA9IGZ1bmN0aW9uIGhhbmRsZUV4aXQoZWxlbSkge1xuICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9kaW1lbnNpb24oKTtcbiAgICBlbGVtLnN0eWxlW2RpbWVuc2lvbl0gPSB0aGlzLnByb3BzLmdldERpbWVuc2lvblZhbHVlKGRpbWVuc2lvbiwgZWxlbSkgKyAncHgnO1xuICAgIHRyaWdnZXJCcm93c2VyUmVmbG93KGVsZW0pO1xuICB9O1xuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5oYW5kbGVFeGl0aW5nID0gZnVuY3Rpb24gaGFuZGxlRXhpdGluZyhlbGVtKSB7XG4gICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2RpbWVuc2lvbigpO1xuICAgIGVsZW0uc3R5bGVbZGltZW5zaW9uXSA9ICcwJztcbiAgfTtcblxuICBDb2xsYXBzZS5wcm90b3R5cGUuX2RpbWVuc2lvbiA9IGZ1bmN0aW9uIF9kaW1lbnNpb24oKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLnByb3BzLmRpbWVuc2lvbiA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMucHJvcHMuZGltZW5zaW9uKCkgOiB0aGlzLnByb3BzLmRpbWVuc2lvbjtcbiAgfTtcblxuICAvLyBmb3IgdGVzdGluZ1xuXG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLl9nZXRTY3JvbGxEaW1lbnNpb25WYWx1ZSA9IGZ1bmN0aW9uIF9nZXRTY3JvbGxEaW1lbnNpb25WYWx1ZShlbGVtLCBkaW1lbnNpb24pIHtcbiAgICByZXR1cm4gZWxlbVsnc2Nyb2xsJyArICgwLCBfY2FwaXRhbGl6ZTJbXCJkZWZhdWx0XCJdKShkaW1lbnNpb24pXSArICdweCc7XG4gIH07XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgb25FbnRlciA9IF9wcm9wcy5vbkVudGVyO1xuICAgIHZhciBvbkVudGVyaW5nID0gX3Byb3BzLm9uRW50ZXJpbmc7XG4gICAgdmFyIG9uRW50ZXJlZCA9IF9wcm9wcy5vbkVudGVyZWQ7XG4gICAgdmFyIG9uRXhpdCA9IF9wcm9wcy5vbkV4aXQ7XG4gICAgdmFyIG9uRXhpdGluZyA9IF9wcm9wcy5vbkV4aXRpbmc7XG4gICAgdmFyIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWU7XG5cbiAgICB2YXIgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbJ29uRW50ZXInLCAnb25FbnRlcmluZycsICdvbkVudGVyZWQnLCAnb25FeGl0JywgJ29uRXhpdGluZycsICdjbGFzc05hbWUnXSk7XG5cbiAgICBkZWxldGUgcHJvcHMuZGltZW5zaW9uO1xuICAgIGRlbGV0ZSBwcm9wcy5nZXREaW1lbnNpb25WYWx1ZTtcblxuICAgIHZhciBoYW5kbGVFbnRlciA9ICgwLCBfdGlucGVyQmVlQ29yZS5jcmVhdGVDaGFpbmVkRnVuY3Rpb24pKHRoaXMuaGFuZGxlRW50ZXIsIG9uRW50ZXIpO1xuICAgIHZhciBoYW5kbGVFbnRlcmluZyA9ICgwLCBfdGlucGVyQmVlQ29yZS5jcmVhdGVDaGFpbmVkRnVuY3Rpb24pKHRoaXMuaGFuZGxlRW50ZXJpbmcsIG9uRW50ZXJpbmcpO1xuICAgIHZhciBoYW5kbGVFbnRlcmVkID0gKDAsIF90aW5wZXJCZWVDb3JlLmNyZWF0ZUNoYWluZWRGdW5jdGlvbikodGhpcy5oYW5kbGVFbnRlcmVkLCBvbkVudGVyZWQpO1xuICAgIHZhciBoYW5kbGVFeGl0ID0gKDAsIF90aW5wZXJCZWVDb3JlLmNyZWF0ZUNoYWluZWRGdW5jdGlvbikodGhpcy5oYW5kbGVFeGl0LCBvbkV4aXQpO1xuICAgIHZhciBoYW5kbGVFeGl0aW5nID0gKDAsIF90aW5wZXJCZWVDb3JlLmNyZWF0ZUNoYWluZWRGdW5jdGlvbikodGhpcy5oYW5kbGVFeGl0aW5nLCBvbkV4aXRpbmcpO1xuXG4gICAgdmFyIGNsYXNzZXMgPSB7XG4gICAgICB3aWR0aDogdGhpcy5fZGltZW5zaW9uKCkgPT09ICd3aWR0aCdcbiAgICB9O1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoX1RyYW5zaXRpb24yW1wiZGVmYXVsdFwiXSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAnYXJpYS1leHBhbmRlZCc6IHByb3BzLnJvbGUgPyBwcm9wc1tcImluXCJdIDogbnVsbCxcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKGNsYXNzTmFtZSwgY2xhc3NlcyksXG4gICAgICBleGl0ZWRDbGFzc05hbWU6ICdjb2xsYXBzZScsXG4gICAgICBleGl0aW5nQ2xhc3NOYW1lOiAnY29sbGFwc2luZycsXG4gICAgICBlbnRlcmVkQ2xhc3NOYW1lOiAnY29sbGFwc2UgaW4nLFxuICAgICAgZW50ZXJpbmdDbGFzc05hbWU6ICdjb2xsYXBzaW5nJyxcbiAgICAgIG9uRW50ZXI6IGhhbmRsZUVudGVyLFxuICAgICAgb25FbnRlcmluZzogaGFuZGxlRW50ZXJpbmcsXG4gICAgICBvbkVudGVyZWQ6IGhhbmRsZUVudGVyZWQsXG4gICAgICBvbkV4aXQ6IGhhbmRsZUV4aXQsXG4gICAgICBvbkV4aXRpbmc6IGhhbmRsZUV4aXRpbmdcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIENvbGxhcHNlO1xufShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXG5Db2xsYXBzZS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Db2xsYXBzZS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQ29sbGFwc2U7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLXRyYW5zaXRpb24vYnVpbGQvQ29sbGFwc2UuanNcbi8vIG1vZHVsZSBpZCA9IDE1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHN0eWxlO1xuXG52YXIgX2NhbWVsaXplU3R5bGUgPSByZXF1aXJlKCcuLi91dGlsL2NhbWVsaXplU3R5bGUnKTtcblxudmFyIF9jYW1lbGl6ZVN0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NhbWVsaXplU3R5bGUpO1xuXG52YXIgX2h5cGhlbmF0ZVN0eWxlID0gcmVxdWlyZSgnLi4vdXRpbC9oeXBoZW5hdGVTdHlsZScpO1xuXG52YXIgX2h5cGhlbmF0ZVN0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2h5cGhlbmF0ZVN0eWxlKTtcblxudmFyIF9nZXRDb21wdXRlZFN0eWxlMiA9IHJlcXVpcmUoJy4vZ2V0Q29tcHV0ZWRTdHlsZScpO1xuXG52YXIgX2dldENvbXB1dGVkU3R5bGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0Q29tcHV0ZWRTdHlsZTIpO1xuXG52YXIgX3JlbW92ZVN0eWxlID0gcmVxdWlyZSgnLi9yZW1vdmVTdHlsZScpO1xuXG52YXIgX3JlbW92ZVN0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlbW92ZVN0eWxlKTtcblxudmFyIF9wcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vdHJhbnNpdGlvbi9wcm9wZXJ0aWVzJyk7XG5cbnZhciBfaXNUcmFuc2Zvcm0gPSByZXF1aXJlKCcuLi90cmFuc2l0aW9uL2lzVHJhbnNmb3JtJyk7XG5cbnZhciBfaXNUcmFuc2Zvcm0yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBzdHlsZShub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgdmFyIGNzcyA9ICcnO1xuICB2YXIgdHJhbnNmb3JtcyA9ICcnO1xuICB2YXIgcHJvcHMgPSBwcm9wZXJ0eTtcblxuICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbm9kZS5zdHlsZVsoMCwgX2NhbWVsaXplU3R5bGUyLmRlZmF1bHQpKHByb3BlcnR5KV0gfHwgKDAsIF9nZXRDb21wdXRlZFN0eWxlMy5kZWZhdWx0KShub2RlKS5nZXRQcm9wZXJ0eVZhbHVlKCgwLCBfaHlwaGVuYXRlU3R5bGUyLmRlZmF1bHQpKHByb3BlcnR5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIChwcm9wcyA9IHt9KVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHZhbHVlID0gcHJvcHNba2V5XTtcbiAgICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7XG4gICAgICAoMCwgX3JlbW92ZVN0eWxlMi5kZWZhdWx0KShub2RlLCAoMCwgX2h5cGhlbmF0ZVN0eWxlMi5kZWZhdWx0KShrZXkpKTtcbiAgICB9IGVsc2UgaWYgKCgwLCBfaXNUcmFuc2Zvcm0yLmRlZmF1bHQpKGtleSkpIHtcbiAgICAgIHRyYW5zZm9ybXMgKz0ga2V5ICsgJygnICsgdmFsdWUgKyAnKSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjc3MgKz0gKDAsIF9oeXBoZW5hdGVTdHlsZTIuZGVmYXVsdCkoa2V5KSArICc6ICcgKyB2YWx1ZSArICc7JztcbiAgICB9XG4gIH0pO1xuXG4gIGlmICh0cmFuc2Zvcm1zKSB7XG4gICAgY3NzICs9IF9wcm9wZXJ0aWVzLnRyYW5zZm9ybSArICc6ICcgKyB0cmFuc2Zvcm1zICsgJzsnO1xuICB9XG5cbiAgbm9kZS5zdHlsZS5jc3NUZXh0ICs9ICc7JyArIGNzcztcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20taGVscGVycy9zdHlsZS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gY2FtZWxpemVTdHlsZU5hbWU7XG5cbnZhciBfY2FtZWxpemUgPSByZXF1aXJlKCcuL2NhbWVsaXplJyk7XG5cbnZhciBfY2FtZWxpemUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2FtZWxpemUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgbXNQYXR0ZXJuID0gL14tbXMtLzsgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iLzJhZWI4YTJhNmJlYjAwNjE3YTQyMTdmN2Y4Mjg0OTI0ZmEyYWQ4MTkvc3JjL3ZlbmRvci9jb3JlL2NhbWVsaXplU3R5bGVOYW1lLmpzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICovXG5mdW5jdGlvbiBjYW1lbGl6ZVN0eWxlTmFtZShzdHJpbmcpIHtcbiAgcmV0dXJuICgwLCBfY2FtZWxpemUyLmRlZmF1bHQpKHN0cmluZy5yZXBsYWNlKG1zUGF0dGVybiwgJ21zLScpKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20taGVscGVycy91dGlsL2NhbWVsaXplU3R5bGUuanNcbi8vIG1vZHVsZSBpZCA9IDE3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gY2FtZWxpemU7XG52YXIgckh5cGhlbiA9IC8tKC4pL2c7XG5cbmZ1bmN0aW9uIGNhbWVsaXplKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2Uockh5cGhlbiwgZnVuY3Rpb24gKF8sIGNocikge1xuICAgIHJldHVybiBjaHIudG9VcHBlckNhc2UoKTtcbiAgfSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20taGVscGVycy91dGlsL2NhbWVsaXplLmpzXG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBoeXBoZW5hdGVTdHlsZU5hbWU7XG5cbnZhciBfaHlwaGVuYXRlID0gcmVxdWlyZSgnLi9oeXBoZW5hdGUnKTtcblxudmFyIF9oeXBoZW5hdGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaHlwaGVuYXRlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIG1zUGF0dGVybiA9IC9ebXMtLzsgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBDb3B5cmlnaHQgMjAxMy0yMDE0LCBGYWNlYm9vaywgSW5jLlxuICAgICAgICAgICAgICAgICAgICAgICAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iLzJhZWI4YTJhNmJlYjAwNjE3YTQyMTdmN2Y4Mjg0OTI0ZmEyYWQ4MTkvc3JjL3ZlbmRvci9jb3JlL2h5cGhlbmF0ZVN0eWxlTmFtZS5qc1xuICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmZ1bmN0aW9uIGh5cGhlbmF0ZVN0eWxlTmFtZShzdHJpbmcpIHtcbiAgcmV0dXJuICgwLCBfaHlwaGVuYXRlMi5kZWZhdWx0KShzdHJpbmcpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2RvbS1oZWxwZXJzL3V0aWwvaHlwaGVuYXRlU3R5bGUuanNcbi8vIG1vZHVsZSBpZCA9IDE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGh5cGhlbmF0ZTtcblxudmFyIHJVcHBlciA9IC8oW0EtWl0pL2c7XG5cbmZ1bmN0aW9uIGh5cGhlbmF0ZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJVcHBlciwgJy0kMScpLnRvTG93ZXJDYXNlKCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWhlbHBlcnMvdXRpbC9oeXBoZW5hdGUuanNcbi8vIG1vZHVsZSBpZCA9IDIwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9nZXRDb21wdXRlZFN0eWxlO1xuXG52YXIgX2NhbWVsaXplU3R5bGUgPSByZXF1aXJlKCcuLi91dGlsL2NhbWVsaXplU3R5bGUnKTtcblxudmFyIF9jYW1lbGl6ZVN0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NhbWVsaXplU3R5bGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgcnBvc2l0aW9uID0gL14odG9wfHJpZ2h0fGJvdHRvbXxsZWZ0KSQvO1xudmFyIHJudW1ub25weCA9IC9eKFsrLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KSkoPyFweClbYS16JV0rJC9pO1xuXG5mdW5jdGlvbiBfZ2V0Q29tcHV0ZWRTdHlsZShub2RlKSB7XG4gIGlmICghbm9kZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gRWxlbWVudCBwYXNzZWQgdG8gYGdldENvbXB1dGVkU3R5bGUoKWAnKTtcbiAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcblxuICByZXR1cm4gJ2RlZmF1bHRWaWV3JyBpbiBkb2MgPyBkb2MuZGVmYXVsdFZpZXcub3BlbmVyID8gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkgOiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKSA6IHtcbiAgICAvL2llIDggXCJtYWdpY1wiIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2Jsb2IvMS4xMS1zdGFibGUvc3JjL2Nzcy9jdXJDU1MuanMjTDcyXG4gICAgZ2V0UHJvcGVydHlWYWx1ZTogZnVuY3Rpb24gZ2V0UHJvcGVydHlWYWx1ZShwcm9wKSB7XG4gICAgICB2YXIgc3R5bGUgPSBub2RlLnN0eWxlO1xuXG4gICAgICBwcm9wID0gKDAsIF9jYW1lbGl6ZVN0eWxlMi5kZWZhdWx0KShwcm9wKTtcblxuICAgICAgaWYgKHByb3AgPT0gJ2Zsb2F0JykgcHJvcCA9ICdzdHlsZUZsb2F0JztcblxuICAgICAgdmFyIGN1cnJlbnQgPSBub2RlLmN1cnJlbnRTdHlsZVtwcm9wXSB8fCBudWxsO1xuXG4gICAgICBpZiAoY3VycmVudCA9PSBudWxsICYmIHN0eWxlICYmIHN0eWxlW3Byb3BdKSBjdXJyZW50ID0gc3R5bGVbcHJvcF07XG5cbiAgICAgIGlmIChybnVtbm9ucHgudGVzdChjdXJyZW50KSAmJiAhcnBvc2l0aW9uLnRlc3QocHJvcCkpIHtcbiAgICAgICAgLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuICAgICAgICB2YXIgbGVmdCA9IHN0eWxlLmxlZnQ7XG4gICAgICAgIHZhciBydW5TdHlsZSA9IG5vZGUucnVudGltZVN0eWxlO1xuICAgICAgICB2YXIgcnNMZWZ0ID0gcnVuU3R5bGUgJiYgcnVuU3R5bGUubGVmdDtcblxuICAgICAgICAvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG4gICAgICAgIGlmIChyc0xlZnQpIHJ1blN0eWxlLmxlZnQgPSBub2RlLmN1cnJlbnRTdHlsZS5sZWZ0O1xuXG4gICAgICAgIHN0eWxlLmxlZnQgPSBwcm9wID09PSAnZm9udFNpemUnID8gJzFlbScgOiBjdXJyZW50O1xuICAgICAgICBjdXJyZW50ID0gc3R5bGUucGl4ZWxMZWZ0ICsgJ3B4JztcblxuICAgICAgICAvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG4gICAgICAgIHN0eWxlLmxlZnQgPSBsZWZ0O1xuICAgICAgICBpZiAocnNMZWZ0KSBydW5TdHlsZS5sZWZ0ID0gcnNMZWZ0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWhlbHBlcnMvc3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS5qc1xuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gcmVtb3ZlU3R5bGU7XG5mdW5jdGlvbiByZW1vdmVTdHlsZShub2RlLCBrZXkpIHtcbiAgcmV0dXJuICdyZW1vdmVQcm9wZXJ0eScgaW4gbm9kZS5zdHlsZSA/IG5vZGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoa2V5KSA6IG5vZGUuc3R5bGUucmVtb3ZlQXR0cmlidXRlKGtleSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWhlbHBlcnMvc3R5bGUvcmVtb3ZlU3R5bGUuanNcbi8vIG1vZHVsZSBpZCA9IDIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gaXNUcmFuc2Zvcm07XG52YXIgc3VwcG9ydGVkVHJhbnNmb3JtcyA9IC9eKCh0cmFuc2xhdGV8cm90YXRlfHNjYWxlKShYfFl8WnwzZCk/fG1hdHJpeCgzZCk/fHBlcnNwZWN0aXZlfHNrZXcoWHxZKT8pJC9pO1xuXG5mdW5jdGlvbiBpc1RyYW5zZm9ybShwcm9wZXJ0eSkge1xuICByZXR1cm4gISEocHJvcGVydHkgJiYgc3VwcG9ydGVkVHJhbnNmb3Jtcy50ZXN0KHByb3BlcnR5KSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20taGVscGVycy90cmFuc2l0aW9uL2lzVHJhbnNmb3JtLmpzXG4vLyBtb2R1bGUgaWQgPSAyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gY2FwaXRhbGl6ZTtcbmZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gIHJldHVybiBcIlwiICsgc3RyaW5nLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKDEpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLXRyYW5zaXRpb24vYnVpbGQvdXRpbC9jYXBpdGFsaXplLmpzXG4vLyBtb2R1bGUgaWQgPSAyNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLkFsaWduID0gZXhwb3J0cy50b0FycmF5ID0gZXhwb3J0cy5jc3NBbmltYXRpb24gPSBleHBvcnRzLmFkZEV2ZW50TGlzdGVuZXIgPSBleHBvcnRzLmNvbnRhaW5zID0gZXhwb3J0cy5LZXlDb2RlID0gZXhwb3J0cy5jcmVhdGVDaGFpbmVkRnVuY3Rpb24gPSBleHBvcnRzLnNwbGl0Q29tcG9uZW50ID0gZXhwb3J0cy5pc1JlcXVpcmVkRm9yQTExeSA9IGV4cG9ydHMuZWxlbWVudFR5cGUgPSBleHBvcnRzLmRlcHJlY2F0ZWQgPSBleHBvcnRzLmNvbXBvbmVudE9yRWxlbWVudCA9IGV4cG9ydHMuYWxsID0gdW5kZWZpbmVkO1xuXG52YXIgX2FsbDIgPSByZXF1aXJlKCcuL2FsbCcpO1xuXG52YXIgX2FsbDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hbGwyKTtcblxudmFyIF9jb21wb25lbnRPckVsZW1lbnQyID0gcmVxdWlyZSgnLi9jb21wb25lbnRPckVsZW1lbnQnKTtcblxudmFyIF9jb21wb25lbnRPckVsZW1lbnQzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29tcG9uZW50T3JFbGVtZW50Mik7XG5cbnZhciBfZGVwcmVjYXRlZDIgPSByZXF1aXJlKCcuL2RlcHJlY2F0ZWQnKTtcblxudmFyIF9kZXByZWNhdGVkMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlcHJlY2F0ZWQyKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSByZXF1aXJlKCcuL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUyKTtcblxudmFyIF9pc1JlcXVpcmVkRm9yQTExeTIgPSByZXF1aXJlKCcuL2lzUmVxdWlyZWRGb3JBMTF5Jyk7XG5cbnZhciBfaXNSZXF1aXJlZEZvckExMXkzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNSZXF1aXJlZEZvckExMXkyKTtcblxudmFyIF9zcGxpdENvbXBvbmVudDIgPSByZXF1aXJlKCcuL3NwbGl0Q29tcG9uZW50Jyk7XG5cbnZhciBfc3BsaXRDb21wb25lbnQzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3BsaXRDb21wb25lbnQyKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gcmVxdWlyZSgnLi9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMik7XG5cbnZhciBfa2V5Q29kZSA9IHJlcXVpcmUoJy4va2V5Q29kZScpO1xuXG52YXIgX2tleUNvZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfa2V5Q29kZSk7XG5cbnZhciBfY29udGFpbnMyID0gcmVxdWlyZSgnLi9jb250YWlucycpO1xuXG52YXIgX2NvbnRhaW5zMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbnRhaW5zMik7XG5cbnZhciBfYWRkRXZlbnRMaXN0ZW5lcjIgPSByZXF1aXJlKCcuL2FkZEV2ZW50TGlzdGVuZXInKTtcblxudmFyIF9hZGRFdmVudExpc3RlbmVyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FkZEV2ZW50TGlzdGVuZXIyKTtcblxudmFyIF9jc3NBbmltYXRpb24yID0gcmVxdWlyZSgnLi9jc3NBbmltYXRpb24nKTtcblxudmFyIF9jc3NBbmltYXRpb24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3NzQW5pbWF0aW9uMik7XG5cbnZhciBfdG9BcnJheTIgPSByZXF1aXJlKCcuL3RvQXJyYXknKTtcblxudmFyIF90b0FycmF5MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3RvQXJyYXkyKTtcblxudmFyIF9BbGlnbjIgPSByZXF1aXJlKCcuL0FsaWduJyk7XG5cbnZhciBfQWxpZ24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQWxpZ24yKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5hbGwgPSBfYWxsMy5kZWZhdWx0O1xuZXhwb3J0cy5jb21wb25lbnRPckVsZW1lbnQgPSBfY29tcG9uZW50T3JFbGVtZW50My5kZWZhdWx0O1xuZXhwb3J0cy5kZXByZWNhdGVkID0gX2RlcHJlY2F0ZWQzLmRlZmF1bHQ7XG5leHBvcnRzLmVsZW1lbnRUeXBlID0gX2VsZW1lbnRUeXBlMy5kZWZhdWx0O1xuZXhwb3J0cy5pc1JlcXVpcmVkRm9yQTExeSA9IF9pc1JlcXVpcmVkRm9yQTExeTMuZGVmYXVsdDtcbmV4cG9ydHMuc3BsaXRDb21wb25lbnQgPSBfc3BsaXRDb21wb25lbnQzLmRlZmF1bHQ7XG5leHBvcnRzLmNyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24zLmRlZmF1bHQ7XG5leHBvcnRzLktleUNvZGUgPSBfa2V5Q29kZTIuZGVmYXVsdDtcbmV4cG9ydHMuY29udGFpbnMgPSBfY29udGFpbnMzLmRlZmF1bHQ7XG5leHBvcnRzLmFkZEV2ZW50TGlzdGVuZXIgPSBfYWRkRXZlbnRMaXN0ZW5lcjMuZGVmYXVsdDtcbmV4cG9ydHMuY3NzQW5pbWF0aW9uID0gX2Nzc0FuaW1hdGlvbjMuZGVmYXVsdDtcbmV4cG9ydHMudG9BcnJheSA9IF90b0FycmF5My5kZWZhdWx0O1xuLy9leHBvcnQgZ2V0Q29udGFpbmVyUmVuZGVyTWl4aW4gZnJvbSAnLi9nZXRDb250YWluZXJSZW5kZXJNaXhpbic7XG5cbmV4cG9ydHMuQWxpZ24gPSBfQWxpZ24zLmRlZmF1bHQ7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RpbnBlci1iZWUtY29yZS9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IGFsbDtcblxudmFyIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlciA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXInKTtcblxudmFyIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGFsbCgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHZhbGlkYXRvcnMgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICB2YWxpZGF0b3JzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgZnVuY3Rpb24gYWxsUHJvcFR5cGVzKCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuXG4gICAgdmFyIGVycm9yID0gbnVsbDtcblxuICAgIHZhbGlkYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsaWRhdG9yKSB7XG4gICAgICBpZiAoZXJyb3IgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByZXN1bHQgPSB2YWxpZGF0b3IuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICBlcnJvciA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIHJldHVybiAoMCwgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyMi5kZWZhdWx0KShhbGxQcm9wVHlwZXMpO1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL2FsbC5qc1xuLy8gbW9kdWxlIGlkID0gMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXI7XG4vKipcclxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cclxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICpcclxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXHJcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxyXG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cclxuICovXG5cbi8vIE1vc3RseSB0YWtlbiBmcm9tIFJlYWN0UHJvcFR5cGVzLlxuXG5mdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWVTYWZlID0gY29tcG9uZW50TmFtZSB8fCAnPDxhbm9ueW1vdXM+Pic7XG4gICAgdmFyIHByb3BGdWxsTmFtZVNhZmUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1JlcXVpcmVkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWVTYWZlICsgJ2Agd2FzIG5vdCBzcGVjaWZpZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lU2FmZSArICdgLicpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gNiA/IF9sZW4gLSA2IDogMCksIF9rZXkgPSA2OyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSA2XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGUuYXBwbHkodW5kZWZpbmVkLCBbcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lU2FmZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZVNhZmVdLmNvbmNhdChhcmdzKSk7XG4gIH1cblxuICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RpbnBlci1iZWUtY29yZS9saWIvdXRpbHMvY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIuanNcbi8vIG1vZHVsZSBpZCA9IDI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIgPSByZXF1aXJlKCcuL3V0aWxzL2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YocHJvcFZhbHVlKTtcblxuICBpZiAoX3JlYWN0Mi5kZWZhdWx0LmlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIFJlYWN0RWxlbWVudCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdENvbXBvbmVudCBvciBhICcpICsgJ0RPTUVsZW1lbnQuIFlvdSBjYW4gdXN1YWxseSBvYnRhaW4gYSBSZWFjdENvbXBvbmVudCBvciBET01FbGVtZW50ICcgKyAnZnJvbSBhIFJlYWN0RWxlbWVudCBieSBhdHRhY2hpbmcgYSByZWYgdG8gaXQuJyk7XG4gIH1cblxuICBpZiAoKHByb3BUeXBlICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgcHJvcFZhbHVlLnJlbmRlciAhPT0gJ2Z1bmN0aW9uJykgJiYgcHJvcFZhbHVlLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUgYCcgKyBwcm9wVmFsdWUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdENvbXBvbmVudCBvciBhICcpICsgJ0RPTUVsZW1lbnQuJyk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gKDAsIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjIuZGVmYXVsdCkodmFsaWRhdGUpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL2NvbXBvbmVudE9yRWxlbWVudC5qc1xuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gZGVwcmVjYXRlZDtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciB3YXJuZWQgPSB7fTtcblxuZnVuY3Rpb24gZGVwcmVjYXRlZCh2YWxpZGF0b3IsIHJlYXNvbikge1xuICByZXR1cm4gZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWVTYWZlID0gY29tcG9uZW50TmFtZSB8fCAnPDxhbm9ueW1vdXM+Pic7XG4gICAgdmFyIHByb3BGdWxsTmFtZVNhZmUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdICE9IG51bGwpIHtcbiAgICAgIHZhciBtZXNzYWdlS2V5ID0gY29tcG9uZW50TmFtZSArICcuJyArIHByb3BOYW1lO1xuXG4gICAgICAoMCwgX3dhcm5pbmcyLmRlZmF1bHQpKHdhcm5lZFttZXNzYWdlS2V5XSwgJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lU2FmZSArICdgIG9mICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZVNhZmUgKyAnYCBpcyBkZXByZWNhdGVkLiAnICsgcmVhc29uICsgJy4nKSk7XG5cbiAgICAgIHdhcm5lZFttZXNzYWdlS2V5XSA9IHRydWU7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gNSA/IF9sZW4gLSA1IDogMCksIF9rZXkgPSA1OyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSA1XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yLmFwcGx5KHVuZGVmaW5lZCwgW3Byb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZV0uY29uY2F0KGFyZ3MpKTtcbiAgfTtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbmZ1bmN0aW9uIF9yZXNldFdhcm5lZCgpIHtcbiAgd2FybmVkID0ge307XG59XG5cbmRlcHJlY2F0ZWQuX3Jlc2V0V2FybmVkID0gX3Jlc2V0V2FybmVkO1xuLyogZXNsaW50LWVuYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL2RlcHJlY2F0ZWQuanNcbi8vIG1vZHVsZSBpZCA9IDI5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIHdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB3YXJuaW5nID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDIgPyBsZW4gLSAyIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMjsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAyXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgK1xuICAgICAgICAnbWVzc2FnZSBhcmd1bWVudCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1hdC5sZW5ndGggPCAxMCB8fCAoL15bc1xcV10qJC8pLnRlc3QoZm9ybWF0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHdhcm5pbmcgZm9ybWF0IHNob3VsZCBiZSBhYmxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgJyArXG4gICAgICAgICd3YXJuaW5nLiBQbGVhc2UsIHVzZSBhIG1vcmUgZGVzY3JpcHRpdmUgZm9ybWF0IHRoYW46ICcgKyBmb3JtYXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICtcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgICB9KTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBjYXRjaCh4KSB7fVxuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3YXJuaW5nO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3dhcm5pbmcvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC91c3IvbG9jYWwvbGliL34vYmVlLXRvb2xzL34vcHJvY2Vzcy9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAzMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcicpO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gZWxlbWVudFR5cGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHByb3BWYWx1ZSk7XG5cbiAgaWYgKF9yZWFjdDIuZGVmYXVsdC5pc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBSZWFjdEVsZW1lbnQgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIGVsZW1lbnQgdHlwZSAoYSBzdHJpbmcgJykgKyAnb3IgYSBSZWFjdENsYXNzKS4nKTtcbiAgfVxuXG4gIGlmIChwcm9wVHlwZSAhPT0gJ2Z1bmN0aW9uJyAmJiBwcm9wVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIHByb3BWYWx1ZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBlbGVtZW50IHR5cGUgKGEgc3RyaW5nICcpICsgJ29yIGEgUmVhY3RDbGFzcykuJyk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gKDAsIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjIuZGVmYXVsdCkoZWxlbWVudFR5cGUpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL2VsZW1lbnRUeXBlLmpzXG4vLyBtb2R1bGUgaWQgPSAzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSBpc1JlcXVpcmVkRm9yQTExeTtcbmZ1bmN0aW9uIGlzUmVxdWlyZWRGb3JBMTF5KHZhbGlkYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWVTYWZlID0gY29tcG9uZW50TmFtZSB8fCAnPDxhbm9ueW1vdXM+Pic7XG4gICAgdmFyIHByb3BGdWxsTmFtZVNhZmUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lU2FmZSArICdgIGlzIHJlcXVpcmVkIHRvIG1ha2UgJyArICgnYCcgKyBjb21wb25lbnROYW1lU2FmZSArICdgIGFjY2Vzc2libGUgZm9yIHVzZXJzIG9mIGFzc2lzdGl2ZSAnKSArICd0ZWNobm9sb2dpZXMgc3VjaCBhcyBzY3JlZW4gcmVhZGVycy4nKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiA1ID8gX2xlbiAtIDUgOiAwKSwgX2tleSA9IDU7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDVdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IuYXBwbHkodW5kZWZpbmVkLCBbcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lXS5jb25jYXQoYXJncykpO1xuICB9O1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL2lzUmVxdWlyZWRGb3JBMTF5LmpzXG4vLyBtb2R1bGUgaWQgPSAzM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9lbnRyaWVzID0gcmVxdWlyZShcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZW50cmllc1wiKTtcblxudmFyIF9lbnRyaWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudHJpZXMpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBzcGxpdENvbXBvbmVudFByb3BzO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcclxuICog5YiG5Ymy6KaB5Lyg5YWl54i25YWD57Sg5ZKM5a2Q5YWD57Sg55qEcHJvcHNcclxuICogQHBhcmFtICB7W29iamVjdF19IHByb3BzICAgICDkvKDlhaXnmoTlsZ7mgKdcclxuICogQHBhcmFtICB7W3JlYWN0RWxlbWVudF19IENvbXBvbmVudCDnu4Tku7ZcclxuICogQHJldHVybiB7W2FycmF5XX0gICAgICAgICAgIOi/lOWbnuaVsOe7hO+8jOesrOS4gOS4quWFg+e0oOS4uueItuWFg+e0oHByb3Bz5a+56LGh77yM56ys5LqM5Liq5a2Q5YWD57SgcHJvcHPlr7nosaFcclxuICovXG5mdW5jdGlvbiBzcGxpdENvbXBvbmVudFByb3BzKHByb3BzLCBDb21wb25lbnQpIHtcbiAgdmFyIGNvbXBvbmVudFByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgdmFyIHBhcmVudFByb3BzID0ge307XG4gIHZhciBjaGlsZFByb3BzID0ge307XG5cbiAgKDAsIF9lbnRyaWVzMi5kZWZhdWx0KShwcm9wcykuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBwcm9wTmFtZSA9IF9yZWZbMF0sXG4gICAgICAgIHByb3BWYWx1ZSA9IF9yZWZbMV07XG5cbiAgICBpZiAoY29tcG9uZW50UHJvcFR5cGVzW3Byb3BOYW1lXSkge1xuICAgICAgcGFyZW50UHJvcHNbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZFByb3BzW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBbcGFyZW50UHJvcHMsIGNoaWxkUHJvcHNdO1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL3NwbGl0Q29tcG9uZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAzNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2VudHJpZXNcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9lbnRyaWVzLmpzXG4vLyBtb2R1bGUgaWQgPSAzNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzLyQuY29yZScpLk9iamVjdC5lbnRyaWVzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2VudHJpZXMuanNcbi8vIG1vZHVsZSBpZCA9IDM2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGh0dHA6Ly9nb28uZ2wvWGtCcmpEXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCAkZW50cmllcyA9IHJlcXVpcmUoJy4vJC5vYmplY3QtdG8tYXJyYXknKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoaXQpe1xuICAgIHJldHVybiAkZW50cmllcyhpdCk7XG4gIH1cbn0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMuanNcbi8vIG1vZHVsZSBpZCA9IDM3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgPSByZXF1aXJlKCcuLyQuY29yZScpXG4gICwgY3R4ICAgICAgID0gcmVxdWlyZSgnLi8kLmN0eCcpXG4gICwgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkZcbiAgICAsIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0LkdcbiAgICAsIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlNcbiAgICAsIElTX1BST1RPICA9IHR5cGUgJiAkZXhwb3J0LlBcbiAgICAsIElTX0JJTkQgICA9IHR5cGUgJiAkZXhwb3J0LkJcbiAgICAsIElTX1dSQVAgICA9IHR5cGUgJiAkZXhwb3J0LldcbiAgICAsIGV4cG9ydHMgICA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pXG4gICAgLCB0YXJnZXQgICAgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG4gICAgLCBrZXksIG93biwgb3V0O1xuICBpZihJU19HTE9CQUwpc291cmNlID0gbmFtZTtcbiAgZm9yKGtleSBpbiBzb3VyY2Upe1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIGtleSBpbiB0YXJnZXQ7XG4gICAgaWYob3duICYmIGtleSBpbiBleHBvcnRzKWNvbnRpbnVlO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gb3duID8gdGFyZ2V0W2tleV0gOiBzb3VyY2Vba2V5XTtcbiAgICAvLyBwcmV2ZW50IGdsb2JhbCBwb2xsdXRpb24gZm9yIG5hbWVzcGFjZXNcbiAgICBleHBvcnRzW2tleV0gPSBJU19HTE9CQUwgJiYgdHlwZW9mIHRhcmdldFtrZXldICE9ICdmdW5jdGlvbicgPyBzb3VyY2Vba2V5XVxuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgOiBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbClcbiAgICAvLyB3cmFwIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZm9yIHByZXZlbnQgY2hhbmdlIHRoZW0gaW4gbGlicmFyeVxuICAgIDogSVNfV1JBUCAmJiB0YXJnZXRba2V5XSA9PSBvdXQgPyAoZnVuY3Rpb24oQyl7XG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uKHBhcmFtKXtcbiAgICAgICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBDID8gbmV3IEMocGFyYW0pIDogQyhwYXJhbSk7XG4gICAgICB9O1xuICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuICAgICAgcmV0dXJuIEY7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIGlmKElTX1BST1RPKShleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KSlba2V5XSA9IG91dDtcbiAgfVxufTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgLy8gd3JhcFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmV4cG9ydC5qc1xuLy8gbW9kdWxlIGlkID0gMzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZiA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZih0eXBlb2YgX19nID09ICdudW1iZXInKV9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmdsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMS4yLjYnfTtcbmlmKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmNvcmUuanNcbi8vIG1vZHVsZSBpZCA9IDQwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vJC5hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCB0aGF0LCBsZW5ndGgpe1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuO1xuICBzd2l0Y2gobGVuZ3RoKXtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmN0eC5qc1xuLy8gbW9kdWxlIGlkID0gNDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuYS1mdW5jdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gNDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyICQgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKVxuICAsIGlzRW51bSAgICA9ICQuaXNFbnVtO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpc0VudHJpZXMpe1xuICByZXR1cm4gZnVuY3Rpb24oaXQpe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QoaXQpXG4gICAgICAsIGtleXMgICA9ICQuZ2V0S2V5cyhPKVxuICAgICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICAgLCBpICAgICAgPSAwXG4gICAgICAsIHJlc3VsdCA9IFtdXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShsZW5ndGggPiBpKWlmKGlzRW51bS5jYWxsKE8sIGtleSA9IGtleXNbaSsrXSkpe1xuICAgICAgcmVzdWx0LnB1c2goaXNFbnRyaWVzID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5vYmplY3QtdG8tYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDQzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciAkT2JqZWN0ID0gT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZTogICAgICRPYmplY3QuY3JlYXRlLFxuICBnZXRQcm90bzogICAkT2JqZWN0LmdldFByb3RvdHlwZU9mLFxuICBpc0VudW06ICAgICB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcbiAgZ2V0RGVzYzogICAgJE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIHNldERlc2M6ICAgICRPYmplY3QuZGVmaW5lUHJvcGVydHksXG4gIHNldERlc2NzOiAgICRPYmplY3QuZGVmaW5lUHJvcGVydGllcyxcbiAgZ2V0S2V5czogICAgJE9iamVjdC5rZXlzLFxuICBnZXROYW1lczogICAkT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMsXG4gIGdldFN5bWJvbHM6ICRPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICBlYWNoOiAgICAgICBbXS5mb3JFYWNoXG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmpzXG4vLyBtb2R1bGUgaWQgPSA0NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlvYmplY3QnKVxuICAsIGRlZmluZWQgPSByZXF1aXJlKCcuLyQuZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQudG8taW9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gNDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuLyQuY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmlvYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDQ2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuY29mLmpzXG4vLyBtb2R1bGUgaWQgPSA0N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuZGVmaW5lZC5qc1xuLy8gbW9kdWxlIGlkID0gNDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZnVuY3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5maWx0ZXIoZnVuY3Rpb24gKGYpIHtcbiAgICByZXR1cm4gZiAhPSBudWxsO1xuICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZikge1xuICAgIGlmICh0eXBlb2YgZiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFyZ3VtZW50IFR5cGUsIG11c3Qgb25seSBwcm92aWRlIGZ1bmN0aW9ucywgdW5kZWZpbmVkLCBvciBudWxsLicpO1xuICAgIH1cblxuICAgIGlmIChhY2MgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiBjaGFpbmVkRnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIGFjYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIGYuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfSwgbnVsbCk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVDaGFpbmVkRnVuY3Rpb247XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RpbnBlci1iZWUtY29yZS9saWIvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSA0OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxyXG4gKiBAaWdub3JlXHJcbiAqIHNvbWUga2V5LWNvZGVzIGRlZmluaXRpb24gYW5kIHV0aWxzIGZyb20gY2xvc3VyZS1saWJyYXJ5XHJcbiAqIEBhdXRob3IgeWltaW5naGVAZ21haWwuY29tXHJcbiAqL1xuXG52YXIgS2V5Q29kZSA9IHtcbiAgLyoqXHJcbiAgICogTUFDX0VOVEVSXHJcbiAgICovXG4gIE1BQ19FTlRFUjogMyxcbiAgLyoqXHJcbiAgICogQkFDS1NQQUNFXHJcbiAgICovXG4gIEJBQ0tTUEFDRTogOCxcbiAgLyoqXHJcbiAgICogVEFCXHJcbiAgICovXG4gIFRBQjogOSxcbiAgLyoqXHJcbiAgICogTlVNTE9DSyBvbiBGRi9TYWZhcmkgTWFjXHJcbiAgICovXG4gIE5VTV9DRU5URVI6IDEyLCAvLyBOVU1MT0NLIG9uIEZGL1NhZmFyaSBNYWNcbiAgLyoqXHJcbiAgICogRU5URVJcclxuICAgKi9cbiAgRU5URVI6IDEzLFxuICAvKipcclxuICAgKiBTSElGVFxyXG4gICAqL1xuICBTSElGVDogMTYsXG4gIC8qKlxyXG4gICAqIENUUkxcclxuICAgKi9cbiAgQ1RSTDogMTcsXG4gIC8qKlxyXG4gICAqIEFMVFxyXG4gICAqL1xuICBBTFQ6IDE4LFxuICAvKipcclxuICAgKiBQQVVTRVxyXG4gICAqL1xuICBQQVVTRTogMTksXG4gIC8qKlxyXG4gICAqIENBUFNfTE9DS1xyXG4gICAqL1xuICBDQVBTX0xPQ0s6IDIwLFxuICAvKipcclxuICAgKiBFU0NcclxuICAgKi9cbiAgRVNDOiAyNyxcbiAgLyoqXHJcbiAgICogU1BBQ0VcclxuICAgKi9cbiAgU1BBQ0U6IDMyLFxuICAvKipcclxuICAgKiBQQUdFX1VQXHJcbiAgICovXG4gIFBBR0VfVVA6IDMzLCAvLyBhbHNvIE5VTV9OT1JUSF9FQVNUXG4gIC8qKlxyXG4gICAqIFBBR0VfRE9XTlxyXG4gICAqL1xuICBQQUdFX0RPV046IDM0LCAvLyBhbHNvIE5VTV9TT1VUSF9FQVNUXG4gIC8qKlxyXG4gICAqIEVORFxyXG4gICAqL1xuICBFTkQ6IDM1LCAvLyBhbHNvIE5VTV9TT1VUSF9XRVNUXG4gIC8qKlxyXG4gICAqIEhPTUVcclxuICAgKi9cbiAgSE9NRTogMzYsIC8vIGFsc28gTlVNX05PUlRIX1dFU1RcbiAgLyoqXHJcbiAgICogTEVGVFxyXG4gICAqL1xuICBMRUZUOiAzNywgLy8gYWxzbyBOVU1fV0VTVFxuICAvKipcclxuICAgKiBVUFxyXG4gICAqL1xuICBVUDogMzgsIC8vIGFsc28gTlVNX05PUlRIXG4gIC8qKlxyXG4gICAqIFJJR0hUXHJcbiAgICovXG4gIFJJR0hUOiAzOSwgLy8gYWxzbyBOVU1fRUFTVFxuICAvKipcclxuICAgKiBET1dOXHJcbiAgICovXG4gIERPV046IDQwLCAvLyBhbHNvIE5VTV9TT1VUSFxuICAvKipcclxuICAgKiBQUklOVF9TQ1JFRU5cclxuICAgKi9cbiAgUFJJTlRfU0NSRUVOOiA0NCxcbiAgLyoqXHJcbiAgICogSU5TRVJUXHJcbiAgICovXG4gIElOU0VSVDogNDUsIC8vIGFsc28gTlVNX0lOU0VSVFxuICAvKipcclxuICAgKiBERUxFVEVcclxuICAgKi9cbiAgREVMRVRFOiA0NiwgLy8gYWxzbyBOVU1fREVMRVRFXG4gIC8qKlxyXG4gICAqIFpFUk9cclxuICAgKi9cbiAgWkVSTzogNDgsXG4gIC8qKlxyXG4gICAqIE9ORVxyXG4gICAqL1xuICBPTkU6IDQ5LFxuICAvKipcclxuICAgKiBUV09cclxuICAgKi9cbiAgVFdPOiA1MCxcbiAgLyoqXHJcbiAgICogVEhSRUVcclxuICAgKi9cbiAgVEhSRUU6IDUxLFxuICAvKipcclxuICAgKiBGT1VSXHJcbiAgICovXG4gIEZPVVI6IDUyLFxuICAvKipcclxuICAgKiBGSVZFXHJcbiAgICovXG4gIEZJVkU6IDUzLFxuICAvKipcclxuICAgKiBTSVhcclxuICAgKi9cbiAgU0lYOiA1NCxcbiAgLyoqXHJcbiAgICogU0VWRU5cclxuICAgKi9cbiAgU0VWRU46IDU1LFxuICAvKipcclxuICAgKiBFSUdIVFxyXG4gICAqL1xuICBFSUdIVDogNTYsXG4gIC8qKlxyXG4gICAqIE5JTkVcclxuICAgKi9cbiAgTklORTogNTcsXG4gIC8qKlxyXG4gICAqIFFVRVNUSU9OX01BUktcclxuICAgKi9cbiAgUVVFU1RJT05fTUFSSzogNjMsIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcclxuICAgKiBBXHJcbiAgICovXG4gIEE6IDY1LFxuICAvKipcclxuICAgKiBCXHJcbiAgICovXG4gIEI6IDY2LFxuICAvKipcclxuICAgKiBDXHJcbiAgICovXG4gIEM6IDY3LFxuICAvKipcclxuICAgKiBEXHJcbiAgICovXG4gIEQ6IDY4LFxuICAvKipcclxuICAgKiBFXHJcbiAgICovXG4gIEU6IDY5LFxuICAvKipcclxuICAgKiBGXHJcbiAgICovXG4gIEY6IDcwLFxuICAvKipcclxuICAgKiBHXHJcbiAgICovXG4gIEc6IDcxLFxuICAvKipcclxuICAgKiBIXHJcbiAgICovXG4gIEg6IDcyLFxuICAvKipcclxuICAgKiBJXHJcbiAgICovXG4gIEk6IDczLFxuICAvKipcclxuICAgKiBKXHJcbiAgICovXG4gIEo6IDc0LFxuICAvKipcclxuICAgKiBLXHJcbiAgICovXG4gIEs6IDc1LFxuICAvKipcclxuICAgKiBMXHJcbiAgICovXG4gIEw6IDc2LFxuICAvKipcclxuICAgKiBNXHJcbiAgICovXG4gIE06IDc3LFxuICAvKipcclxuICAgKiBOXHJcbiAgICovXG4gIE46IDc4LFxuICAvKipcclxuICAgKiBPXHJcbiAgICovXG4gIE86IDc5LFxuICAvKipcclxuICAgKiBQXHJcbiAgICovXG4gIFA6IDgwLFxuICAvKipcclxuICAgKiBRXHJcbiAgICovXG4gIFE6IDgxLFxuICAvKipcclxuICAgKiBSXHJcbiAgICovXG4gIFI6IDgyLFxuICAvKipcclxuICAgKiBTXHJcbiAgICovXG4gIFM6IDgzLFxuICAvKipcclxuICAgKiBUXHJcbiAgICovXG4gIFQ6IDg0LFxuICAvKipcclxuICAgKiBVXHJcbiAgICovXG4gIFU6IDg1LFxuICAvKipcclxuICAgKiBWXHJcbiAgICovXG4gIFY6IDg2LFxuICAvKipcclxuICAgKiBXXHJcbiAgICovXG4gIFc6IDg3LFxuICAvKipcclxuICAgKiBYXHJcbiAgICovXG4gIFg6IDg4LFxuICAvKipcclxuICAgKiBZXHJcbiAgICovXG4gIFk6IDg5LFxuICAvKipcclxuICAgKiBaXHJcbiAgICovXG4gIFo6IDkwLFxuICAvKipcclxuICAgKiBNRVRBXHJcbiAgICovXG4gIE1FVEE6IDkxLCAvLyBXSU5fS0VZX0xFRlRcbiAgLyoqXHJcbiAgICogV0lOX0tFWV9SSUdIVFxyXG4gICAqL1xuICBXSU5fS0VZX1JJR0hUOiA5MixcbiAgLyoqXHJcbiAgICogQ09OVEVYVF9NRU5VXHJcbiAgICovXG4gIENPTlRFWFRfTUVOVTogOTMsXG4gIC8qKlxyXG4gICAqIE5VTV9aRVJPXHJcbiAgICovXG4gIE5VTV9aRVJPOiA5NixcbiAgLyoqXHJcbiAgICogTlVNX09ORVxyXG4gICAqL1xuICBOVU1fT05FOiA5NyxcbiAgLyoqXHJcbiAgICogTlVNX1RXT1xyXG4gICAqL1xuICBOVU1fVFdPOiA5OCxcbiAgLyoqXHJcbiAgICogTlVNX1RIUkVFXHJcbiAgICovXG4gIE5VTV9USFJFRTogOTksXG4gIC8qKlxyXG4gICAqIE5VTV9GT1VSXHJcbiAgICovXG4gIE5VTV9GT1VSOiAxMDAsXG4gIC8qKlxyXG4gICAqIE5VTV9GSVZFXHJcbiAgICovXG4gIE5VTV9GSVZFOiAxMDEsXG4gIC8qKlxyXG4gICAqIE5VTV9TSVhcclxuICAgKi9cbiAgTlVNX1NJWDogMTAyLFxuICAvKipcclxuICAgKiBOVU1fU0VWRU5cclxuICAgKi9cbiAgTlVNX1NFVkVOOiAxMDMsXG4gIC8qKlxyXG4gICAqIE5VTV9FSUdIVFxyXG4gICAqL1xuICBOVU1fRUlHSFQ6IDEwNCxcbiAgLyoqXHJcbiAgICogTlVNX05JTkVcclxuICAgKi9cbiAgTlVNX05JTkU6IDEwNSxcbiAgLyoqXHJcbiAgICogTlVNX01VTFRJUExZXHJcbiAgICovXG4gIE5VTV9NVUxUSVBMWTogMTA2LFxuICAvKipcclxuICAgKiBOVU1fUExVU1xyXG4gICAqL1xuICBOVU1fUExVUzogMTA3LFxuICAvKipcclxuICAgKiBOVU1fTUlOVVNcclxuICAgKi9cbiAgTlVNX01JTlVTOiAxMDksXG4gIC8qKlxyXG4gICAqIE5VTV9QRVJJT0RcclxuICAgKi9cbiAgTlVNX1BFUklPRDogMTEwLFxuICAvKipcclxuICAgKiBOVU1fRElWSVNJT05cclxuICAgKi9cbiAgTlVNX0RJVklTSU9OOiAxMTEsXG4gIC8qKlxyXG4gICAqIEYxXHJcbiAgICovXG4gIEYxOiAxMTIsXG4gIC8qKlxyXG4gICAqIEYyXHJcbiAgICovXG4gIEYyOiAxMTMsXG4gIC8qKlxyXG4gICAqIEYzXHJcbiAgICovXG4gIEYzOiAxMTQsXG4gIC8qKlxyXG4gICAqIEY0XHJcbiAgICovXG4gIEY0OiAxMTUsXG4gIC8qKlxyXG4gICAqIEY1XHJcbiAgICovXG4gIEY1OiAxMTYsXG4gIC8qKlxyXG4gICAqIEY2XHJcbiAgICovXG4gIEY2OiAxMTcsXG4gIC8qKlxyXG4gICAqIEY3XHJcbiAgICovXG4gIEY3OiAxMTgsXG4gIC8qKlxyXG4gICAqIEY4XHJcbiAgICovXG4gIEY4OiAxMTksXG4gIC8qKlxyXG4gICAqIEY5XHJcbiAgICovXG4gIEY5OiAxMjAsXG4gIC8qKlxyXG4gICAqIEYxMFxyXG4gICAqL1xuICBGMTA6IDEyMSxcbiAgLyoqXHJcbiAgICogRjExXHJcbiAgICovXG4gIEYxMTogMTIyLFxuICAvKipcclxuICAgKiBGMTJcclxuICAgKi9cbiAgRjEyOiAxMjMsXG4gIC8qKlxyXG4gICAqIE5VTUxPQ0tcclxuICAgKi9cbiAgTlVNTE9DSzogMTQ0LFxuICAvKipcclxuICAgKiBTRU1JQ09MT05cclxuICAgKi9cbiAgU0VNSUNPTE9OOiAxODYsIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcclxuICAgKiBEQVNIXHJcbiAgICovXG4gIERBU0g6IDE4OSwgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxyXG4gICAqIEVRVUFMU1xyXG4gICAqL1xuICBFUVVBTFM6IDE4NywgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxyXG4gICAqIENPTU1BXHJcbiAgICovXG4gIENPTU1BOiAxODgsIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcclxuICAgKiBQRVJJT0RcclxuICAgKi9cbiAgUEVSSU9EOiAxOTAsIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcclxuICAgKiBTTEFTSFxyXG4gICAqL1xuICBTTEFTSDogMTkxLCAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXHJcbiAgICogQVBPU1RST1BIRVxyXG4gICAqL1xuICBBUE9TVFJPUEhFOiAxOTIsIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcclxuICAgKiBTSU5HTEVfUVVPVEVcclxuICAgKi9cbiAgU0lOR0xFX1FVT1RFOiAyMjIsIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcclxuICAgKiBPUEVOX1NRVUFSRV9CUkFDS0VUXHJcbiAgICovXG4gIE9QRU5fU1FVQVJFX0JSQUNLRVQ6IDIxOSwgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxyXG4gICAqIEJBQ0tTTEFTSFxyXG4gICAqL1xuICBCQUNLU0xBU0g6IDIyMCwgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxyXG4gICAqIENMT1NFX1NRVUFSRV9CUkFDS0VUXHJcbiAgICovXG4gIENMT1NFX1NRVUFSRV9CUkFDS0VUOiAyMjEsIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcclxuICAgKiBXSU5fS0VZXHJcbiAgICovXG4gIFdJTl9LRVk6IDIyNCxcbiAgLyoqXHJcbiAgICogTUFDX0ZGX01FVEFcclxuICAgKi9cbiAgTUFDX0ZGX01FVEE6IDIyNCwgLy8gRmlyZWZveCAoR2Vja28pIGZpcmVzIHRoaXMgZm9yIHRoZSBtZXRhIGtleSBpbnN0ZWFkIG9mIDkxXG4gIC8qKlxyXG4gICAqIFdJTl9JTUVcclxuICAgKi9cbiAgV0lOX0lNRTogMjI5XG59O1xuXG4vKlxyXG4gd2hldGhlciB0ZXh0IGFuZCBtb2RpZmllZCBrZXkgaXMgZW50ZXJlZCBhdCB0aGUgc2FtZSB0aW1lLlxyXG4gKi9cbktleUNvZGUuaXNUZXh0TW9kaWZ5aW5nS2V5RXZlbnQgPSBmdW5jdGlvbiBpc1RleHRNb2RpZnlpbmdLZXlFdmVudChlKSB7XG4gIHZhciBrZXlDb2RlID0gZS5rZXlDb2RlO1xuICBpZiAoZS5hbHRLZXkgJiYgIWUuY3RybEtleSB8fCBlLm1ldGFLZXkgfHxcbiAgLy8gRnVuY3Rpb24ga2V5cyBkb24ndCBnZW5lcmF0ZSB0ZXh0XG4gIGtleUNvZGUgPj0gS2V5Q29kZS5GMSAmJiBrZXlDb2RlIDw9IEtleUNvZGUuRjEyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVGhlIGZvbGxvd2luZyBrZXlzIGFyZSBxdWl0ZSBoYXJtbGVzcywgZXZlbiBpbiBjb21iaW5hdGlvbiB3aXRoXG4gIC8vIENUUkwsIEFMVCBvciBTSElGVC5cbiAgc3dpdGNoIChrZXlDb2RlKSB7XG4gICAgY2FzZSBLZXlDb2RlLkFMVDpcbiAgICBjYXNlIEtleUNvZGUuQ0FQU19MT0NLOlxuICAgIGNhc2UgS2V5Q29kZS5DT05URVhUX01FTlU6XG4gICAgY2FzZSBLZXlDb2RlLkNUUkw6XG4gICAgY2FzZSBLZXlDb2RlLkRPV046XG4gICAgY2FzZSBLZXlDb2RlLkVORDpcbiAgICBjYXNlIEtleUNvZGUuRVNDOlxuICAgIGNhc2UgS2V5Q29kZS5IT01FOlxuICAgIGNhc2UgS2V5Q29kZS5JTlNFUlQ6XG4gICAgY2FzZSBLZXlDb2RlLkxFRlQ6XG4gICAgY2FzZSBLZXlDb2RlLk1BQ19GRl9NRVRBOlxuICAgIGNhc2UgS2V5Q29kZS5NRVRBOlxuICAgIGNhc2UgS2V5Q29kZS5OVU1MT0NLOlxuICAgIGNhc2UgS2V5Q29kZS5OVU1fQ0VOVEVSOlxuICAgIGNhc2UgS2V5Q29kZS5QQUdFX0RPV046XG4gICAgY2FzZSBLZXlDb2RlLlBBR0VfVVA6XG4gICAgY2FzZSBLZXlDb2RlLlBBVVNFOlxuICAgIGNhc2UgS2V5Q29kZS5QUklOVF9TQ1JFRU46XG4gICAgY2FzZSBLZXlDb2RlLlJJR0hUOlxuICAgIGNhc2UgS2V5Q29kZS5TSElGVDpcbiAgICBjYXNlIEtleUNvZGUuVVA6XG4gICAgY2FzZSBLZXlDb2RlLldJTl9LRVk6XG4gICAgY2FzZSBLZXlDb2RlLldJTl9LRVlfUklHSFQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG4vKlxyXG4gd2hldGhlciBjaGFyYWN0ZXIgaXMgZW50ZXJlZC5cclxuICovXG5LZXlDb2RlLmlzQ2hhcmFjdGVyS2V5ID0gZnVuY3Rpb24gaXNDaGFyYWN0ZXJLZXkoa2V5Q29kZSkge1xuICBpZiAoa2V5Q29kZSA+PSBLZXlDb2RlLlpFUk8gJiYga2V5Q29kZSA8PSBLZXlDb2RlLk5JTkUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChrZXlDb2RlID49IEtleUNvZGUuTlVNX1pFUk8gJiYga2V5Q29kZSA8PSBLZXlDb2RlLk5VTV9NVUxUSVBMWSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGtleUNvZGUgPj0gS2V5Q29kZS5BICYmIGtleUNvZGUgPD0gS2V5Q29kZS5aKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBTYWZhcmkgc2VuZHMgemVybyBrZXkgY29kZSBmb3Igbm9uLWxhdGluIGNoYXJhY3RlcnMuXG4gIGlmICh3aW5kb3cubmF2aWdhdGlvbi51c2VyQWdlbnQuaW5kZXhPZignV2ViS2l0JykgIT09IC0xICYmIGtleUNvZGUgPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN3aXRjaCAoa2V5Q29kZSkge1xuICAgIGNhc2UgS2V5Q29kZS5TUEFDRTpcbiAgICBjYXNlIEtleUNvZGUuUVVFU1RJT05fTUFSSzpcbiAgICBjYXNlIEtleUNvZGUuTlVNX1BMVVM6XG4gICAgY2FzZSBLZXlDb2RlLk5VTV9NSU5VUzpcbiAgICBjYXNlIEtleUNvZGUuTlVNX1BFUklPRDpcbiAgICBjYXNlIEtleUNvZGUuTlVNX0RJVklTSU9OOlxuICAgIGNhc2UgS2V5Q29kZS5TRU1JQ09MT046XG4gICAgY2FzZSBLZXlDb2RlLkRBU0g6XG4gICAgY2FzZSBLZXlDb2RlLkVRVUFMUzpcbiAgICBjYXNlIEtleUNvZGUuQ09NTUE6XG4gICAgY2FzZSBLZXlDb2RlLlBFUklPRDpcbiAgICBjYXNlIEtleUNvZGUuU0xBU0g6XG4gICAgY2FzZSBLZXlDb2RlLkFQT1NUUk9QSEU6XG4gICAgY2FzZSBLZXlDb2RlLlNJTkdMRV9RVU9URTpcbiAgICBjYXNlIEtleUNvZGUuT1BFTl9TUVVBUkVfQlJBQ0tFVDpcbiAgICBjYXNlIEtleUNvZGUuQkFDS1NMQVNIOlxuICAgIGNhc2UgS2V5Q29kZS5DTE9TRV9TUVVBUkVfQlJBQ0tFVDpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gS2V5Q29kZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdGlucGVyLWJlZS1jb3JlL2xpYi9rZXlDb2RlLmpzXG4vLyBtb2R1bGUgaWQgPSA1MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNvbnRhaW5zO1xuZnVuY3Rpb24gY29udGFpbnMocm9vdCwgbikge1xuICB2YXIgbm9kZSA9IG47XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IHJvb3QpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL2NvbnRhaW5zLmpzXG4vLyBtb2R1bGUgaWQgPSA1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSBhZGRFdmVudExpc3RlbmVyV3JhcDtcblxudmFyIF9hZGREb21FdmVudExpc3RlbmVyID0gcmVxdWlyZSgnYWRkLWRvbS1ldmVudC1saXN0ZW5lcicpO1xuXG52YXIgX2FkZERvbUV2ZW50TGlzdGVuZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWRkRG9tRXZlbnRMaXN0ZW5lcik7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJXcmFwKHRhcmdldCwgZXZlbnRUeXBlLCBjYikge1xuICAvKiBlc2xpbnQgY2FtZWxjYXNlOiAyICovXG4gIHZhciBjYWxsYmFjayA9IF9yZWFjdERvbTIuZGVmYXVsdC51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyA/IGZ1bmN0aW9uIHJ1bihlKSB7XG4gICAgX3JlYWN0RG9tMi5kZWZhdWx0LnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGNiLCBlKTtcbiAgfSA6IGNiO1xuICByZXR1cm4gKDAsIF9hZGREb21FdmVudExpc3RlbmVyMi5kZWZhdWx0KSh0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2spO1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL2FkZEV2ZW50TGlzdGVuZXIuanNcbi8vIG1vZHVsZSBpZCA9IDUyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gYWRkRXZlbnRMaXN0ZW5lcjtcblxudmFyIF9FdmVudE9iamVjdCA9IHJlcXVpcmUoJy4vRXZlbnRPYmplY3QnKTtcblxudmFyIF9FdmVudE9iamVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9FdmVudE9iamVjdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICBmdW5jdGlvbiB3cmFwQ2FsbGJhY2soZSkge1xuICAgIHZhciBuZSA9IG5ldyBfRXZlbnRPYmplY3QyW1wiZGVmYXVsdFwiXShlKTtcbiAgICBjYWxsYmFjay5jYWxsKHRhcmdldCwgbmUpO1xuICB9XG5cbiAgaWYgKHRhcmdldC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCB3cmFwQ2FsbGJhY2ssIGZhbHNlKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgd3JhcENhbGxiYWNrLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIGlmICh0YXJnZXQuYXR0YWNoRXZlbnQpIHtcbiAgICB0YXJnZXQuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50VHlwZSwgd3JhcENhbGxiYWNrKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgIHRhcmdldC5kZXRhY2hFdmVudCgnb24nICsgZXZlbnRUeXBlLCB3cmFwQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9hZGQtZG9tLWV2ZW50LWxpc3RlbmVyL2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX0V2ZW50QmFzZU9iamVjdCA9IHJlcXVpcmUoJy4vRXZlbnRCYXNlT2JqZWN0Jyk7XG5cbnZhciBfRXZlbnRCYXNlT2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0V2ZW50QmFzZU9iamVjdCk7XG5cbnZhciBfb2JqZWN0QXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgX29iamVjdEFzc2lnbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RBc3NpZ24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyoqXG4gKiBAaWdub3JlXG4gKiBldmVudCBvYmplY3QgZm9yIGRvbVxuICogQGF1dGhvciB5aW1pbmdoZUBnbWFpbC5jb21cbiAqL1xuXG52YXIgVFJVRSA9IHRydWU7XG52YXIgRkFMU0UgPSBmYWxzZTtcbnZhciBjb21tb25Qcm9wcyA9IFsnYWx0S2V5JywgJ2J1YmJsZXMnLCAnY2FuY2VsYWJsZScsICdjdHJsS2V5JywgJ2N1cnJlbnRUYXJnZXQnLCAnZXZlbnRQaGFzZScsICdtZXRhS2V5JywgJ3NoaWZ0S2V5JywgJ3RhcmdldCcsICd0aW1lU3RhbXAnLCAndmlldycsICd0eXBlJ107XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKHcpIHtcbiAgcmV0dXJuIHcgPT09IG51bGwgfHwgdyA9PT0gdW5kZWZpbmVkO1xufVxuXG52YXIgZXZlbnROb3JtYWxpemVycyA9IFt7XG4gIHJlZzogL15rZXkvLFxuICBwcm9wczogWydjaGFyJywgJ2NoYXJDb2RlJywgJ2tleScsICdrZXlDb2RlJywgJ3doaWNoJ10sXG4gIGZpeDogZnVuY3Rpb24gZml4KGV2ZW50LCBuYXRpdmVFdmVudCkge1xuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChldmVudC53aGljaCkpIHtcbiAgICAgIGV2ZW50LndoaWNoID0gIWlzTnVsbE9yVW5kZWZpbmVkKG5hdGl2ZUV2ZW50LmNoYXJDb2RlKSA/IG5hdGl2ZUV2ZW50LmNoYXJDb2RlIDogbmF0aXZlRXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICAvLyBhZGQgbWV0YUtleSB0byBub24tTWFjIGJyb3dzZXJzICh1c2UgY3RybCBmb3IgUEMgJ3MgYW5kIE1ldGEgZm9yIE1hY3MpXG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXZlbnQubWV0YUtleSA9IGV2ZW50LmN0cmxLZXk7XG4gICAgfVxuICB9XG59LCB7XG4gIHJlZzogL150b3VjaC8sXG4gIHByb3BzOiBbJ3RvdWNoZXMnLCAnY2hhbmdlZFRvdWNoZXMnLCAndGFyZ2V0VG91Y2hlcyddXG59LCB7XG4gIHJlZzogL15oYXNoY2hhbmdlJC8sXG4gIHByb3BzOiBbJ25ld1VSTCcsICdvbGRVUkwnXVxufSwge1xuICByZWc6IC9eZ2VzdHVyZWNoYW5nZSQvaSxcbiAgcHJvcHM6IFsncm90YXRpb24nLCAnc2NhbGUnXVxufSwge1xuICByZWc6IC9eKG1vdXNld2hlZWx8RE9NTW91c2VTY3JvbGwpJC8sXG4gIHByb3BzOiBbXSxcbiAgZml4OiBmdW5jdGlvbiBmaXgoZXZlbnQsIG5hdGl2ZUV2ZW50KSB7XG4gICAgdmFyIGRlbHRhWCA9IHZvaWQgMDtcbiAgICB2YXIgZGVsdGFZID0gdm9pZCAwO1xuICAgIHZhciBkZWx0YSA9IHZvaWQgMDtcbiAgICB2YXIgd2hlZWxEZWx0YSA9IG5hdGl2ZUV2ZW50LndoZWVsRGVsdGE7XG4gICAgdmFyIGF4aXMgPSBuYXRpdmVFdmVudC5heGlzO1xuICAgIHZhciB3aGVlbERlbHRhWSA9IG5hdGl2ZUV2ZW50LndoZWVsRGVsdGFZO1xuICAgIHZhciB3aGVlbERlbHRhWCA9IG5hdGl2ZUV2ZW50LndoZWVsRGVsdGFYO1xuICAgIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG5cbiAgICAvLyBpZS93ZWJraXRcbiAgICBpZiAod2hlZWxEZWx0YSkge1xuICAgICAgZGVsdGEgPSB3aGVlbERlbHRhIC8gMTIwO1xuICAgIH1cblxuICAgIC8vIGdlY2tvXG4gICAgaWYgKGRldGFpbCkge1xuICAgICAgLy8gcHJlc3MgY29udHJvbCBlLmRldGFpbCA9PSAxIGVsc2UgZS5kZXRhaWwgPT0gM1xuICAgICAgZGVsdGEgPSAwIC0gKGRldGFpbCAlIDMgPT09IDAgPyBkZXRhaWwgLyAzIDogZGV0YWlsKTtcbiAgICB9XG5cbiAgICAvLyBHZWNrb1xuICAgIGlmIChheGlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChheGlzID09PSBldmVudC5IT1JJWk9OVEFMX0FYSVMpIHtcbiAgICAgICAgZGVsdGFZID0gMDtcbiAgICAgICAgZGVsdGFYID0gMCAtIGRlbHRhO1xuICAgICAgfSBlbHNlIGlmIChheGlzID09PSBldmVudC5WRVJUSUNBTF9BWElTKSB7XG4gICAgICAgIGRlbHRhWCA9IDA7XG4gICAgICAgIGRlbHRhWSA9IGRlbHRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlYmtpdFxuICAgIGlmICh3aGVlbERlbHRhWSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWx0YVkgPSB3aGVlbERlbHRhWSAvIDEyMDtcbiAgICB9XG4gICAgaWYgKHdoZWVsRGVsdGFYICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbHRhWCA9IC0xICogd2hlZWxEZWx0YVggLyAxMjA7XG4gICAgfVxuXG4gICAgLy8g6buY6K6kIGRlbHRhWSAoaWUpXG4gICAgaWYgKCFkZWx0YVggJiYgIWRlbHRhWSkge1xuICAgICAgZGVsdGFZID0gZGVsdGE7XG4gICAgfVxuXG4gICAgaWYgKGRlbHRhWCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKipcbiAgICAgICAqIGRlbHRhWCBvZiBtb3VzZXdoZWVsIGV2ZW50XG4gICAgICAgKiBAcHJvcGVydHkgZGVsdGFYXG4gICAgICAgKiBAbWVtYmVyIEV2ZW50LkRvbUV2ZW50Lk9iamVjdFxuICAgICAgICovXG4gICAgICBldmVudC5kZWx0YVggPSBkZWx0YVg7XG4gICAgfVxuXG4gICAgaWYgKGRlbHRhWSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKipcbiAgICAgICAqIGRlbHRhWSBvZiBtb3VzZXdoZWVsIGV2ZW50XG4gICAgICAgKiBAcHJvcGVydHkgZGVsdGFZXG4gICAgICAgKiBAbWVtYmVyIEV2ZW50LkRvbUV2ZW50Lk9iamVjdFxuICAgICAgICovXG4gICAgICBldmVudC5kZWx0YVkgPSBkZWx0YVk7XG4gICAgfVxuXG4gICAgaWYgKGRlbHRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qKlxuICAgICAgICogZGVsdGEgb2YgbW91c2V3aGVlbCBldmVudFxuICAgICAgICogQHByb3BlcnR5IGRlbHRhXG4gICAgICAgKiBAbWVtYmVyIEV2ZW50LkRvbUV2ZW50Lk9iamVjdFxuICAgICAgICovXG4gICAgICBldmVudC5kZWx0YSA9IGRlbHRhO1xuICAgIH1cbiAgfVxufSwge1xuICByZWc6IC9ebW91c2V8Y29udGV4dG1lbnV8Y2xpY2t8bXNwb2ludGVyfCheRE9NTW91c2VTY3JvbGwkKS9pLFxuICBwcm9wczogWydidXR0b25zJywgJ2NsaWVudFgnLCAnY2xpZW50WScsICdidXR0b24nLCAnb2Zmc2V0WCcsICdyZWxhdGVkVGFyZ2V0JywgJ3doaWNoJywgJ2Zyb21FbGVtZW50JywgJ3RvRWxlbWVudCcsICdvZmZzZXRZJywgJ3BhZ2VYJywgJ3BhZ2VZJywgJ3NjcmVlblgnLCAnc2NyZWVuWSddLFxuICBmaXg6IGZ1bmN0aW9uIGZpeChldmVudCwgbmF0aXZlRXZlbnQpIHtcbiAgICB2YXIgZXZlbnREb2MgPSB2b2lkIDA7XG4gICAgdmFyIGRvYyA9IHZvaWQgMDtcbiAgICB2YXIgYm9keSA9IHZvaWQgMDtcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHZhciBidXR0b24gPSBuYXRpdmVFdmVudC5idXR0b247XG5cbiAgICAvLyBDYWxjdWxhdGUgcGFnZVgvWSBpZiBtaXNzaW5nIGFuZCBjbGllbnRYL1kgYXZhaWxhYmxlXG4gICAgaWYgKHRhcmdldCAmJiBpc051bGxPclVuZGVmaW5lZChldmVudC5wYWdlWCkgJiYgIWlzTnVsbE9yVW5kZWZpbmVkKG5hdGl2ZUV2ZW50LmNsaWVudFgpKSB7XG4gICAgICBldmVudERvYyA9IHRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xuICAgICAgZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgYm9keSA9IGV2ZW50RG9jLmJvZHk7XG4gICAgICBldmVudC5wYWdlWCA9IG5hdGl2ZUV2ZW50LmNsaWVudFggKyAoZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDApIC0gKGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50TGVmdCB8fCAwKTtcbiAgICAgIGV2ZW50LnBhZ2VZID0gbmF0aXZlRXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wIHx8IDApIC0gKGRvYyAmJiBkb2MuY2xpZW50VG9wIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgfHwgMCk7XG4gICAgfVxuXG4gICAgLy8gd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0XG4gICAgLy8gZG8gbm90IHVzZSBidXR0b25cbiAgICBpZiAoIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoYnV0dG9uICYgMSkge1xuICAgICAgICBldmVudC53aGljaCA9IDE7XG4gICAgICB9IGVsc2UgaWYgKGJ1dHRvbiAmIDIpIHtcbiAgICAgICAgZXZlbnQud2hpY2ggPSAzO1xuICAgICAgfSBlbHNlIGlmIChidXR0b24gJiA0KSB7XG4gICAgICAgIGV2ZW50LndoaWNoID0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50LndoaWNoID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5XG4gICAgaWYgKCFldmVudC5yZWxhdGVkVGFyZ2V0ICYmIGV2ZW50LmZyb21FbGVtZW50KSB7XG4gICAgICBldmVudC5yZWxhdGVkVGFyZ2V0ID0gZXZlbnQuZnJvbUVsZW1lbnQgPT09IHRhcmdldCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBldmVudDtcbiAgfVxufV07XG5cbmZ1bmN0aW9uIHJldFRydWUoKSB7XG4gIHJldHVybiBUUlVFO1xufVxuXG5mdW5jdGlvbiByZXRGYWxzZSgpIHtcbiAgcmV0dXJuIEZBTFNFO1xufVxuXG5mdW5jdGlvbiBEb21FdmVudE9iamVjdChuYXRpdmVFdmVudCkge1xuICB2YXIgdHlwZSA9IG5hdGl2ZUV2ZW50LnR5cGU7XG5cbiAgdmFyIGlzTmF0aXZlID0gdHlwZW9mIG5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgbmF0aXZlRXZlbnQuY2FuY2VsQnViYmxlID09PSAnYm9vbGVhbic7XG5cbiAgX0V2ZW50QmFzZU9iamVjdDJbXCJkZWZhdWx0XCJdLmNhbGwodGhpcyk7XG5cbiAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50O1xuXG4gIC8vIGluIGNhc2UgZG9tIGV2ZW50IGhhcyBiZWVuIG1hcmsgYXMgZGVmYXVsdCBwcmV2ZW50ZWQgYnkgbG93ZXIgZG9tIG5vZGVcbiAgdmFyIGlzRGVmYXVsdFByZXZlbnRlZCA9IHJldEZhbHNlO1xuICBpZiAoJ2RlZmF1bHRQcmV2ZW50ZWQnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgaXNEZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA/IHJldFRydWUgOiByZXRGYWxzZTtcbiAgfSBlbHNlIGlmICgnZ2V0UHJldmVudERlZmF1bHQnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkxMTUxXG4gICAgaXNEZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZ2V0UHJldmVudERlZmF1bHQoKSA/IHJldFRydWUgOiByZXRGYWxzZTtcbiAgfSBlbHNlIGlmICgncmV0dXJuVmFsdWUnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgaXNEZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQucmV0dXJuVmFsdWUgPT09IEZBTFNFID8gcmV0VHJ1ZSA6IHJldEZhbHNlO1xuICB9XG5cbiAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBpc0RlZmF1bHRQcmV2ZW50ZWQ7XG5cbiAgdmFyIGZpeEZucyA9IFtdO1xuICB2YXIgZml4Rm4gPSB2b2lkIDA7XG4gIHZhciBsID0gdm9pZCAwO1xuICB2YXIgcHJvcCA9IHZvaWQgMDtcbiAgdmFyIHByb3BzID0gY29tbW9uUHJvcHMuY29uY2F0KCk7XG5cbiAgZXZlbnROb3JtYWxpemVycy5mb3JFYWNoKGZ1bmN0aW9uIChub3JtYWxpemVyKSB7XG4gICAgaWYgKHR5cGUubWF0Y2gobm9ybWFsaXplci5yZWcpKSB7XG4gICAgICBwcm9wcyA9IHByb3BzLmNvbmNhdChub3JtYWxpemVyLnByb3BzKTtcbiAgICAgIGlmIChub3JtYWxpemVyLmZpeCkge1xuICAgICAgICBmaXhGbnMucHVzaChub3JtYWxpemVyLmZpeCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBsID0gcHJvcHMubGVuZ3RoO1xuXG4gIC8vIGNsb25lIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdFxuICB3aGlsZSAobCkge1xuICAgIHByb3AgPSBwcm9wc1stLWxdO1xuICAgIHRoaXNbcHJvcF0gPSBuYXRpdmVFdmVudFtwcm9wXTtcbiAgfVxuXG4gIC8vIGZpeCB0YXJnZXQgcHJvcGVydHksIGlmIG5lY2Vzc2FyeVxuICBpZiAoIXRoaXMudGFyZ2V0ICYmIGlzTmF0aXZlKSB7XG4gICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudC5zcmNFbGVtZW50IHx8IGRvY3VtZW50OyAvLyBzcmNFbGVtZW50IG1pZ2h0IG5vdCBiZSBkZWZpbmVkIGVpdGhlclxuICB9XG5cbiAgLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dCBub2RlIChzYWZhcmkpXG4gIGlmICh0aGlzLnRhcmdldCAmJiB0aGlzLnRhcmdldC5ub2RlVHlwZSA9PT0gMykge1xuICAgIHRoaXMudGFyZ2V0ID0gdGhpcy50YXJnZXQucGFyZW50Tm9kZTtcbiAgfVxuXG4gIGwgPSBmaXhGbnMubGVuZ3RoO1xuXG4gIHdoaWxlIChsKSB7XG4gICAgZml4Rm4gPSBmaXhGbnNbLS1sXTtcbiAgICBmaXhGbih0aGlzLCBuYXRpdmVFdmVudCk7XG4gIH1cblxuICB0aGlzLnRpbWVTdGFtcCA9IG5hdGl2ZUV2ZW50LnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xufVxuXG52YXIgRXZlbnRCYXNlT2JqZWN0UHJvdG8gPSBfRXZlbnRCYXNlT2JqZWN0MltcImRlZmF1bHRcIl0ucHJvdG90eXBlO1xuXG4oMCwgX29iamVjdEFzc2lnbjJbXCJkZWZhdWx0XCJdKShEb21FdmVudE9iamVjdC5wcm90b3R5cGUsIEV2ZW50QmFzZU9iamVjdFByb3RvLCB7XG4gIGNvbnN0cnVjdG9yOiBEb21FdmVudE9iamVjdCxcblxuICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7XG4gICAgdmFyIGUgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnRcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gRkFMU0UgKElFKVxuICAgICAgZS5yZXR1cm5WYWx1ZSA9IEZBTFNFO1xuICAgIH1cblxuICAgIEV2ZW50QmFzZU9iamVjdFByb3RvLnByZXZlbnREZWZhdWx0LmNhbGwodGhpcyk7XG4gIH0sXG4gIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgIHZhciBlID0gdGhpcy5uYXRpdmVFdmVudDtcblxuICAgIC8vIGlmIHN0b3BQcm9wYWdhdGlvbiBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudFxuICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIHNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBUUlVFIChJRSlcbiAgICAgIGUuY2FuY2VsQnViYmxlID0gVFJVRTtcbiAgICB9XG5cbiAgICBFdmVudEJhc2VPYmplY3RQcm90by5zdG9wUHJvcGFnYXRpb24uY2FsbCh0aGlzKTtcbiAgfVxufSk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gRG9tRXZlbnRPYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYWRkLWRvbS1ldmVudC1saXN0ZW5lci9saWIvRXZlbnRPYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDU0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuLyoqXG4gKiBAaWdub3JlXG4gKiBiYXNlIGV2ZW50IG9iamVjdCBmb3IgY3VzdG9tIGFuZCBkb20gZXZlbnQuXG4gKiBAYXV0aG9yIHlpbWluZ2hlQGdtYWlsLmNvbVxuICovXG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEJhc2VPYmplY3QoKSB7XG4gIHRoaXMudGltZVN0YW1wID0gRGF0ZS5ub3coKTtcbiAgdGhpcy50YXJnZXQgPSB1bmRlZmluZWQ7XG4gIHRoaXMuY3VycmVudFRhcmdldCA9IHVuZGVmaW5lZDtcbn1cblxuRXZlbnRCYXNlT2JqZWN0LnByb3RvdHlwZSA9IHtcbiAgaXNFdmVudE9iamVjdDogMSxcblxuICBjb25zdHJ1Y3RvcjogRXZlbnRCYXNlT2JqZWN0LFxuXG4gIGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cbiAgaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXG4gIGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblxuICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7XG4gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlO1xuICB9LFxuICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcbiAgfSxcbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgLy8gZml4ZWQgMS4yXG4gICAgLy8gY2FsbCBzdG9wUHJvcGFnYXRpb24gaW1wbGljaXRseVxuICAgIHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH0sXG4gIGhhbHQ6IGZ1bmN0aW9uIGhhbHQoaW1tZWRpYXRlKSB7XG4gICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgdGhpcy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59O1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEV2ZW50QmFzZU9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9hZGQtZG9tLWV2ZW50LWxpc3RlbmVyL2xpYi9FdmVudEJhc2VPYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDU1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vb2JqZWN0LWFzc2lnbi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfRXZlbnQgPSByZXF1aXJlKCcuL0V2ZW50Jyk7XG5cbnZhciBfRXZlbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRXZlbnQpO1xuXG52YXIgX2NvbXBvbmVudENsYXNzZXMgPSByZXF1aXJlKCdjb21wb25lbnQtY2xhc3NlcycpO1xuXG52YXIgX2NvbXBvbmVudENsYXNzZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29tcG9uZW50Q2xhc3Nlcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBpc0Nzc0FuaW1hdGlvblN1cHBvcnRlZCA9IF9FdmVudDIuZGVmYXVsdC5lbmRFdmVudHMubGVuZ3RoICE9PSAwO1xuXG5cbnZhciBjYXBpdGFsUHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdNb3onLCAnTycsXG4vLyBtcyBpcyBzcGVjaWFsIC4uLi4gIVxuJ21zJ107XG52YXIgcHJlZml4ZXMgPSBbJy13ZWJraXQtJywgJy1tb3otJywgJy1vLScsICdtcy0nLCAnJ107XG5cbmZ1bmN0aW9uIGdldFN0eWxlUHJvcGVydHkobm9kZSwgbmFtZSkge1xuICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcblxuICB2YXIgcmV0ID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICByZXQgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHByZWZpeGVzW2ldICsgbmFtZSk7XG4gICAgaWYgKHJldCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGZpeEJyb3dzZXJCeVRpbWVvdXQobm9kZSkge1xuICBpZiAoaXNDc3NBbmltYXRpb25TdXBwb3J0ZWQpIHtcbiAgICB2YXIgdHJhbnNpdGlvbkRlbGF5ID0gcGFyc2VGbG9hdChnZXRTdHlsZVByb3BlcnR5KG5vZGUsICd0cmFuc2l0aW9uLWRlbGF5JykpIHx8IDA7XG4gICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IHBhcnNlRmxvYXQoZ2V0U3R5bGVQcm9wZXJ0eShub2RlLCAndHJhbnNpdGlvbi1kdXJhdGlvbicpKSB8fCAwO1xuICAgIHZhciBhbmltYXRpb25EZWxheSA9IHBhcnNlRmxvYXQoZ2V0U3R5bGVQcm9wZXJ0eShub2RlLCAnYW5pbWF0aW9uLWRlbGF5JykpIHx8IDA7XG4gICAgdmFyIGFuaW1hdGlvbkR1cmF0aW9uID0gcGFyc2VGbG9hdChnZXRTdHlsZVByb3BlcnR5KG5vZGUsICdhbmltYXRpb24tZHVyYXRpb24nKSkgfHwgMDtcbiAgICB2YXIgdGltZSA9IE1hdGgubWF4KHRyYW5zaXRpb25EdXJhdGlvbiArIHRyYW5zaXRpb25EZWxheSwgYW5pbWF0aW9uRHVyYXRpb24gKyBhbmltYXRpb25EZWxheSk7XG4gICAgLy8gc29tZXRpbWVzLCBicm93c2VyIGJ1Z1xuICAgIG5vZGUucmNFbmRBbmltVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5yY0VuZEFuaW1UaW1lb3V0ID0gbnVsbDtcbiAgICAgIGlmIChub2RlLnJjRW5kTGlzdGVuZXIpIHtcbiAgICAgICAgbm9kZS5yY0VuZExpc3RlbmVyKCk7XG4gICAgICB9XG4gICAgfSwgdGltZSAqIDEwMDAgKyAyMDApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFyQnJvd3NlckJ1Z1RpbWVvdXQobm9kZSkge1xuICBpZiAobm9kZS5yY0VuZEFuaW1UaW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KG5vZGUucmNFbmRBbmltVGltZW91dCk7XG4gICAgbm9kZS5yY0VuZEFuaW1UaW1lb3V0ID0gbnVsbDtcbiAgfVxufVxuXG52YXIgY3NzQW5pbWF0aW9uID0gZnVuY3Rpb24gY3NzQW5pbWF0aW9uKG5vZGUsIHRyYW5zaXRpb25OYW1lLCBlbmRDYWxsYmFjaykge1xuICB2YXIgbmFtZUlzT2JqID0gKHR5cGVvZiB0cmFuc2l0aW9uTmFtZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodHJhbnNpdGlvbk5hbWUpKSA9PT0gJ29iamVjdCc7XG4gIHZhciBjbGFzc05hbWUgPSBuYW1lSXNPYmogPyB0cmFuc2l0aW9uTmFtZS5uYW1lIDogdHJhbnNpdGlvbk5hbWU7XG4gIHZhciBhY3RpdmVDbGFzc05hbWUgPSBuYW1lSXNPYmogPyB0cmFuc2l0aW9uTmFtZS5hY3RpdmUgOiB0cmFuc2l0aW9uTmFtZSArICctYWN0aXZlJztcbiAgdmFyIGVuZCA9IGVuZENhbGxiYWNrO1xuICB2YXIgc3RhcnQgPSB2b2lkIDA7XG4gIHZhciBhY3RpdmUgPSB2b2lkIDA7XG4gIHZhciBub2RlQ2xhc3NlcyA9ICgwLCBfY29tcG9uZW50Q2xhc3NlczIuZGVmYXVsdCkobm9kZSk7XG5cbiAgaWYgKGVuZENhbGxiYWNrICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbmRDYWxsYmFjaykgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgZW5kID0gZW5kQ2FsbGJhY2suZW5kO1xuICAgIHN0YXJ0ID0gZW5kQ2FsbGJhY2suc3RhcnQ7XG4gICAgYWN0aXZlID0gZW5kQ2FsbGJhY2suYWN0aXZlO1xuICB9XG5cbiAgaWYgKG5vZGUucmNFbmRMaXN0ZW5lcikge1xuICAgIG5vZGUucmNFbmRMaXN0ZW5lcigpO1xuICB9XG5cbiAgbm9kZS5yY0VuZExpc3RlbmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZSAmJiBlLnRhcmdldCAhPT0gbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlLnJjQW5pbVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChub2RlLnJjQW5pbVRpbWVvdXQpO1xuICAgICAgbm9kZS5yY0FuaW1UaW1lb3V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBjbGVhckJyb3dzZXJCdWdUaW1lb3V0KG5vZGUpO1xuXG4gICAgbm9kZUNsYXNzZXMucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgbm9kZUNsYXNzZXMucmVtb3ZlKGFjdGl2ZUNsYXNzTmFtZSk7XG5cbiAgICBfRXZlbnQyLmRlZmF1bHQucmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBub2RlLnJjRW5kTGlzdGVuZXIpO1xuICAgIG5vZGUucmNFbmRMaXN0ZW5lciA9IG51bGw7XG5cbiAgICAvLyBVc3VhbGx5IHRoaXMgb3B0aW9uYWwgZW5kIGlzIHVzZWQgZm9yIGluZm9ybWluZyBhbiBvd25lciBvZlxuICAgIC8vIGEgbGVhdmUgYW5pbWF0aW9uIGFuZCB0ZWxsaW5nIGl0IHRvIHJlbW92ZSB0aGUgY2hpbGQuXG4gICAgaWYgKGVuZCkge1xuICAgICAgZW5kKCk7XG4gICAgfVxuICB9O1xuXG4gIF9FdmVudDIuZGVmYXVsdC5hZGRFbmRFdmVudExpc3RlbmVyKG5vZGUsIG5vZGUucmNFbmRMaXN0ZW5lcik7XG5cbiAgaWYgKHN0YXJ0KSB7XG4gICAgc3RhcnQoKTtcbiAgfVxuICBub2RlQ2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTtcblxuICBub2RlLnJjQW5pbVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBub2RlLnJjQW5pbVRpbWVvdXQgPSBudWxsO1xuICAgIG5vZGVDbGFzc2VzLmFkZChhY3RpdmVDbGFzc05hbWUpO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHNldFRpbWVvdXQoYWN0aXZlLCAwKTtcbiAgICB9XG4gICAgZml4QnJvd3NlckJ5VGltZW91dChub2RlKTtcbiAgICAvLyAzMG1zIGZvciBmaXJlZm94XG4gIH0sIDMwKTtcblxuICByZXR1cm4ge1xuICAgIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICBpZiAobm9kZS5yY0VuZExpc3RlbmVyKSB7XG4gICAgICAgIG5vZGUucmNFbmRMaXN0ZW5lcigpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5cbmNzc0FuaW1hdGlvbi5zdHlsZSA9IGZ1bmN0aW9uIChub2RlLCBzdHlsZSwgY2FsbGJhY2spIHtcbiAgaWYgKG5vZGUucmNFbmRMaXN0ZW5lcikge1xuICAgIG5vZGUucmNFbmRMaXN0ZW5lcigpO1xuICB9XG5cbiAgbm9kZS5yY0VuZExpc3RlbmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZSAmJiBlLnRhcmdldCAhPT0gbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlLnJjQW5pbVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChub2RlLnJjQW5pbVRpbWVvdXQpO1xuICAgICAgbm9kZS5yY0FuaW1UaW1lb3V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBjbGVhckJyb3dzZXJCdWdUaW1lb3V0KG5vZGUpO1xuXG4gICAgX0V2ZW50Mi5kZWZhdWx0LnJlbW92ZUVuZEV2ZW50TGlzdGVuZXIobm9kZSwgbm9kZS5yY0VuZExpc3RlbmVyKTtcbiAgICBub2RlLnJjRW5kTGlzdGVuZXIgPSBudWxsO1xuXG4gICAgLy8gVXN1YWxseSB0aGlzIG9wdGlvbmFsIGNhbGxiYWNrIGlzIHVzZWQgZm9yIGluZm9ybWluZyBhbiBvd25lciBvZlxuICAgIC8vIGEgbGVhdmUgYW5pbWF0aW9uIGFuZCB0ZWxsaW5nIGl0IHRvIHJlbW92ZSB0aGUgY2hpbGQuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfTtcblxuICBfRXZlbnQyLmRlZmF1bHQuYWRkRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBub2RlLnJjRW5kTGlzdGVuZXIpO1xuXG4gIG5vZGUucmNBbmltVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIHMgaW4gc3R5bGUpIHtcbiAgICAgIGlmIChzdHlsZS5oYXNPd25Qcm9wZXJ0eShzKSkge1xuICAgICAgICBub2RlLnN0eWxlW3NdID0gc3R5bGVbc107XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUucmNBbmltVGltZW91dCA9IG51bGw7XG4gICAgZml4QnJvd3NlckJ5VGltZW91dChub2RlKTtcbiAgfSwgMCk7XG59O1xuXG5jc3NBbmltYXRpb24uc2V0VHJhbnNpdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBwLCB2YWx1ZSkge1xuICB2YXIgcHJvcGVydHkgPSBwO1xuICB2YXIgdiA9IHZhbHVlO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHYgPSBwcm9wZXJ0eTtcbiAgICBwcm9wZXJ0eSA9ICcnO1xuICB9XG4gIHByb3BlcnR5ID0gcHJvcGVydHkgfHwgJyc7XG4gIGNhcGl0YWxQcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICBub2RlLnN0eWxlW3ByZWZpeCArICdUcmFuc2l0aW9uJyArIHByb3BlcnR5XSA9IHY7XG4gIH0pO1xufTtcblxuY3NzQW5pbWF0aW9uLmlzQ3NzQW5pbWF0aW9uU3VwcG9ydGVkID0gaXNDc3NBbmltYXRpb25TdXBwb3J0ZWQ7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGNzc0FuaW1hdGlvbjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdGlucGVyLWJlZS1jb3JlL2xpYi9jc3NBbmltYXRpb24uanNcbi8vIG1vZHVsZSBpZCA9IDU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBFVkVOVF9OQU1FX01BUCA9IHtcbiAgdHJhbnNpdGlvbmVuZDoge1xuICAgIHRyYW5zaXRpb246ICd0cmFuc2l0aW9uZW5kJyxcbiAgICBXZWJraXRUcmFuc2l0aW9uOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG4gICAgTW96VHJhbnNpdGlvbjogJ21velRyYW5zaXRpb25FbmQnLFxuICAgIE9UcmFuc2l0aW9uOiAnb1RyYW5zaXRpb25FbmQnLFxuICAgIG1zVHJhbnNpdGlvbjogJ01TVHJhbnNpdGlvbkVuZCdcbiAgfSxcblxuICBhbmltYXRpb25lbmQ6IHtcbiAgICBhbmltYXRpb246ICdhbmltYXRpb25lbmQnLFxuICAgIFdlYmtpdEFuaW1hdGlvbjogJ3dlYmtpdEFuaW1hdGlvbkVuZCcsXG4gICAgTW96QW5pbWF0aW9uOiAnbW96QW5pbWF0aW9uRW5kJyxcbiAgICBPQW5pbWF0aW9uOiAnb0FuaW1hdGlvbkVuZCcsXG4gICAgbXNBbmltYXRpb246ICdNU0FuaW1hdGlvbkVuZCdcbiAgfVxufTtcblxudmFyIGVuZEV2ZW50cyA9IFtdO1xuXG5mdW5jdGlvbiBkZXRlY3RFdmVudHMoKSB7XG4gIHZhciB0ZXN0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdmFyIHN0eWxlID0gdGVzdEVsLnN0eWxlO1xuXG4gIGlmICghKCdBbmltYXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSBFVkVOVF9OQU1FX01BUC5hbmltYXRpb25lbmQuYW5pbWF0aW9uO1xuICB9XG5cbiAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSBFVkVOVF9OQU1FX01BUC50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb247XG4gIH1cblxuICBmb3IgKHZhciBiYXNlRXZlbnROYW1lIGluIEVWRU5UX05BTUVfTUFQKSB7XG4gICAgaWYgKEVWRU5UX05BTUVfTUFQLmhhc093blByb3BlcnR5KGJhc2VFdmVudE5hbWUpKSB7XG4gICAgICB2YXIgYmFzZUV2ZW50cyA9IEVWRU5UX05BTUVfTUFQW2Jhc2VFdmVudE5hbWVdO1xuICAgICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIGJhc2VFdmVudHMpIHtcbiAgICAgICAgaWYgKHN0eWxlTmFtZSBpbiBzdHlsZSkge1xuICAgICAgICAgIGVuZEV2ZW50cy5wdXNoKGJhc2VFdmVudHNbc3R5bGVOYW1lXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgZGV0ZWN0RXZlbnRzKCk7XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBldmVudExpc3RlbmVyKSB7XG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50TGlzdGVuZXIsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGV2ZW50TGlzdGVuZXIpIHtcbiAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xufVxuXG52YXIgVHJhbnNpdGlvbkV2ZW50cyA9IHtcbiAgYWRkRW5kRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gYWRkRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudExpc3RlbmVyKSB7XG4gICAgaWYgKGVuZEV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGV2ZW50TGlzdGVuZXIsIDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZW5kRXZlbnQpIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZW5kRXZlbnQsIGV2ZW50TGlzdGVuZXIpO1xuICAgIH0pO1xuICB9LFxuXG5cbiAgZW5kRXZlbnRzOiBlbmRFdmVudHMsXG5cbiAgcmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudExpc3RlbmVyKSB7XG4gICAgaWYgKGVuZEV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGVuZEV2ZW50KSB7XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVyKG5vZGUsIGVuZEV2ZW50LCBldmVudExpc3RlbmVyKTtcbiAgICB9KTtcbiAgfVxufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gVHJhbnNpdGlvbkV2ZW50cztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdGlucGVyLWJlZS1jb3JlL2xpYi9FdmVudC5qc1xuLy8gbW9kdWxlIGlkID0gNThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnRyeSB7XG4gIHZhciBpbmRleCA9IHJlcXVpcmUoJ2luZGV4b2YnKTtcbn0gY2F0Y2ggKGVycikge1xuICB2YXIgaW5kZXggPSByZXF1aXJlKCdjb21wb25lbnQtaW5kZXhvZicpO1xufVxuXG4vKipcbiAqIFdoaXRlc3BhY2UgcmVnZXhwLlxuICovXG5cbnZhciByZSA9IC9cXHMrLztcblxuLyoqXG4gKiB0b1N0cmluZyByZWZlcmVuY2UuXG4gKi9cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBXcmFwIGBlbGAgaW4gYSBgQ2xhc3NMaXN0YC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtDbGFzc0xpc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZWwpe1xuICByZXR1cm4gbmV3IENsYXNzTGlzdChlbCk7XG59O1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgQ2xhc3NMaXN0IGZvciBgZWxgLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIENsYXNzTGlzdChlbCkge1xuICBpZiAoIWVsIHx8ICFlbC5ub2RlVHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQSBET00gZWxlbWVudCByZWZlcmVuY2UgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICB0aGlzLmVsID0gZWw7XG4gIHRoaXMubGlzdCA9IGVsLmNsYXNzTGlzdDtcbn1cblxuLyoqXG4gKiBBZGQgY2xhc3MgYG5hbWVgIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge0NsYXNzTGlzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ2xhc3NMaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihuYW1lKXtcbiAgLy8gY2xhc3NMaXN0XG4gIGlmICh0aGlzLmxpc3QpIHtcbiAgICB0aGlzLmxpc3QuYWRkKG5hbWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZmFsbGJhY2tcbiAgdmFyIGFyciA9IHRoaXMuYXJyYXkoKTtcbiAgdmFyIGkgPSBpbmRleChhcnIsIG5hbWUpO1xuICBpZiAoIX5pKSBhcnIucHVzaChuYW1lKTtcbiAgdGhpcy5lbC5jbGFzc05hbWUgPSBhcnIuam9pbignICcpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGNsYXNzIGBuYW1lYCB3aGVuIHByZXNlbnQsIG9yXG4gKiBwYXNzIGEgcmVndWxhciBleHByZXNzaW9uIHRvIHJlbW92ZVxuICogYW55IHdoaWNoIG1hdGNoLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbmFtZVxuICogQHJldHVybiB7Q2xhc3NMaXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5DbGFzc0xpc3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKG5hbWUpe1xuICBpZiAoJ1tvYmplY3QgUmVnRXhwXScgPT0gdG9TdHJpbmcuY2FsbChuYW1lKSkge1xuICAgIHJldHVybiB0aGlzLnJlbW92ZU1hdGNoaW5nKG5hbWUpO1xuICB9XG5cbiAgLy8gY2xhc3NMaXN0XG4gIGlmICh0aGlzLmxpc3QpIHtcbiAgICB0aGlzLmxpc3QucmVtb3ZlKG5hbWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZmFsbGJhY2tcbiAgdmFyIGFyciA9IHRoaXMuYXJyYXkoKTtcbiAgdmFyIGkgPSBpbmRleChhcnIsIG5hbWUpO1xuICBpZiAofmkpIGFyci5zcGxpY2UoaSwgMSk7XG4gIHRoaXMuZWwuY2xhc3NOYW1lID0gYXJyLmpvaW4oJyAnKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbGwgY2xhc3NlcyBtYXRjaGluZyBgcmVgLlxuICpcbiAqIEBwYXJhbSB7UmVnRXhwfSByZVxuICogQHJldHVybiB7Q2xhc3NMaXN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ2xhc3NMaXN0LnByb3RvdHlwZS5yZW1vdmVNYXRjaGluZyA9IGZ1bmN0aW9uKHJlKXtcbiAgdmFyIGFyciA9IHRoaXMuYXJyYXkoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmUudGVzdChhcnJbaV0pKSB7XG4gICAgICB0aGlzLnJlbW92ZShhcnJbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVG9nZ2xlIGNsYXNzIGBuYW1lYCwgY2FuIGZvcmNlIHN0YXRlIHZpYSBgZm9yY2VgLlxuICpcbiAqIEZvciBicm93c2VycyB0aGF0IHN1cHBvcnQgY2xhc3NMaXN0LCBidXQgZG8gbm90IHN1cHBvcnQgYGZvcmNlYCB5ZXQsXG4gKiB0aGUgbWlzdGFrZSB3aWxsIGJlIGRldGVjdGVkIGFuZCBjb3JyZWN0ZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VcbiAqIEByZXR1cm4ge0NsYXNzTGlzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ2xhc3NMaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbihuYW1lLCBmb3JjZSl7XG4gIC8vIGNsYXNzTGlzdFxuICBpZiAodGhpcy5saXN0KSB7XG4gICAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBmb3JjZSkge1xuICAgICAgaWYgKGZvcmNlICE9PSB0aGlzLmxpc3QudG9nZ2xlKG5hbWUsIGZvcmNlKSkge1xuICAgICAgICB0aGlzLmxpc3QudG9nZ2xlKG5hbWUpOyAvLyB0b2dnbGUgYWdhaW4gdG8gY29ycmVjdFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxpc3QudG9nZ2xlKG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGZhbGxiYWNrXG4gIGlmIChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgZm9yY2UpIHtcbiAgICBpZiAoIWZvcmNlKSB7XG4gICAgICB0aGlzLnJlbW92ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGQobmFtZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh0aGlzLmhhcyhuYW1lKSkge1xuICAgICAgdGhpcy5yZW1vdmUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYW4gYXJyYXkgb2YgY2xhc3Nlcy5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ2xhc3NMaXN0LnByb3RvdHlwZS5hcnJheSA9IGZ1bmN0aW9uKCl7XG4gIHZhciBjbGFzc05hbWUgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJztcbiAgdmFyIHN0ciA9IGNsYXNzTmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XG4gIHZhciBhcnIgPSBzdHIuc3BsaXQocmUpO1xuICBpZiAoJycgPT09IGFyclswXSkgYXJyLnNoaWZ0KCk7XG4gIHJldHVybiBhcnI7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGNsYXNzIGBuYW1lYCBpcyBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtDbGFzc0xpc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkNsYXNzTGlzdC5wcm90b3R5cGUuaGFzID1cbkNsYXNzTGlzdC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbihuYW1lKXtcbiAgcmV0dXJuIHRoaXMubGlzdFxuICAgID8gdGhpcy5saXN0LmNvbnRhaW5zKG5hbWUpXG4gICAgOiAhISB+aW5kZXgodGhpcy5hcnJheSgpLCBuYW1lKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29tcG9uZW50LWNsYXNzZXMvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYXJyLCBvYmope1xuICBpZiAoYXJyLmluZGV4T2YpIHJldHVybiBhcnIuaW5kZXhPZihvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgIGlmIChhcnJbaV0gPT09IG9iaikgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29tcG9uZW50LWluZGV4b2YvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IHRvQXJyYXk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICB2YXIgcmV0ID0gW107XG4gIF9yZWFjdDIuZGVmYXVsdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoYykge1xuICAgIHJldC5wdXNoKGMpO1xuICB9KTtcbiAgcmV0dXJuIHJldDtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdGlucGVyLWJlZS1jb3JlL2xpYi90b0FycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSA2MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF9kb21BbGlnbiA9IHJlcXVpcmUoJ2RvbS1hbGlnbicpO1xuXG52YXIgX2RvbUFsaWduMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RvbUFsaWduKTtcblxudmFyIF9hZGRFdmVudExpc3RlbmVyID0gcmVxdWlyZSgnLi9hZGRFdmVudExpc3RlbmVyJyk7XG5cbnZhciBfYWRkRXZlbnRMaXN0ZW5lcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hZGRFdmVudExpc3RlbmVyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLy9pbXBvcnQgaXNXaW5kb3cgZnJvbSAnLi9pc1dpbmRvdyc7XG5cbmZ1bmN0aW9uIGlzV2luZG93KG9iaikge1xuICAvKiBlc2xpbnQgbm8tZXEtbnVsbDogMCAqL1xuICAvKiBlc2xpbnQgZXFlcWVxOiAwICovXG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT0gb2JqLndpbmRvdztcbn1cblxuZnVuY3Rpb24gYnVmZmVyKGZuLCBtcykge1xuICB2YXIgdGltZXIgPSB2b2lkIDA7XG5cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgaWYgKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1ZmZlckZuKCkge1xuICAgIGNsZWFyKCk7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KGZuLCBtcyk7XG4gIH1cblxuICBidWZmZXJGbi5jbGVhciA9IGNsZWFyO1xuXG4gIHJldHVybiBidWZmZXJGbjtcbn1cblxudmFyIEFsaWduID0gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUNsYXNzKHtcbiAgcHJvcFR5cGVzOiB7XG4gICAgY2hpbGRyZW5Qcm9wczogX3JlYWN0LlByb3BUeXBlcy5vYmplY3QsXG4gICAgYWxpZ246IF9yZWFjdC5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgdGFyZ2V0OiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25BbGlnbjogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICAgIG1vbml0b3JCdWZmZXJUaW1lOiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgICBtb25pdG9yV2luZG93UmVzaXplOiBfcmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gICAgZGlzYWJsZWQ6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgICBjaGlsZHJlbjogX3JlYWN0LlByb3BUeXBlcy5hbnlcbiAgfSxcblxuICBnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uIGdldERlZmF1bHRQcm9wcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBmdW5jdGlvbiB0YXJnZXQoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgICB9LFxuICAgICAgb25BbGlnbjogZnVuY3Rpb24gb25BbGlnbigpIHt9LFxuXG4gICAgICBtb25pdG9yQnVmZmVyVGltZTogNTAsXG4gICAgICBtb25pdG9yV2luZG93UmVzaXplOiBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgIH07XG4gIH0sXG4gIGNvbXBvbmVudERpZE1vdW50OiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIC8vIGlmIHBhcmVudCByZWYgbm90IGF0dGFjaGVkIC4uLi4gdXNlIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkXG4gICAgdGhpcy5mb3JjZUFsaWduKCk7XG4gICAgaWYgKCFwcm9wcy5kaXNhYmxlZCAmJiBwcm9wcy5tb25pdG9yV2luZG93UmVzaXplKSB7XG4gICAgICB0aGlzLnN0YXJ0TW9uaXRvcldpbmRvd1Jlc2l6ZSgpO1xuICAgIH1cbiAgfSxcbiAgY29tcG9uZW50RGlkVXBkYXRlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgdmFyIHJlQWxpZ24gPSBmYWxzZTtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKCFwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgaWYgKHByZXZQcm9wcy5kaXNhYmxlZCB8fCBwcmV2UHJvcHMuYWxpZ24gIT09IHByb3BzLmFsaWduKSB7XG4gICAgICAgIHJlQWxpZ24gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGxhc3RUYXJnZXQgPSBwcmV2UHJvcHMudGFyZ2V0KCk7XG4gICAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gcHJvcHMudGFyZ2V0KCk7XG4gICAgICAgIGlmIChpc1dpbmRvdyhsYXN0VGFyZ2V0KSAmJiBpc1dpbmRvdyhjdXJyZW50VGFyZ2V0KSkge1xuICAgICAgICAgIHJlQWxpZ24gPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0VGFyZ2V0ICE9PSBjdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgcmVBbGlnbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVBbGlnbikge1xuICAgICAgdGhpcy5mb3JjZUFsaWduKCk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm1vbml0b3JXaW5kb3dSZXNpemUgJiYgIXByb3BzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnN0YXJ0TW9uaXRvcldpbmRvd1Jlc2l6ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3BNb25pdG9yV2luZG93UmVzaXplKCk7XG4gICAgfVxuICB9LFxuICBjb21wb25lbnRXaWxsVW5tb3VudDogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5zdG9wTW9uaXRvcldpbmRvd1Jlc2l6ZSgpO1xuICB9LFxuICBzdGFydE1vbml0b3JXaW5kb3dSZXNpemU6IGZ1bmN0aW9uIHN0YXJ0TW9uaXRvcldpbmRvd1Jlc2l6ZSgpIHtcbiAgICBpZiAoIXRoaXMucmVzaXplSGFuZGxlcikge1xuICAgICAgdGhpcy5idWZmZXJNb25pdG9yID0gYnVmZmVyKHRoaXMuZm9yY2VBbGlnbiwgdGhpcy5wcm9wcy5tb25pdG9yQnVmZmVyVGltZSk7XG4gICAgICB0aGlzLnJlc2l6ZUhhbmRsZXIgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIyLmRlZmF1bHQpKHdpbmRvdywgJ3Jlc2l6ZScsIHRoaXMuYnVmZmVyTW9uaXRvcik7XG4gICAgfVxuICB9LFxuICBzdG9wTW9uaXRvcldpbmRvd1Jlc2l6ZTogZnVuY3Rpb24gc3RvcE1vbml0b3JXaW5kb3dSZXNpemUoKSB7XG4gICAgaWYgKHRoaXMucmVzaXplSGFuZGxlcikge1xuICAgICAgdGhpcy5idWZmZXJNb25pdG9yLmNsZWFyKCk7XG4gICAgICB0aGlzLnJlc2l6ZUhhbmRsZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLnJlc2l6ZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgfSxcbiAgZm9yY2VBbGlnbjogZnVuY3Rpb24gZm9yY2VBbGlnbigpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIGlmICghcHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBfcmVhY3REb20yLmRlZmF1bHQuZmluZERPTU5vZGUodGhpcyk7XG4gICAgICBwcm9wcy5vbkFsaWduKHNvdXJjZSwgKDAsIF9kb21BbGlnbjIuZGVmYXVsdCkoc291cmNlLCBwcm9wcy50YXJnZXQoKSwgcHJvcHMuYWxpZ24pKTtcbiAgICB9XG4gIH0sXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjaGlsZHJlblByb3BzID0gX3Byb3BzLmNoaWxkcmVuUHJvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuO1xuXG4gICAgdmFyIGNoaWxkID0gX3JlYWN0Mi5kZWZhdWx0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICAgIGlmIChjaGlsZHJlblByb3BzKSB7XG4gICAgICB2YXIgbmV3UHJvcHMgPSB7fTtcbiAgICAgIGZvciAodmFyIHByb3AgaW4gY2hpbGRyZW5Qcm9wcykge1xuICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgIG5ld1Byb3BzW3Byb3BdID0gdGhpcy5wcm9wc1tjaGlsZHJlblByb3BzW3Byb3BdXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jbG9uZUVsZW1lbnQoY2hpbGQsIG5ld1Byb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG59KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gQWxpZ247XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RpbnBlci1iZWUtY29yZS9saWIvQWxpZ24uanNcbi8vIG1vZHVsZSBpZCA9IDYyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIF91dGlsczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlscyk7XG5cbnZhciBfZ2V0T2Zmc2V0UGFyZW50ID0gcmVxdWlyZSgnLi9nZXRPZmZzZXRQYXJlbnQnKTtcblxudmFyIF9nZXRPZmZzZXRQYXJlbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0T2Zmc2V0UGFyZW50KTtcblxudmFyIF9nZXRWaXNpYmxlUmVjdEZvckVsZW1lbnQgPSByZXF1aXJlKCcuL2dldFZpc2libGVSZWN0Rm9yRWxlbWVudCcpO1xuXG52YXIgX2dldFZpc2libGVSZWN0Rm9yRWxlbWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRWaXNpYmxlUmVjdEZvckVsZW1lbnQpO1xuXG52YXIgX2FkanVzdEZvclZpZXdwb3J0ID0gcmVxdWlyZSgnLi9hZGp1c3RGb3JWaWV3cG9ydCcpO1xuXG52YXIgX2FkanVzdEZvclZpZXdwb3J0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FkanVzdEZvclZpZXdwb3J0KTtcblxudmFyIF9nZXRSZWdpb24gPSByZXF1aXJlKCcuL2dldFJlZ2lvbicpO1xuXG52YXIgX2dldFJlZ2lvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRSZWdpb24pO1xuXG52YXIgX2dldEVsRnV0dXJlUG9zID0gcmVxdWlyZSgnLi9nZXRFbEZ1dHVyZVBvcycpO1xuXG52YXIgX2dldEVsRnV0dXJlUG9zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldEVsRnV0dXJlUG9zKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbi8vIGh0dHA6Ly95aW1pbmdoZS5pdGV5ZS5jb20vYmxvZy8xMTI0NzIwXG5cbi8qKlxuICogYWxpZ24gZG9tIG5vZGUgZmxleGlibHlcbiAqIEBhdXRob3IgeWltaW5naGVAZ21haWwuY29tXG4gKi9cblxuZnVuY3Rpb24gaXNGYWlsWChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy5sZWZ0IDwgdmlzaWJsZVJlY3QubGVmdCB8fCBlbEZ1dHVyZVBvcy5sZWZ0ICsgZWxSZWdpb24ud2lkdGggPiB2aXNpYmxlUmVjdC5yaWdodDtcbn1cblxuZnVuY3Rpb24gaXNGYWlsWShlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy50b3AgPCB2aXNpYmxlUmVjdC50b3AgfHwgZWxGdXR1cmVQb3MudG9wICsgZWxSZWdpb24uaGVpZ2h0ID4gdmlzaWJsZVJlY3QuYm90dG9tO1xufVxuXG5mdW5jdGlvbiBpc0NvbXBsZXRlRmFpbFgoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCkge1xuICByZXR1cm4gZWxGdXR1cmVQb3MubGVmdCA+IHZpc2libGVSZWN0LnJpZ2h0IHx8IGVsRnV0dXJlUG9zLmxlZnQgKyBlbFJlZ2lvbi53aWR0aCA8IHZpc2libGVSZWN0LmxlZnQ7XG59XG5cbmZ1bmN0aW9uIGlzQ29tcGxldGVGYWlsWShlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy50b3AgPiB2aXNpYmxlUmVjdC5ib3R0b20gfHwgZWxGdXR1cmVQb3MudG9wICsgZWxSZWdpb24uaGVpZ2h0IDwgdmlzaWJsZVJlY3QudG9wO1xufVxuXG5mdW5jdGlvbiBmbGlwKHBvaW50cywgcmVnLCBtYXApIHtcbiAgdmFyIHJldCA9IFtdO1xuICBfdXRpbHMyW1wiZGVmYXVsdFwiXS5lYWNoKHBvaW50cywgZnVuY3Rpb24gKHApIHtcbiAgICByZXQucHVzaChwLnJlcGxhY2UocmVnLCBmdW5jdGlvbiAobSkge1xuICAgICAgcmV0dXJuIG1hcFttXTtcbiAgICB9KSk7XG4gIH0pO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBmbGlwT2Zmc2V0KG9mZnNldCwgaW5kZXgpIHtcbiAgb2Zmc2V0W2luZGV4XSA9IC1vZmZzZXRbaW5kZXhdO1xuICByZXR1cm4gb2Zmc2V0O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0T2Zmc2V0KHN0ciwgb2Zmc2V0TGVuKSB7XG4gIHZhciBuID0gdm9pZCAwO1xuICBpZiAoLyUkLy50ZXN0KHN0cikpIHtcbiAgICBuID0gcGFyc2VJbnQoc3RyLnN1YnN0cmluZygwLCBzdHIubGVuZ3RoIC0gMSksIDEwKSAvIDEwMCAqIG9mZnNldExlbjtcbiAgfSBlbHNlIHtcbiAgICBuID0gcGFyc2VJbnQoc3RyLCAxMCk7XG4gIH1cbiAgcmV0dXJuIG4gfHwgMDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplT2Zmc2V0KG9mZnNldCwgZWwpIHtcbiAgb2Zmc2V0WzBdID0gY29udmVydE9mZnNldChvZmZzZXRbMF0sIGVsLndpZHRoKTtcbiAgb2Zmc2V0WzFdID0gY29udmVydE9mZnNldChvZmZzZXRbMV0sIGVsLmhlaWdodCk7XG59XG5cbmZ1bmN0aW9uIGRvbUFsaWduKGVsLCByZWZOb2RlLCBhbGlnbikge1xuICB2YXIgcG9pbnRzID0gYWxpZ24ucG9pbnRzO1xuICB2YXIgb2Zmc2V0ID0gYWxpZ24ub2Zmc2V0IHx8IFswLCAwXTtcbiAgdmFyIHRhcmdldE9mZnNldCA9IGFsaWduLnRhcmdldE9mZnNldCB8fCBbMCwgMF07XG4gIHZhciBvdmVyZmxvdyA9IGFsaWduLm92ZXJmbG93O1xuICB2YXIgdGFyZ2V0ID0gYWxpZ24udGFyZ2V0IHx8IHJlZk5vZGU7XG4gIHZhciBzb3VyY2UgPSBhbGlnbi5zb3VyY2UgfHwgZWw7XG4gIG9mZnNldCA9IFtdLmNvbmNhdChvZmZzZXQpO1xuICB0YXJnZXRPZmZzZXQgPSBbXS5jb25jYXQodGFyZ2V0T2Zmc2V0KTtcbiAgb3ZlcmZsb3cgPSBvdmVyZmxvdyB8fCB7fTtcbiAgdmFyIG5ld092ZXJmbG93Q2ZnID0ge307XG5cbiAgdmFyIGZhaWwgPSAwO1xuICAvLyDlvZPliY3oioLngrnlj6/ku6XooqvmlL7nva7nmoTmmL7npLrljLrln59cbiAgdmFyIHZpc2libGVSZWN0ID0gKDAsIF9nZXRWaXNpYmxlUmVjdEZvckVsZW1lbnQyW1wiZGVmYXVsdFwiXSkoc291cmNlKTtcbiAgLy8g5b2T5YmN6IqC54K55omA5Y2g55qE5Yy65Z+fLCBsZWZ0L3RvcC93aWR0aC9oZWlnaHRcbiAgdmFyIGVsUmVnaW9uID0gKDAsIF9nZXRSZWdpb24yW1wiZGVmYXVsdFwiXSkoc291cmNlKTtcbiAgLy8g5Y+C54Wn6IqC54K55omA5Y2g55qE5Yy65Z+fLCBsZWZ0L3RvcC93aWR0aC9oZWlnaHRcbiAgdmFyIHJlZk5vZGVSZWdpb24gPSAoMCwgX2dldFJlZ2lvbjJbXCJkZWZhdWx0XCJdKSh0YXJnZXQpO1xuICAvLyDlsIYgb2Zmc2V0IOi9rOaNouaIkOaVsOWAvO+8jOaUr+aMgeeZvuWIhuavlFxuICBub3JtYWxpemVPZmZzZXQob2Zmc2V0LCBlbFJlZ2lvbik7XG4gIG5vcm1hbGl6ZU9mZnNldCh0YXJnZXRPZmZzZXQsIHJlZk5vZGVSZWdpb24pO1xuICAvLyDlvZPliY3oioLngrnlsIbopoHooqvmlL7nva7nmoTkvY3nva5cbiAgdmFyIGVsRnV0dXJlUG9zID0gKDAsIF9nZXRFbEZ1dHVyZVBvczJbXCJkZWZhdWx0XCJdKShlbFJlZ2lvbiwgcmVmTm9kZVJlZ2lvbiwgcG9pbnRzLCBvZmZzZXQsIHRhcmdldE9mZnNldCk7XG4gIC8vIOW9k+WJjeiKgueCueWwhuimgeaJgOWkhOeahOWMuuWfn1xuICB2YXIgbmV3RWxSZWdpb24gPSBfdXRpbHMyW1wiZGVmYXVsdFwiXS5tZXJnZShlbFJlZ2lvbiwgZWxGdXR1cmVQb3MpO1xuXG4gIC8vIOWmguaenOWPr+inhuWMuuWfn+S4jeiDveWujOWFqOaUvue9ruW9k+WJjeiKgueCueaXtuWFgeiuuOiwg+aVtFxuICBpZiAodmlzaWJsZVJlY3QgJiYgKG92ZXJmbG93LmFkanVzdFggfHwgb3ZlcmZsb3cuYWRqdXN0WSkpIHtcbiAgICBpZiAob3ZlcmZsb3cuYWRqdXN0WCkge1xuICAgICAgLy8g5aaC5p6c5qiq5ZCR5LiN6IO95pS+5LiLXG4gICAgICBpZiAoaXNGYWlsWChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSkge1xuICAgICAgICAvLyDlr7npvZDkvY3nva7lj43kuItcbiAgICAgICAgdmFyIG5ld1BvaW50cyA9IGZsaXAocG9pbnRzLCAvW2xyXS9pZywge1xuICAgICAgICAgIGw6ICdyJyxcbiAgICAgICAgICByOiAnbCdcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIOWBj+enu+mHj+S5n+WPjeS4i1xuICAgICAgICB2YXIgbmV3T2Zmc2V0ID0gZmxpcE9mZnNldChvZmZzZXQsIDApO1xuICAgICAgICB2YXIgbmV3VGFyZ2V0T2Zmc2V0ID0gZmxpcE9mZnNldCh0YXJnZXRPZmZzZXQsIDApO1xuICAgICAgICB2YXIgbmV3RWxGdXR1cmVQb3MgPSAoMCwgX2dldEVsRnV0dXJlUG9zMltcImRlZmF1bHRcIl0pKGVsUmVnaW9uLCByZWZOb2RlUmVnaW9uLCBuZXdQb2ludHMsIG5ld09mZnNldCwgbmV3VGFyZ2V0T2Zmc2V0KTtcbiAgICAgICAgaWYgKCFpc0NvbXBsZXRlRmFpbFgobmV3RWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCkpIHtcbiAgICAgICAgICBmYWlsID0gMTtcbiAgICAgICAgICBwb2ludHMgPSBuZXdQb2ludHM7XG4gICAgICAgICAgb2Zmc2V0ID0gbmV3T2Zmc2V0O1xuICAgICAgICAgIHRhcmdldE9mZnNldCA9IG5ld1RhcmdldE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvdmVyZmxvdy5hZGp1c3RZKSB7XG4gICAgICAvLyDlpoLmnpznurXlkJHkuI3og73mlL7kuItcbiAgICAgIGlmIChpc0ZhaWxZKGVsRnV0dXJlUG9zLCBlbFJlZ2lvbiwgdmlzaWJsZVJlY3QpKSB7XG4gICAgICAgIC8vIOWvuem9kOS9jee9ruWPjeS4i1xuICAgICAgICB2YXIgX25ld1BvaW50cyA9IGZsaXAocG9pbnRzLCAvW3RiXS9pZywge1xuICAgICAgICAgIHQ6ICdiJyxcbiAgICAgICAgICBiOiAndCdcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIOWBj+enu+mHj+S5n+WPjeS4i1xuICAgICAgICB2YXIgX25ld09mZnNldCA9IGZsaXBPZmZzZXQob2Zmc2V0LCAxKTtcbiAgICAgICAgdmFyIF9uZXdUYXJnZXRPZmZzZXQgPSBmbGlwT2Zmc2V0KHRhcmdldE9mZnNldCwgMSk7XG4gICAgICAgIHZhciBfbmV3RWxGdXR1cmVQb3MgPSAoMCwgX2dldEVsRnV0dXJlUG9zMltcImRlZmF1bHRcIl0pKGVsUmVnaW9uLCByZWZOb2RlUmVnaW9uLCBfbmV3UG9pbnRzLCBfbmV3T2Zmc2V0LCBfbmV3VGFyZ2V0T2Zmc2V0KTtcbiAgICAgICAgaWYgKCFpc0NvbXBsZXRlRmFpbFkoX25ld0VsRnV0dXJlUG9zLCBlbFJlZ2lvbiwgdmlzaWJsZVJlY3QpKSB7XG4gICAgICAgICAgZmFpbCA9IDE7XG4gICAgICAgICAgcG9pbnRzID0gX25ld1BvaW50cztcbiAgICAgICAgICBvZmZzZXQgPSBfbmV3T2Zmc2V0O1xuICAgICAgICAgIHRhcmdldE9mZnNldCA9IF9uZXdUYXJnZXRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDlpoLmnpzlpLHotKXvvIzph43mlrDorqHnrpflvZPliY3oioLngrnlsIbopoHooqvmlL7nva7nmoTkvY3nva5cbiAgICBpZiAoZmFpbCkge1xuICAgICAgZWxGdXR1cmVQb3MgPSAoMCwgX2dldEVsRnV0dXJlUG9zMltcImRlZmF1bHRcIl0pKGVsUmVnaW9uLCByZWZOb2RlUmVnaW9uLCBwb2ludHMsIG9mZnNldCwgdGFyZ2V0T2Zmc2V0KTtcbiAgICAgIF91dGlsczJbXCJkZWZhdWx0XCJdLm1peChuZXdFbFJlZ2lvbiwgZWxGdXR1cmVQb3MpO1xuICAgIH1cblxuICAgIC8vIOajgOafpeWPjeS4i+WQjueahOS9jee9ruaYr+WQpuWPr+S7peaUvuS4i+S6hlxuICAgIC8vIOWmguaenOS7jeeEtuaUvuS4jeS4i+WPquacieaMh+WumuS6huWPr+S7peiwg+aVtOW9k+WJjeaWueWQkeaJjeiwg+aVtFxuICAgIG5ld092ZXJmbG93Q2ZnLmFkanVzdFggPSBvdmVyZmxvdy5hZGp1c3RYICYmIGlzRmFpbFgoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCk7XG5cbiAgICBuZXdPdmVyZmxvd0NmZy5hZGp1c3RZID0gb3ZlcmZsb3cuYWRqdXN0WSAmJiBpc0ZhaWxZKGVsRnV0dXJlUG9zLCBlbFJlZ2lvbiwgdmlzaWJsZVJlY3QpO1xuXG4gICAgLy8g56Gu5a6e6KaB6LCD5pW077yM55Sa6Iez5Y+v6IO95Lya6LCD5pW06auY5bqm5a695bqmXG4gICAgaWYgKG5ld092ZXJmbG93Q2ZnLmFkanVzdFggfHwgbmV3T3ZlcmZsb3dDZmcuYWRqdXN0WSkge1xuICAgICAgbmV3RWxSZWdpb24gPSAoMCwgX2FkanVzdEZvclZpZXdwb3J0MltcImRlZmF1bHRcIl0pKGVsRnV0dXJlUG9zLCBlbFJlZ2lvbiwgdmlzaWJsZVJlY3QsIG5ld092ZXJmbG93Q2ZnKTtcbiAgICB9XG4gIH1cblxuICAvLyBuZWVkIGp1ZGdlIHRvIGluIGNhc2Ugc2V0IGZpeGVkIHdpdGggaW4gY3NzIG9uIGhlaWdodCBhdXRvIGVsZW1lbnRcbiAgaWYgKG5ld0VsUmVnaW9uLndpZHRoICE9PSBlbFJlZ2lvbi53aWR0aCkge1xuICAgIF91dGlsczJbXCJkZWZhdWx0XCJdLmNzcyhzb3VyY2UsICd3aWR0aCcsIF91dGlsczJbXCJkZWZhdWx0XCJdLndpZHRoKHNvdXJjZSkgKyBuZXdFbFJlZ2lvbi53aWR0aCAtIGVsUmVnaW9uLndpZHRoKTtcbiAgfVxuXG4gIGlmIChuZXdFbFJlZ2lvbi5oZWlnaHQgIT09IGVsUmVnaW9uLmhlaWdodCkge1xuICAgIF91dGlsczJbXCJkZWZhdWx0XCJdLmNzcyhzb3VyY2UsICdoZWlnaHQnLCBfdXRpbHMyW1wiZGVmYXVsdFwiXS5oZWlnaHQoc291cmNlKSArIG5ld0VsUmVnaW9uLmhlaWdodCAtIGVsUmVnaW9uLmhlaWdodCk7XG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20va2lzc3l0ZWFtL2tpc3N5L2lzc3Vlcy8xOTBcbiAgLy8g55u45a+55LqO5bGP5bmV5L2N572u5rKh5Y+Y77yM6ICMIGxlZnQvdG9wIOWPmOS6hlxuICAvLyDkvovlpoIgPGRpdiAncmVsYXRpdmUnPjxlbCBhYnNvbHV0ZT48L2Rpdj5cbiAgX3V0aWxzMltcImRlZmF1bHRcIl0ub2Zmc2V0KHNvdXJjZSwge1xuICAgIGxlZnQ6IG5ld0VsUmVnaW9uLmxlZnQsXG4gICAgdG9wOiBuZXdFbFJlZ2lvbi50b3BcbiAgfSwge1xuICAgIHVzZUNzc1JpZ2h0OiBhbGlnbi51c2VDc3NSaWdodCxcbiAgICB1c2VDc3NCb3R0b206IGFsaWduLnVzZUNzc0JvdHRvbSxcbiAgICB1c2VDc3NUcmFuc2Zvcm06IGFsaWduLnVzZUNzc1RyYW5zZm9ybVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHBvaW50czogcG9pbnRzLFxuICAgIG9mZnNldDogb2Zmc2V0LFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0LFxuICAgIG92ZXJmbG93OiBuZXdPdmVyZmxvd0NmZ1xuICB9O1xufVxuXG5kb21BbGlnbi5fX2dldE9mZnNldFBhcmVudCA9IF9nZXRPZmZzZXRQYXJlbnQyW1wiZGVmYXVsdFwiXTtcblxuZG9tQWxpZ24uX19nZXRWaXNpYmxlUmVjdEZvckVsZW1lbnQgPSBfZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50MltcImRlZmF1bHRcIl07XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZG9tQWxpZ247XG4vKipcbiAqICAyMDEyLTA0LTI2IHlpbWluZ2hlQGdtYWlsLmNvbVxuICogICAtIOS8mOWMluaZuuiDveWvuem9kOeul+azlVxuICogICAtIOaFjueUqCByZXNpemVYWFxuICpcbiAqICAyMDExLTA3LTEzIHlpbWluZ2hlQGdtYWlsLmNvbSBub3RlOlxuICogICAtIOWinuWKoOaZuuiDveWvuem9kO+8jOS7peWPiuWkp+Wwj+iwg+aVtOmAiemhuVxuICoqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWFsaWduL2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfcHJvcGVydHlVdGlscyA9IHJlcXVpcmUoJy4vcHJvcGVydHlVdGlscycpO1xuXG52YXIgUkVfTlVNID0gL1tcXC0rXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVtcXC0rXT9cXGQrfCkvLnNvdXJjZTtcblxudmFyIGdldENvbXB1dGVkU3R5bGVYID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBmb3JjZSh4LCB5KSB7XG4gIHJldHVybiB4ICsgeTtcbn1cblxuZnVuY3Rpb24gY3NzKGVsLCBuYW1lLCB2KSB7XG4gIHZhciB2YWx1ZSA9IHY7XG4gIGlmICgodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG5hbWUpKSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHZhciBpIGluIG5hbWUpIHtcbiAgICAgIGlmIChuYW1lLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgIGNzcyhlbCwgaSwgbmFtZVtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdmFsdWUgPSB2YWx1ZSArICdweCc7XG4gICAgfVxuICAgIGVsLnN0eWxlW25hbWVdID0gdmFsdWU7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZVgoZWwsIG5hbWUpO1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRQb3NpdGlvbihlbGVtKSB7XG4gIHZhciBib3ggPSB2b2lkIDA7XG4gIHZhciB4ID0gdm9pZCAwO1xuICB2YXIgeSA9IHZvaWQgMDtcbiAgdmFyIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDtcbiAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgdmFyIGRvY0VsZW0gPSBkb2MgJiYgZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgLy8g5qC55o2uIEdCUyDmnIDmlrDmlbDmja7vvIxBLUdyYWRlIEJyb3dzZXJzIOmDveW3suaUr+aMgSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qg5pa55rOV77yM5LiN55So5YaN6ICD6JmR5Lyg57uf55qE5a6e546w5pa55byPXG4gIGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgLy8g5rOo77yaalF1ZXJ5IOi/mOiAg+iZkeWHj+WOuyBkb2NFbGVtLmNsaWVudExlZnQvY2xpZW50VG9wXG4gIC8vIOS9hua1i+ivleWPkeeOsO+8jOi/meagt+WPjeiAjOS8muWvvOiHtOW9kyBodG1sIOWSjCBib2R5IOaciei+uei3nS/ovrnmoYbmoLflvI/ml7bvvIzojrflj5bnmoTlgLzkuI3mraPnoa5cbiAgLy8g5q2k5aSW77yMaWU2IOS8muW/veeVpSBodG1sIOeahCBtYXJnaW4g5YC877yM5bm46L+Q5Zyw5piv5rKh5pyJ6LCB5Lya5Y676K6+572uIGh0bWwg55qEIG1hcmdpblxuXG4gIHggPSBib3gubGVmdDtcbiAgeSA9IGJveC50b3A7XG5cbiAgLy8gSW4gSUUsIG1vc3Qgb2YgdGhlIHRpbWUsIDIgZXh0cmEgcGl4ZWxzIGFyZSBhZGRlZCB0byB0aGUgdG9wIGFuZCBsZWZ0XG4gIC8vIGR1ZSB0byB0aGUgaW1wbGljaXQgMi1waXhlbCBpbnNldCBib3JkZXIuICBJbiBJRTYvNyBxdWlya3MgbW9kZSBhbmRcbiAgLy8gSUU2IHN0YW5kYXJkcyBtb2RlLCB0aGlzIGJvcmRlciBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzZXR0aW5nIHRoZVxuICAvLyBkb2N1bWVudCBlbGVtZW50J3MgYm9yZGVyIHRvIHplcm8gLS0gdGh1cywgd2UgY2Fubm90IHJlbHkgb24gdGhlXG4gIC8vIG9mZnNldCBhbHdheXMgYmVpbmcgMiBwaXhlbHMuXG5cbiAgLy8gSW4gcXVpcmtzIG1vZGUsIHRoZSBvZmZzZXQgY2FuIGJlIGRldGVybWluZWQgYnkgcXVlcnlpbmcgdGhlIGJvZHknc1xuICAvLyBjbGllbnRMZWZ0L2NsaWVudFRvcCwgYnV0IGluIHN0YW5kYXJkcyBtb2RlLCBpdCBpcyBmb3VuZCBieSBxdWVyeWluZ1xuICAvLyB0aGUgZG9jdW1lbnQgZWxlbWVudCdzIGNsaWVudExlZnQvY2xpZW50VG9wLiAgU2luY2Ugd2UgYWxyZWFkeSBjYWxsZWRcbiAgLy8gZ2V0Q2xpZW50Qm91bmRpbmdSZWN0IHdlIGhhdmUgYWxyZWFkeSBmb3JjZWQgYSByZWZsb3csIHNvIGl0IGlzIG5vdFxuICAvLyB0b28gZXhwZW5zaXZlIGp1c3QgdG8gcXVlcnkgdGhlbSBhbGwuXG5cbiAgLy8gaWUg5LiL5bqU6K+l5YeP5Y6756qX5Y+j55qE6L655qGG5ZCn77yM5q+V56uf6buY6K6kIGFic29sdXRlIOmDveaYr+ebuOWvueeql+WPo+WumuS9jeeahFxuICAvLyDnqpflj6PovrnmoYbmoIflh4bmmK/orr4gZG9jdW1lbnRFbGVtZW50ICxxdWlya3Mg5pe26K6+572uIGJvZHlcbiAgLy8g5pyA5aW956aB5q2i5ZyoIGJvZHkg5ZKMIGh0bWwg5LiK6L655qGGIO+8jOS9hiBpZSA8IDkgaHRtbCDpu5jorqTmnIkgMnB4IO+8jOWHj+WOu1xuICAvLyDkvYbmmK/pnZ4gaWUg5LiN5Y+v6IO96K6+572u56qX5Y+j6L655qGG77yMYm9keSBodG1sIOS5n+S4jeaYr+eql+WPoyAsaWUg5Y+v5Lul6YCa6L+HIGh0bWwsYm9keSDorr7nva5cbiAgLy8g5qCH5YeGIGllIOS4iyBkb2NFbGVtLmNsaWVudFRvcCDlsLHmmK8gYm9yZGVyLXRvcFxuICAvLyBpZTcgaHRtbCDljbPnqpflj6PovrnmoYbmlLnlj5jkuI3kuobjgILmsLjov5zkuLogMlxuICAvLyDkvYbmoIflh4YgZmlyZWZveC9jaHJvbWUvaWU5IOS4iyBkb2NFbGVtLmNsaWVudFRvcCDmmK/nqpflj6PovrnmoYbvvIzljbPkvb/orr7kuoYgYm9yZGVyLXRvcCDkuZ/kuLogMFxuXG4gIHggLT0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwO1xuICB5IC09IGRvY0VsZW0uY2xpZW50VG9wIHx8IGJvZHkuY2xpZW50VG9wIHx8IDA7XG5cbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiB4LFxuICAgIHRvcDogeVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRTY3JvbGwodywgdG9wKSB7XG4gIHZhciByZXQgPSB3WydwYWdlJyArICh0b3AgPyAnWScgOiAnWCcpICsgJ09mZnNldCddO1xuICB2YXIgbWV0aG9kID0gJ3Njcm9sbCcgKyAodG9wID8gJ1RvcCcgOiAnTGVmdCcpO1xuICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcbiAgICB2YXIgZCA9IHcuZG9jdW1lbnQ7XG4gICAgLy8gaWU2LDcsOCBzdGFuZGFyZCBtb2RlXG4gICAgcmV0ID0gZC5kb2N1bWVudEVsZW1lbnRbbWV0aG9kXTtcbiAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcbiAgICAgIC8vIHF1aXJrcyBtb2RlXG4gICAgICByZXQgPSBkLmJvZHlbbWV0aG9kXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsTGVmdCh3KSB7XG4gIHJldHVybiBnZXRTY3JvbGwodyk7XG59XG5cbmZ1bmN0aW9uIGdldFNjcm9sbFRvcCh3KSB7XG4gIHJldHVybiBnZXRTY3JvbGwodywgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGdldE9mZnNldChlbCkge1xuICB2YXIgcG9zID0gZ2V0Q2xpZW50UG9zaXRpb24oZWwpO1xuICB2YXIgZG9jID0gZWwub3duZXJEb2N1bWVudDtcbiAgdmFyIHcgPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgcG9zLmxlZnQgKz0gZ2V0U2Nyb2xsTGVmdCh3KTtcbiAgcG9zLnRvcCArPSBnZXRTY3JvbGxUb3Aodyk7XG4gIHJldHVybiBwb3M7XG59XG5mdW5jdGlvbiBfZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBuYW1lLCBjcykge1xuICB2YXIgY29tcHV0ZWRTdHlsZSA9IGNzO1xuICB2YXIgdmFsID0gJyc7XG4gIHZhciBkID0gZWxlbS5vd25lckRvY3VtZW50O1xuICBjb21wdXRlZFN0eWxlID0gY29tcHV0ZWRTdHlsZSB8fCBkLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCk7XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2tpc3N5dGVhbS9raXNzeS9pc3N1ZXMvNjFcbiAgaWYgKGNvbXB1dGVkU3R5bGUpIHtcbiAgICB2YWwgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgfHwgY29tcHV0ZWRTdHlsZVtuYW1lXTtcbiAgfVxuXG4gIHJldHVybiB2YWw7XG59XG5cbnZhciBfUkVfTlVNX05PX1BYID0gbmV3IFJlZ0V4cCgnXignICsgUkVfTlVNICsgJykoPyFweClbYS16JV0rJCcsICdpJyk7XG52YXIgUkVfUE9TID0gL14odG9wfHJpZ2h0fGJvdHRvbXxsZWZ0KSQvO1xudmFyIENVUlJFTlRfU1RZTEUgPSAnY3VycmVudFN0eWxlJztcbnZhciBSVU5USU1FX1NUWUxFID0gJ3J1bnRpbWVTdHlsZSc7XG52YXIgTEVGVCA9ICdsZWZ0JztcbnZhciBQWCA9ICdweCc7XG5cbmZ1bmN0aW9uIF9nZXRDb21wdXRlZFN0eWxlSUUoZWxlbSwgbmFtZSkge1xuICAvLyBjdXJyZW50U3R5bGUgbWF5YmUgbnVsbFxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzUyMzEuYXNweFxuICB2YXIgcmV0ID0gZWxlbVtDVVJSRU5UX1NUWUxFXSAmJiBlbGVtW0NVUlJFTlRfU1RZTEVdW25hbWVdO1xuXG4gIC8vIOW9kyB3aWR0aC9oZWlnaHQg6K6+572u5Li655m+5YiG5q+U5pe277yM6YCa6L+HIHBpeGVsTGVmdCDmlrnlvI/ovazmjaLnmoQgd2lkdGgvaGVpZ2h0IOWAvFxuICAvLyDkuIDlvIDlp4vlsLHlpITnkIbkuoYhIENVU1RPTV9TVFlMRS5oZWlnaHQsQ1VTVE9NX1NUWUxFLndpZHRoICxjc3NIb29rIOino+WGs0AyMDExLTA4LTE5XG4gIC8vIOWcqCBpZSDkuIvkuI3lr7nvvIzpnIDopoHnm7TmjqXnlKggb2Zmc2V0IOaWueW8j1xuICAvLyBib3JkZXJXaWR0aCDnrYnlgLzkuZ/mnInpl67popjvvIzkvYbogIPomZHliLAgYm9yZGVyV2lkdGgg6K6+5Li655m+5YiG5q+U55qE5qaC546H5b6I5bCP77yM6L+Z6YeM5bCx5LiN6ICD6JmR5LqGXG5cbiAgLy8gRnJvbSB0aGUgYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkc1xuICAvLyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQtMTAyMjkxXG4gIC8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlclxuICAvLyBidXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWlyZCBlbmRpbmcsIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHNcbiAgLy8gZXhjbHVkZSBsZWZ0IHJpZ2h0IGZvciByZWxhdGl2aXR5XG4gIGlmIChfUkVfTlVNX05PX1BYLnRlc3QocmV0KSAmJiAhUkVfUE9TLnRlc3QobmFtZSkpIHtcbiAgICAvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG4gICAgdmFyIHN0eWxlID0gZWxlbS5zdHlsZTtcbiAgICB2YXIgbGVmdCA9IHN0eWxlW0xFRlRdO1xuICAgIHZhciByc0xlZnQgPSBlbGVtW1JVTlRJTUVfU1RZTEVdW0xFRlRdO1xuXG4gICAgLy8gcHJldmVudCBmbGFzaGluZyBvZiBjb250ZW50XG4gICAgZWxlbVtSVU5USU1FX1NUWUxFXVtMRUZUXSA9IGVsZW1bQ1VSUkVOVF9TVFlMRV1bTEVGVF07XG5cbiAgICAvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG4gICAgc3R5bGVbTEVGVF0gPSBuYW1lID09PSAnZm9udFNpemUnID8gJzFlbScgOiByZXQgfHwgMDtcbiAgICByZXQgPSBzdHlsZS5waXhlbExlZnQgKyBQWDtcblxuICAgIC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcbiAgICBzdHlsZVtMRUZUXSA9IGxlZnQ7XG5cbiAgICBlbGVtW1JVTlRJTUVfU1RZTEVdW0xFRlRdID0gcnNMZWZ0O1xuICB9XG4gIHJldHVybiByZXQgPT09ICcnID8gJ2F1dG8nIDogcmV0O1xufVxuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgZ2V0Q29tcHV0ZWRTdHlsZVggPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSA/IF9nZXRDb21wdXRlZFN0eWxlIDogX2dldENvbXB1dGVkU3R5bGVJRTtcbn1cblxuZnVuY3Rpb24gZ2V0T2Zmc2V0RGlyZWN0aW9uKGRpciwgb3B0aW9uKSB7XG4gIGlmIChkaXIgPT09ICdsZWZ0Jykge1xuICAgIHJldHVybiBvcHRpb24udXNlQ3NzUmlnaHQgPyAncmlnaHQnIDogZGlyO1xuICB9XG4gIHJldHVybiBvcHRpb24udXNlQ3NzQm90dG9tID8gJ2JvdHRvbScgOiBkaXI7XG59XG5cbmZ1bmN0aW9uIG9wcG9zaXRlT2Zmc2V0RGlyZWN0aW9uKGRpcikge1xuICBpZiAoZGlyID09PSAnbGVmdCcpIHtcbiAgICByZXR1cm4gJ3JpZ2h0JztcbiAgfSBlbHNlIGlmIChkaXIgPT09ICdyaWdodCcpIHtcbiAgICByZXR1cm4gJ2xlZnQnO1xuICB9IGVsc2UgaWYgKGRpciA9PT0gJ3RvcCcpIHtcbiAgICByZXR1cm4gJ2JvdHRvbSc7XG4gIH0gZWxzZSBpZiAoZGlyID09PSAnYm90dG9tJykge1xuICAgIHJldHVybiAndG9wJztcbiAgfVxufVxuXG4vLyDorr7nva4gZWxlbSDnm7jlr7kgZWxlbS5vd25lckRvY3VtZW50IOeahOWdkOagh1xuZnVuY3Rpb24gc2V0TGVmdFRvcChlbGVtLCBvZmZzZXQsIG9wdGlvbikge1xuICAvLyBzZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG4gIGlmIChjc3MoZWxlbSwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgZWxlbS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gIH1cbiAgdmFyIHByZXNldEggPSAtOTk5O1xuICB2YXIgcHJlc2V0ViA9IC05OTk7XG4gIHZhciBob3Jpem9udGFsUHJvcGVydHkgPSBnZXRPZmZzZXREaXJlY3Rpb24oJ2xlZnQnLCBvcHRpb24pO1xuICB2YXIgdmVydGljYWxQcm9wZXJ0eSA9IGdldE9mZnNldERpcmVjdGlvbigndG9wJywgb3B0aW9uKTtcbiAgdmFyIG9wcG9zaXRlSG9yaXpvbnRhbFByb3BlcnR5ID0gb3Bwb3NpdGVPZmZzZXREaXJlY3Rpb24oaG9yaXpvbnRhbFByb3BlcnR5KTtcbiAgdmFyIG9wcG9zaXRlVmVydGljYWxQcm9wZXJ0eSA9IG9wcG9zaXRlT2Zmc2V0RGlyZWN0aW9uKHZlcnRpY2FsUHJvcGVydHkpO1xuXG4gIGlmIChob3Jpem9udGFsUHJvcGVydHkgIT09ICdsZWZ0Jykge1xuICAgIHByZXNldEggPSA5OTk7XG4gIH1cblxuICBpZiAodmVydGljYWxQcm9wZXJ0eSAhPT0gJ3RvcCcpIHtcbiAgICBwcmVzZXRWID0gOTk5O1xuICB9XG4gIHZhciBvcmlnaW5hbFRyYW5zaXRpb24gPSAnJztcbiAgdmFyIG9yaWdpbmFsT2Zmc2V0ID0gZ2V0T2Zmc2V0KGVsZW0pO1xuICBpZiAoJ2xlZnQnIGluIG9mZnNldCB8fCAndG9wJyBpbiBvZmZzZXQpIHtcbiAgICBvcmlnaW5hbFRyYW5zaXRpb24gPSAoMCwgX3Byb3BlcnR5VXRpbHMuZ2V0VHJhbnNpdGlvblByb3BlcnR5KShlbGVtKSB8fCAnJztcbiAgICAoMCwgX3Byb3BlcnR5VXRpbHMuc2V0VHJhbnNpdGlvblByb3BlcnR5KShlbGVtLCAnbm9uZScpO1xuICB9XG4gIGlmICgnbGVmdCcgaW4gb2Zmc2V0KSB7XG4gICAgZWxlbS5zdHlsZVtvcHBvc2l0ZUhvcml6b250YWxQcm9wZXJ0eV0gPSAnJztcbiAgICBlbGVtLnN0eWxlW2hvcml6b250YWxQcm9wZXJ0eV0gPSBwcmVzZXRIICsgJ3B4JztcbiAgfVxuICBpZiAoJ3RvcCcgaW4gb2Zmc2V0KSB7XG4gICAgZWxlbS5zdHlsZVtvcHBvc2l0ZVZlcnRpY2FsUHJvcGVydHldID0gJyc7XG4gICAgZWxlbS5zdHlsZVt2ZXJ0aWNhbFByb3BlcnR5XSA9IHByZXNldFYgKyAncHgnO1xuICB9XG4gIHZhciBvbGQgPSBnZXRPZmZzZXQoZWxlbSk7XG4gIHZhciBvcmlnaW5hbFN0eWxlID0ge307XG4gIGZvciAodmFyIGtleSBpbiBvZmZzZXQpIHtcbiAgICBpZiAob2Zmc2V0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHZhciBkaXIgPSBnZXRPZmZzZXREaXJlY3Rpb24oa2V5LCBvcHRpb24pO1xuICAgICAgdmFyIHByZXNldCA9IGtleSA9PT0gJ2xlZnQnID8gcHJlc2V0SCA6IHByZXNldFY7XG4gICAgICB2YXIgb2ZmID0gb3JpZ2luYWxPZmZzZXRba2V5XSAtIG9sZFtrZXldO1xuICAgICAgaWYgKGRpciA9PT0ga2V5KSB7XG4gICAgICAgIG9yaWdpbmFsU3R5bGVbZGlyXSA9IHByZXNldCArIG9mZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9yaWdpbmFsU3R5bGVbZGlyXSA9IHByZXNldCAtIG9mZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY3NzKGVsZW0sIG9yaWdpbmFsU3R5bGUpO1xuICAvLyBmb3JjZSByZWxheW91dFxuICBmb3JjZShlbGVtLm9mZnNldFRvcCwgZWxlbS5vZmZzZXRMZWZ0KTtcbiAgaWYgKCdsZWZ0JyBpbiBvZmZzZXQgfHwgJ3RvcCcgaW4gb2Zmc2V0KSB7XG4gICAgKDAsIF9wcm9wZXJ0eVV0aWxzLnNldFRyYW5zaXRpb25Qcm9wZXJ0eSkoZWxlbSwgb3JpZ2luYWxUcmFuc2l0aW9uKTtcbiAgfVxuICB2YXIgcmV0ID0ge307XG4gIGZvciAodmFyIF9rZXkgaW4gb2Zmc2V0KSB7XG4gICAgaWYgKG9mZnNldC5oYXNPd25Qcm9wZXJ0eShfa2V5KSkge1xuICAgICAgdmFyIF9kaXIgPSBnZXRPZmZzZXREaXJlY3Rpb24oX2tleSwgb3B0aW9uKTtcbiAgICAgIHZhciBfb2ZmID0gb2Zmc2V0W19rZXldIC0gb3JpZ2luYWxPZmZzZXRbX2tleV07XG4gICAgICBpZiAoX2tleSA9PT0gX2Rpcikge1xuICAgICAgICByZXRbX2Rpcl0gPSBvcmlnaW5hbFN0eWxlW19kaXJdICsgX29mZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldFtfZGlyXSA9IG9yaWdpbmFsU3R5bGVbX2Rpcl0gLSBfb2ZmO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjc3MoZWxlbSwgcmV0KTtcbn1cblxuZnVuY3Rpb24gc2V0VHJhbnNmb3JtKGVsZW0sIG9mZnNldCkge1xuICB2YXIgb3JpZ2luYWxPZmZzZXQgPSBnZXRPZmZzZXQoZWxlbSk7XG4gIHZhciBvcmlnaW5hbFhZID0gKDAsIF9wcm9wZXJ0eVV0aWxzLmdldFRyYW5zZm9ybVhZKShlbGVtKTtcbiAgdmFyIHJlc3VsdFhZID0geyB4OiBvcmlnaW5hbFhZLngsIHk6IG9yaWdpbmFsWFkueSB9O1xuICBpZiAoJ2xlZnQnIGluIG9mZnNldCkge1xuICAgIHJlc3VsdFhZLnggPSBvcmlnaW5hbFhZLnggKyBvZmZzZXQubGVmdCAtIG9yaWdpbmFsT2Zmc2V0LmxlZnQ7XG4gIH1cbiAgaWYgKCd0b3AnIGluIG9mZnNldCkge1xuICAgIHJlc3VsdFhZLnkgPSBvcmlnaW5hbFhZLnkgKyBvZmZzZXQudG9wIC0gb3JpZ2luYWxPZmZzZXQudG9wO1xuICB9XG4gICgwLCBfcHJvcGVydHlVdGlscy5zZXRUcmFuc2Zvcm1YWSkoZWxlbSwgcmVzdWx0WFkpO1xufVxuXG5mdW5jdGlvbiBzZXRPZmZzZXQoZWxlbSwgb2Zmc2V0LCBvcHRpb24pIHtcbiAgaWYgKG9wdGlvbi51c2VDc3NSaWdodCB8fCBvcHRpb24udXNlQ3NzQm90dG9tKSB7XG4gICAgc2V0TGVmdFRvcChlbGVtLCBvZmZzZXQsIG9wdGlvbik7XG4gIH0gZWxzZSBpZiAob3B0aW9uLnVzZUNzc1RyYW5zZm9ybSAmJiAoMCwgX3Byb3BlcnR5VXRpbHMuZ2V0VHJhbnNmb3JtTmFtZSkoKSBpbiBkb2N1bWVudC5ib2R5LnN0eWxlKSB7XG4gICAgc2V0VHJhbnNmb3JtKGVsZW0sIG9mZnNldCwgb3B0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRMZWZ0VG9wKGVsZW0sIG9mZnNldCwgb3B0aW9uKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlYWNoKGFyciwgZm4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBmbihhcnJbaV0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQm9yZGVyQm94Rm4oZWxlbSkge1xuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZVgoZWxlbSwgJ2JveFNpemluZycpID09PSAnYm9yZGVyLWJveCc7XG59XG5cbnZhciBCT1hfTU9ERUxTID0gWydtYXJnaW4nLCAnYm9yZGVyJywgJ3BhZGRpbmcnXTtcbnZhciBDT05URU5UX0lOREVYID0gLTE7XG52YXIgUEFERElOR19JTkRFWCA9IDI7XG52YXIgQk9SREVSX0lOREVYID0gMTtcbnZhciBNQVJHSU5fSU5ERVggPSAwO1xuXG5mdW5jdGlvbiBzd2FwKGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBvbGQgPSB7fTtcbiAgdmFyIHN0eWxlID0gZWxlbS5zdHlsZTtcbiAgdmFyIG5hbWUgPSB2b2lkIDA7XG5cbiAgLy8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzXG4gIGZvciAobmFtZSBpbiBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIG9sZFtuYW1lXSA9IHN0eWxlW25hbWVdO1xuICAgICAgc3R5bGVbbmFtZV0gPSBvcHRpb25zW25hbWVdO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrLmNhbGwoZWxlbSk7XG5cbiAgLy8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG4gIGZvciAobmFtZSBpbiBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIHN0eWxlW25hbWVdID0gb2xkW25hbWVdO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQQk1XaWR0aChlbGVtLCBwcm9wcywgd2hpY2gpIHtcbiAgdmFyIHZhbHVlID0gMDtcbiAgdmFyIHByb3AgPSB2b2lkIDA7XG4gIHZhciBqID0gdm9pZCAwO1xuICB2YXIgaSA9IHZvaWQgMDtcbiAgZm9yIChqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgcHJvcCA9IHByb3BzW2pdO1xuICAgIGlmIChwcm9wKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgd2hpY2gubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNzc1Byb3AgPSB2b2lkIDA7XG4gICAgICAgIGlmIChwcm9wID09PSAnYm9yZGVyJykge1xuICAgICAgICAgIGNzc1Byb3AgPSAnJyArIHByb3AgKyB3aGljaFtpXSArICdXaWR0aCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3NzUHJvcCA9IHByb3AgKyB3aGljaFtpXTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSArPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGVYKGVsZW0sIGNzc1Byb3ApKSB8fCAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogQSBjcnVkZSB3YXkgb2YgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGlzIGEgd2luZG93XG4gKiBAbWVtYmVyIHV0aWxcbiAqL1xuZnVuY3Rpb24gaXNXaW5kb3cob2JqKSB7XG4gIC8vIG11c3QgdXNlID09IGZvciBpZThcbiAgLyogZXNsaW50IGVxZXFlcTowICovXG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqID09IG9iai53aW5kb3c7XG59XG5cbnZhciBkb21VdGlscyA9IHt9O1xuXG5lYWNoKFsnV2lkdGgnLCAnSGVpZ2h0J10sIGZ1bmN0aW9uIChuYW1lKSB7XG4gIGRvbVV0aWxzWydkb2MnICsgbmFtZV0gPSBmdW5jdGlvbiAocmVmV2luKSB7XG4gICAgdmFyIGQgPSByZWZXaW4uZG9jdW1lbnQ7XG4gICAgcmV0dXJuIE1hdGgubWF4KFxuICAgIC8vIGZpcmVmb3ggY2hyb21lIGRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ8IGJvZHkuc2Nyb2xsSGVpZ2h0XG4gICAgLy8gaWUgc3RhbmRhcmQgbW9kZSA6IGRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ+IGJvZHkuc2Nyb2xsSGVpZ2h0XG4gICAgZC5kb2N1bWVudEVsZW1lbnRbJ3Njcm9sbCcgKyBuYW1lXSxcbiAgICAvLyBxdWlya3MgOiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IOacgOWkp+etieS6juWPr+inhueql+WPo+WkmuS4gOeCue+8n1xuICAgIGQuYm9keVsnc2Nyb2xsJyArIG5hbWVdLCBkb21VdGlsc1sndmlld3BvcnQnICsgbmFtZV0oZCkpO1xuICB9O1xuXG4gIGRvbVV0aWxzWyd2aWV3cG9ydCcgKyBuYW1lXSA9IGZ1bmN0aW9uICh3aW4pIHtcbiAgICAvLyBwYyBicm93c2VyIGluY2x1ZGVzIHNjcm9sbGJhciBpbiB3aW5kb3cuaW5uZXJXaWR0aFxuICAgIHZhciBwcm9wID0gJ2NsaWVudCcgKyBuYW1lO1xuICAgIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQ7XG4gICAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgZG9jdW1lbnRFbGVtZW50UHJvcCA9IGRvY3VtZW50RWxlbWVudFtwcm9wXTtcbiAgICAvLyDmoIflh4bmqKHlvI/lj5YgZG9jdW1lbnRFbGVtZW50XG4gICAgLy8gYmFja2NvbXBhdCDlj5YgYm9keVxuICAgIHJldHVybiBkb2MuY29tcGF0TW9kZSA9PT0gJ0NTUzFDb21wYXQnICYmIGRvY3VtZW50RWxlbWVudFByb3AgfHwgYm9keSAmJiBib2R5W3Byb3BdIHx8IGRvY3VtZW50RWxlbWVudFByb3A7XG4gIH07XG59KTtcblxuLypcbiDlvpfliLDlhYPntKDnmoTlpKflsI/kv6Hmga9cbiBAcGFyYW0gZWxlbVxuIEBwYXJhbSBuYW1lXG4gQHBhcmFtIHtTdHJpbmd9IFtleHRyYV0gICdwYWRkaW5nJyA6IChjc3Mgd2lkdGgpICsgcGFkZGluZ1xuICdib3JkZXInIDogKGNzcyB3aWR0aCkgKyBwYWRkaW5nICsgYm9yZGVyXG4gJ21hcmdpbicgOiAoY3NzIHdpZHRoKSArIHBhZGRpbmcgKyBib3JkZXIgKyBtYXJnaW5cbiAqL1xuZnVuY3Rpb24gZ2V0V0goZWxlbSwgbmFtZSwgZXgpIHtcbiAgdmFyIGV4dHJhID0gZXg7XG4gIGlmIChpc1dpbmRvdyhlbGVtKSkge1xuICAgIHJldHVybiBuYW1lID09PSAnd2lkdGgnID8gZG9tVXRpbHMudmlld3BvcnRXaWR0aChlbGVtKSA6IGRvbVV0aWxzLnZpZXdwb3J0SGVpZ2h0KGVsZW0pO1xuICB9IGVsc2UgaWYgKGVsZW0ubm9kZVR5cGUgPT09IDkpIHtcbiAgICByZXR1cm4gbmFtZSA9PT0gJ3dpZHRoJyA/IGRvbVV0aWxzLmRvY1dpZHRoKGVsZW0pIDogZG9tVXRpbHMuZG9jSGVpZ2h0KGVsZW0pO1xuICB9XG4gIHZhciB3aGljaCA9IG5hbWUgPT09ICd3aWR0aCcgPyBbJ0xlZnQnLCAnUmlnaHQnXSA6IFsnVG9wJywgJ0JvdHRvbSddO1xuICB2YXIgYm9yZGVyQm94VmFsdWUgPSBuYW1lID09PSAnd2lkdGgnID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0O1xuICB2YXIgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGVYKGVsZW0pO1xuICB2YXIgaXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveEZuKGVsZW0sIGNvbXB1dGVkU3R5bGUpO1xuICB2YXIgY3NzQm94VmFsdWUgPSAwO1xuICBpZiAoYm9yZGVyQm94VmFsdWUgPT09IG51bGwgfHwgYm9yZGVyQm94VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBib3JkZXJCb3hWYWx1ZSA8PSAwKSB7XG4gICAgYm9yZGVyQm94VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgLy8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW4gY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2FyeVxuICAgIGNzc0JveFZhbHVlID0gZ2V0Q29tcHV0ZWRTdHlsZVgoZWxlbSwgbmFtZSk7XG4gICAgaWYgKGNzc0JveFZhbHVlID09PSBudWxsIHx8IGNzc0JveFZhbHVlID09PSB1bmRlZmluZWQgfHwgTnVtYmVyKGNzc0JveFZhbHVlKSA8IDApIHtcbiAgICAgIGNzc0JveFZhbHVlID0gZWxlbS5zdHlsZVtuYW1lXSB8fCAwO1xuICAgIH1cbiAgICAvLyBOb3JtYWxpemUgJycsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYVxuICAgIGNzc0JveFZhbHVlID0gcGFyc2VGbG9hdChjc3NCb3hWYWx1ZSkgfHwgMDtcbiAgfVxuICBpZiAoZXh0cmEgPT09IHVuZGVmaW5lZCkge1xuICAgIGV4dHJhID0gaXNCb3JkZXJCb3ggPyBCT1JERVJfSU5ERVggOiBDT05URU5UX0lOREVYO1xuICB9XG4gIHZhciBib3JkZXJCb3hWYWx1ZU9ySXNCb3JkZXJCb3ggPSBib3JkZXJCb3hWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGlzQm9yZGVyQm94O1xuICB2YXIgdmFsID0gYm9yZGVyQm94VmFsdWUgfHwgY3NzQm94VmFsdWU7XG4gIGlmIChleHRyYSA9PT0gQ09OVEVOVF9JTkRFWCkge1xuICAgIGlmIChib3JkZXJCb3hWYWx1ZU9ySXNCb3JkZXJCb3gpIHtcbiAgICAgIHJldHVybiB2YWwgLSBnZXRQQk1XaWR0aChlbGVtLCBbJ2JvcmRlcicsICdwYWRkaW5nJ10sIHdoaWNoLCBjb21wdXRlZFN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNzc0JveFZhbHVlO1xuICB9IGVsc2UgaWYgKGJvcmRlckJveFZhbHVlT3JJc0JvcmRlckJveCkge1xuICAgIGlmIChleHRyYSA9PT0gQk9SREVSX0lOREVYKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gdmFsICsgKGV4dHJhID09PSBQQURESU5HX0lOREVYID8gLWdldFBCTVdpZHRoKGVsZW0sIFsnYm9yZGVyJ10sIHdoaWNoLCBjb21wdXRlZFN0eWxlKSA6IGdldFBCTVdpZHRoKGVsZW0sIFsnbWFyZ2luJ10sIHdoaWNoLCBjb21wdXRlZFN0eWxlKSk7XG4gIH1cbiAgcmV0dXJuIGNzc0JveFZhbHVlICsgZ2V0UEJNV2lkdGgoZWxlbSwgQk9YX01PREVMUy5zbGljZShleHRyYSksIHdoaWNoLCBjb21wdXRlZFN0eWxlKTtcbn1cblxudmFyIGNzc1Nob3cgPSB7XG4gIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgZGlzcGxheTogJ2Jsb2NrJ1xufTtcblxuLy8gZml4ICMxMTkgOiBodHRwczovL2dpdGh1Yi5jb20va2lzc3l0ZWFtL2tpc3N5L2lzc3Vlcy8xMTlcbmZ1bmN0aW9uIGdldFdISWdub3JlRGlzcGxheSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW47IF9rZXkyKyspIHtcbiAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICB2YXIgdmFsID0gdm9pZCAwO1xuICB2YXIgZWxlbSA9IGFyZ3NbMF07XG4gIC8vIGluIGNhc2UgZWxlbSBpcyB3aW5kb3dcbiAgLy8gZWxlbS5vZmZzZXRXaWR0aCA9PT0gdW5kZWZpbmVkXG4gIGlmIChlbGVtLm9mZnNldFdpZHRoICE9PSAwKSB7XG4gICAgdmFsID0gZ2V0V0guYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICBzd2FwKGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhbCA9IGdldFdILmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn1cblxuZWFjaChbJ3dpZHRoJywgJ2hlaWdodCddLCBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIgZmlyc3QgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcbiAgZG9tVXRpbHNbJ291dGVyJyArIGZpcnN0XSA9IGZ1bmN0aW9uIChlbCwgaW5jbHVkZU1hcmdpbikge1xuICAgIHJldHVybiBlbCAmJiBnZXRXSElnbm9yZURpc3BsYXkoZWwsIG5hbWUsIGluY2x1ZGVNYXJnaW4gPyBNQVJHSU5fSU5ERVggOiBCT1JERVJfSU5ERVgpO1xuICB9O1xuICB2YXIgd2hpY2ggPSBuYW1lID09PSAnd2lkdGgnID8gWydMZWZ0JywgJ1JpZ2h0J10gOiBbJ1RvcCcsICdCb3R0b20nXTtcblxuICBkb21VdGlsc1tuYW1lXSA9IGZ1bmN0aW9uIChlbGVtLCB2KSB7XG4gICAgdmFyIHZhbCA9IHY7XG4gICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZWxlbSkge1xuICAgICAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGVYKGVsZW0pO1xuICAgICAgICB2YXIgaXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveEZuKGVsZW0pO1xuICAgICAgICBpZiAoaXNCb3JkZXJCb3gpIHtcbiAgICAgICAgICB2YWwgKz0gZ2V0UEJNV2lkdGgoZWxlbSwgWydwYWRkaW5nJywgJ2JvcmRlciddLCB3aGljaCwgY29tcHV0ZWRTdHlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNzcyhlbGVtLCBuYW1lLCB2YWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW0gJiYgZ2V0V0hJZ25vcmVEaXNwbGF5KGVsZW0sIG5hbWUsIENPTlRFTlRfSU5ERVgpO1xuICB9O1xufSk7XG5cbmZ1bmN0aW9uIG1peCh0bywgZnJvbSkge1xuICBmb3IgKHZhciBpIGluIGZyb20pIHtcbiAgICBpZiAoZnJvbS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgdG9baV0gPSBmcm9tW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG87XG59XG5cbnZhciB1dGlscyA9IHtcbiAgZ2V0V2luZG93OiBmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICAgIGlmIChub2RlICYmIG5vZGUuZG9jdW1lbnQgJiYgbm9kZS5zZXRUaW1lb3V0KSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudCB8fCBub2RlO1xuICAgIHJldHVybiBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgfSxcbiAgb2Zmc2V0OiBmdW5jdGlvbiBvZmZzZXQoZWwsIHZhbHVlLCBvcHRpb24pIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgc2V0T2Zmc2V0KGVsLCB2YWx1ZSwgb3B0aW9uIHx8IHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldE9mZnNldChlbCk7XG4gICAgfVxuICB9LFxuXG4gIGlzV2luZG93OiBpc1dpbmRvdyxcbiAgZWFjaDogZWFjaCxcbiAgY3NzOiBjc3MsXG4gIGNsb25lOiBmdW5jdGlvbiBjbG9uZShvYmopIHtcbiAgICB2YXIgaSA9IHZvaWQgMDtcbiAgICB2YXIgcmV0ID0ge307XG4gICAgZm9yIChpIGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICByZXRbaV0gPSBvYmpbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBvdmVyZmxvdyA9IG9iai5vdmVyZmxvdztcbiAgICBpZiAob3ZlcmZsb3cpIHtcbiAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgIHJldC5vdmVyZmxvd1tpXSA9IG9iai5vdmVyZmxvd1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIG1peDogbWl4LFxuICBnZXRXaW5kb3dTY3JvbGxMZWZ0OiBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxMZWZ0KHcpIHtcbiAgICByZXR1cm4gZ2V0U2Nyb2xsTGVmdCh3KTtcbiAgfSxcbiAgZ2V0V2luZG93U2Nyb2xsVG9wOiBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxUb3Aodykge1xuICAgIHJldHVybiBnZXRTY3JvbGxUb3Aodyk7XG4gIH0sXG4gIG1lcmdlOiBmdW5jdGlvbiBtZXJnZSgpIHtcbiAgICB2YXIgcmV0ID0ge307XG5cbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMjsgX2tleTMrKykge1xuICAgICAgYXJnc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgdXRpbHMubWl4KHJldCwgYXJnc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgdmlld3BvcnRXaWR0aDogMCxcbiAgdmlld3BvcnRIZWlnaHQ6IDBcbn07XG5cbm1peCh1dGlscywgZG9tVXRpbHMpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHV0aWxzO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2RvbS1hbGlnbi9saWIvdXRpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDY0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0VHJhbnNmb3JtTmFtZSA9IGdldFRyYW5zZm9ybU5hbWU7XG5leHBvcnRzLnNldFRyYW5zaXRpb25Qcm9wZXJ0eSA9IHNldFRyYW5zaXRpb25Qcm9wZXJ0eTtcbmV4cG9ydHMuZ2V0VHJhbnNpdGlvblByb3BlcnR5ID0gZ2V0VHJhbnNpdGlvblByb3BlcnR5O1xuZXhwb3J0cy5nZXRUcmFuc2Zvcm1YWSA9IGdldFRyYW5zZm9ybVhZO1xuZXhwb3J0cy5zZXRUcmFuc2Zvcm1YWSA9IHNldFRyYW5zZm9ybVhZO1xudmFyIHZlbmRvclByZWZpeCA9IHZvaWQgMDtcblxudmFyIGpzQ3NzTWFwID0ge1xuICBXZWJraXQ6ICctd2Via2l0LScsXG4gIE1vejogJy1tb3otJyxcbiAgLy8gSUUgZGlkIGl0IHdyb25nIGFnYWluIC4uLlxuICBtczogJy1tcy0nLFxuICBPOiAnLW8tJ1xufTtcblxuZnVuY3Rpb24gZ2V0VmVuZG9yUHJlZml4KCkge1xuICBpZiAodmVuZG9yUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdmVuZG9yUHJlZml4O1xuICB9XG4gIHZlbmRvclByZWZpeCA9ICcnO1xuICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJykuc3R5bGU7XG4gIHZhciB0ZXN0UHJvcCA9ICdUcmFuc2Zvcm0nO1xuICBmb3IgKHZhciBrZXkgaW4ganNDc3NNYXApIHtcbiAgICBpZiAoa2V5ICsgdGVzdFByb3AgaW4gc3R5bGUpIHtcbiAgICAgIHZlbmRvclByZWZpeCA9IGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZlbmRvclByZWZpeDtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbk5hbWUoKSB7XG4gIHJldHVybiBnZXRWZW5kb3JQcmVmaXgoKSA/IGdldFZlbmRvclByZWZpeCgpICsgJ1RyYW5zaXRpb25Qcm9wZXJ0eScgOiAndHJhbnNpdGlvblByb3BlcnR5Jztcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNmb3JtTmFtZSgpIHtcbiAgcmV0dXJuIGdldFZlbmRvclByZWZpeCgpID8gZ2V0VmVuZG9yUHJlZml4KCkgKyAnVHJhbnNmb3JtJyA6ICd0cmFuc2Zvcm0nO1xufVxuXG5mdW5jdGlvbiBzZXRUcmFuc2l0aW9uUHJvcGVydHkobm9kZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWUgPSBnZXRUcmFuc2l0aW9uTmFtZSgpO1xuICBpZiAobmFtZSkge1xuICAgIG5vZGUuc3R5bGVbbmFtZV0gPSB2YWx1ZTtcbiAgICBpZiAobmFtZSAhPT0gJ3RyYW5zaXRpb25Qcm9wZXJ0eScpIHtcbiAgICAgIG5vZGUuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5ID0gdmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldFRyYW5zZm9ybShub2RlLCB2YWx1ZSkge1xuICB2YXIgbmFtZSA9IGdldFRyYW5zZm9ybU5hbWUoKTtcbiAgaWYgKG5hbWUpIHtcbiAgICBub2RlLnN0eWxlW25hbWVdID0gdmFsdWU7XG4gICAgaWYgKG5hbWUgIT09ICd0cmFuc2Zvcm0nKSB7XG4gICAgICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IHZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uUHJvcGVydHkobm9kZSkge1xuICByZXR1cm4gbm9kZS5zdHlsZS50cmFuc2l0aW9uUHJvcGVydHkgfHwgbm9kZS5zdHlsZVtnZXRUcmFuc2l0aW9uTmFtZSgpXTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNmb3JtWFkobm9kZSkge1xuICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKTtcbiAgdmFyIHRyYW5zZm9ybSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3RyYW5zZm9ybScpIHx8IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoZ2V0VHJhbnNmb3JtTmFtZSgpKTtcbiAgaWYgKHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0gIT09ICdub25lJykge1xuICAgIHZhciBtYXRyaXggPSB0cmFuc2Zvcm0ucmVwbGFjZSgvW14wLTlcXC0uLF0vZywgJycpLnNwbGl0KCcsJyk7XG4gICAgcmV0dXJuIHsgeDogcGFyc2VGbG9hdChtYXRyaXhbMTJdIHx8IG1hdHJpeFs0XSwgMCksIHk6IHBhcnNlRmxvYXQobWF0cml4WzEzXSB8fCBtYXRyaXhbNV0sIDApIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcbn1cblxudmFyIG1hdHJpeDJkID0gL21hdHJpeFxcKCguKilcXCkvO1xudmFyIG1hdHJpeDNkID0gL21hdHJpeDNkXFwoKC4qKVxcKS87XG5cbmZ1bmN0aW9uIHNldFRyYW5zZm9ybVhZKG5vZGUsIHh5KSB7XG4gIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpO1xuICB2YXIgdHJhbnNmb3JtID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndHJhbnNmb3JtJykgfHwgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShnZXRUcmFuc2Zvcm1OYW1lKCkpO1xuICBpZiAodHJhbnNmb3JtICYmIHRyYW5zZm9ybSAhPT0gJ25vbmUnKSB7XG4gICAgdmFyIGFyciA9IHZvaWQgMDtcbiAgICB2YXIgbWF0Y2gyZCA9IHRyYW5zZm9ybS5tYXRjaChtYXRyaXgyZCk7XG4gICAgaWYgKG1hdGNoMmQpIHtcbiAgICAgIG1hdGNoMmQgPSBtYXRjaDJkWzFdO1xuICAgICAgYXJyID0gbWF0Y2gyZC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChpdGVtLCAxMCk7XG4gICAgICB9KTtcbiAgICAgIGFycls0XSA9IHh5Lng7XG4gICAgICBhcnJbNV0gPSB4eS55O1xuICAgICAgc2V0VHJhbnNmb3JtKG5vZGUsICdtYXRyaXgoJyArIGFyci5qb2luKCcsJykgKyAnKScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbWF0Y2gzZCA9IHRyYW5zZm9ybS5tYXRjaChtYXRyaXgzZClbMV07XG4gICAgICBhcnIgPSBtYXRjaDNkLnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KGl0ZW0sIDEwKTtcbiAgICAgIH0pO1xuICAgICAgYXJyWzEyXSA9IHh5Lng7XG4gICAgICBhcnJbMTNdID0geHkueTtcbiAgICAgIHNldFRyYW5zZm9ybShub2RlLCAnbWF0cml4M2QoJyArIGFyci5qb2luKCcsJykgKyAnKScpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzZXRUcmFuc2Zvcm0obm9kZSwgJ3RyYW5zbGF0ZVgoJyArIHh5LnggKyAncHgpIHRyYW5zbGF0ZVkoJyArIHh5LnkgKyAncHgpIHRyYW5zbGF0ZVooMCknKTtcbiAgfVxufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20tYWxpZ24vbGliL3Byb3BlcnR5VXRpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDY1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIF91dGlsczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlscyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG4vKipcbiAqIOW+l+WIsOS8muWvvOiHtOWFg+e0oOaYvuekuuS4jeWFqOeahOelluWFiOWFg+e0oFxuICovXG5cbmZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIC8vIGllIOi/meS4quS5n+S4jeaYr+WujOWFqOWPr+ihjFxuICAvKlxuICAgPGRpdiBzdHlsZT1cIndpZHRoOiA1MHB4O2hlaWdodDogMTAwcHg7b3ZlcmZsb3c6IGhpZGRlblwiPlxuICAgPGRpdiBzdHlsZT1cIndpZHRoOiA1MHB4O2hlaWdodDogMTAwcHg7cG9zaXRpb246IHJlbGF0aXZlO1wiIGlkPVwiZDZcIj5cbiAgIOWFg+e0oCA2IOmrmCAxMDBweCDlrr0gNTBweDxici8+XG4gICA8L2Rpdj5cbiAgIDwvZGl2PlxuICAgKi9cbiAgLy8gZWxlbWVudC5vZmZzZXRQYXJlbnQgZG9lcyB0aGUgcmlnaHQgdGhpbmcgaW4gaWU3IGFuZCBiZWxvdy4gUmV0dXJuIHBhcmVudCB3aXRoIGxheW91dCFcbiAgLy8gIEluIG90aGVyIGJyb3dzZXJzIGl0IG9ubHkgaW5jbHVkZXMgZWxlbWVudHMgd2l0aCBwb3NpdGlvbiBhYnNvbHV0ZSwgcmVsYXRpdmUgb3JcbiAgLy8gZml4ZWQsIG5vdCBlbGVtZW50cyB3aXRoIG92ZXJmbG93IHNldCB0byBhdXRvIG9yIHNjcm9sbC5cbiAgLy8gICAgICAgIGlmIChVQS5pZSAmJiBpZU1vZGUgPCA4KSB7XG4gIC8vICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50O1xuICAvLyAgICAgICAgfVxuICAvLyDnu5/kuIDnmoQgb2Zmc2V0UGFyZW50IOaWueazlVxuICB2YXIgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICB2YXIgYm9keSA9IGRvYy5ib2R5O1xuICB2YXIgcGFyZW50ID0gdm9pZCAwO1xuICB2YXIgcG9zaXRpb25TdHlsZSA9IF91dGlsczJbXCJkZWZhdWx0XCJdLmNzcyhlbGVtZW50LCAncG9zaXRpb24nKTtcbiAgdmFyIHNraXBTdGF0aWMgPSBwb3NpdGlvblN0eWxlID09PSAnZml4ZWQnIHx8IHBvc2l0aW9uU3R5bGUgPT09ICdhYnNvbHV0ZSc7XG5cbiAgaWYgKCFza2lwU3RhdGljKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2h0bWwnID8gbnVsbCA6IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgfVxuXG4gIGZvciAocGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOyBwYXJlbnQgJiYgcGFyZW50ICE9PSBib2R5OyBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSkge1xuICAgIHBvc2l0aW9uU3R5bGUgPSBfdXRpbHMyW1wiZGVmYXVsdFwiXS5jc3MocGFyZW50LCAncG9zaXRpb24nKTtcbiAgICBpZiAocG9zaXRpb25TdHlsZSAhPT0gJ3N0YXRpYycpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGdldE9mZnNldFBhcmVudDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20tYWxpZ24vbGliL2dldE9mZnNldFBhcmVudC5qc1xuLy8gbW9kdWxlIGlkID0gNjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgX3V0aWxzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWxzKTtcblxudmFyIF9nZXRPZmZzZXRQYXJlbnQgPSByZXF1aXJlKCcuL2dldE9mZnNldFBhcmVudCcpO1xuXG52YXIgX2dldE9mZnNldFBhcmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRPZmZzZXRQYXJlbnQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyoqXG4gKiDojrflvpflhYPntKDnmoTmmL7npLrpg6jliIbnmoTljLrln59cbiAqL1xuZnVuY3Rpb24gZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50KGVsZW1lbnQpIHtcbiAgdmFyIHZpc2libGVSZWN0ID0ge1xuICAgIGxlZnQ6IDAsXG4gICAgcmlnaHQ6IEluZmluaXR5LFxuICAgIHRvcDogMCxcbiAgICBib3R0b206IEluZmluaXR5XG4gIH07XG4gIHZhciBlbCA9ICgwLCBfZ2V0T2Zmc2V0UGFyZW50MltcImRlZmF1bHRcIl0pKGVsZW1lbnQpO1xuICB2YXIgc2Nyb2xsWCA9IHZvaWQgMDtcbiAgdmFyIHNjcm9sbFkgPSB2b2lkIDA7XG4gIHZhciB3aW5TaXplID0gdm9pZCAwO1xuICB2YXIgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICB2YXIgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIHZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gIC8vIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdmlzaWJsZSByZWN0IGJ5IGNsaW1iaW5nIHRoZSBkb20gYWNjb3VudGluZyBmb3JcbiAgLy8gYWxsIHNjcm9sbGFibGUgY29udGFpbmVycy5cbiAgd2hpbGUgKGVsKSB7XG4gICAgLy8gY2xpZW50V2lkdGggaXMgemVybyBmb3IgaW5saW5lIGJsb2NrIGVsZW1lbnRzIGluIGllLlxuICAgIGlmICgobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgPT09IC0xIHx8IGVsLmNsaWVudFdpZHRoICE9PSAwKSAmJlxuICAgIC8vIGJvZHkgbWF5IGhhdmUgb3ZlcmZsb3cgc2V0IG9uIGl0LCB5ZXQgd2Ugc3RpbGwgZ2V0IHRoZSBlbnRpcmVcbiAgICAvLyB2aWV3cG9ydC4gSW4gc29tZSBicm93c2VycywgZWwub2Zmc2V0UGFyZW50IG1heSBiZVxuICAgIC8vIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgc28gY2hlY2sgZm9yIHRoYXQgdG9vLlxuICAgIGVsICE9PSBib2R5ICYmIGVsICE9PSBkb2N1bWVudEVsZW1lbnQgJiYgX3V0aWxzMltcImRlZmF1bHRcIl0uY3NzKGVsLCAnb3ZlcmZsb3cnKSAhPT0gJ3Zpc2libGUnKSB7XG4gICAgICB2YXIgcG9zID0gX3V0aWxzMltcImRlZmF1bHRcIl0ub2Zmc2V0KGVsKTtcbiAgICAgIC8vIGFkZCBib3JkZXJcbiAgICAgIHBvcy5sZWZ0ICs9IGVsLmNsaWVudExlZnQ7XG4gICAgICBwb3MudG9wICs9IGVsLmNsaWVudFRvcDtcbiAgICAgIHZpc2libGVSZWN0LnRvcCA9IE1hdGgubWF4KHZpc2libGVSZWN0LnRvcCwgcG9zLnRvcCk7XG4gICAgICB2aXNpYmxlUmVjdC5yaWdodCA9IE1hdGgubWluKHZpc2libGVSZWN0LnJpZ2h0LFxuICAgICAgLy8gY29uc2lkZXIgYXJlYSB3aXRob3V0IHNjcm9sbEJhclxuICAgICAgcG9zLmxlZnQgKyBlbC5jbGllbnRXaWR0aCk7XG4gICAgICB2aXNpYmxlUmVjdC5ib3R0b20gPSBNYXRoLm1pbih2aXNpYmxlUmVjdC5ib3R0b20sIHBvcy50b3AgKyBlbC5jbGllbnRIZWlnaHQpO1xuICAgICAgdmlzaWJsZVJlY3QubGVmdCA9IE1hdGgubWF4KHZpc2libGVSZWN0LmxlZnQsIHBvcy5sZWZ0KTtcbiAgICB9IGVsc2UgaWYgKGVsID09PSBib2R5IHx8IGVsID09PSBkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBlbCA9ICgwLCBfZ2V0T2Zmc2V0UGFyZW50MltcImRlZmF1bHRcIl0pKGVsKTtcbiAgfVxuXG4gIC8vIENsaXAgYnkgd2luZG93J3Mgdmlld3BvcnQuXG4gIHNjcm9sbFggPSBfdXRpbHMyW1wiZGVmYXVsdFwiXS5nZXRXaW5kb3dTY3JvbGxMZWZ0KHdpbik7XG4gIHNjcm9sbFkgPSBfdXRpbHMyW1wiZGVmYXVsdFwiXS5nZXRXaW5kb3dTY3JvbGxUb3Aod2luKTtcbiAgdmlzaWJsZVJlY3QubGVmdCA9IE1hdGgubWF4KHZpc2libGVSZWN0LmxlZnQsIHNjcm9sbFgpO1xuICB2aXNpYmxlUmVjdC50b3AgPSBNYXRoLm1heCh2aXNpYmxlUmVjdC50b3AsIHNjcm9sbFkpO1xuICB3aW5TaXplID0ge1xuICAgIHdpZHRoOiBfdXRpbHMyW1wiZGVmYXVsdFwiXS52aWV3cG9ydFdpZHRoKHdpbiksXG4gICAgaGVpZ2h0OiBfdXRpbHMyW1wiZGVmYXVsdFwiXS52aWV3cG9ydEhlaWdodCh3aW4pXG4gIH07XG4gIHZpc2libGVSZWN0LnJpZ2h0ID0gTWF0aC5taW4odmlzaWJsZVJlY3QucmlnaHQsIHNjcm9sbFggKyB3aW5TaXplLndpZHRoKTtcbiAgdmlzaWJsZVJlY3QuYm90dG9tID0gTWF0aC5taW4odmlzaWJsZVJlY3QuYm90dG9tLCBzY3JvbGxZICsgd2luU2l6ZS5oZWlnaHQpO1xuICByZXR1cm4gdmlzaWJsZVJlY3QudG9wID49IDAgJiYgdmlzaWJsZVJlY3QubGVmdCA+PSAwICYmIHZpc2libGVSZWN0LmJvdHRvbSA+IHZpc2libGVSZWN0LnRvcCAmJiB2aXNpYmxlUmVjdC5yaWdodCA+IHZpc2libGVSZWN0LmxlZnQgPyB2aXNpYmxlUmVjdCA6IG51bGw7XG59XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2RvbS1hbGlnbi9saWIvZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50LmpzXG4vLyBtb2R1bGUgaWQgPSA2N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBfdXRpbHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbHMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gYWRqdXN0Rm9yVmlld3BvcnQoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCwgb3ZlcmZsb3cpIHtcbiAgdmFyIHBvcyA9IF91dGlsczJbXCJkZWZhdWx0XCJdLmNsb25lKGVsRnV0dXJlUG9zKTtcbiAgdmFyIHNpemUgPSB7XG4gICAgd2lkdGg6IGVsUmVnaW9uLndpZHRoLFxuICAgIGhlaWdodDogZWxSZWdpb24uaGVpZ2h0XG4gIH07XG5cbiAgaWYgKG92ZXJmbG93LmFkanVzdFggJiYgcG9zLmxlZnQgPCB2aXNpYmxlUmVjdC5sZWZ0KSB7XG4gICAgcG9zLmxlZnQgPSB2aXNpYmxlUmVjdC5sZWZ0O1xuICB9XG5cbiAgLy8gTGVmdCBlZGdlIGluc2lkZSBhbmQgcmlnaHQgZWRnZSBvdXRzaWRlIHZpZXdwb3J0LCB0cnkgdG8gcmVzaXplIGl0LlxuICBpZiAob3ZlcmZsb3cucmVzaXplV2lkdGggJiYgcG9zLmxlZnQgPj0gdmlzaWJsZVJlY3QubGVmdCAmJiBwb3MubGVmdCArIHNpemUud2lkdGggPiB2aXNpYmxlUmVjdC5yaWdodCkge1xuICAgIHNpemUud2lkdGggLT0gcG9zLmxlZnQgKyBzaXplLndpZHRoIC0gdmlzaWJsZVJlY3QucmlnaHQ7XG4gIH1cblxuICAvLyBSaWdodCBlZGdlIG91dHNpZGUgdmlld3BvcnQsIHRyeSB0byBtb3ZlIGl0LlxuICBpZiAob3ZlcmZsb3cuYWRqdXN0WCAmJiBwb3MubGVmdCArIHNpemUud2lkdGggPiB2aXNpYmxlUmVjdC5yaWdodCkge1xuICAgIC8vIOS/neivgeW3pui+ueeVjOWSjOWPr+inhuWMuuWfn+W3pui+ueeVjOWvuem9kFxuICAgIHBvcy5sZWZ0ID0gTWF0aC5tYXgodmlzaWJsZVJlY3QucmlnaHQgLSBzaXplLndpZHRoLCB2aXNpYmxlUmVjdC5sZWZ0KTtcbiAgfVxuXG4gIC8vIFRvcCBlZGdlIG91dHNpZGUgdmlld3BvcnQsIHRyeSB0byBtb3ZlIGl0LlxuICBpZiAob3ZlcmZsb3cuYWRqdXN0WSAmJiBwb3MudG9wIDwgdmlzaWJsZVJlY3QudG9wKSB7XG4gICAgcG9zLnRvcCA9IHZpc2libGVSZWN0LnRvcDtcbiAgfVxuXG4gIC8vIFRvcCBlZGdlIGluc2lkZSBhbmQgYm90dG9tIGVkZ2Ugb3V0c2lkZSB2aWV3cG9ydCwgdHJ5IHRvIHJlc2l6ZSBpdC5cbiAgaWYgKG92ZXJmbG93LnJlc2l6ZUhlaWdodCAmJiBwb3MudG9wID49IHZpc2libGVSZWN0LnRvcCAmJiBwb3MudG9wICsgc2l6ZS5oZWlnaHQgPiB2aXNpYmxlUmVjdC5ib3R0b20pIHtcbiAgICBzaXplLmhlaWdodCAtPSBwb3MudG9wICsgc2l6ZS5oZWlnaHQgLSB2aXNpYmxlUmVjdC5ib3R0b207XG4gIH1cblxuICAvLyBCb3R0b20gZWRnZSBvdXRzaWRlIHZpZXdwb3J0LCB0cnkgdG8gbW92ZSBpdC5cbiAgaWYgKG92ZXJmbG93LmFkanVzdFkgJiYgcG9zLnRvcCArIHNpemUuaGVpZ2h0ID4gdmlzaWJsZVJlY3QuYm90dG9tKSB7XG4gICAgLy8g5L+d6K+B5LiK6L6555WM5ZKM5Y+v6KeG5Yy65Z+f5LiK6L6555WM5a+56b2QXG4gICAgcG9zLnRvcCA9IE1hdGgubWF4KHZpc2libGVSZWN0LmJvdHRvbSAtIHNpemUuaGVpZ2h0LCB2aXNpYmxlUmVjdC50b3ApO1xuICB9XG5cbiAgcmV0dXJuIF91dGlsczJbXCJkZWZhdWx0XCJdLm1peChwb3MsIHNpemUpO1xufVxuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGFkanVzdEZvclZpZXdwb3J0O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2RvbS1hbGlnbi9saWIvYWRqdXN0Rm9yVmlld3BvcnQuanNcbi8vIG1vZHVsZSBpZCA9IDY4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIF91dGlsczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlscyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBnZXRSZWdpb24obm9kZSkge1xuICB2YXIgb2Zmc2V0ID0gdm9pZCAwO1xuICB2YXIgdyA9IHZvaWQgMDtcbiAgdmFyIGggPSB2b2lkIDA7XG4gIGlmICghX3V0aWxzMltcImRlZmF1bHRcIl0uaXNXaW5kb3cobm9kZSkgJiYgbm9kZS5ub2RlVHlwZSAhPT0gOSkge1xuICAgIG9mZnNldCA9IF91dGlsczJbXCJkZWZhdWx0XCJdLm9mZnNldChub2RlKTtcbiAgICB3ID0gX3V0aWxzMltcImRlZmF1bHRcIl0ub3V0ZXJXaWR0aChub2RlKTtcbiAgICBoID0gX3V0aWxzMltcImRlZmF1bHRcIl0ub3V0ZXJIZWlnaHQobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHdpbiA9IF91dGlsczJbXCJkZWZhdWx0XCJdLmdldFdpbmRvdyhub2RlKTtcbiAgICBvZmZzZXQgPSB7XG4gICAgICBsZWZ0OiBfdXRpbHMyW1wiZGVmYXVsdFwiXS5nZXRXaW5kb3dTY3JvbGxMZWZ0KHdpbiksXG4gICAgICB0b3A6IF91dGlsczJbXCJkZWZhdWx0XCJdLmdldFdpbmRvd1Njcm9sbFRvcCh3aW4pXG4gICAgfTtcbiAgICB3ID0gX3V0aWxzMltcImRlZmF1bHRcIl0udmlld3BvcnRXaWR0aCh3aW4pO1xuICAgIGggPSBfdXRpbHMyW1wiZGVmYXVsdFwiXS52aWV3cG9ydEhlaWdodCh3aW4pO1xuICB9XG4gIG9mZnNldC53aWR0aCA9IHc7XG4gIG9mZnNldC5oZWlnaHQgPSBoO1xuICByZXR1cm4gb2Zmc2V0O1xufVxuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGdldFJlZ2lvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20tYWxpZ24vbGliL2dldFJlZ2lvbi5qc1xuLy8gbW9kdWxlIGlkID0gNjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2dldEFsaWduT2Zmc2V0ID0gcmVxdWlyZSgnLi9nZXRBbGlnbk9mZnNldCcpO1xuXG52YXIgX2dldEFsaWduT2Zmc2V0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldEFsaWduT2Zmc2V0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGdldEVsRnV0dXJlUG9zKGVsUmVnaW9uLCByZWZOb2RlUmVnaW9uLCBwb2ludHMsIG9mZnNldCwgdGFyZ2V0T2Zmc2V0KSB7XG4gIHZhciB4eSA9IHZvaWQgMDtcbiAgdmFyIGRpZmYgPSB2b2lkIDA7XG4gIHZhciBwMSA9IHZvaWQgMDtcbiAgdmFyIHAyID0gdm9pZCAwO1xuXG4gIHh5ID0ge1xuICAgIGxlZnQ6IGVsUmVnaW9uLmxlZnQsXG4gICAgdG9wOiBlbFJlZ2lvbi50b3BcbiAgfTtcblxuICBwMSA9ICgwLCBfZ2V0QWxpZ25PZmZzZXQyW1wiZGVmYXVsdFwiXSkocmVmTm9kZVJlZ2lvbiwgcG9pbnRzWzFdKTtcbiAgcDIgPSAoMCwgX2dldEFsaWduT2Zmc2V0MltcImRlZmF1bHRcIl0pKGVsUmVnaW9uLCBwb2ludHNbMF0pO1xuXG4gIGRpZmYgPSBbcDIubGVmdCAtIHAxLmxlZnQsIHAyLnRvcCAtIHAxLnRvcF07XG5cbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiB4eS5sZWZ0IC0gZGlmZlswXSArIG9mZnNldFswXSAtIHRhcmdldE9mZnNldFswXSxcbiAgICB0b3A6IHh5LnRvcCAtIGRpZmZbMV0gKyBvZmZzZXRbMV0gLSB0YXJnZXRPZmZzZXRbMV1cbiAgfTtcbn1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBnZXRFbEZ1dHVyZVBvcztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20tYWxpZ24vbGliL2dldEVsRnV0dXJlUG9zLmpzXG4vLyBtb2R1bGUgaWQgPSA3MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG4vKipcbiAqIOiOt+WPliBub2RlIOS4iueahCBhbGlnbiDlr7npvZDngrkg55u45a+55LqO6aG16Z2i55qE5Z2Q5qCHXG4gKi9cblxuZnVuY3Rpb24gZ2V0QWxpZ25PZmZzZXQocmVnaW9uLCBhbGlnbikge1xuICB2YXIgViA9IGFsaWduLmNoYXJBdCgwKTtcbiAgdmFyIEggPSBhbGlnbi5jaGFyQXQoMSk7XG4gIHZhciB3ID0gcmVnaW9uLndpZHRoO1xuICB2YXIgaCA9IHJlZ2lvbi5oZWlnaHQ7XG4gIHZhciB4ID0gdm9pZCAwO1xuICB2YXIgeSA9IHZvaWQgMDtcblxuICB4ID0gcmVnaW9uLmxlZnQ7XG4gIHkgPSByZWdpb24udG9wO1xuXG4gIGlmIChWID09PSAnYycpIHtcbiAgICB5ICs9IGggLyAyO1xuICB9IGVsc2UgaWYgKFYgPT09ICdiJykge1xuICAgIHkgKz0gaDtcbiAgfVxuXG4gIGlmIChIID09PSAnYycpIHtcbiAgICB4ICs9IHcgLyAyO1xuICB9IGVsc2UgaWYgKEggPT09ICdyJykge1xuICAgIHggKz0gdztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbGVmdDogeCxcbiAgICB0b3A6IHlcbiAgfTtcbn1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBnZXRBbGlnbk9mZnNldDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20tYWxpZ24vbGliL2dldEFsaWduT2Zmc2V0LmpzXG4vLyBtb2R1bGUgaWQgPSA3MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfVHJhbnNpdGlvbiA9IHJlcXVpcmUoJy4vVHJhbnNpdGlvbicpO1xuXG52YXIgX1RyYW5zaXRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVHJhbnNpdGlvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXHJcbiAgICogU2hvdyB0aGUgY29tcG9uZW50OyB0cmlnZ2VycyB0aGUgZmFkZSBpbiBvciBmYWRlIG91dCBhbmltYXRpb25cclxuICAgKi9cbiAgXCJpblwiOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuYm9vbCxcblxuICAvKipcclxuICAgKiBVbm1vdW50IHRoZSBjb21wb25lbnQgKHJlbW92ZSBpdCBmcm9tIHRoZSBET00pIHdoZW4gaXQgaXMgZmFkZWQgb3V0XHJcbiAgICovXG4gIHVubW91bnRPbkV4aXQ6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxyXG4gICAqIFJ1biB0aGUgZmFkZSBpbiBhbmltYXRpb24gd2hlbiB0aGUgY29tcG9uZW50IG1vdW50cywgaWYgaXQgaXMgaW5pdGlhbGx5XHJcbiAgICogc2hvd25cclxuICAgKi9cbiAgdHJhbnNpdGlvbkFwcGVhcjogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXHJcbiAgICogRHVyYXRpb24gb2YgdGhlIGZhZGUgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcywgdG8gZW5zdXJlIHRoYXQgZmluaXNoaW5nXHJcbiAgICogY2FsbGJhY2tzIGFyZSBmaXJlZCBldmVuIGlmIHRoZSBvcmlnaW5hbCBicm93c2VyIHRyYW5zaXRpb24gZW5kIGV2ZW50cyBhcmVcclxuICAgKiBjYW5jZWxlZFxyXG4gICAqL1xuICB0aW1lb3V0OiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxyXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGZhZGVzIGluXHJcbiAgICovXG4gIG9uRW50ZXI6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jLFxuICAvKipcclxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgY29tcG9uZW50IHN0YXJ0cyB0byBmYWRlIGluXHJcbiAgICovXG4gIG9uRW50ZXJpbmc6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jLFxuICAvKipcclxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgaGFzIGNvbXBvbmVudCBmYWRlZCBpblxyXG4gICAqL1xuICBvbkVudGVyZWQ6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jLFxuICAvKipcclxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBmYWRlcyBvdXRcclxuICAgKi9cbiAgb25FeGl0OiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBzdGFydHMgdG8gZmFkZSBvdXRcclxuICAgKi9cbiAgb25FeGl0aW5nOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgZmFkZWQgb3V0XHJcbiAgICovXG4gIG9uRXhpdGVkOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuY1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgXCJpblwiOiBmYWxzZSxcbiAgdGltZW91dDogMzAwLFxuICB1bm1vdW50T25FeGl0OiBmYWxzZSxcbiAgdHJhbnNpdGlvbkFwcGVhcjogZmFsc2Vcbn07XG5cbnZhciBGYWRlID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEZhZGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEZhZGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZhZGUpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBGYWRlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoX1RyYW5zaXRpb24yW1wiZGVmYXVsdFwiXSwgX2V4dGVuZHMoe30sIHRoaXMucHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKHRoaXMucHJvcHMuY2xhc3NOYW1lLCAnZmFkZScpLFxuICAgICAgZW50ZXJlZENsYXNzTmFtZTogJ2luJyxcbiAgICAgIGVudGVyaW5nQ2xhc3NOYW1lOiAnaW4nXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBGYWRlO1xufShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXG5GYWRlLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkZhZGUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEZhZGU7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLXRyYW5zaXRpb24vYnVpbGQvRmFkZS5qc1xuLy8gbW9kdWxlIGlkID0gNzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3RpbnBlckJlZUNvcmUgPSByZXF1aXJlKCd0aW5wZXItYmVlLWNvcmUnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8v5piv5ZCm5piv5omL6aOO55C05pWI5p6cXG4gIGFjY29yZGlvbjogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmJvb2wsXG4gIC8v5r+A5rS755qE6aG5XG4gIGFjdGl2ZUtleTogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmFueSxcbiAgLy/pu5jorqTnmoTmv4DmtLvnmoTpoblcbiAgZGVmYXVsdEFjdGl2ZUtleTogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmFueSxcbiAgLy/pgInkuK3lh73mlbBcbiAgb25TZWxlY3Q6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jLFxuICByb2xlOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuc3RyaW5nXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBhY2NvcmRpb246IGZhbHNlLFxuICBjbHNQcmVmaXg6ICd1LXBhbmVsLWdyb3VwJ1xufTtcblxuLy8gVE9ETzogVXNlIHVuY29udHJvbGxhYmxlLlxuXG52YXIgUGFuZWxHcm91cCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhQYW5lbEdyb3VwLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQYW5lbEdyb3VwKHByb3BzLCBjb250ZXh0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhbmVsR3JvdXApO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVTZWxlY3QgPSBfdGhpcy5oYW5kbGVTZWxlY3QuYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGFjdGl2ZUtleTogcHJvcHMuZGVmYXVsdEFjdGl2ZUtleVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgUGFuZWxHcm91cC5wcm90b3R5cGUuaGFuZGxlU2VsZWN0ID0gZnVuY3Rpb24gaGFuZGxlU2VsZWN0KGtleSwgZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLnByb3BzLm9uU2VsZWN0KSB7XG4gICAgICB0aGlzLnByb3BzLm9uU2VsZWN0KGtleSwgZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlS2V5ID09PSBrZXkpIHtcbiAgICAgIGtleSA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IGFjdGl2ZUtleToga2V5IH0pO1xuICB9O1xuXG4gIFBhbmVsR3JvdXAucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHZhciBhY2NvcmRpb24gPSBfcHJvcHMuYWNjb3JkaW9uO1xuICAgIHZhciBwcm9wc0FjdGl2ZUtleSA9IF9wcm9wcy5hY3RpdmVLZXk7XG4gICAgdmFyIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWU7XG4gICAgdmFyIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuO1xuICAgIHZhciBkZWZhdWx0QWN0aXZlS2V5ID0gX3Byb3BzLmRlZmF1bHRBY3RpdmVLZXk7XG4gICAgdmFyIG9uU2VsZWN0ID0gX3Byb3BzLm9uU2VsZWN0O1xuICAgIHZhciBzdHlsZSA9IF9wcm9wcy5zdHlsZTtcbiAgICB2YXIgY2xzUHJlZml4ID0gX3Byb3BzLmNsc1ByZWZpeDtcblxuICAgIHZhciBvdGhlcnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbJ2FjY29yZGlvbicsICdhY3RpdmVLZXknLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJywgJ2RlZmF1bHRBY3RpdmVLZXknLCAnb25TZWxlY3QnLCAnc3R5bGUnLCAnY2xzUHJlZml4J10pO1xuXG4gICAgdmFyIGFjdGl2ZUtleSA9IHZvaWQgMDtcbiAgICBpZiAoYWNjb3JkaW9uKSB7XG4gICAgICBhY3RpdmVLZXkgPSBwcm9wc0FjdGl2ZUtleSAhPSBudWxsID8gcHJvcHNBY3RpdmVLZXkgOiB0aGlzLnN0YXRlLmFjdGl2ZUtleTtcbiAgICAgIG90aGVycy5yb2xlID0gb3RoZXJzLnJvbGUgfHwgJ3RhYmxpc3QnO1xuICAgIH1cblxuICAgIHZhciBjbGFzc2VzID0ge307XG4gICAgY2xhc3Nlc1snJyArIGNsc1ByZWZpeF0gPSB0cnVlO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgIF9leHRlbmRzKHt9LCBvdGhlcnMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyW1wiZGVmYXVsdFwiXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgICAgfSksXG4gICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5DaGlsZHJlbi5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoIV9yZWFjdDJbXCJkZWZhdWx0XCJdLmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hpbGRQcm9wcyA9IHtcbiAgICAgICAgICBzdHlsZTogY2hpbGQucHJvcHMuc3R5bGVcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYWNjb3JkaW9uKSB7XG4gICAgICAgICAgX2V4dGVuZHMoY2hpbGRQcm9wcywge1xuICAgICAgICAgICAgaGVhZGVyUm9sZTogJ3RhYicsXG4gICAgICAgICAgICBwYW5lbFJvbGU6ICd0YWJwYW5lbCcsXG4gICAgICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGV4cGFuZGVkOiBjaGlsZC5wcm9wcy5ldmVudEtleSA9PT0gYWN0aXZlS2V5LFxuICAgICAgICAgICAgb25TZWxlY3Q6ICgwLCBfdGlucGVyQmVlQ29yZS5jcmVhdGVDaGFpbmVkRnVuY3Rpb24pKF90aGlzMi5oYW5kbGVTZWxlY3QsIGNoaWxkLnByb3BzLm9uU2VsZWN0KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgY2hpbGRQcm9wcyk7XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFBhbmVsR3JvdXA7XG59KF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNvbXBvbmVudCk7XG5cblBhbmVsR3JvdXAucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuUGFuZWxHcm91cC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gUGFuZWxHcm91cDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtcGFuZWwvYnVpbGQvUGFuZWxHcm91cC5qc1xuLy8gbW9kdWxlIGlkID0gNzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFN0ZXAgZnJvbSAnLi9TdGVwJztcbmltcG9ydCBTdGVwcyBmcm9tICcuL1N0ZXBzJztcblN0ZXAuU3RlcHMgPSBTdGVwcztcbmV4cG9ydCBkZWZhdWx0IFN0ZXA7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gc3JjL2luZGV4LmpzIiwiaW1wb3J0IFJlYWN0LCB7IFByb3BUeXBlcyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhzdHIpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGVwIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzTmFtZSwgcHJlZml4Q2xzLCBzdHlsZSwgdGFpbFdpZHRoLFxuICAgICAgc3RhdHVzID0gJ3dhaXQnLCBpY29uUHJlZml4LCBpY29uLCB3cmFwcGVyU3R5bGUsXG4gICAgICBhZGp1c3RNYXJnaW5SaWdodCwgc3RlcExhc3QsIHN0ZXBOdW1iZXIsXG4gICAgICBkZXNjcmlwdGlvbiwgdGl0bGUsIC4uLnJlc3RQcm9wcyB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBpY29uQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyh7XG4gICAgICBbYCR7cHJlZml4Q2xzfS1pY29uYF06IHRydWUsXG4gICAgICBbYCR7aWNvblByZWZpeH1pY29uYF06IHRydWUsXG4gICAgICBbYCR7aWNvblByZWZpeH1pY29uLSR7aWNvbn1gXTogaWNvbiAmJiBpc1N0cmluZyhpY29uKSxcbiAgICAgIFtgJHtpY29uUHJlZml4fWljb24tY2hlY2tgXTogIWljb24gJiYgc3RhdHVzID09PSAnZmluaXNoJyxcbiAgICAgIFtgJHtpY29uUHJlZml4fWljb24tY3Jvc3NgXTogIWljb24gJiYgc3RhdHVzID09PSAnZXJyb3InLFxuICAgIH0pO1xuXG4gICAgbGV0IGljb25Ob2RlO1xuICAgIGlmIChpY29uICYmICFpc1N0cmluZyhpY29uKSkge1xuICAgICAgaWNvbk5vZGUgPSA8c3BhbiBjbGFzc05hbWU9e2Ake3ByZWZpeENsc30taWNvbmB9PntpY29ufTwvc3Bhbj47XG4gICAgfSBlbHNlIGlmIChpY29uIHx8IHN0YXR1cyA9PT0gJ2ZpbmlzaCcgfHwgc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICBpY29uTm9kZSA9IDxzcGFuIGNsYXNzTmFtZT17aWNvbkNsYXNzTmFtZX0gLz47XG4gICAgfSBlbHNlIHtcbiAgICAgIGljb25Ob2RlID0gPHNwYW4gY2xhc3NOYW1lPXtgJHtwcmVmaXhDbHN9LWljb25gfT57c3RlcE51bWJlcn08L3NwYW4+O1xuICAgIH1cblxuICAgIGNvbnN0IGNsYXNzU3RyaW5nID0gY2xhc3NOYW1lcyh7XG4gICAgICBbYCR7cHJlZml4Q2xzfS1pdGVtYF06IHRydWUsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1pdGVtLWxhc3RgXTogc3RlcExhc3QsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1zdGF0dXMtJHtzdGF0dXN9YF06IHRydWUsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1jdXN0b21gXTogaWNvbixcbiAgICAgIFtjbGFzc05hbWVdOiAhIWNsYXNzTmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiB7Li4ucmVzdFByb3BzfVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzU3RyaW5nfVxuICAgICAgICBzdHlsZT17eyB3aWR0aDogdGFpbFdpZHRoLCBtYXJnaW5SaWdodDogYWRqdXN0TWFyZ2luUmlnaHQsIC4uLnN0eWxlIH19XG4gICAgICA+XG4gICAgICAgIHtzdGVwTGFzdCA/ICcnIDogPGRpdiByZWY9XCJ0YWlsXCIgY2xhc3NOYW1lPXtgJHtwcmVmaXhDbHN9LXRhaWxgfT48aSAvPjwvZGl2Pn1cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeENsc30tc3RlcGB9PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4Q2xzfS1oZWFkYH1cbiAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6IHdyYXBwZXJTdHlsZS5iYWNrZ3JvdW5kIHx8IHdyYXBwZXJTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cHJlZml4Q2xzfS1oZWFkLWlubmVyYH0+e2ljb25Ob2RlfTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgcmVmPVwibWFpblwiIGNsYXNzTmFtZT17YCR7cHJlZml4Q2xzfS1tYWluYH0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4Q2xzfS10aXRsZWB9XG4gICAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6IHdyYXBwZXJTdHlsZS5iYWNrZ3JvdW5kIHx8IHdyYXBwZXJTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgfX1cbiAgICAgICAgICAgID57dGl0bGV9PC9kaXY+XG4gICAgICAgICAgICB7ZGVzY3JpcHRpb24gPyA8ZGl2IGNsYXNzTmFtZT17YCR7cHJlZml4Q2xzfS1kZXNjcmlwdGlvbmB9PntkZXNjcmlwdGlvbn08L2Rpdj4gOiAnJ31cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cblN0ZXAucHJvcFR5cGVzID0ge1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHByZWZpeENsczogUHJvcFR5cGVzLnN0cmluZyxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIHdyYXBwZXJTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgdGFpbFdpZHRoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBQcm9wVHlwZXMubnVtYmVyLFxuICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gIF0pLFxuICBzdGF0dXM6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGljb25QcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGljb246IFByb3BUeXBlcy5ub2RlLFxuICBhZGp1c3RNYXJnaW5SaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLm51bWJlcixcbiAgICBQcm9wVHlwZXMuc3RyaW5nLFxuICBdKSxcbiAgc3RlcExhc3Q6IFByb3BUeXBlcy5ib29sLFxuICBzdGVwTnVtYmVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBkZXNjcmlwdGlvbjogUHJvcFR5cGVzLmFueSxcbiAgdGl0bGU6IFByb3BUeXBlcy5hbnksXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0ZXA7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gc3JjL1N0ZXAuanMiLCJpbXBvcnQgUmVhY3QsIHsgUHJvcFR5cGVzIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcblxuY29uc3QgcHJvcFR5cGVzID0ge1xuICBwcmVmaXhDbHM6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGljb25QcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGxhYmVsUGxhY2VtZW50OiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLmFueSxcbiAgY3VycmVudDogUHJvcFR5cGVzLm51bWJlcixcbiAgc3RhdHVzOiBQcm9wVHlwZXMub25lT2YoWyd3YWl0JywgJ3Byb2Nlc3MnLCAnZmluaXNoJywgJ2Vycm9yJ10pLFxuICBkaXJlY3Rpb246IFByb3BUeXBlcy5vbmVPZihbJ2hvcml6b250YWwnLCAndmVydGljYWwnXSksXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihbJ2RlZmF1bHQnLCAnc21hbGwnXSlcbn07XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgcHJlZml4Q2xzOiAndS1zdGVwcycsXG4gIGljb25QcmVmaXg6ICd1JyxcbiAgZGlyZWN0aW9uOiAnaG9yaXpvbnRhbCcsXG4gIGxhYmVsUGxhY2VtZW50OiAnaG9yaXpvbnRhbCcsXG4gIGN1cnJlbnQ6IDAsXG4gIHN0YXR1czogJ3Byb2Nlc3MnLFxuICBzaXplOiAnZGVmYXVsdCcsXG59O1xuXG5jbGFzcyBTdGVwcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsYXN0U3RlcE9mZnNldFdpZHRoOiAwLFxuICAgIH07XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5jYWxjTGFzdFN0ZXBPZmZzZXRXaWR0aCgpO1xuICB9XG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB0aGlzLmNhbGNMYXN0U3RlcE9mZnNldFdpZHRoKCk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMuY2FsY1RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNhbGNUaW1lb3V0KTtcbiAgICB9XG4gIH1cbiAgY2FsY0xhc3RTdGVwT2Zmc2V0V2lkdGggPSAoKSA9PiB7XG4gICAgY29uc3QgZG9tTm9kZSA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMpO1xuICAgIGlmIChkb21Ob2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLmNhbGNUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNhbGNUaW1lb3V0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsY1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gKzEgZm9yIGZpdCBlZGdlIGJ1ZyBvZiBkaWdpdCB3aWR0aCwgbGlrZSAzNS40cHhcbiAgICAgICAgY29uc3QgbGFzdFN0ZXBPZmZzZXRXaWR0aCA9IChkb21Ob2RlLmxhc3RDaGlsZC5vZmZzZXRXaWR0aCB8fCAwKSArIDE7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmxhc3RTdGVwT2Zmc2V0V2lkdGggPT09IGxhc3RTdGVwT2Zmc2V0V2lkdGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGxhc3RTdGVwT2Zmc2V0V2lkdGggfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IHByZWZpeENscywgc3R5bGUgPSB7fSwgY2xhc3NOYW1lLCBjaGlsZHJlbiwgZGlyZWN0aW9uLFxuICAgICAgICAgICAgbGFiZWxQbGFjZW1lbnQsIGljb25QcmVmaXgsIHN0YXR1cywgc2l6ZSwgY3VycmVudCwgLi4ucmVzdFByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBsYXN0SW5kZXggPSBjaGlsZHJlbi5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHJlTGF5b3V0ZWQgPSB0aGlzLnN0YXRlLmxhc3RTdGVwT2Zmc2V0V2lkdGggPiAwO1xuICAgIGNvbnN0IGNsYXNzU3RyaW5nID0gY2xhc3NOYW1lcyh7XG4gICAgICBbcHJlZml4Q2xzXTogdHJ1ZSxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LSR7c2l6ZX1gXTogc2l6ZSxcbiAgICAgIFtgJHtwcmVmaXhDbHN9LSR7ZGlyZWN0aW9ufWBdOiB0cnVlLFxuICAgICAgW2Ake3ByZWZpeENsc30tbGFiZWwtJHtsYWJlbFBsYWNlbWVudH1gXTogZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1oaWRkZW5gXTogIXJlTGF5b3V0ZWQsXG4gICAgICBbY2xhc3NOYW1lXTogY2xhc3NOYW1lLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc1N0cmluZ30gc3R5bGU9e3N0eWxlfSB7Li4ucmVzdFByb3BzfT5cbiAgICAgICAge1xuICAgICAgICAgIFJlYWN0LkNoaWxkcmVuLm1hcChjaGlsZHJlbiwgKGVsZSwgaWR4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YWlsV2lkdGggPSAoZGlyZWN0aW9uID09PSAndmVydGljYWwnIHx8IGlkeCA9PT0gbGFzdEluZGV4IHx8ICFyZUxheW91dGVkKVxuICAgICAgICAgICAgICA/IG51bGwgOiBgJHsxMDAgLyBsYXN0SW5kZXh9JWA7XG4gICAgICAgICAgICBjb25zdCBhZGp1c3RNYXJnaW5SaWdodCA9IChkaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCcgfHwgaWR4ID09PSBsYXN0SW5kZXgpXG4gICAgICAgICAgICAgID8gbnVsbCA6IC1NYXRoLnJvdW5kKHRoaXMuc3RhdGUubGFzdFN0ZXBPZmZzZXRXaWR0aCAvIGxhc3RJbmRleCArIDEpO1xuICAgICAgICAgICAgY29uc3QgbnAgPSB7XG4gICAgICAgICAgICAgIHN0ZXBOdW1iZXI6IChpZHggKyAxKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICBzdGVwTGFzdDogaWR4ID09PSBsYXN0SW5kZXgsXG4gICAgICAgICAgICAgIHRhaWxXaWR0aCxcbiAgICAgICAgICAgICAgYWRqdXN0TWFyZ2luUmlnaHQsXG4gICAgICAgICAgICAgIHByZWZpeENscyxcbiAgICAgICAgICAgICAgaWNvblByZWZpeCxcbiAgICAgICAgICAgICAgd3JhcHBlclN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIGZpeCB0YWlsIGNvbG9yXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSAnZXJyb3InICYmIGlkeCA9PT0gY3VycmVudCAtIDEpIHtcbiAgICAgICAgICAgICAgbnAuY2xhc3NOYW1lID0gYCR7cHJvcHMucHJlZml4Q2xzfS1uZXh0LWVycm9yYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFlbGUucHJvcHMuc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGlmIChpZHggPT09IGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBucC5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoaWR4IDwgY3VycmVudCkge1xuICAgICAgICAgICAgICAgIG5wLnN0YXR1cyA9ICdmaW5pc2gnO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5wLnN0YXR1cyA9ICd3YWl0JztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChlbGUsIG5wKTtcbiAgICAgICAgICB9LCB0aGlzKVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5TdGVwcy5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5TdGVwcy5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmV4cG9ydCBkZWZhdWx0IFN0ZXBzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHNyYy9TdGVwcy5qcyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9JY29uID0gcmVxdWlyZSgnLi9JY29uJyk7XG5cbnZhciBfSWNvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9JY29uKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX0ljb24yW1wiZGVmYXVsdFwiXTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtaWNvbi9idWlsZC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0dmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIHByb3BUeXBlcyA9IHtcblx0dHlwZTogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmdcblxufTtcbi8qKlxuICogIGJhZGdlIOm7mOiupOaYvuekuuWGheWuuTFcbiAqL1xudmFyIGRlZmF1bHRQcm9wcyA9IHtcblx0Y2xzUHJlZml4OiAndWYnXG59O1xuXG52YXIgSWNvbiA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG5cdF9pbmhlcml0cyhJY29uLCBfQ29tcG9uZW50KTtcblxuXHRmdW5jdGlvbiBJY29uKHByb3BzKSB7XG5cdFx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIEljb24pO1xuXG5cdFx0cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykpO1xuXHR9XG5cblx0SWNvbi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuXHRcdHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuXHRcdCAgICB0eXBlID0gX3Byb3BzLnR5cGUsXG5cdFx0ICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG5cdFx0ICAgIGNsc1ByZWZpeCA9IF9wcm9wcy5jbHNQcmVmaXgsXG5cdFx0ICAgIG90aGVycyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMsIFsndHlwZScsICdjbGFzc05hbWUnLCAnY2xzUHJlZml4J10pO1xuXG5cdFx0dmFyIGNsc09iaiA9IHt9O1xuXG5cdFx0dmFyIGNsYXNzTmFtZXMgPSAoMCwgX2NsYXNzbmFtZXMyW1wiZGVmYXVsdFwiXSkoY2xzUHJlZml4LCB0eXBlKTtcblxuXHRcdHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KCdpJywgX2V4dGVuZHMoe30sIG90aGVycywgeyBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShjbGFzc05hbWVzLCBjbGFzc05hbWUpIH0pKTtcblx0fTtcblxuXHRyZXR1cm4gSWNvbjtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbkljb24uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuSWNvbi5Qcm9wVHlwZXMgPSBfcmVhY3QuUHJvcFR5cGVzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEljb247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWljb24vYnVpbGQvSWNvbi5qc1xuLy8gbW9kdWxlIGlkID0gNzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX01lc3NhZ2UgPSByZXF1aXJlKCcuL01lc3NhZ2UnKTtcblxudmFyIF9NZXNzYWdlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01lc3NhZ2UpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfTWVzc2FnZTJbXCJkZWZhdWx0XCJdO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1tZXNzYWdlL2J1aWxkL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA3OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfYmVlTm90aWZpY2F0aW9uID0gcmVxdWlyZSgnYmVlLW5vdGlmaWNhdGlvbicpO1xuXG52YXIgX2JlZU5vdGlmaWNhdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iZWVOb3RpZmljYXRpb24pO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbnZhciBkZWZhdWx0RHVyYXRpb24gPSAxLjU7XG52YXIgZGVmYXVsdFRvcCA9IDA7XG52YXIgZGVmYXVsdEJvdHRvbSA9IDQ4O1xudmFyIGJvdHRvbSA9IDkwO1xudmFyIHBhZGRpbmcgPSAzMDtcbnZhciB3aWR0aCA9IDIwMDtcbnZhciBtZXNzYWdlSW5zdGFuY2UgPSB2b2lkIDA7XG52YXIga2V5ID0gMTtcbnZhciBjbHNQcmVmaXggPSAndS1tZXNzYWdlJztcbnZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG52YXIgcG9zaXRpb25PYmogPSB7XG4gICAgXCJ0b3BcIjoge1xuICAgICAgICBtZXNzYWdlU3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIlxuICAgICAgICB9LFxuICAgICAgICBub3RpZmljYXRpb25TdHlsZToge1xuICAgICAgICAgICAgdG9wOiBkZWZhdWx0VG9wLFxuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zaXRpb25OYW1lOiAndG9wJ1xuICAgIH0sXG4gICAgXCJib3R0b21cIjoge1xuICAgICAgICBtZXNzYWdlU3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIlxuICAgICAgICB9LFxuICAgICAgICBub3RpZmljYXRpb25TdHlsZToge1xuICAgICAgICAgICAgYm90dG9tOiBkZWZhdWx0Qm90dG9tLFxuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zaXRpb25OYW1lOiAnYm90dG9tJ1xuICAgIH0sXG4gICAgXCJ0b3BSaWdodFwiOiB7XG4gICAgICAgIG1lc3NhZ2VTdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IHdpZHRoXG4gICAgICAgIH0sXG4gICAgICAgIG5vdGlmaWNhdGlvblN0eWxlOiB7XG4gICAgICAgICAgICB0b3A6IHBhZGRpbmcsXG4gICAgICAgICAgICByaWdodDogcGFkZGluZyxcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aFxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2l0aW9uTmFtZTogJ3JpZ2h0J1xuICAgIH0sXG4gICAgXCJib3R0b21SaWdodFwiOiB7XG4gICAgICAgIG1lc3NhZ2VTdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IHdpZHRoXG4gICAgICAgIH0sXG4gICAgICAgIG5vdGlmaWNhdGlvblN0eWxlOiB7XG4gICAgICAgICAgICBib3R0b206IGJvdHRvbSxcbiAgICAgICAgICAgIHJpZ2h0OiBwYWRkaW5nLFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zaXRpb25OYW1lOiAncmlnaHQnXG4gICAgfSxcbiAgICBcInRvcExlZnRcIjoge1xuICAgICAgICBtZXNzYWdlU3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aFxuICAgICAgICB9LFxuICAgICAgICBub3RpZmljYXRpb25TdHlsZToge1xuICAgICAgICAgICAgdG9wOiBwYWRkaW5nLFxuICAgICAgICAgICAgbGVmdDogcGFkZGluZyxcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aFxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2l0aW9uTmFtZTogJ2xlZnQnXG4gICAgfSxcbiAgICBcImJvdHRvbUxlZnRcIjoge1xuICAgICAgICBtZXNzYWdlU3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aFxuICAgICAgICB9LFxuICAgICAgICBub3RpZmljYXRpb25TdHlsZToge1xuICAgICAgICAgICAgYm90dG9tOiBib3R0b20sXG4gICAgICAgICAgICBsZWZ0OiBwYWRkaW5nLFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zaXRpb25OYW1lOiAnbGVmdCdcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBnZXRNZXNzYWdlSW5zdGFuY2UoKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAndG9wJztcblxuICAgIHZhciBzdHlsZSA9IHBvc2l0aW9uT2JqW3Bvc2l0aW9uXS5ub3RpZmljYXRpb25TdHlsZTtcbiAgICBtZXNzYWdlSW5zdGFuY2UgPSBtZXNzYWdlSW5zdGFuY2UgfHwgX2JlZU5vdGlmaWNhdGlvbjJbXCJkZWZhdWx0XCJdLm5ld0luc3RhbmNlKHtcbiAgICAgICAgY2xzUHJlZml4OiBjbHNQcmVmaXgsXG4gICAgICAgIHRyYW5zaXRpb25OYW1lOiBjbHNQcmVmaXggKyAnLScgKyBwb3NpdGlvbk9ialtwb3NpdGlvbl0udHJhbnNpdGlvbk5hbWUsXG4gICAgICAgIHN0eWxlOiBzdHlsZSwgLy8g6KaG55uW5Y6f5p2l55qE5qC35byPXG4gICAgICAgIHBvc2l0aW9uOiAnJ1xuICAgIH0pO1xuICAgIHJldHVybiBtZXNzYWdlSW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIG5vdGljZShjb250ZW50LCBkdXJhdGlvbiwgdHlwZSwgb25DbG9zZSwgcG9zaXRpb24pIHtcbiAgICB2YXIgaWNvblR5cGUgPSB7XG4gICAgICAgIGluZm86ICd1ZiB1Zi1pLWMtMicsXG4gICAgICAgIHN1Y2Nlc3M6ICd1ZiB1Zi1jb3JyZWN0JyxcbiAgICAgICAgZGFuZ2VyOiAndWYgdWYtY2xvc2UtYycsXG4gICAgICAgIHdhcm5pbmc6ICd1ZiB1Zi1leGMtdCcsXG4gICAgICAgIGxpZ2h0OiAndWYgdWYtbm90aWZpY2F0aW9uJyxcbiAgICAgICAgZGFyazogJ3VmIHVmLWJ1YmJsZScsXG4gICAgICAgIG5ld3M6ICd1ZiB1Zi1iZWxsJyxcbiAgICAgICAgaW5mb2xpZ2h0OiAndWYgdWYtaS1jLTInLFxuICAgICAgICBzdWNjZXNzbGlnaHQ6ICd1ZiB1Zi1jb3JyZWN0JyxcbiAgICAgICAgZGFuZ2VybGlnaHQ6ICd1ZiB1Zi1jbG9zZS1jJyxcbiAgICAgICAgd2FybmluZ2xpZ2h0OiAndWYgdWYtZXhjLXQnXG4gICAgfVt0eXBlXTtcblxuICAgIHZhciBzdHlsZSA9IHBvc2l0aW9uT2JqW3Bvc2l0aW9uXS5tZXNzYWdlU3R5bGU7XG5cbiAgICB2YXIgaW5zdGFuY2UgPSBnZXRNZXNzYWdlSW5zdGFuY2UocG9zaXRpb24pO1xuXG4gICAgaW5zdGFuY2Uubm90aWNlKHtcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgY29sb3I6IHR5cGUsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgY29udGVudDogX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICdkaXYnLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgICAgICAgeyBjbGFzc05hbWU6IGNsc1ByZWZpeCArICctbm90aWNlLWRlc2NyaXB0aW9uLWljb24nIH0sXG4gICAgICAgICAgICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudCgnaScsIHsgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyW1wiZGVmYXVsdFwiXSkoaWNvblR5cGUpIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogY2xzUHJlZml4ICsgJy1ub3RpY2UtZGVzY3JpcHRpb24tY29udGVudCcgfSxcbiAgICAgICAgICAgICAgICBjb250ZW50XG4gICAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIG9uQ2xvc2U6IG9uQ2xvc2VcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0ga2V5Kys7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5yZW1vdmVOb3RpY2UodGFyZ2V0KTtcbiAgICAgICAgfTtcbiAgICB9KCk7XG59XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0ge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKG9iaikge1xuICAgICAgICB2YXIgY29udGVudCA9IG9iai5jb250ZW50IHx8ICcnO1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBfdHlwZW9mKG9iai5kdXJhdGlvbikgPT0gdW5kZWZpbmVkID8gZGVmYXVsdER1cmF0aW9uIDogb2JqLmR1cmF0aW9uO1xuICAgICAgICB2YXIgY29sb3IgPSBvYmouY29sb3IgfHwgJ2RhcmsnO1xuICAgICAgICB2YXIgb25DbG9zZSA9IG9iai5vbkNsb3NlIHx8IG5vb3A7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IG9iai5wb3NpdGlvbiB8fCBcInRvcFwiO1xuICAgICAgICByZXR1cm4gbm90aWNlKGNvbnRlbnQsIGR1cmF0aW9uLCBjb2xvciwgb25DbG9zZSwgcG9zaXRpb24pO1xuICAgIH0sXG4gICAgY29uZmlnOiBmdW5jdGlvbiBjb25maWcob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucy50b3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVmYXVsdFRvcCA9IG9wdGlvbnMudG9wO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmR1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlZmF1bHREdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuY2xzUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsc1ByZWZpeCA9IG9wdGlvbnMuY2xzUHJlZml4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmRlZmF1bHRCb3R0b20gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVmYXVsdEJvdHRvbSA9IG9wdGlvbnMuZGVmYXVsdEJvdHRvbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5ib3R0b20gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYm90dG9tID0gb3B0aW9ucy5ib3R0b207XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMud2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYm90dG9tID0gb3B0aW9ucy53aWR0aDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2VJbnN0YW5jZSkge1xuICAgICAgICAgICAgbWVzc2FnZUluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIG1lc3NhZ2VJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1tZXNzYWdlL2J1aWxkL01lc3NhZ2UuanNcbi8vIG1vZHVsZSBpZCA9IDgwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9Ob3RpZmljYXRpb24gPSByZXF1aXJlKCcuL05vdGlmaWNhdGlvbicpO1xuXG52YXIgX05vdGlmaWNhdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob3RpZmljYXRpb24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfTm90aWZpY2F0aW9uMltcImRlZmF1bHRcIl07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLW5vdGlmaWNhdGlvbi9idWlsZC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gODFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfYmVlQW5pbWF0ZSA9IHJlcXVpcmUoJ2JlZS1hbmltYXRlJyk7XG5cbnZhciBfYmVlQW5pbWF0ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iZWVBbmltYXRlKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24gPSByZXF1aXJlKCd0aW5wZXItYmVlLWNvcmUvbGliL2NyZWF0ZUNoYWluZWRGdW5jdGlvbicpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24pO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9Ob3RpY2UgPSByZXF1aXJlKCcuL05vdGljZScpO1xuXG52YXIgX05vdGljZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ob3RpY2UpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgndGlucGVyLWJlZS1jb3JlL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogX2RlZmF1bHRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG52YXIgc2VlZCA9IDA7XG52YXIgbm93ID0gRGF0ZS5ub3coKTtcblxuZnVuY3Rpb24gZ2V0VXVpZCgpIHtcbiAgcmV0dXJuICd1Tm90aWZpY2F0aW9uXycgKyBub3cgKyAnXycgKyBzZWVkKys7XG59XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIHNob3c6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgY2xzUHJlZml4OiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgc3R5bGU6IF9yZWFjdC5Qcm9wVHlwZXMub2JqZWN0LFxuICBwb3NpdGlvbjogX3JlYWN0LlByb3BUeXBlcy5vbmVPZihbJ3RvcFJpZ2h0JywgJ2JvdHRvbVJpZ2h0JywgJyddKSxcbiAgdHJhbnNpdGlvbk5hbWU6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBhbmltYXRpb246IF9yZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtfcmVhY3QuUHJvcFR5cGVzLnN0cmluZywgX3JlYWN0LlByb3BUeXBlcy5vYmplY3RdKVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY2xzUHJlZml4OiAndS1ub3RpZmljYXRpb24nLFxuICBhbmltYXRpb246ICdmYWRlJyxcbiAgcG9zaXRpb246ICd0b3BSaWdodCdcbn07XG5cbnZhciBOb3RpZmljYXRpb24gPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoTm90aWZpY2F0aW9uLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBOb3RpZmljYXRpb24ocHJvcHMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm90aWZpY2F0aW9uKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykpO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBub3RpY2VzOiBbXVxuICAgIH07XG4gICAgX3RoaXMuYWRkID0gX3RoaXMuYWRkLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLnJlbW92ZSA9IF90aGlzLnJlbW92ZS5iaW5kKF90aGlzKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuZ2V0VHJhbnNpdGlvbk5hbWUgPSBmdW5jdGlvbiBnZXRUcmFuc2l0aW9uTmFtZSgpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHZhciB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lO1xuICAgIGlmICghdHJhbnNpdGlvbk5hbWUgJiYgcHJvcHMuYW5pbWF0aW9uKSB7XG4gICAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLmNsc1ByZWZpeCArICctJyArIHByb3BzLmFuaW1hdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lO1xuICB9O1xuXG4gIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKG5vdGljZSkge1xuICAgIHZhciBrZXkgPSBub3RpY2Uua2V5ID0gbm90aWNlLmtleSB8fCBnZXRVdWlkKCk7XG4gICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldmlvdXNTdGF0ZSkge1xuICAgICAgdmFyIG5vdGljZXMgPSBwcmV2aW91c1N0YXRlLm5vdGljZXM7XG4gICAgICBpZiAoIW5vdGljZXMuZmlsdGVyKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiB2LmtleSA9PT0ga2V5O1xuICAgICAgfSkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm90aWNlczogbm90aWNlcy5jb25jYXQobm90aWNlKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKGtleSkge1xuICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZpb3VzU3RhdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5vdGljZXM6IHByZXZpb3VzU3RhdGUubm90aWNlcy5maWx0ZXIoZnVuY3Rpb24gKG5vdGljZSkge1xuICAgICAgICAgIHJldHVybiBub3RpY2Uua2V5ICE9PSBrZXk7XG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzLFxuICAgICAgICBfY2xhc3NlcztcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHZhciBjbHNQcmVmaXggPSBfcHJvcHMuY2xzUHJlZml4O1xuICAgIHZhciBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lO1xuICAgIHZhciBwb3NpdGlvbiA9IF9wcm9wcy5wb3NpdGlvbjtcbiAgICB2YXIgc3R5bGUgPSBfcHJvcHMuc3R5bGU7XG5cbiAgICB2YXIgbm90aWNlTm9kZXMgPSB0aGlzLnN0YXRlLm5vdGljZXMubWFwKGZ1bmN0aW9uIChub3RpY2UpIHtcbiAgICAgIHZhciBvbkNsb3NlID0gKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yW1wiZGVmYXVsdFwiXSkoX3RoaXMyLnJlbW92ZS5iaW5kKF90aGlzMiwgbm90aWNlLmtleSksIG5vdGljZS5vbkNsb3NlKTtcbiAgICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfTm90aWNlMltcImRlZmF1bHRcIl0sXG4gICAgICAgIF9leHRlbmRzKHtcbiAgICAgICAgICBjbHNQcmVmaXg6IGNsc1ByZWZpeFxuICAgICAgICB9LCBub3RpY2UsIHtcbiAgICAgICAgICBvbkNsb3NlOiBvbkNsb3NlXG4gICAgICAgIH0pLFxuICAgICAgICBub3RpY2UuY29udGVudFxuICAgICAgKTtcbiAgICB9KTtcbiAgICB2YXIgY2xhc3NlcyA9IChfY2xhc3NlcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzZXMsIGNsc1ByZWZpeCwgMSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NlcywgY2xhc3NOYW1lLCAhIWNsYXNzTmFtZSksIF9jbGFzc2VzKTtcbiAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgIGNsYXNzZXNbY2xzUHJlZml4ICsgJy0nICsgcG9zaXRpb25dID0gISFwb3NpdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgeyBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShjbGFzc05hbWUsIGNsYXNzZXMpLCBzdHlsZTogc3R5bGUgfSxcbiAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9iZWVBbmltYXRlMltcImRlZmF1bHRcIl0sXG4gICAgICAgIHsgdHJhbnNpdGlvbk5hbWU6IHRoaXMuZ2V0VHJhbnNpdGlvbk5hbWUoKSB9LFxuICAgICAgICBub3RpY2VOb2Rlc1xuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIE5vdGlmaWNhdGlvbjtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbjtcblxuTm90aWZpY2F0aW9uLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbk5vdGlmaWNhdGlvbi5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbk5vdGlmaWNhdGlvbi5uZXdJbnN0YW5jZSA9IGZ1bmN0aW9uIG5ld05vdGlmaWNhdGlvbkluc3RhbmNlKHByb3BlcnRpZXMpIHtcbiAgdmFyIHByb3BzID0gcHJvcGVydGllcyB8fCB7fTtcbiAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gIHZhciBub3RpZmljYXRpb24gPSBfcmVhY3REb20yW1wiZGVmYXVsdFwiXS5yZW5kZXIoX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChOb3RpZmljYXRpb24sIHByb3BzKSwgZGl2KTtcbiAgcmV0dXJuIHtcbiAgICBub3RpY2U6IGZ1bmN0aW9uIG5vdGljZShub3RpY2VQcm9wcykge1xuICAgICAgbm90aWZpY2F0aW9uLmFkZChub3RpY2VQcm9wcyk7XG4gICAgfSxcbiAgICByZW1vdmVOb3RpY2U6IGZ1bmN0aW9uIHJlbW92ZU5vdGljZShrZXkpIHtcbiAgICAgIG5vdGlmaWNhdGlvbi5yZW1vdmUoa2V5KTtcbiAgICB9LFxuXG4gICAgY29tcG9uZW50OiBub3RpZmljYXRpb24sXG4gICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIF9yZWFjdERvbTJbXCJkZWZhdWx0XCJdLnVubW91bnRDb21wb25lbnRBdE5vZGUoZGl2KTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGl2KTtcbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IE5vdGlmaWNhdGlvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtbm90aWZpY2F0aW9uL2J1aWxkL05vdGlmaWNhdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gODJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX0FuaW1hdGUgPSByZXF1aXJlKCcuL0FuaW1hdGUnKTtcblxudmFyIF9BbmltYXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FuaW1hdGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfQW5pbWF0ZTJbXCJkZWZhdWx0XCJdO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1hbmltYXRlL2J1aWxkL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA4M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9DaGlsZHJlblV0aWxzID0gcmVxdWlyZSgnLi9DaGlsZHJlblV0aWxzJyk7XG5cbnZhciBfQW5pbWF0ZUNoaWxkID0gcmVxdWlyZSgnLi9BbmltYXRlQ2hpbGQnKTtcblxudmFyIF9BbmltYXRlQ2hpbGQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQW5pbWF0ZUNoaWxkKTtcblxudmFyIF91dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogX2RlZmF1bHRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG52YXIgZGVmYXVsdEtleSA9ICd1X2FuaW1hdGVfJyArIERhdGUubm93KCk7XG5cblxuZnVuY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tUHJvcHMocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gIGlmIChfcmVhY3QyW1wiZGVmYXVsdFwiXS5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICBpZiAoIWNoaWxkcmVuLmtleSkge1xuICAgICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNsb25lRWxlbWVudChjaGlsZHJlbiwge1xuICAgICAgICBrZXk6IGRlZmF1bHRLZXlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb21wb25lbnQ6IF9yZWFjdC5Qcm9wVHlwZXMuYW55LFxuICBhbmltYXRpb246IF9yZWFjdC5Qcm9wVHlwZXMub2JqZWN0LFxuICB0cmFuc2l0aW9uTmFtZTogX3JlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW19yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLCBfcmVhY3QuUHJvcFR5cGVzLm9iamVjdF0pLFxuICB0cmFuc2l0aW9uRW50ZXI6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgdHJhbnNpdGlvbkFwcGVhcjogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICBleGNsdXNpdmU6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgdHJhbnNpdGlvbkxlYXZlOiBfcmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIG9uRW5kOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRW50ZXI6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25MZWF2ZTogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvbkFwcGVhcjogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBzaG93UHJvcDogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmdcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGFuaW1hdGlvbjoge30sXG4gIGNvbXBvbmVudDogJ3NwYW4nLFxuICB0cmFuc2l0aW9uRW50ZXI6IHRydWUsXG4gIHRyYW5zaXRpb25MZWF2ZTogdHJ1ZSxcbiAgdHJhbnNpdGlvbkFwcGVhcjogZmFsc2UsXG4gIG9uRW5kOiBub29wLFxuICBvbkVudGVyOiBub29wLFxuICBvbkxlYXZlOiBub29wLFxuICBvbkFwcGVhcjogbm9vcFxufTtcblxudmFyIEFuaW1hdGUgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQW5pbWF0ZSwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQW5pbWF0ZShwcm9wcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmltYXRlKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykpO1xuXG4gICAgX3RoaXMuY3VycmVudGx5QW5pbWF0aW5nS2V5cyA9IHt9O1xuICAgIF90aGlzLmtleXNUb0VudGVyID0gW107XG4gICAgX3RoaXMua2V5c1RvTGVhdmUgPSBbXTtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNoaWxkcmVuOiAoMCwgX0NoaWxkcmVuVXRpbHMudG9BcnJheUNoaWxkcmVuKShnZXRDaGlsZHJlbkZyb21Qcm9wcyhfdGhpcy5wcm9wcykpXG4gICAgfTtcblxuICAgIF90aGlzLnBlcmZvcm1FbnRlciA9IF90aGlzLnBlcmZvcm1FbnRlci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5wZXJmb3JtQXBwZWFyID0gX3RoaXMucGVyZm9ybUFwcGVhci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVEb25lQWRkaW5nID0gX3RoaXMuaGFuZGxlRG9uZUFkZGluZy5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5wZXJmb3JtTGVhdmUgPSBfdGhpcy5wZXJmb3JtTGVhdmUuYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5wZXJmb3JtTGVhdmUgPSBfdGhpcy5wZXJmb3JtTGVhdmUuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlRG9uZUxlYXZpbmcgPSBfdGhpcy5oYW5kbGVEb25lTGVhdmluZy5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5pc1ZhbGlkQ2hpbGRCeUtleSA9IF90aGlzLmlzVmFsaWRDaGlsZEJ5S2V5LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLnN0b3AgPSBfdGhpcy5zdG9wLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIEFuaW1hdGUucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgIHZhciBzaG93UHJvcCA9IHRoaXMucHJvcHMuc2hvd1Byb3A7XG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5zdGF0ZS5jaGlsZHJlbjtcbiAgICBpZiAoc2hvd1Byb3ApIHtcbiAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gISFjaGlsZC5wcm9wc1tzaG93UHJvcF07XG4gICAgICB9KTtcbiAgICB9XG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICBfdGhpczIucGVyZm9ybUFwcGVhcihjaGlsZC5rZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIEFuaW1hdGUucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gIH07XG5cbiAgQW5pbWF0ZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB0aGlzLm5leHRQcm9wcyA9IG5leHRQcm9wcztcbiAgICB2YXIgbmV4dENoaWxkcmVuID0gKDAsIF9DaGlsZHJlblV0aWxzLnRvQXJyYXlDaGlsZHJlbikoZ2V0Q2hpbGRyZW5Gcm9tUHJvcHMobmV4dFByb3BzKSk7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAvLyBleGNsdXNpdmUgbmVlZHMgaW1tZWRpYXRlIHJlc3BvbnNlXG4gICAgaWYgKHByb3BzLmV4Y2x1c2l2ZSkge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5jdXJyZW50bHlBbmltYXRpbmdLZXlzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX3RoaXMzLnN0b3Aoa2V5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgc2hvd1Byb3AgPSBwcm9wcy5zaG93UHJvcDtcbiAgICB2YXIgY3VycmVudGx5QW5pbWF0aW5nS2V5cyA9IHRoaXMuY3VycmVudGx5QW5pbWF0aW5nS2V5cztcbiAgICAvLyBsYXN0IHByb3BzIGNoaWxkcmVuIGlmIGV4Y2x1c2l2ZVxuICAgIHZhciBjdXJyZW50Q2hpbGRyZW4gPSBwcm9wcy5leGNsdXNpdmUgPyAoMCwgX0NoaWxkcmVuVXRpbHMudG9BcnJheUNoaWxkcmVuKShnZXRDaGlsZHJlbkZyb21Qcm9wcyhwcm9wcykpIDogdGhpcy5zdGF0ZS5jaGlsZHJlbjtcbiAgICAvLyBpbiBjYXNlIGRlc3Ryb3kgaW4gc2hvd1Byb3AgbW9kZVxuICAgIHZhciBuZXdDaGlsZHJlbiA9IFtdO1xuICAgIGlmIChzaG93UHJvcCkge1xuICAgICAgY3VycmVudENoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGN1cnJlbnRDaGlsZCkge1xuICAgICAgICB2YXIgbmV4dENoaWxkID0gY3VycmVudENoaWxkICYmICgwLCBfQ2hpbGRyZW5VdGlscy5maW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXkpKG5leHRDaGlsZHJlbiwgY3VycmVudENoaWxkLmtleSk7XG4gICAgICAgIHZhciBuZXdDaGlsZCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKCghbmV4dENoaWxkIHx8ICFuZXh0Q2hpbGQucHJvcHNbc2hvd1Byb3BdKSAmJiBjdXJyZW50Q2hpbGQucHJvcHNbc2hvd1Byb3BdKSB7XG4gICAgICAgICAgbmV3Q2hpbGQgPSBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jbG9uZUVsZW1lbnQobmV4dENoaWxkIHx8IGN1cnJlbnRDaGlsZCwgX2RlZmluZVByb3BlcnR5KHt9LCBzaG93UHJvcCwgdHJ1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0NoaWxkID0gbmV4dENoaWxkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdDaGlsZCkge1xuICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2gobmV3Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG5leHRDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChuZXh0Q2hpbGQpIHtcbiAgICAgICAgaWYgKCFuZXh0Q2hpbGQgfHwgISgwLCBfQ2hpbGRyZW5VdGlscy5maW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXkpKGN1cnJlbnRDaGlsZHJlbiwgbmV4dENoaWxkLmtleSkpIHtcbiAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKG5leHRDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdDaGlsZHJlbiA9ICgwLCBfQ2hpbGRyZW5VdGlscy5tZXJnZUNoaWxkcmVuKShjdXJyZW50Q2hpbGRyZW4sIG5leHRDaGlsZHJlbik7XG4gICAgfVxuXG4gICAgLy8gbmVlZCByZW5kZXIgdG8gYXZvaWQgdXBkYXRlXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBjaGlsZHJlbjogbmV3Q2hpbGRyZW5cbiAgICB9KTtcblxuICAgIG5leHRDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgdmFyIGtleSA9IGNoaWxkICYmIGNoaWxkLmtleTtcbiAgICAgIGlmIChjaGlsZCAmJiBjdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGhhc1ByZXYgPSBjaGlsZCAmJiAoMCwgX0NoaWxkcmVuVXRpbHMuZmluZENoaWxkSW5DaGlsZHJlbkJ5S2V5KShjdXJyZW50Q2hpbGRyZW4sIGtleSk7XG4gICAgICBpZiAoc2hvd1Byb3ApIHtcbiAgICAgICAgdmFyIHNob3dJbk5leHQgPSBjaGlsZC5wcm9wc1tzaG93UHJvcF07XG4gICAgICAgIGlmIChoYXNQcmV2KSB7XG4gICAgICAgICAgdmFyIHNob3dJbk5vdyA9ICgwLCBfQ2hpbGRyZW5VdGlscy5maW5kU2hvd25DaGlsZEluQ2hpbGRyZW5CeUtleSkoY3VycmVudENoaWxkcmVuLCBrZXksIHNob3dQcm9wKTtcbiAgICAgICAgICBpZiAoIXNob3dJbk5vdyAmJiBzaG93SW5OZXh0KSB7XG4gICAgICAgICAgICBfdGhpczMua2V5c1RvRW50ZXIucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaG93SW5OZXh0KSB7XG4gICAgICAgICAgX3RoaXMzLmtleXNUb0VudGVyLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaGFzUHJldikge1xuICAgICAgICBfdGhpczMua2V5c1RvRW50ZXIucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY3VycmVudENoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICB2YXIga2V5ID0gY2hpbGQgJiYgY2hpbGQua2V5O1xuICAgICAgaWYgKGNoaWxkICYmIGN1cnJlbnRseUFuaW1hdGluZ0tleXNba2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaGFzTmV4dCA9IGNoaWxkICYmICgwLCBfQ2hpbGRyZW5VdGlscy5maW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXkpKG5leHRDaGlsZHJlbiwga2V5KTtcbiAgICAgIGlmIChzaG93UHJvcCkge1xuICAgICAgICB2YXIgc2hvd0luTm93ID0gY2hpbGQucHJvcHNbc2hvd1Byb3BdO1xuICAgICAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgICAgIHZhciBzaG93SW5OZXh0ID0gKDAsIF9DaGlsZHJlblV0aWxzLmZpbmRTaG93bkNoaWxkSW5DaGlsZHJlbkJ5S2V5KShuZXh0Q2hpbGRyZW4sIGtleSwgc2hvd1Byb3ApO1xuICAgICAgICAgIGlmICghc2hvd0luTmV4dCAmJiBzaG93SW5Ob3cpIHtcbiAgICAgICAgICAgIF90aGlzMy5rZXlzVG9MZWF2ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNob3dJbk5vdykge1xuICAgICAgICAgIF90aGlzMy5rZXlzVG9MZWF2ZS5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWhhc05leHQpIHtcbiAgICAgICAgX3RoaXMzLmtleXNUb0xlYXZlLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBBbmltYXRlLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgdmFyIGtleXNUb0VudGVyID0gdGhpcy5rZXlzVG9FbnRlcjtcbiAgICB0aGlzLmtleXNUb0VudGVyID0gW107XG4gICAga2V5c1RvRW50ZXIuZm9yRWFjaCh0aGlzLnBlcmZvcm1FbnRlcik7XG4gICAgdmFyIGtleXNUb0xlYXZlID0gdGhpcy5rZXlzVG9MZWF2ZTtcbiAgICB0aGlzLmtleXNUb0xlYXZlID0gW107XG4gICAga2V5c1RvTGVhdmUuZm9yRWFjaCh0aGlzLnBlcmZvcm1MZWF2ZSk7XG4gIH07XG5cbiAgQW5pbWF0ZS5wcm90b3R5cGUucGVyZm9ybUVudGVyID0gZnVuY3Rpb24gcGVyZm9ybUVudGVyKGtleSkge1xuICAgIC8vIG1heSBhbHJlYWR5IHJlbW92ZSBieSBleGNsdXNpdmVcbiAgICBpZiAodGhpcy5yZWZzW2tleV0pIHtcbiAgICAgIHRoaXMuY3VycmVudGx5QW5pbWF0aW5nS2V5c1trZXldID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVmc1trZXldLmNvbXBvbmVudFdpbGxFbnRlcih0aGlzLmhhbmRsZURvbmVBZGRpbmcuYmluZCh0aGlzLCBrZXksICdlbnRlcicpKTtcbiAgICB9XG4gIH07XG5cbiAgQW5pbWF0ZS5wcm90b3R5cGUucGVyZm9ybUFwcGVhciA9IGZ1bmN0aW9uIHBlcmZvcm1BcHBlYXIoa2V5KSB7XG4gICAgaWYgKHRoaXMucmVmc1trZXldKSB7XG4gICAgICB0aGlzLmN1cnJlbnRseUFuaW1hdGluZ0tleXNba2V5XSA9IHRydWU7XG4gICAgICB0aGlzLnJlZnNba2V5XS5jb21wb25lbnRXaWxsQXBwZWFyKHRoaXMuaGFuZGxlRG9uZUFkZGluZy5iaW5kKHRoaXMsIGtleSwgJ2FwcGVhcicpKTtcbiAgICB9XG4gIH07XG5cbiAgQW5pbWF0ZS5wcm90b3R5cGUuaGFuZGxlRG9uZUFkZGluZyA9IGZ1bmN0aW9uIGhhbmRsZURvbmVBZGRpbmcoa2V5LCB0eXBlKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICBkZWxldGUgdGhpcy5jdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV07XG4gICAgLy8gaWYgdXBkYXRlIG9uIGV4Y2x1c2l2ZSBtb2RlLCBza2lwIGNoZWNrXG4gICAgaWYgKHByb3BzLmV4Y2x1c2l2ZSAmJiBwcm9wcyAhPT0gdGhpcy5uZXh0UHJvcHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGN1cnJlbnRDaGlsZHJlbiA9ICgwLCBfQ2hpbGRyZW5VdGlscy50b0FycmF5Q2hpbGRyZW4pKGdldENoaWxkcmVuRnJvbVByb3BzKHByb3BzKSk7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRDaGlsZEJ5S2V5KGN1cnJlbnRDaGlsZHJlbiwga2V5KSkge1xuICAgICAgLy8gZXhjbHVzaXZlIHdpbGwgbm90IG5lZWQgdGhpc1xuICAgICAgdGhpcy5wZXJmb3JtTGVhdmUoa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGUgPT09ICdhcHBlYXInKSB7XG4gICAgICAgIGlmIChfdXRpbDJbXCJkZWZhdWx0XCJdLmFsbG93QXBwZWFyQ2FsbGJhY2socHJvcHMpKSB7XG4gICAgICAgICAgcHJvcHMub25BcHBlYXIoa2V5KTtcbiAgICAgICAgICBwcm9wcy5vbkVuZChrZXksIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoX3V0aWwyW1wiZGVmYXVsdFwiXS5hbGxvd0VudGVyQ2FsbGJhY2socHJvcHMpKSB7XG4gICAgICAgICAgcHJvcHMub25FbnRlcihrZXkpO1xuICAgICAgICAgIHByb3BzLm9uRW5kKGtleSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgQW5pbWF0ZS5wcm90b3R5cGUucGVyZm9ybUxlYXZlID0gZnVuY3Rpb24gcGVyZm9ybUxlYXZlKGtleSkge1xuICAgIC8vIG1heSBhbHJlYWR5IHJlbW92ZSBieSBleGNsdXNpdmVcbiAgICBpZiAodGhpcy5yZWZzW2tleV0pIHtcbiAgICAgIHRoaXMuY3VycmVudGx5QW5pbWF0aW5nS2V5c1trZXldID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVmc1trZXldLmNvbXBvbmVudFdpbGxMZWF2ZSh0aGlzLmhhbmRsZURvbmVMZWF2aW5nLmJpbmQodGhpcywga2V5KSk7XG4gICAgfVxuICB9O1xuXG4gIEFuaW1hdGUucHJvdG90eXBlLmhhbmRsZURvbmVMZWF2aW5nID0gZnVuY3Rpb24gaGFuZGxlRG9uZUxlYXZpbmcoa2V5KSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICBkZWxldGUgdGhpcy5jdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV07XG4gICAgLy8gaWYgdXBkYXRlIG9uIGV4Y2x1c2l2ZSBtb2RlLCBza2lwIGNoZWNrXG4gICAgaWYgKHByb3BzLmV4Y2x1c2l2ZSAmJiBwcm9wcyAhPT0gdGhpcy5uZXh0UHJvcHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGN1cnJlbnRDaGlsZHJlbiA9ICgwLCBfQ2hpbGRyZW5VdGlscy50b0FycmF5Q2hpbGRyZW4pKGdldENoaWxkcmVuRnJvbVByb3BzKHByb3BzKSk7XG4gICAgLy8gaW4gY2FzZSBzdGF0ZSBjaGFuZ2UgaXMgdG9vIGZhc3RcbiAgICBpZiAodGhpcy5pc1ZhbGlkQ2hpbGRCeUtleShjdXJyZW50Q2hpbGRyZW4sIGtleSkpIHtcbiAgICAgIHRoaXMucGVyZm9ybUVudGVyKGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlbmQgPSBmdW5jdGlvbiBlbmQoKSB7XG4gICAgICAgIGlmIChfdXRpbDJbXCJkZWZhdWx0XCJdLmFsbG93TGVhdmVDYWxsYmFjayhwcm9wcykpIHtcbiAgICAgICAgICBwcm9wcy5vbkxlYXZlKGtleSk7XG4gICAgICAgICAgcHJvcHMub25FbmQoa2V5LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKiBlc2xpbnQgcmVhY3Qvbm8taXMtbW91bnRlZDowICovXG4gICAgICBpZiAodGhpcy5tb3VudGVkICYmICEoMCwgX0NoaWxkcmVuVXRpbHMuaXNTYW1lQ2hpbGRyZW4pKHRoaXMuc3RhdGUuY2hpbGRyZW4sIGN1cnJlbnRDaGlsZHJlbiwgcHJvcHMuc2hvd1Byb3ApKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGNoaWxkcmVuOiBjdXJyZW50Q2hpbGRyZW5cbiAgICAgICAgfSwgZW5kKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBBbmltYXRlLnByb3RvdHlwZS5pc1ZhbGlkQ2hpbGRCeUtleSA9IGZ1bmN0aW9uIGlzVmFsaWRDaGlsZEJ5S2V5KGN1cnJlbnRDaGlsZHJlbiwga2V5KSB7XG4gICAgdmFyIHNob3dQcm9wID0gdGhpcy5wcm9wcy5zaG93UHJvcDtcbiAgICBpZiAoc2hvd1Byb3ApIHtcbiAgICAgIHJldHVybiAoMCwgX0NoaWxkcmVuVXRpbHMuZmluZFNob3duQ2hpbGRJbkNoaWxkcmVuQnlLZXkpKGN1cnJlbnRDaGlsZHJlbiwga2V5LCBzaG93UHJvcCk7XG4gICAgfVxuICAgIHJldHVybiAoMCwgX0NoaWxkcmVuVXRpbHMuZmluZENoaWxkSW5DaGlsZHJlbkJ5S2V5KShjdXJyZW50Q2hpbGRyZW4sIGtleSk7XG4gIH07XG5cbiAgQW5pbWF0ZS5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uIHN0b3Aoa2V5KSB7XG4gICAgZGVsZXRlIHRoaXMuY3VycmVudGx5QW5pbWF0aW5nS2V5c1trZXldO1xuICAgIHZhciBjb21wb25lbnQgPSB0aGlzLnJlZnNba2V5XTtcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBjb21wb25lbnQuc3RvcCgpO1xuICAgIH1cbiAgfTtcblxuICBBbmltYXRlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB0aGlzLm5leHRQcm9wcyA9IHByb3BzO1xuICAgIHZhciBzdGF0ZUNoaWxkcmVuID0gdGhpcy5zdGF0ZS5jaGlsZHJlbjtcbiAgICB2YXIgY2hpbGRyZW4gPSBudWxsO1xuICAgIGlmIChzdGF0ZUNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbiA9IHN0YXRlQ2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoaWxkLmtleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzZXQga2V5IGZvciA8cmMtYW5pbWF0ZT4gY2hpbGRyZW4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBfQW5pbWF0ZUNoaWxkMltcImRlZmF1bHRcIl0sXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiBjaGlsZC5rZXksXG4gICAgICAgICAgICByZWY6IGNoaWxkLmtleSxcbiAgICAgICAgICAgIGFuaW1hdGlvbjogcHJvcHMuYW5pbWF0aW9uLFxuICAgICAgICAgICAgdHJhbnNpdGlvbk5hbWU6IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkVudGVyOiBwcm9wcy50cmFuc2l0aW9uRW50ZXIsXG4gICAgICAgICAgICB0cmFuc2l0aW9uQXBwZWFyOiBwcm9wcy50cmFuc2l0aW9uQXBwZWFyLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkxlYXZlOiBwcm9wcy50cmFuc2l0aW9uTGVhdmVcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIENvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudDtcbiAgICBpZiAoQ29tcG9uZW50KSB7XG4gICAgICB2YXIgcGFzc2VkUHJvcHMgPSBwcm9wcztcbiAgICAgIGlmICh0eXBlb2YgQ29tcG9uZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICBwYXNzZWRQcm9wcyA9IHtcbiAgICAgICAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICBzdHlsZTogcHJvcHMuc3R5bGVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIHBhc3NlZFByb3BzLFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuWzBdIHx8IG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIEFuaW1hdGU7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG47XG5BbmltYXRlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbkFuaW1hdGUucHJvcFR5cGVzID0gQW5pbWF0ZS5wcm9wVHlwZXM7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQW5pbWF0ZTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtYW5pbWF0ZS9idWlsZC9BbmltYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSA4NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRvQXJyYXlDaGlsZHJlbiA9IHRvQXJyYXlDaGlsZHJlbjtcbmV4cG9ydHMuZmluZENoaWxkSW5DaGlsZHJlbkJ5S2V5ID0gZmluZENoaWxkSW5DaGlsZHJlbkJ5S2V5O1xuZXhwb3J0cy5maW5kU2hvd25DaGlsZEluQ2hpbGRyZW5CeUtleSA9IGZpbmRTaG93bkNoaWxkSW5DaGlsZHJlbkJ5S2V5O1xuZXhwb3J0cy5maW5kSGlkZGVuQ2hpbGRJbkNoaWxkcmVuQnlLZXkgPSBmaW5kSGlkZGVuQ2hpbGRJbkNoaWxkcmVuQnlLZXk7XG5leHBvcnRzLmlzU2FtZUNoaWxkcmVuID0gaXNTYW1lQ2hpbGRyZW47XG5leHBvcnRzLm1lcmdlQ2hpbGRyZW4gPSBtZXJnZUNoaWxkcmVuO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiB0b0FycmF5Q2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIHJldCA9IFtdO1xuICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXQucHVzaChjaGlsZCk7XG4gIH0pO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXkoY2hpbGRyZW4sIGtleSkge1xuICB2YXIgcmV0ID0gbnVsbDtcbiAgaWYgKGNoaWxkcmVuKSB7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHJldCA9IGNoaWxkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRTaG93bkNoaWxkSW5DaGlsZHJlbkJ5S2V5KGNoaWxkcmVuLCBrZXksIHNob3dQcm9wKSB7XG4gIHZhciByZXQgPSBudWxsO1xuICBpZiAoY2hpbGRyZW4pIHtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLmtleSA9PT0ga2V5ICYmIGNoaWxkLnByb3BzW3Nob3dQcm9wXSkge1xuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0d28gY2hpbGQgd2l0aCBzYW1lIGtleSBmb3IgPHJjLWFuaW1hdGU+IGNoaWxkcmVuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0ID0gY2hpbGQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZmluZEhpZGRlbkNoaWxkSW5DaGlsZHJlbkJ5S2V5KGNoaWxkcmVuLCBrZXksIHNob3dQcm9wKSB7XG4gIHZhciBmb3VuZCA9IDA7XG4gIGlmIChjaGlsZHJlbikge1xuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm91bmQgPSBjaGlsZCAmJiBjaGlsZC5rZXkgPT09IGtleSAmJiAhY2hpbGQucHJvcHNbc2hvd1Byb3BdO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBmb3VuZDtcbn1cblxuZnVuY3Rpb24gaXNTYW1lQ2hpbGRyZW4oYzEsIGMyLCBzaG93UHJvcCkge1xuICB2YXIgc2FtZSA9IGMxLmxlbmd0aCA9PT0gYzIubGVuZ3RoO1xuICBpZiAoc2FtZSkge1xuICAgIGMxLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgICAgdmFyIGNoaWxkMiA9IGMyW2luZGV4XTtcbiAgICAgIGlmIChjaGlsZCAmJiBjaGlsZDIpIHtcbiAgICAgICAgaWYgKGNoaWxkICYmICFjaGlsZDIgfHwgIWNoaWxkICYmIGNoaWxkMikge1xuICAgICAgICAgIHNhbWUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5rZXkgIT09IGNoaWxkMi5rZXkpIHtcbiAgICAgICAgICBzYW1lID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hvd1Byb3AgJiYgY2hpbGQucHJvcHNbc2hvd1Byb3BdICE9PSBjaGlsZDIucHJvcHNbc2hvd1Byb3BdKSB7XG4gICAgICAgICAgc2FtZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHNhbWU7XG59XG5cbmZ1bmN0aW9uIG1lcmdlQ2hpbGRyZW4ocHJldiwgbmV4dCkge1xuICB2YXIgcmV0ID0gW107XG5cbiAgLy8gRm9yIGVhY2gga2V5IG9mIGBuZXh0YCwgdGhlIGxpc3Qgb2Yga2V5cyB0byBpbnNlcnQgYmVmb3JlIHRoYXQga2V5IGluXG4gIC8vIHRoZSBjb21iaW5lZCBsaXN0XG4gIHZhciBuZXh0Q2hpbGRyZW5QZW5kaW5nID0ge307XG4gIHZhciBwZW5kaW5nQ2hpbGRyZW4gPSBbXTtcbiAgcHJldi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmIChjaGlsZCAmJiBmaW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXkobmV4dCwgY2hpbGQua2V5KSkge1xuICAgICAgaWYgKHBlbmRpbmdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgbmV4dENoaWxkcmVuUGVuZGluZ1tjaGlsZC5rZXldID0gcGVuZGluZ0NoaWxkcmVuO1xuICAgICAgICBwZW5kaW5nQ2hpbGRyZW4gPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVuZGluZ0NoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfSk7XG5cbiAgbmV4dC5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmIChjaGlsZCAmJiBuZXh0Q2hpbGRyZW5QZW5kaW5nLmhhc093blByb3BlcnR5KGNoaWxkLmtleSkpIHtcbiAgICAgIHJldCA9IHJldC5jb25jYXQobmV4dENoaWxkcmVuUGVuZGluZ1tjaGlsZC5rZXldKTtcbiAgICB9XG4gICAgcmV0LnB1c2goY2hpbGQpO1xuICB9KTtcblxuICByZXQgPSByZXQuY29uY2F0KHBlbmRpbmdDaGlsZHJlbik7XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWFuaW1hdGUvYnVpbGQvQ2hpbGRyZW5VdGlscy5qc1xuLy8gbW9kdWxlIGlkID0gODVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF90aW5wZXJCZWVDb3JlID0gcmVxdWlyZSgndGlucGVyLWJlZS1jb3JlJyk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgX3V0aWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIHRyYW5zaXRpb25NYXAgPSB7XG4gIGVudGVyOiAndHJhbnNpdGlvbkVudGVyJyxcbiAgYXBwZWFyOiAndHJhbnNpdGlvbkFwcGVhcicsXG4gIGxlYXZlOiAndHJhbnNpdGlvbkxlYXZlJ1xufTtcblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IF9yZWFjdC5Qcm9wVHlwZXMuYW55XG59O1xuXG52YXIgQW5pbWF0ZUNoaWxkID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEFuaW1hdGVDaGlsZCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQW5pbWF0ZUNoaWxkKHByb3BzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFuaW1hdGVDaGlsZCk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMpKTtcblxuICAgIF90aGlzLnRyYW5zaXRpb24gPSBfdGhpcy50cmFuc2l0aW9uLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLnN0b3AgPSBfdGhpcy5zdG9wLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIEFuaW1hdGVDaGlsZC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLnN0b3AoKTtcbiAgfTtcblxuICBBbmltYXRlQ2hpbGQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxFbnRlciA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxFbnRlcihkb25lKSB7XG4gICAgaWYgKF91dGlsMltcImRlZmF1bHRcIl0uaXNFbnRlclN1cHBvcnRlZCh0aGlzLnByb3BzKSkge1xuICAgICAgdGhpcy50cmFuc2l0aW9uKCdlbnRlcicsIGRvbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb25lKCk7XG4gICAgfVxuICB9O1xuXG4gIEFuaW1hdGVDaGlsZC5wcm90b3R5cGUuY29tcG9uZW50V2lsbEFwcGVhciA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxBcHBlYXIoZG9uZSkge1xuICAgIGlmIChfdXRpbDJbXCJkZWZhdWx0XCJdLmlzQXBwZWFyU3VwcG9ydGVkKHRoaXMucHJvcHMpKSB7XG4gICAgICB0aGlzLnRyYW5zaXRpb24oJ2FwcGVhcicsIGRvbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb25lKCk7XG4gICAgfVxuICB9O1xuXG4gIEFuaW1hdGVDaGlsZC5wcm90b3R5cGUuY29tcG9uZW50V2lsbExlYXZlID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbExlYXZlKGRvbmUpIHtcbiAgICBpZiAoX3V0aWwyW1wiZGVmYXVsdFwiXS5pc0xlYXZlU3VwcG9ydGVkKHRoaXMucHJvcHMpKSB7XG4gICAgICB0aGlzLnRyYW5zaXRpb24oJ2xlYXZlJywgZG9uZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFsd2F5cyBzeW5jLCBkbyBub3QgaW50ZXJ1cHQgd2l0aCByZWFjdCBjb21wb25lbnQgbGlmZSBjeWNsZVxuICAgICAgLy8gdXBkYXRlIGhpZGRlbiAtPiBhbmltYXRlIGhpZGRlbiAtPlxuICAgICAgLy8gZGlkVXBkYXRlIC0+IGFuaW1hdGUgbGVhdmUgLT4gdW5tb3VudCAoaWYgYW5pbWF0ZSBpcyBub25lKVxuICAgICAgZG9uZSgpO1xuICAgIH1cbiAgfTtcblxuICBBbmltYXRlQ2hpbGQucHJvdG90eXBlLnRyYW5zaXRpb24gPSBmdW5jdGlvbiB0cmFuc2l0aW9uKGFuaW1hdGlvblR5cGUsIGZpbmlzaENhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgbm9kZSA9IF9yZWFjdERvbTJbXCJkZWZhdWx0XCJdLmZpbmRET01Ob2RlKHRoaXMpO1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHRyYW5zaXRpb25OYW1lID0gcHJvcHMudHJhbnNpdGlvbk5hbWU7XG4gICAgdmFyIG5hbWVJc09iaiA9ICh0eXBlb2YgdHJhbnNpdGlvbk5hbWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHRyYW5zaXRpb25OYW1lKSkgPT09ICdvYmplY3QnO1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIHZhciBlbmQgPSBmdW5jdGlvbiBlbmQoKSB7XG4gICAgICBfdGhpczIuc3RvcHBlciA9IG51bGw7XG4gICAgICBmaW5pc2hDYWxsYmFjaygpO1xuICAgIH07XG4gICAgaWYgKChfdGlucGVyQmVlQ29yZS5jc3NBbmltYXRpb24uaXNDc3NBbmltYXRpb25TdXBwb3J0ZWQgfHwgIXByb3BzLmFuaW1hdGlvblthbmltYXRpb25UeXBlXSkgJiYgdHJhbnNpdGlvbk5hbWUgJiYgcHJvcHNbdHJhbnNpdGlvbk1hcFthbmltYXRpb25UeXBlXV0pIHtcbiAgICAgIHZhciBuYW1lID0gbmFtZUlzT2JqID8gdHJhbnNpdGlvbk5hbWVbYW5pbWF0aW9uVHlwZV0gOiB0cmFuc2l0aW9uTmFtZSArICctJyArIGFuaW1hdGlvblR5cGU7XG4gICAgICB2YXIgYWN0aXZlTmFtZSA9IG5hbWUgKyAnLWFjdGl2ZSc7XG4gICAgICBpZiAobmFtZUlzT2JqICYmIHRyYW5zaXRpb25OYW1lW2FuaW1hdGlvblR5cGUgKyAnQWN0aXZlJ10pIHtcbiAgICAgICAgYWN0aXZlTmFtZSA9IHRyYW5zaXRpb25OYW1lW2FuaW1hdGlvblR5cGUgKyAnQWN0aXZlJ107XG4gICAgICB9XG4gICAgICB0aGlzLnN0b3BwZXIgPSAoMCwgX3RpbnBlckJlZUNvcmUuY3NzQW5pbWF0aW9uKShub2RlLCB7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIGFjdGl2ZTogYWN0aXZlTmFtZVxuICAgICAgfSwgZW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9wcGVyID0gcHJvcHMuYW5pbWF0aW9uW2FuaW1hdGlvblR5cGVdKG5vZGUsIGVuZCk7XG4gICAgfVxuICB9O1xuXG4gIEFuaW1hdGVDaGlsZC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgdmFyIHN0b3BwZXIgPSB0aGlzLnN0b3BwZXI7XG4gICAgaWYgKHN0b3BwZXIpIHtcbiAgICAgIHRoaXMuc3RvcHBlciA9IG51bGw7XG4gICAgICBzdG9wcGVyLnN0b3AoKTtcbiAgICB9XG4gIH07XG5cbiAgQW5pbWF0ZUNoaWxkLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gIH07XG5cbiAgcmV0dXJuIEFuaW1hdGVDaGlsZDtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbjtcblxuQW5pbWF0ZUNoaWxkLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBBbmltYXRlQ2hpbGQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWFuaW1hdGUvYnVpbGQvQW5pbWF0ZUNoaWxkLmpzXG4vLyBtb2R1bGUgaWQgPSA4NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbnZhciB1dGlsID0ge1xuICBpc0FwcGVhclN1cHBvcnRlZDogZnVuY3Rpb24gaXNBcHBlYXJTdXBwb3J0ZWQocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMudHJhbnNpdGlvbk5hbWUgJiYgcHJvcHMudHJhbnNpdGlvbkFwcGVhciB8fCBwcm9wcy5hbmltYXRpb24uYXBwZWFyO1xuICB9LFxuICBpc0VudGVyU3VwcG9ydGVkOiBmdW5jdGlvbiBpc0VudGVyU3VwcG9ydGVkKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnRyYW5zaXRpb25OYW1lICYmIHByb3BzLnRyYW5zaXRpb25FbnRlciB8fCBwcm9wcy5hbmltYXRpb24uZW50ZXI7XG4gIH0sXG4gIGlzTGVhdmVTdXBwb3J0ZWQ6IGZ1bmN0aW9uIGlzTGVhdmVTdXBwb3J0ZWQocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMudHJhbnNpdGlvbk5hbWUgJiYgcHJvcHMudHJhbnNpdGlvbkxlYXZlIHx8IHByb3BzLmFuaW1hdGlvbi5sZWF2ZTtcbiAgfSxcbiAgYWxsb3dBcHBlYXJDYWxsYmFjazogZnVuY3Rpb24gYWxsb3dBcHBlYXJDYWxsYmFjayhwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy50cmFuc2l0aW9uQXBwZWFyIHx8IHByb3BzLmFuaW1hdGlvbi5hcHBlYXI7XG4gIH0sXG4gIGFsbG93RW50ZXJDYWxsYmFjazogZnVuY3Rpb24gYWxsb3dFbnRlckNhbGxiYWNrKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnRyYW5zaXRpb25FbnRlciB8fCBwcm9wcy5hbmltYXRpb24uZW50ZXI7XG4gIH0sXG4gIGFsbG93TGVhdmVDYWxsYmFjazogZnVuY3Rpb24gYWxsb3dMZWF2ZUNhbGxiYWNrKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnRyYW5zaXRpb25MZWF2ZSB8fCBwcm9wcy5hbmltYXRpb24ubGVhdmU7XG4gIH1cbn07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHV0aWw7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtYW5pbWF0ZS9idWlsZC91dGlsLmpzXG4vLyBtb2R1bGUgaWQgPSA4N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgZHVyYXRpb246IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBvbkNsb3NlOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGNoaWxkcmVuOiBfcmVhY3QuUHJvcFR5cGVzLmFueSxcbiAgY29sb3I6IF9yZWFjdC5Qcm9wVHlwZXMub25lT2YoWydsaWdodCddKSxcbiAgdGl0bGU6IF9yZWFjdC5Qcm9wVHlwZXMuYW55XG59O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgb25FbmQ6IG5vb3AsXG4gIG9uQ2xvc2U6IG5vb3AsXG4gIGR1cmF0aW9uOiA0LjUsXG4gIGNsb3NhYmxlOiB0cnVlXG59O1xuXG52YXIgTm90aWNlID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKE5vdGljZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTm90aWNlKHByb3BzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vdGljZSk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMpKTtcblxuICAgIF90aGlzLmNsZWFyQ2xvc2VUaW1lciA9IF90aGlzLmNsZWFyQ2xvc2VUaW1lci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5jbG9zZSA9IF90aGlzLmNsb3NlLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIE5vdGljZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmICh0aGlzLnByb3BzLmR1cmF0aW9uKSB7XG4gICAgICB0aGlzLmNsb3NlVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLmNsb3NlKCk7XG4gICAgICB9LCB0aGlzLnByb3BzLmR1cmF0aW9uICogMTAwMCk7XG4gICAgfVxuICB9O1xuXG4gIE5vdGljZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLmNsZWFyQ2xvc2VUaW1lcigpO1xuICB9O1xuXG4gIE5vdGljZS5wcm90b3R5cGUuY2xlYXJDbG9zZVRpbWVyID0gZnVuY3Rpb24gY2xlYXJDbG9zZVRpbWVyKCkge1xuICAgIGlmICh0aGlzLmNsb3NlVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNsb3NlVGltZXIpO1xuICAgICAgdGhpcy5jbG9zZVRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgTm90aWNlLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIHRoaXMuY2xlYXJDbG9zZVRpbWVyKCk7XG4gICAgdGhpcy5wcm9wcy5vbkNsb3NlKCk7XG4gIH07XG5cbiAgTm90aWNlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9jbGFzc2VzO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIGNsb3NhYmxlID0gX3Byb3BzLmNsb3NhYmxlO1xuICAgIHZhciBjbHNQcmVmaXggPSBfcHJvcHMuY2xzUHJlZml4O1xuICAgIHZhciBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lO1xuICAgIHZhciBzdHlsZSA9IF9wcm9wcy5zdHlsZTtcbiAgICB2YXIgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIGNvbG9yID0gX3Byb3BzLmNvbG9yO1xuICAgIHZhciB0aXRsZSA9IF9wcm9wcy50aXRsZTtcblxuICAgIHZhciBjb21wb25lbnRDbGFzcyA9IGNsc1ByZWZpeCArICctbm90aWNlJztcbiAgICB2YXIgY2xhc3NlcyA9IChfY2xhc3NlcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzZXMsICcnICsgY29tcG9uZW50Q2xhc3MsIDEpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzZXMsIGNvbXBvbmVudENsYXNzICsgJy1jbG9zYWJsZScsIGNsb3NhYmxlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc2VzLCBjbGFzc05hbWUsICEhY2xhc3NOYW1lKSwgX2NsYXNzZXMpO1xuICAgIGlmIChjb2xvcikge1xuICAgICAgY2xhc3Nlc1tjb21wb25lbnRDbGFzcyArICctJyArIGNvbG9yXSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICB7IGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKGNsYXNzZXMpLCBzdHlsZTogc3R5bGUsIG9uQ2xpY2s6IHRoaXMuY2xvc2UgfSxcbiAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGNsYXNzTmFtZTogY29tcG9uZW50Q2xhc3MgKyAnLWNvbnRlbnQnIH0sXG4gICAgICAgIHRpdGxlICYmIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgeyBjbGFzc05hbWU6IGNvbXBvbmVudENsYXNzICsgJy10aXRsZScgfSxcbiAgICAgICAgICB0aXRsZVxuICAgICAgICApLFxuICAgICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdkaXYnLFxuICAgICAgICAgIHsgY2xhc3NOYW1lOiBjb21wb25lbnRDbGFzcyArICctZGVzY3JpcHRpb24nIH0sXG4gICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIGNsb3NhYmxlID8gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2EnLFxuICAgICAgICB7IHRhYkluZGV4OiAnMCcsIG9uQ2xpY2s6IHRoaXMuY2xvc2UsIGNsYXNzTmFtZTogY29tcG9uZW50Q2xhc3MgKyAnLWNsb3NlJyB9LFxuICAgICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KCdzcGFuJywgeyBjbGFzc05hbWU6IGNvbXBvbmVudENsYXNzICsgJy1jbG9zZS14JyB9KVxuICAgICAgKSA6IG51bGxcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBOb3RpY2U7XG59KF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNvbXBvbmVudCk7XG5cbjtcblxuTm90aWNlLlByb3BUeXBlcyA9IF9yZWFjdC5Qcm9wVHlwZXM7XG5Ob3RpY2UuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IE5vdGljZTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtbm90aWZpY2F0aW9uL2J1aWxkL05vdGljZS5qc1xuLy8gbW9kdWxlIGlkID0gODhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX0J1dHRvbiA9IHJlcXVpcmUoJy4vQnV0dG9uJyk7XG5cbnZhciBfQnV0dG9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0J1dHRvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9CdXR0b24yW1wiZGVmYXVsdFwiXTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtYnV0dG9uL2J1aWxkL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA4OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gICAgLyoqXHJcbiAgICAgKiBAdGl0bGUg5bC65a+4XHJcbiAgICAgKi9cbiAgICBzaXplOiBfcmVhY3QuUHJvcFR5cGVzLm9uZU9mKFsnc20nLCAneGcnLCAnbGcnXSksXG4gICAgLyoqXHJcbiAgICAgKiBAdGl0bGUg5qC35byPXHJcbiAgICAgKi9cbiAgICBzdHlsZTogX3JlYWN0LlByb3BUeXBlcy5vYmplY3QsXG4gICAgLyoqXHJcbiAgICAgKiBAdGl0bGUg5b2i54q2XHJcbiAgICAgKi9cbiAgICBzaGFwZTogX3JlYWN0LlByb3BUeXBlcy5vbmVPZihbJ2Jsb2NrJywgJ3JvdW5kJywgJ3NxdWFyZWQnLCAnZmxvYXRpbmcnLCAncGlsbFJpZ2h0JywgJ3BpbGxMZWZ0JywgJ2ljb24nXSksXG5cbiAgICBib3JkZXJlZDogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxyXG4gICAgKiBAdGl0bGUg57G75Z6LXHJcbiAgICAqL1xuICAgIGNvbG9yczogX3JlYWN0LlByb3BUeXBlcy5vbmVPZihbJ3ByaW1hcnknLCAnYWNjZW50JywgJ3N1Y2Nlc3MnLCAnaW5mbycsICd3YXJuaW5nJywgJ2RhbmdlcicsICdkZWZhdWx0J10pLFxuICAgIC8qKlxyXG4gICAgICogQHRpdGxlIOaYr+WQpuemgeeUqFxyXG4gICAgICogQHZlSWdub3JlXHJcbiAgICAgKi9cbiAgICBkaXNhYmxlZDogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxyXG4gICAgICogQHRpdGxlIOexu+WQjVxyXG4gICAgICogQHZlSWdub3JlXHJcbiAgICAgKi9cbiAgICBjbGFzc05hbWU6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgLyoqXHJcbiAgICAgKiBAdGl0bGUgPGJ1dHRvbj4g55qEIHR5cGVcclxuICAgICAqIEB2ZUlnbm9yZVxyXG4gICAgICovXG4gICAgaHRtbFR5cGU6IF9yZWFjdC5Qcm9wVHlwZXMub25lT2YoWydzdWJtaXQnLCAnYnV0dG9uJywgJ3Jlc2V0J10pXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBodG1sVHlwZTogJ2J1dHRvbicsXG4gICAgY2xzUHJlZml4OiAndS1idXR0b24nLFxuICAgIGJvcmRlcmVkOiBmYWxzZVxuXG59O1xuXG52YXIgc2l6ZU1hcCA9IHtcbiAgICBzbTogJ3NtJyxcbiAgICB4ZzogJ3hnJyxcbiAgICBsZzogJ2xnJ1xufSxcbiAgICBjb2xvcnNNYXAgPSB7XG4gICAgcHJpbWFyeTogJ3ByaW1hcnknLFxuICAgIGFjY2VudDogJ2FjY2VudCcsXG4gICAgc3VjY2VzczogJ3N1Y2Nlc3MnLFxuICAgIGluZm86ICdpbmZvJyxcbiAgICB3YXJuaW5nOiAnd2FybmluZycsXG4gICAgZGFuZ2VyOiAnZGFuZ2VyJ1xufSxcbiAgICBzaGFwZU1hcCA9IHtcbiAgICBibG9jazogJ2Jsb2NrJyxcbiAgICByb3VuZDogJ3JvdW5kJyxcbiAgICBzcXVhcmVkOiAnc3F1YXJlZCcsXG4gICAgZmxvYXRpbmc6ICdmbG9hdGluZycsXG4gICAgcGlsbFJpZ2h0OiAncGlsbC1yaWdodCcsXG4gICAgcGlsbExlZnQ6ICdwaWxsLWxlZnQnLFxuICAgIGljb246ICdpY29uJ1xufTtcblxudmFyIEJ1dHRvbiA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzKEJ1dHRvbiwgX0NvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBCdXR0b24ocHJvcHMpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJ1dHRvbik7XG5cbiAgICAgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykpO1xuICAgIH1cblxuICAgIEJ1dHRvbi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIGNvbG9ycyA9IF9wcm9wcy5jb2xvcnM7XG4gICAgICAgIHZhciBzaGFwZSA9IF9wcm9wcy5zaGFwZTtcbiAgICAgICAgdmFyIGRpc2FibGVkID0gX3Byb3BzLmRpc2FibGVkO1xuICAgICAgICB2YXIgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZTtcbiAgICAgICAgdmFyIHNpemUgPSBfcHJvcHMuc2l6ZTtcbiAgICAgICAgdmFyIGJvcmRlcmVkID0gX3Byb3BzLmJvcmRlcmVkO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW47XG4gICAgICAgIHZhciBodG1sVHlwZSA9IF9wcm9wcy5odG1sVHlwZTtcbiAgICAgICAgdmFyIGNsc1ByZWZpeCA9IF9wcm9wcy5jbHNQcmVmaXg7XG5cbiAgICAgICAgdmFyIG90aGVycyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMsIFsnY29sb3JzJywgJ3NoYXBlJywgJ2Rpc2FibGVkJywgJ2NsYXNzTmFtZScsICdzaXplJywgJ2JvcmRlcmVkJywgJ2NoaWxkcmVuJywgJ2h0bWxUeXBlJywgJ2Nsc1ByZWZpeCddKTtcblxuICAgICAgICB2YXIgY2xzT2JqID0ge307XG4gICAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgICAgIGNsc09ialtjbGFzc05hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2l6ZU1hcFtzaXplXSkge1xuICAgICAgICAgICAgY2xzT2JqW2Nsc1ByZWZpeCArICctJyArIHNpemVNYXBbc2l6ZV1dID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hhcGVNYXBbc2hhcGVdKSB7XG4gICAgICAgICAgICBjbHNPYmpbY2xzUHJlZml4ICsgJy0nICsgc2hhcGVNYXBbc2hhcGVdXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbG9yc01hcFtjb2xvcnNdKSB7XG4gICAgICAgICAgICBjbHNPYmpbY2xzUHJlZml4ICsgJy0nICsgY29sb3JzTWFwW2NvbG9yc11dID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjbHNPYmpbY2xzUHJlZml4ICsgJy1ib3JkZXInXSA9IGJvcmRlcmVkO1xuICAgICAgICB2YXIgY2xhc3NlcyA9ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShjbHNQcmVmaXgsIGNsc09iaik7XG4gICAgICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgJ2J1dHRvbicsXG4gICAgICAgICAgICBfZXh0ZW5kcyh7XG4gICAgICAgICAgICAgICAgdHlwZTogaHRtbFR5cGUsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZFxuICAgICAgICAgICAgfSwgb3RoZXJzKSxcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEJ1dHRvbjtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbkJ1dHRvbi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5CdXR0b24uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEJ1dHRvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtYnV0dG9uL2J1aWxkL0J1dHRvbi5qc1xuLy8gbW9kdWxlIGlkID0gOTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4qXG4qIEB0aXRsZSDluLjnlKjln7rnoYAgU3RlcFxuKiBAZGVzY3JpcHRpb24gY3VycmVudCDmoIforrDlvZPliY3mnLrlnovlk6rkuIDmraVcbipcbiovXG5cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU3RlcCBmcm9tICcuLi8uLi9zcmMnO1xuXG5jbGFzcyBEZW1vMSBleHRlbmRzIENvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxTdGVwLlN0ZXBzIGN1cnJlbnQ9ezF9PlxuICAgICAgICAgICAgPFN0ZXAgdGl0bGU9XCJGaW5pc2hlZFwiIGRlc2NyaXB0aW9uPVwiVGhpcyBpcyBhIGRlc2NyaXB0aW9uLlwiIC8+XG4gICAgICAgICAgICA8U3RlcCB0aXRsZT1cIkluIFByb2dyZXNzXCIgZGVzY3JpcHRpb249XCJUaGlzIGlzIGEgZGVzY3JpcHRpb24uXCIgLz5cbiAgICAgICAgICAgIDxTdGVwIHRpdGxlPVwiV2FpdGluZ1wiIGRlc2NyaXB0aW9uPVwiVGhpcyBpcyBhIGRlc2NyaXB0aW9uLlwiIC8+XG4gICAgICAgICAgPC9TdGVwLlN0ZXBzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERlbW8xO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGRlbW8vZGVtb2xpc3QvRGVtbzEuanMiLCIvKipcbipcbiogQHRpdGxlIOiHquWumuS5iWljb24gU3RlcFxuKiBAZGVzY3JpcHRpb25cbipcbiovXG5cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgSWNvbiBmcm9tICdiZWUtaWNvbic7XG5pbXBvcnQgU3RlcCBmcm9tICcuLi8uLi9zcmMnO1xuXG5jbGFzcyBEZW1vMiBleHRlbmRzIENvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3RlcC5TdGVwcz5cbiAgICAgICAgICA8U3RlcCBzdGF0dXM9XCJmaW5pc2hcIiB0aXRsZT1cIkxvZ2luXCIgaWNvbj17PEljb24gdHlwZT1cInVmLXVzZXJzLW9cIiAvPn0gLz5cbiAgICAgICAgICA8U3RlcCBzdGF0dXM9XCJmaW5pc2hcIiB0aXRsZT1cIlZlcmlmaWNhdGlvblwiIGljb249ezxJY29uIHR5cGU9XCJ1Zi1wZXJzb25pbi1vXCIgLz59IC8+XG4gICAgICAgICAgPFN0ZXAgc3RhdHVzPVwicHJvY2Vzc1wiIHRpdGxlPVwiUGF5XCIgaWNvbj17PEljb24gdHlwZT1cInVmLWNyZWRpdGNhcmRcIiAvPn0gLz5cbiAgICAgICAgICA8U3RlcCBzdGF0dXM9XCJ3YWl0XCIgdGl0bGU9XCJEb25lXCIgaWNvbj17PEljb24gdHlwZT1cInVmLWNvcnJlY3QtMlwiIC8+fSAvPlxuICAgICAgICA8L1N0ZXAuU3RlcHM+XG4gICAgICApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGVtbzI7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGRlbW8vZGVtb2xpc3QvRGVtbzIuanMiLCJcbi8qKlxuKlxuKiBAdGl0bGUg57uT5ZCI5YiH5o2i5LqL5Lu255qEIFN0ZXBcbiogQGRlc2NyaXB0aW9uIOeCueWHu25leHTvvIxTdGVw55qE5rWB56iL6Lef6L+bXG4qXG4qL1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBJY29uIGZyb20gJ2JlZS1pY29uJztcbmltcG9ydCBNZXNzYWdlIGZyb20gJ2JlZS1tZXNzYWdlJztcbmltcG9ydCBCdXR0b24gZnJvbSAnYmVlLWJ1dHRvbic7XG5pbXBvcnQgU3RlcCBmcm9tICcuLi8uLi9zcmMnO1xuXG5jb25zdCBTdGVwcyA9IFN0ZXAuU3RlcHM7XG5cbmNvbnN0IHN0ZXBzID0gW3tcbiAgdGl0bGU6ICdGaXJzdCcsXG4gIGNvbnRlbnQ6ICdGaXJzdC1jb250ZW50Jyxcbn0sIHtcbiAgdGl0bGU6ICdTZWNvbmQnLFxuICBjb250ZW50OiAnU2Vjb25kLWNvbnRlbnQnLFxufSwge1xuICB0aXRsZTogJ0xhc3QnLFxuICBjb250ZW50OiAnTGFzdC1jb250ZW50Jyxcbn1dO1xuXG5jbGFzcyBEZW1vMyBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBjdXJyZW50OiAwLFxuICAgIH07XG4gIH1cbiAgbmV4dCgpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zdGF0ZS5jdXJyZW50ICsgMTtcbiAgICB0aGlzLnNldFN0YXRlKHsgY3VycmVudCB9KTtcbiAgfVxuICBwcmV2KCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnN0YXRlLmN1cnJlbnQgLSAxO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBjdXJyZW50IH0pO1xuICB9XG5cbiAgYWxlcnREb25lKCkge1xuICAgIE1lc3NhZ2UuY3JlYXRlKHtjb250ZW50OiAnZG9uZScsIGNvbG9yOiAnaW5mbyd9KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGN1cnJlbnQgfSA9IHRoaXMuc3RhdGU7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxTdGVwcyBjdXJyZW50PXtjdXJyZW50fT5cbiAgICAgICAgICB7c3RlcHMubWFwKGl0ZW0gPT4gPFN0ZXAga2V5PXtpdGVtLnRpdGxlfSB0aXRsZT17aXRlbS50aXRsZX0gLz4pfVxuICAgICAgICA8L1N0ZXBzPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInN0ZXBzLWNvbnRlbnRcIj57c3RlcHNbdGhpcy5zdGF0ZS5jdXJyZW50XS5jb250ZW50fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInN0ZXBzLWFjdGlvblwiPlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY3VycmVudCA8IHN0ZXBzLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICYmXG4gICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJwcmltYXJ5XCIgb25DbGljaz17KCkgPT4gdGhpcy5uZXh0KCl9Pk5leHQ8L0J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jdXJyZW50ID09PSBzdGVwcy5sZW5ndGggLSAxXG4gICAgICAgICAgICAmJlxuICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVwicHJpbWFyeVwiIG9uQ2xpY2s9eygpID0+IHRoaXMuYWxlcnREb25lKCl9PkRvbmU8L0J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jdXJyZW50ID4gMFxuICAgICAgICAgICAgJiZcbiAgICAgICAgICAgIDxCdXR0b24gc3R5bGU9e3sgbWFyZ2luTGVmdDogOCB9fSBvbkNsaWNrPXsoKSA9PiB0aGlzLnByZXYoKX0+XG4gICAgICAgICAgICAgIFByZXZpb3VzXG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEZW1vMztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZGVtby9kZW1vbGlzdC9EZW1vMy5qcyIsIi8qKlxuKlxuKiBAdGl0bGUgdmVydGljYWwgU3RlcFxuKiBAZGVzY3JpcHRpb24gXG4qXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFN0ZXAgZnJvbSAnLi4vLi4vc3JjJztcblxuY29uc3QgU3RlcHMgPSBTdGVwLlN0ZXBzO1xuXG5jbGFzcyBEZW1vNCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxTdGVwcyBkaXJlY3Rpb249XCJ2ZXJ0aWNhbFwiIHNpemU9XCJzbWFsbFwiIGN1cnJlbnQ9ezF9PlxuICAgICAgICAgICAgPFN0ZXAgdGl0bGU9XCJGaW5pc2hlZFwiIGRlc2NyaXB0aW9uPVwiVGhpcyBpcyBhIGRlc2NyaXB0aW9uLlwiIC8+XG4gICAgICAgICAgICA8U3RlcCB0aXRsZT1cIkluIFByb2dyZXNzXCIgZGVzY3JpcHRpb249XCJUaGlzIGlzIGEgZGVzY3JpcHRpb24uXCIgLz5cbiAgICAgICAgICAgIDxTdGVwIHRpdGxlPVwiV2FpdGluZ1wiIGRlc2NyaXB0aW9uPVwiVGhpcyBpcyBhIGRlc2NyaXB0aW9uLlwiIC8+XG4gICAgICAgICA8L1N0ZXBzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEZW1vNDtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gZGVtby9kZW1vbGlzdC9EZW1vNC5qcyIsIi8qKlxuKlxuKiBAdGl0bGUg5oyH5a6a54q25oCB55qEU3RlcFxuKiBAZGVzY3JpcHRpb24gIOeUqHN0ZXDnmoRzdGF0dXPlsZ7mgKfvvIzmjIflrprlvZPliY1zdGVw55qE54q25oCBXG4qXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFN0ZXAgZnJvbSAnLi4vLi4vc3JjJztcblxuY29uc3QgU3RlcHMgPSBTdGVwLlN0ZXBzO1xuXG5jbGFzcyBEZW1vNSBleHRlbmRzIENvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxTdGVwcyBjdXJyZW50PXsxfSBzdGF0dXM9XCJlcnJvclwiPlxuICAgICAgICAgICAgPFN0ZXAgdGl0bGU9XCJGaW5pc2hlZFwiIGRlc2NyaXB0aW9uPVwiVGhpcyBpcyBhIGRlc2NyaXB0aW9uXCIgLz5cbiAgICAgICAgICAgIDxTdGVwIHRpdGxlPVwiSW4gUHJvY2Vzc1wiIGRlc2NyaXB0aW9uPVwiVGhpcyBpcyBhIGRlc2NyaXB0aW9uXCIgLz5cbiAgICAgICAgICAgIDxTdGVwIHRpdGxlPVwiV2FpdGluZ1wiIGRlc2NyaXB0aW9uPVwiVGhpcyBpcyBhIGRlc2NyaXB0aW9uXCIgLz5cbiAgICAgICAgPC9TdGVwcz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGVtbzU7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGRlbW8vZGVtb2xpc3QvRGVtbzUuanMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQ3JDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFMQTtBQU1BO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFHQTtBQUpBO0FBU0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUhBO0FBUUE7QUFDQTs7OztBQUVBOzs7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBUEE7QUFVQTtBQUNBOzs7O0FBRUE7Ozs7OztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDL0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQy9DQTs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzlSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDaFZBOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN4UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ3ZMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNwQ0E7Ozs7OztBQ0FBO0FBQ0E7Ozs7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzdDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDSEE7QUFDQTs7Ozs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3ZnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNwUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUMxTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDOUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN6TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUM3aUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzdHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQy9HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDMUlBO0FBQ0E7OztBQUFBO0FBQ0E7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGQTtBQUNBOzs7QUFBQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQUNBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFKQTtBQU1BO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBSEE7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTEE7QUFQQTtBQUxBO0FBc0JBO0FBQ0E7O0FBdkRBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUF1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQW5CQTtBQUNBO0FBcUJBOzs7Ozs7Ozs7Ozs7Ozs7QUN0RkE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBQ0E7QUFTQTs7O0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQURBO0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBL0JBO0FBQ0E7QUFEQTtBQUZBO0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFnQkE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFoQ0E7QUFvQ0E7QUFDQTs7QUF2RkE7QUFDQTtBQXVGQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ3BIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDck1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDNUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ2xYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3BIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNySUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDcklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNySkE7QUFDQTs7O0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUFUQTs7Ozs7OztBQVVBOzs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBREE7QUFTQTtBQUNBOzs7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUNsQkE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUFWQTs7Ozs7OztBQVdBOzs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBOzs7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7O0FBWEE7Ozs7Ozs7O0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUZBO0FBQ0E7QUFJQTs7O0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUZBO0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBREE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZEE7QUFMQTtBQTBCQTtBQUNBOzs7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUN2RUE7QUFDQTs7O0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7QUFUQTs7Ozs7OztBQVVBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQURBO0FBUUE7QUFDQTs7OztBQUVBOzs7Ozs7Ozs7Ozs7O0FDbkJBO0FBQ0E7OztBQUFBO0FBQ0E7Ozs7Ozs7Ozs7O0FBVEE7Ozs7Ozs7QUFVQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFEQTtBQVFBO0FBQ0E7Ozs7QUFFQTs7OzsiLCJzb3VyY2VSb290IjoiIn0=
|
8313 | //# sourceMappingURL=demo.js.map |
\ | No newline at end of file |