snabberb 0.3.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,506 +1,1073 @@
1
- (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.snabbdom = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
1
+ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.snabbdom = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2
2
  "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- var vnode_1 = require("./vnode");
5
- var is = require("./is");
3
+
4
+ var _init = require("./node_modules/snabbdom/build/package/init");
5
+
6
+ var _h = require("./node_modules/snabbdom/build/package/h");
7
+
8
+ var _tovnode = require("./node_modules/snabbdom/build/package/tovnode");
9
+
10
+ var _attributes = require("./node_modules/snabbdom/build/package/modules/attributes");
11
+
12
+ var _class = require("./node_modules/snabbdom/build/package/modules/class");
13
+
14
+ var _dataset = require("./node_modules/snabbdom/build/package/modules/dataset");
15
+
16
+ var _eventlisteners = require("./node_modules/snabbdom/build/package/modules/eventlisteners");
17
+
18
+ var _props = require("./node_modules/snabbdom/build/package/modules/props");
19
+
20
+ var _style = require("./node_modules/snabbdom/build/package/modules/style");
21
+
22
+ // browserify build.js -p esmify -s snabbdom > opal/vendor/snabbdom.js
23
+ module.exports.init = _init.init;
24
+ module.exports.h = _h.h;
25
+ module.exports.toVNode = _tovnode.toVNode;
26
+ module.exports.attributesModule = _attributes.attributesModule;
27
+ module.exports.classModule = _class.classModule;
28
+ module.exports.datasetModule = _dataset.datasetModule;
29
+ module.exports.eventListenersModule = _eventlisteners.eventListenersModule;
30
+ module.exports.propsModule = _props.propsModule;
31
+ module.exports.styleModule = _style.styleModule;
32
+
33
+ },{"./node_modules/snabbdom/build/package/h":2,"./node_modules/snabbdom/build/package/init":4,"./node_modules/snabbdom/build/package/modules/attributes":6,"./node_modules/snabbdom/build/package/modules/class":7,"./node_modules/snabbdom/build/package/modules/dataset":8,"./node_modules/snabbdom/build/package/modules/eventlisteners":9,"./node_modules/snabbdom/build/package/modules/props":10,"./node_modules/snabbdom/build/package/modules/style":11,"./node_modules/snabbdom/build/package/tovnode":12}],2:[function(require,module,exports){
34
+ "use strict";
35
+
36
+ Object.defineProperty(exports, "__esModule", {
37
+ value: true
38
+ });
39
+ exports.h = h;
40
+
41
+ var _vnode = require("./vnode.js");
42
+
43
+ var is = _interopRequireWildcard(require("./is.js"));
44
+
45
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
46
+
47
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
48
+
6
49
  function addNS(data, children, sel) {
7
- data.ns = 'http://www.w3.org/2000/svg';
8
- if (sel !== 'foreignObject' && children !== undefined) {
9
- for (var i = 0; i < children.length; ++i) {
10
- var childData = children[i].data;
11
- if (childData !== undefined) {
12
- addNS(childData, children[i].children, children[i].sel);
13
- }
14
- }
50
+ data.ns = 'http://www.w3.org/2000/svg';
51
+
52
+ if (sel !== 'foreignObject' && children !== undefined) {
53
+ for (let i = 0; i < children.length; ++i) {
54
+ const childData = children[i].data;
55
+
56
+ if (childData !== undefined) {
57
+ addNS(childData, children[i].children, children[i].sel);
58
+ }
15
59
  }
60
+ }
16
61
  }
62
+
17
63
  function h(sel, b, c) {
18
- var data = {}, children, text, i;
19
- if (c !== undefined) {
20
- data = b;
21
- if (is.array(c)) {
22
- children = c;
23
- }
24
- else if (is.primitive(c)) {
25
- text = c;
26
- }
27
- else if (c && c.sel) {
28
- children = [c];
29
- }
64
+ var data = {};
65
+ var children;
66
+ var text;
67
+ var i;
68
+
69
+ if (c !== undefined) {
70
+ if (b !== null) {
71
+ data = b;
30
72
  }
31
- else if (b !== undefined) {
32
- if (is.array(b)) {
33
- children = b;
34
- }
35
- else if (is.primitive(b)) {
36
- text = b;
37
- }
38
- else if (b && b.sel) {
39
- children = [b];
40
- }
41
- else {
42
- data = b;
43
- }
73
+
74
+ if (is.array(c)) {
75
+ children = c;
76
+ } else if (is.primitive(c)) {
77
+ text = c;
78
+ } else if (c && c.sel) {
79
+ children = [c];
44
80
  }
45
- if (is.array(children)) {
46
- for (i = 0; i < children.length; ++i) {
47
- if (is.primitive(children[i]))
48
- children[i] = vnode_1.vnode(undefined, undefined, undefined, children[i]);
49
- }
81
+ } else if (b !== undefined && b !== null) {
82
+ if (is.array(b)) {
83
+ children = b;
84
+ } else if (is.primitive(b)) {
85
+ text = b;
86
+ } else if (b && b.sel) {
87
+ children = [b];
88
+ } else {
89
+ data = b;
50
90
  }
51
- if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' &&
52
- (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
53
- addNS(data, children, sel);
91
+ }
92
+
93
+ if (children !== undefined) {
94
+ for (i = 0; i < children.length; ++i) {
95
+ if (is.primitive(children[i])) children[i] = (0, _vnode.vnode)(undefined, undefined, undefined, children[i], undefined);
54
96
  }
55
- return vnode_1.vnode(sel, data, children, text, undefined);
97
+ }
98
+
99
+ if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' && (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
100
+ addNS(data, children, sel);
101
+ }
102
+
103
+ return (0, _vnode.vnode)(sel, data, children, text, undefined);
56
104
  }
57
- exports.h = h;
105
+
58
106
  ;
59
- exports.default = h;
60
107
 
61
- },{"./is":3,"./vnode":6}],2:[function(require,module,exports){
108
+ },{"./is.js":5,"./vnode.js":13}],3:[function(require,module,exports){
62
109
  "use strict";
63
- Object.defineProperty(exports, "__esModule", { value: true });
110
+
111
+ Object.defineProperty(exports, "__esModule", {
112
+ value: true
113
+ });
114
+ exports.htmlDomApi = void 0;
115
+
64
116
  function createElement(tagName) {
65
- return document.createElement(tagName);
117
+ return document.createElement(tagName);
66
118
  }
119
+
67
120
  function createElementNS(namespaceURI, qualifiedName) {
68
- return document.createElementNS(namespaceURI, qualifiedName);
121
+ return document.createElementNS(namespaceURI, qualifiedName);
69
122
  }
123
+
70
124
  function createTextNode(text) {
71
- return document.createTextNode(text);
125
+ return document.createTextNode(text);
72
126
  }
127
+
73
128
  function createComment(text) {
74
- return document.createComment(text);
129
+ return document.createComment(text);
75
130
  }
131
+
76
132
  function insertBefore(parentNode, newNode, referenceNode) {
77
- parentNode.insertBefore(newNode, referenceNode);
133
+ parentNode.insertBefore(newNode, referenceNode);
78
134
  }
135
+
79
136
  function removeChild(node, child) {
80
- node.removeChild(child);
137
+ node.removeChild(child);
81
138
  }
139
+
82
140
  function appendChild(node, child) {
83
- node.appendChild(child);
141
+ node.appendChild(child);
84
142
  }
143
+
85
144
  function parentNode(node) {
86
- return node.parentNode;
145
+ return node.parentNode;
87
146
  }
147
+
88
148
  function nextSibling(node) {
89
- return node.nextSibling;
149
+ return node.nextSibling;
90
150
  }
151
+
91
152
  function tagName(elm) {
92
- return elm.tagName;
153
+ return elm.tagName;
93
154
  }
155
+
94
156
  function setTextContent(node, text) {
95
- node.textContent = text;
157
+ node.textContent = text;
96
158
  }
159
+
97
160
  function getTextContent(node) {
98
- return node.textContent;
161
+ return node.textContent;
99
162
  }
163
+
100
164
  function isElement(node) {
101
- return node.nodeType === 1;
165
+ return node.nodeType === 1;
102
166
  }
167
+
103
168
  function isText(node) {
104
- return node.nodeType === 3;
169
+ return node.nodeType === 3;
105
170
  }
171
+
106
172
  function isComment(node) {
107
- return node.nodeType === 8;
108
- }
109
- exports.htmlDomApi = {
110
- createElement: createElement,
111
- createElementNS: createElementNS,
112
- createTextNode: createTextNode,
113
- createComment: createComment,
114
- insertBefore: insertBefore,
115
- removeChild: removeChild,
116
- appendChild: appendChild,
117
- parentNode: parentNode,
118
- nextSibling: nextSibling,
119
- tagName: tagName,
120
- setTextContent: setTextContent,
121
- getTextContent: getTextContent,
122
- isElement: isElement,
123
- isText: isText,
124
- isComment: isComment,
173
+ return node.nodeType === 8;
174
+ }
175
+
176
+ const htmlDomApi = {
177
+ createElement,
178
+ createElementNS,
179
+ createTextNode,
180
+ createComment,
181
+ insertBefore,
182
+ removeChild,
183
+ appendChild,
184
+ parentNode,
185
+ nextSibling,
186
+ tagName,
187
+ setTextContent,
188
+ getTextContent,
189
+ isElement,
190
+ isText,
191
+ isComment
125
192
  };
126
- exports.default = exports.htmlDomApi;
193
+ exports.htmlDomApi = htmlDomApi;
127
194
 
128
- },{}],3:[function(require,module,exports){
195
+ },{}],4:[function(require,module,exports){
129
196
  "use strict";
130
- Object.defineProperty(exports, "__esModule", { value: true });
131
- exports.array = Array.isArray;
132
- function primitive(s) {
133
- return typeof s === 'string' || typeof s === 'number';
197
+
198
+ Object.defineProperty(exports, "__esModule", {
199
+ value: true
200
+ });
201
+ exports.init = init;
202
+
203
+ var _vnode = require("./vnode.js");
204
+
205
+ var is = _interopRequireWildcard(require("./is.js"));
206
+
207
+ var _htmldomapi = require("./htmldomapi.js");
208
+
209
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
210
+
211
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
212
+
213
+ function isUndef(s) {
214
+ return s === undefined;
134
215
  }
135
- exports.primitive = primitive;
136
216
 
137
- },{}],4:[function(require,module,exports){
138
- "use strict";
139
- Object.defineProperty(exports, "__esModule", { value: true });
140
- var vnode_1 = require("./vnode");
141
- var is = require("./is");
142
- var htmldomapi_1 = require("./htmldomapi");
143
- function isUndef(s) { return s === undefined; }
144
- function isDef(s) { return s !== undefined; }
145
- var emptyNode = vnode_1.default('', {}, [], undefined, undefined);
217
+ function isDef(s) {
218
+ return s !== undefined;
219
+ }
220
+
221
+ const emptyNode = (0, _vnode.vnode)('', {}, [], undefined, undefined);
222
+
146
223
  function sameVnode(vnode1, vnode2) {
147
- return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
224
+ return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
148
225
  }
226
+
149
227
  function isVnode(vnode) {
150
- return vnode.sel !== undefined;
228
+ return vnode.sel !== undefined;
151
229
  }
230
+
152
231
  function createKeyToOldIdx(children, beginIdx, endIdx) {
153
- var i, map = {}, key, ch;
154
- for (i = beginIdx; i <= endIdx; ++i) {
155
- ch = children[i];
156
- if (ch != null) {
157
- key = ch.key;
158
- if (key !== undefined)
159
- map[key] = i;
160
- }
232
+ var _a;
233
+
234
+ const map = {};
235
+
236
+ for (let i = beginIdx; i <= endIdx; ++i) {
237
+ const key = (_a = children[i]) === null || _a === void 0 ? void 0 : _a.key;
238
+
239
+ if (key !== undefined) {
240
+ map[key] = i;
161
241
  }
162
- return map;
242
+ }
243
+
244
+ return map;
163
245
  }
164
- var hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
165
- var h_1 = require("./h");
166
- exports.h = h_1.h;
167
- var thunk_1 = require("./thunk");
168
- exports.thunk = thunk_1.thunk;
246
+
247
+ const hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
248
+
169
249
  function init(modules, domApi) {
170
- var i, j, cbs = {};
171
- var api = domApi !== undefined ? domApi : htmldomapi_1.default;
172
- for (i = 0; i < hooks.length; ++i) {
173
- cbs[hooks[i]] = [];
174
- for (j = 0; j < modules.length; ++j) {
175
- var hook = modules[j][hooks[i]];
176
- if (hook !== undefined) {
177
- cbs[hooks[i]].push(hook);
178
- }
179
- }
250
+ let i;
251
+ let j;
252
+ const cbs = {
253
+ create: [],
254
+ update: [],
255
+ remove: [],
256
+ destroy: [],
257
+ pre: [],
258
+ post: []
259
+ };
260
+ const api = domApi !== undefined ? domApi : _htmldomapi.htmlDomApi;
261
+
262
+ for (i = 0; i < hooks.length; ++i) {
263
+ cbs[hooks[i]] = [];
264
+
265
+ for (j = 0; j < modules.length; ++j) {
266
+ const hook = modules[j][hooks[i]];
267
+
268
+ if (hook !== undefined) {
269
+ cbs[hooks[i]].push(hook);
270
+ }
180
271
  }
181
- function emptyNodeAt(elm) {
182
- var id = elm.id ? '#' + elm.id : '';
183
- var c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
184
- return vnode_1.default(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
185
- }
186
- function createRmCb(childElm, listeners) {
187
- return function rmCb() {
188
- if (--listeners === 0) {
189
- var parent_1 = api.parentNode(childElm);
190
- api.removeChild(parent_1, childElm);
191
- }
192
- };
193
- }
194
- function createElm(vnode, insertedVnodeQueue) {
195
- var i, data = vnode.data;
196
- if (data !== undefined) {
197
- if (isDef(i = data.hook) && isDef(i = i.init)) {
198
- i(vnode);
199
- data = vnode.data;
200
- }
201
- }
202
- var children = vnode.children, sel = vnode.sel;
203
- if (sel === '!') {
204
- if (isUndef(vnode.text)) {
205
- vnode.text = '';
206
- }
207
- vnode.elm = api.createComment(vnode.text);
208
- }
209
- else if (sel !== undefined) {
210
- // Parse selector
211
- var hashIdx = sel.indexOf('#');
212
- var dotIdx = sel.indexOf('.', hashIdx);
213
- var hash = hashIdx > 0 ? hashIdx : sel.length;
214
- var dot = dotIdx > 0 ? dotIdx : sel.length;
215
- var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
216
- var elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag)
217
- : api.createElement(tag);
218
- if (hash < dot)
219
- elm.setAttribute('id', sel.slice(hash + 1, dot));
220
- if (dotIdx > 0)
221
- elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' '));
222
- for (i = 0; i < cbs.create.length; ++i)
223
- cbs.create[i](emptyNode, vnode);
224
- if (is.array(children)) {
225
- for (i = 0; i < children.length; ++i) {
226
- var ch = children[i];
227
- if (ch != null) {
228
- api.appendChild(elm, createElm(ch, insertedVnodeQueue));
229
- }
230
- }
231
- }
232
- else if (is.primitive(vnode.text)) {
233
- api.appendChild(elm, api.createTextNode(vnode.text));
234
- }
235
- i = vnode.data.hook; // Reuse variable
236
- if (isDef(i)) {
237
- if (i.create)
238
- i.create(emptyNode, vnode);
239
- if (i.insert)
240
- insertedVnodeQueue.push(vnode);
241
- }
242
- }
243
- else {
244
- vnode.elm = api.createTextNode(vnode.text);
272
+ }
273
+
274
+ function emptyNodeAt(elm) {
275
+ const id = elm.id ? '#' + elm.id : '';
276
+ const c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
277
+ return (0, _vnode.vnode)(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
278
+ }
279
+
280
+ function createRmCb(childElm, listeners) {
281
+ return function rmCb() {
282
+ if (--listeners === 0) {
283
+ const parent = api.parentNode(childElm);
284
+ api.removeChild(parent, childElm);
285
+ }
286
+ };
287
+ }
288
+
289
+ function createElm(vnode, insertedVnodeQueue) {
290
+ var _a, _b;
291
+
292
+ let i;
293
+ let data = vnode.data;
294
+
295
+ if (data !== undefined) {
296
+ const init = (_a = data.hook) === null || _a === void 0 ? void 0 : _a.init;
297
+
298
+ if (isDef(init)) {
299
+ init(vnode);
300
+ data = vnode.data;
301
+ }
302
+ }
303
+
304
+ const children = vnode.children;
305
+ const sel = vnode.sel;
306
+
307
+ if (sel === '!') {
308
+ if (isUndef(vnode.text)) {
309
+ vnode.text = '';
310
+ }
311
+
312
+ vnode.elm = api.createComment(vnode.text);
313
+ } else if (sel !== undefined) {
314
+ // Parse selector
315
+ const hashIdx = sel.indexOf('#');
316
+ const dotIdx = sel.indexOf('.', hashIdx);
317
+ const hash = hashIdx > 0 ? hashIdx : sel.length;
318
+ const dot = dotIdx > 0 ? dotIdx : sel.length;
319
+ const tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
320
+ const elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag) : api.createElement(tag);
321
+ if (hash < dot) elm.setAttribute('id', sel.slice(hash + 1, dot));
322
+ if (dotIdx > 0) elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' '));
323
+
324
+ for (i = 0; i < cbs.create.length; ++i) cbs.create[i](emptyNode, vnode);
325
+
326
+ if (is.array(children)) {
327
+ for (i = 0; i < children.length; ++i) {
328
+ const ch = children[i];
329
+
330
+ if (ch != null) {
331
+ api.appendChild(elm, createElm(ch, insertedVnodeQueue));
332
+ }
245
333
  }
246
- return vnode.elm;
247
- }
248
- function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
249
- for (; startIdx <= endIdx; ++startIdx) {
250
- var ch = vnodes[startIdx];
251
- if (ch != null) {
252
- api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
253
- }
334
+ } else if (is.primitive(vnode.text)) {
335
+ api.appendChild(elm, api.createTextNode(vnode.text));
336
+ }
337
+
338
+ const hook = vnode.data.hook;
339
+
340
+ if (isDef(hook)) {
341
+ (_b = hook.create) === null || _b === void 0 ? void 0 : _b.call(hook, emptyNode, vnode);
342
+
343
+ if (hook.insert) {
344
+ insertedVnodeQueue.push(vnode);
254
345
  }
346
+ }
347
+ } else {
348
+ vnode.elm = api.createTextNode(vnode.text);
255
349
  }
256
- function invokeDestroyHook(vnode) {
257
- var i, j, data = vnode.data;
258
- if (data !== undefined) {
259
- if (isDef(i = data.hook) && isDef(i = i.destroy))
260
- i(vnode);
261
- for (i = 0; i < cbs.destroy.length; ++i)
262
- cbs.destroy[i](vnode);
263
- if (vnode.children !== undefined) {
264
- for (j = 0; j < vnode.children.length; ++j) {
265
- i = vnode.children[j];
266
- if (i != null && typeof i !== "string") {
267
- invokeDestroyHook(i);
268
- }
269
- }
270
- }
271
- }
350
+
351
+ return vnode.elm;
352
+ }
353
+
354
+ function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
355
+ for (; startIdx <= endIdx; ++startIdx) {
356
+ const ch = vnodes[startIdx];
357
+
358
+ if (ch != null) {
359
+ api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
360
+ }
272
361
  }
273
- function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
274
- for (; startIdx <= endIdx; ++startIdx) {
275
- var i_1 = void 0, listeners = void 0, rm = void 0, ch = vnodes[startIdx];
276
- if (ch != null) {
277
- if (isDef(ch.sel)) {
278
- invokeDestroyHook(ch);
279
- listeners = cbs.remove.length + 1;
280
- rm = createRmCb(ch.elm, listeners);
281
- for (i_1 = 0; i_1 < cbs.remove.length; ++i_1)
282
- cbs.remove[i_1](ch, rm);
283
- if (isDef(i_1 = ch.data) && isDef(i_1 = i_1.hook) && isDef(i_1 = i_1.remove)) {
284
- i_1(ch, rm);
285
- }
286
- else {
287
- rm();
288
- }
289
- }
290
- else {
291
- api.removeChild(parentElm, ch.elm);
292
- }
293
- }
362
+ }
363
+
364
+ function invokeDestroyHook(vnode) {
365
+ var _a, _b;
366
+
367
+ const data = vnode.data;
368
+
369
+ if (data !== undefined) {
370
+ (_b = (_a = data === null || data === void 0 ? void 0 : data.hook) === null || _a === void 0 ? void 0 : _a.destroy) === null || _b === void 0 ? void 0 : _b.call(_a, vnode);
371
+
372
+ for (let i = 0; i < cbs.destroy.length; ++i) cbs.destroy[i](vnode);
373
+
374
+ if (vnode.children !== undefined) {
375
+ for (let j = 0; j < vnode.children.length; ++j) {
376
+ const child = vnode.children[j];
377
+
378
+ if (child != null && typeof child !== 'string') {
379
+ invokeDestroyHook(child);
380
+ }
294
381
  }
382
+ }
295
383
  }
296
- function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
297
- var oldStartIdx = 0, newStartIdx = 0;
298
- var oldEndIdx = oldCh.length - 1;
299
- var oldStartVnode = oldCh[0];
300
- var oldEndVnode = oldCh[oldEndIdx];
301
- var newEndIdx = newCh.length - 1;
302
- var newStartVnode = newCh[0];
303
- var newEndVnode = newCh[newEndIdx];
304
- var oldKeyToIdx;
305
- var idxInOld;
306
- var elmToMove;
307
- var before;
308
- while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
309
- if (oldStartVnode == null) {
310
- oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
311
- }
312
- else if (oldEndVnode == null) {
313
- oldEndVnode = oldCh[--oldEndIdx];
314
- }
315
- else if (newStartVnode == null) {
316
- newStartVnode = newCh[++newStartIdx];
317
- }
318
- else if (newEndVnode == null) {
319
- newEndVnode = newCh[--newEndIdx];
320
- }
321
- else if (sameVnode(oldStartVnode, newStartVnode)) {
322
- patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
323
- oldStartVnode = oldCh[++oldStartIdx];
324
- newStartVnode = newCh[++newStartIdx];
325
- }
326
- else if (sameVnode(oldEndVnode, newEndVnode)) {
327
- patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
328
- oldEndVnode = oldCh[--oldEndIdx];
329
- newEndVnode = newCh[--newEndIdx];
330
- }
331
- else if (sameVnode(oldStartVnode, newEndVnode)) {
332
- patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
333
- api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
334
- oldStartVnode = oldCh[++oldStartIdx];
335
- newEndVnode = newCh[--newEndIdx];
336
- }
337
- else if (sameVnode(oldEndVnode, newStartVnode)) {
338
- patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
339
- api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
340
- oldEndVnode = oldCh[--oldEndIdx];
341
- newStartVnode = newCh[++newStartIdx];
342
- }
343
- else {
344
- if (oldKeyToIdx === undefined) {
345
- oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
346
- }
347
- idxInOld = oldKeyToIdx[newStartVnode.key];
348
- if (isUndef(idxInOld)) {
349
- api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
350
- newStartVnode = newCh[++newStartIdx];
351
- }
352
- else {
353
- elmToMove = oldCh[idxInOld];
354
- if (elmToMove.sel !== newStartVnode.sel) {
355
- api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
356
- }
357
- else {
358
- patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
359
- oldCh[idxInOld] = undefined;
360
- api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
361
- }
362
- newStartVnode = newCh[++newStartIdx];
363
- }
364
- }
365
- }
366
- if (oldStartIdx > oldEndIdx) {
367
- before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
368
- addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
369
- }
370
- else if (newStartIdx > newEndIdx) {
371
- removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
384
+ }
385
+
386
+ function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
387
+ var _a, _b;
388
+
389
+ for (; startIdx <= endIdx; ++startIdx) {
390
+ let listeners;
391
+ let rm;
392
+ const ch = vnodes[startIdx];
393
+
394
+ if (ch != null) {
395
+ if (isDef(ch.sel)) {
396
+ invokeDestroyHook(ch);
397
+ listeners = cbs.remove.length + 1;
398
+ rm = createRmCb(ch.elm, listeners);
399
+
400
+ for (let i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm);
401
+
402
+ const removeHook = (_b = (_a = ch === null || ch === void 0 ? void 0 : ch.data) === null || _a === void 0 ? void 0 : _a.hook) === null || _b === void 0 ? void 0 : _b.remove;
403
+
404
+ if (isDef(removeHook)) {
405
+ removeHook(ch, rm);
406
+ } else {
407
+ rm();
408
+ }
409
+ } else {
410
+ // Text node
411
+ api.removeChild(parentElm, ch.elm);
372
412
  }
413
+ }
373
414
  }
374
- function patchVnode(oldVnode, vnode, insertedVnodeQueue) {
375
- var i, hook;
376
- if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {
377
- i(oldVnode, vnode);
378
- }
379
- var elm = vnode.elm = oldVnode.elm;
380
- var oldCh = oldVnode.children;
381
- var ch = vnode.children;
382
- if (oldVnode === vnode)
383
- return;
384
- if (vnode.data !== undefined) {
385
- for (i = 0; i < cbs.update.length; ++i)
386
- cbs.update[i](oldVnode, vnode);
387
- i = vnode.data.hook;
388
- if (isDef(i) && isDef(i = i.update))
389
- i(oldVnode, vnode);
390
- }
391
- if (isUndef(vnode.text)) {
392
- if (isDef(oldCh) && isDef(ch)) {
393
- if (oldCh !== ch)
394
- updateChildren(elm, oldCh, ch, insertedVnodeQueue);
395
- }
396
- else if (isDef(ch)) {
397
- if (isDef(oldVnode.text))
398
- api.setTextContent(elm, '');
399
- addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
400
- }
401
- else if (isDef(oldCh)) {
402
- removeVnodes(elm, oldCh, 0, oldCh.length - 1);
403
- }
404
- else if (isDef(oldVnode.text)) {
405
- api.setTextContent(elm, '');
406
- }
407
- }
408
- else if (oldVnode.text !== vnode.text) {
409
- api.setTextContent(elm, vnode.text);
415
+ }
416
+
417
+ function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
418
+ let oldStartIdx = 0;
419
+ let newStartIdx = 0;
420
+ let oldEndIdx = oldCh.length - 1;
421
+ let oldStartVnode = oldCh[0];
422
+ let oldEndVnode = oldCh[oldEndIdx];
423
+ let newEndIdx = newCh.length - 1;
424
+ let newStartVnode = newCh[0];
425
+ let newEndVnode = newCh[newEndIdx];
426
+ let oldKeyToIdx;
427
+ let idxInOld;
428
+ let elmToMove;
429
+ let before;
430
+
431
+ while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
432
+ if (oldStartVnode == null) {
433
+ oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
434
+ } else if (oldEndVnode == null) {
435
+ oldEndVnode = oldCh[--oldEndIdx];
436
+ } else if (newStartVnode == null) {
437
+ newStartVnode = newCh[++newStartIdx];
438
+ } else if (newEndVnode == null) {
439
+ newEndVnode = newCh[--newEndIdx];
440
+ } else if (sameVnode(oldStartVnode, newStartVnode)) {
441
+ patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
442
+ oldStartVnode = oldCh[++oldStartIdx];
443
+ newStartVnode = newCh[++newStartIdx];
444
+ } else if (sameVnode(oldEndVnode, newEndVnode)) {
445
+ patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
446
+ oldEndVnode = oldCh[--oldEndIdx];
447
+ newEndVnode = newCh[--newEndIdx];
448
+ } else if (sameVnode(oldStartVnode, newEndVnode)) {
449
+ // Vnode moved right
450
+ patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
451
+ api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
452
+ oldStartVnode = oldCh[++oldStartIdx];
453
+ newEndVnode = newCh[--newEndIdx];
454
+ } else if (sameVnode(oldEndVnode, newStartVnode)) {
455
+ // Vnode moved left
456
+ patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
457
+ api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
458
+ oldEndVnode = oldCh[--oldEndIdx];
459
+ newStartVnode = newCh[++newStartIdx];
460
+ } else {
461
+ if (oldKeyToIdx === undefined) {
462
+ oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
410
463
  }
411
- if (isDef(hook) && isDef(i = hook.postpatch)) {
412
- i(oldVnode, vnode);
464
+
465
+ idxInOld = oldKeyToIdx[newStartVnode.key];
466
+
467
+ if (isUndef(idxInOld)) {
468
+ // New element
469
+ api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
470
+ } else {
471
+ elmToMove = oldCh[idxInOld];
472
+
473
+ if (elmToMove.sel !== newStartVnode.sel) {
474
+ api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
475
+ } else {
476
+ patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
477
+ oldCh[idxInOld] = undefined;
478
+ api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
479
+ }
413
480
  }
481
+
482
+ newStartVnode = newCh[++newStartIdx];
483
+ }
484
+ }
485
+
486
+ if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {
487
+ if (oldStartIdx > oldEndIdx) {
488
+ before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
489
+ addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
490
+ } else {
491
+ removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
492
+ }
493
+ }
494
+ }
495
+
496
+ function patchVnode(oldVnode, vnode, insertedVnodeQueue) {
497
+ var _a, _b, _c, _d, _e;
498
+
499
+ const hook = (_a = vnode.data) === null || _a === void 0 ? void 0 : _a.hook;
500
+ (_b = hook === null || hook === void 0 ? void 0 : hook.prepatch) === null || _b === void 0 ? void 0 : _b.call(hook, oldVnode, vnode);
501
+ const elm = vnode.elm = oldVnode.elm;
502
+ const oldCh = oldVnode.children;
503
+ const ch = vnode.children;
504
+ if (oldVnode === vnode) return;
505
+
506
+ if (vnode.data !== undefined) {
507
+ for (let i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode);
508
+
509
+ (_d = (_c = vnode.data.hook) === null || _c === void 0 ? void 0 : _c.update) === null || _d === void 0 ? void 0 : _d.call(_c, oldVnode, vnode);
510
+ }
511
+
512
+ if (isUndef(vnode.text)) {
513
+ if (isDef(oldCh) && isDef(ch)) {
514
+ if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue);
515
+ } else if (isDef(ch)) {
516
+ if (isDef(oldVnode.text)) api.setTextContent(elm, '');
517
+ addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
518
+ } else if (isDef(oldCh)) {
519
+ removeVnodes(elm, oldCh, 0, oldCh.length - 1);
520
+ } else if (isDef(oldVnode.text)) {
521
+ api.setTextContent(elm, '');
522
+ }
523
+ } else if (oldVnode.text !== vnode.text) {
524
+ if (isDef(oldCh)) {
525
+ removeVnodes(elm, oldCh, 0, oldCh.length - 1);
526
+ }
527
+
528
+ api.setTextContent(elm, vnode.text);
414
529
  }
415
- return function patch(oldVnode, vnode) {
416
- var i, elm, parent;
417
- var insertedVnodeQueue = [];
418
- for (i = 0; i < cbs.pre.length; ++i)
419
- cbs.pre[i]();
420
- if (!isVnode(oldVnode)) {
421
- oldVnode = emptyNodeAt(oldVnode);
530
+
531
+ (_e = hook === null || hook === void 0 ? void 0 : hook.postpatch) === null || _e === void 0 ? void 0 : _e.call(hook, oldVnode, vnode);
532
+ }
533
+
534
+ return function patch(oldVnode, vnode) {
535
+ let i, elm, parent;
536
+ const insertedVnodeQueue = [];
537
+
538
+ for (i = 0; i < cbs.pre.length; ++i) cbs.pre[i]();
539
+
540
+ if (!isVnode(oldVnode)) {
541
+ oldVnode = emptyNodeAt(oldVnode);
542
+ }
543
+
544
+ if (sameVnode(oldVnode, vnode)) {
545
+ patchVnode(oldVnode, vnode, insertedVnodeQueue);
546
+ } else {
547
+ elm = oldVnode.elm;
548
+ parent = api.parentNode(elm);
549
+ createElm(vnode, insertedVnodeQueue);
550
+
551
+ if (parent !== null) {
552
+ api.insertBefore(parent, vnode.elm, api.nextSibling(elm));
553
+ removeVnodes(parent, [oldVnode], 0, 0);
554
+ }
555
+ }
556
+
557
+ for (i = 0; i < insertedVnodeQueue.length; ++i) {
558
+ insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
559
+ }
560
+
561
+ for (i = 0; i < cbs.post.length; ++i) cbs.post[i]();
562
+
563
+ return vnode;
564
+ };
565
+ }
566
+
567
+ },{"./htmldomapi.js":3,"./is.js":5,"./vnode.js":13}],5:[function(require,module,exports){
568
+ "use strict";
569
+
570
+ Object.defineProperty(exports, "__esModule", {
571
+ value: true
572
+ });
573
+ exports.primitive = primitive;
574
+ exports.array = void 0;
575
+ const array = Array.isArray;
576
+ exports.array = array;
577
+
578
+ function primitive(s) {
579
+ return typeof s === 'string' || typeof s === 'number';
580
+ }
581
+
582
+ },{}],6:[function(require,module,exports){
583
+ "use strict";
584
+
585
+ Object.defineProperty(exports, "__esModule", {
586
+ value: true
587
+ });
588
+ exports.attributesModule = void 0;
589
+ const xlinkNS = 'http://www.w3.org/1999/xlink';
590
+ const xmlNS = 'http://www.w3.org/XML/1998/namespace';
591
+ const colonChar = 58;
592
+ const xChar = 120;
593
+
594
+ function updateAttrs(oldVnode, vnode) {
595
+ var key;
596
+ var elm = vnode.elm;
597
+ var oldAttrs = oldVnode.data.attrs;
598
+ var attrs = vnode.data.attrs;
599
+ if (!oldAttrs && !attrs) return;
600
+ if (oldAttrs === attrs) return;
601
+ oldAttrs = oldAttrs || {};
602
+ attrs = attrs || {}; // update modified attributes, add new attributes
603
+
604
+ for (key in attrs) {
605
+ const cur = attrs[key];
606
+ const old = oldAttrs[key];
607
+
608
+ if (old !== cur) {
609
+ if (cur === true) {
610
+ elm.setAttribute(key, '');
611
+ } else if (cur === false) {
612
+ elm.removeAttribute(key);
613
+ } else {
614
+ if (key.charCodeAt(0) !== xChar) {
615
+ elm.setAttribute(key, cur);
616
+ } else if (key.charCodeAt(3) === colonChar) {
617
+ // Assume xml namespace
618
+ elm.setAttributeNS(xmlNS, key, cur);
619
+ } else if (key.charCodeAt(5) === colonChar) {
620
+ // Assume xlink namespace
621
+ elm.setAttributeNS(xlinkNS, key, cur);
622
+ } else {
623
+ elm.setAttribute(key, cur);
422
624
  }
423
- if (sameVnode(oldVnode, vnode)) {
424
- patchVnode(oldVnode, vnode, insertedVnodeQueue);
625
+ }
626
+ }
627
+ } // remove removed attributes
628
+ // use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)
629
+ // the other option is to remove all attributes with value == undefined
630
+
631
+
632
+ for (key in oldAttrs) {
633
+ if (!(key in attrs)) {
634
+ elm.removeAttribute(key);
635
+ }
636
+ }
637
+ }
638
+
639
+ const attributesModule = {
640
+ create: updateAttrs,
641
+ update: updateAttrs
642
+ };
643
+ exports.attributesModule = attributesModule;
644
+
645
+ },{}],7:[function(require,module,exports){
646
+ "use strict";
647
+
648
+ Object.defineProperty(exports, "__esModule", {
649
+ value: true
650
+ });
651
+ exports.classModule = void 0;
652
+
653
+ function updateClass(oldVnode, vnode) {
654
+ var cur;
655
+ var name;
656
+ var elm = vnode.elm;
657
+ var oldClass = oldVnode.data.class;
658
+ var klass = vnode.data.class;
659
+ if (!oldClass && !klass) return;
660
+ if (oldClass === klass) return;
661
+ oldClass = oldClass || {};
662
+ klass = klass || {};
663
+
664
+ for (name in oldClass) {
665
+ if (oldClass[name] && !Object.prototype.hasOwnProperty.call(klass, name)) {
666
+ // was `true` and now not provided
667
+ elm.classList.remove(name);
668
+ }
669
+ }
670
+
671
+ for (name in klass) {
672
+ cur = klass[name];
673
+
674
+ if (cur !== oldClass[name]) {
675
+ elm.classList[cur ? 'add' : 'remove'](name);
676
+ }
677
+ }
678
+ }
679
+
680
+ const classModule = {
681
+ create: updateClass,
682
+ update: updateClass
683
+ };
684
+ exports.classModule = classModule;
685
+
686
+ },{}],8:[function(require,module,exports){
687
+ "use strict";
688
+
689
+ Object.defineProperty(exports, "__esModule", {
690
+ value: true
691
+ });
692
+ exports.datasetModule = void 0;
693
+ const CAPS_REGEX = /[A-Z]/g;
694
+
695
+ function updateDataset(oldVnode, vnode) {
696
+ const elm = vnode.elm;
697
+ let oldDataset = oldVnode.data.dataset;
698
+ let dataset = vnode.data.dataset;
699
+ let key;
700
+ if (!oldDataset && !dataset) return;
701
+ if (oldDataset === dataset) return;
702
+ oldDataset = oldDataset || {};
703
+ dataset = dataset || {};
704
+ const d = elm.dataset;
705
+
706
+ for (key in oldDataset) {
707
+ if (!dataset[key]) {
708
+ if (d) {
709
+ if (key in d) {
710
+ delete d[key];
425
711
  }
426
- else {
427
- elm = oldVnode.elm;
428
- parent = api.parentNode(elm);
429
- createElm(vnode, insertedVnodeQueue);
430
- if (parent !== null) {
431
- api.insertBefore(parent, vnode.elm, api.nextSibling(elm));
432
- removeVnodes(parent, [oldVnode], 0, 0);
433
- }
712
+ } else {
713
+ elm.removeAttribute('data-' + key.replace(CAPS_REGEX, '-$&').toLowerCase());
714
+ }
715
+ }
716
+ }
717
+
718
+ for (key in dataset) {
719
+ if (oldDataset[key] !== dataset[key]) {
720
+ if (d) {
721
+ d[key] = dataset[key];
722
+ } else {
723
+ elm.setAttribute('data-' + key.replace(CAPS_REGEX, '-$&').toLowerCase(), dataset[key]);
724
+ }
725
+ }
726
+ }
727
+ }
728
+
729
+ const datasetModule = {
730
+ create: updateDataset,
731
+ update: updateDataset
732
+ };
733
+ exports.datasetModule = datasetModule;
734
+
735
+ },{}],9:[function(require,module,exports){
736
+ "use strict";
737
+
738
+ Object.defineProperty(exports, "__esModule", {
739
+ value: true
740
+ });
741
+ exports.eventListenersModule = void 0;
742
+
743
+ function invokeHandler(handler, vnode, event) {
744
+ if (typeof handler === 'function') {
745
+ // call function handler
746
+ handler.call(vnode, event, vnode);
747
+ } else if (typeof handler === 'object') {
748
+ // call multiple handlers
749
+ for (var i = 0; i < handler.length; i++) {
750
+ invokeHandler(handler[i], vnode, event);
751
+ }
752
+ }
753
+ }
754
+
755
+ function handleEvent(event, vnode) {
756
+ var name = event.type;
757
+ var on = vnode.data.on; // call event handler(s) if exists
758
+
759
+ if (on && on[name]) {
760
+ invokeHandler(on[name], vnode, event);
761
+ }
762
+ }
763
+
764
+ function createListener() {
765
+ return function handler(event) {
766
+ handleEvent(event, handler.vnode);
767
+ };
768
+ }
769
+
770
+ function updateEventListeners(oldVnode, vnode) {
771
+ var oldOn = oldVnode.data.on;
772
+ var oldListener = oldVnode.listener;
773
+ var oldElm = oldVnode.elm;
774
+ var on = vnode && vnode.data.on;
775
+ var elm = vnode && vnode.elm;
776
+ var name; // optimization for reused immutable handlers
777
+
778
+ if (oldOn === on) {
779
+ return;
780
+ } // remove existing listeners which no longer used
781
+
782
+
783
+ if (oldOn && oldListener) {
784
+ // if element changed or deleted we remove all existing listeners unconditionally
785
+ if (!on) {
786
+ for (name in oldOn) {
787
+ // remove listener if element was changed or existing listeners removed
788
+ oldElm.removeEventListener(name, oldListener, false);
789
+ }
790
+ } else {
791
+ for (name in oldOn) {
792
+ // remove listener if existing listener removed
793
+ if (!on[name]) {
794
+ oldElm.removeEventListener(name, oldListener, false);
434
795
  }
435
- for (i = 0; i < insertedVnodeQueue.length; ++i) {
436
- insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
796
+ }
797
+ }
798
+ } // add new listeners which has not already attached
799
+
800
+
801
+ if (on) {
802
+ // reuse existing listener or create new
803
+ var listener = vnode.listener = oldVnode.listener || createListener(); // update vnode for listener
804
+
805
+ listener.vnode = vnode; // if element changed or added we add all needed listeners unconditionally
806
+
807
+ if (!oldOn) {
808
+ for (name in on) {
809
+ // add listener if element was changed or new listeners added
810
+ elm.addEventListener(name, listener, false);
811
+ }
812
+ } else {
813
+ for (name in on) {
814
+ // add listener if new listener added
815
+ if (!oldOn[name]) {
816
+ elm.addEventListener(name, listener, false);
437
817
  }
438
- for (i = 0; i < cbs.post.length; ++i)
439
- cbs.post[i]();
440
- return vnode;
441
- };
818
+ }
819
+ }
820
+ }
442
821
  }
443
- exports.init = init;
444
822
 
445
- },{"./h":1,"./htmldomapi":2,"./is":3,"./thunk":5,"./vnode":6}],5:[function(require,module,exports){
823
+ const eventListenersModule = {
824
+ create: updateEventListeners,
825
+ update: updateEventListeners,
826
+ destroy: updateEventListeners
827
+ };
828
+ exports.eventListenersModule = eventListenersModule;
829
+
830
+ },{}],10:[function(require,module,exports){
446
831
  "use strict";
447
- Object.defineProperty(exports, "__esModule", { value: true });
448
- var h_1 = require("./h");
449
- function copyToThunk(vnode, thunk) {
450
- thunk.elm = vnode.elm;
451
- vnode.data.fn = thunk.data.fn;
452
- vnode.data.args = thunk.data.args;
453
- thunk.data = vnode.data;
454
- thunk.children = vnode.children;
455
- thunk.text = vnode.text;
456
- thunk.elm = vnode.elm;
457
- }
458
- function init(thunk) {
459
- var cur = thunk.data;
460
- var vnode = cur.fn.apply(undefined, cur.args);
461
- copyToThunk(vnode, thunk);
462
- }
463
- function prepatch(oldVnode, thunk) {
464
- var i, old = oldVnode.data, cur = thunk.data;
465
- var oldArgs = old.args, args = cur.args;
466
- if (old.fn !== cur.fn || oldArgs.length !== args.length) {
467
- copyToThunk(cur.fn.apply(undefined, args), thunk);
468
- return;
469
- }
470
- for (i = 0; i < args.length; ++i) {
471
- if (oldArgs[i] !== args[i]) {
472
- copyToThunk(cur.fn.apply(undefined, args), thunk);
473
- return;
474
- }
832
+
833
+ Object.defineProperty(exports, "__esModule", {
834
+ value: true
835
+ });
836
+ exports.propsModule = void 0;
837
+
838
+ function updateProps(oldVnode, vnode) {
839
+ var key;
840
+ var cur;
841
+ var old;
842
+ var elm = vnode.elm;
843
+ var oldProps = oldVnode.data.props;
844
+ var props = vnode.data.props;
845
+ if (!oldProps && !props) return;
846
+ if (oldProps === props) return;
847
+ oldProps = oldProps || {};
848
+ props = props || {};
849
+
850
+ for (key in props) {
851
+ cur = props[key];
852
+ old = oldProps[key];
853
+
854
+ if (old !== cur && (key !== 'value' || elm[key] !== cur)) {
855
+ elm[key] = cur;
475
856
  }
476
- copyToThunk(oldVnode, thunk);
857
+ }
477
858
  }
478
- exports.thunk = function thunk(sel, key, fn, args) {
479
- if (args === undefined) {
480
- args = fn;
481
- fn = key;
482
- key = undefined;
859
+
860
+ const propsModule = {
861
+ create: updateProps,
862
+ update: updateProps
863
+ };
864
+ exports.propsModule = propsModule;
865
+
866
+ },{}],11:[function(require,module,exports){
867
+ "use strict";
868
+
869
+ Object.defineProperty(exports, "__esModule", {
870
+ value: true
871
+ });
872
+ exports.styleModule = void 0;
873
+ // Bindig `requestAnimationFrame` like this fixes a bug in IE/Edge. See #360 and #409.
874
+ var raf = typeof window !== 'undefined' && window.requestAnimationFrame.bind(window) || setTimeout;
875
+
876
+ var nextFrame = function (fn) {
877
+ raf(function () {
878
+ raf(fn);
879
+ });
880
+ };
881
+
882
+ var reflowForced = false;
883
+
884
+ function setNextFrame(obj, prop, val) {
885
+ nextFrame(function () {
886
+ obj[prop] = val;
887
+ });
888
+ }
889
+
890
+ function updateStyle(oldVnode, vnode) {
891
+ var cur;
892
+ var name;
893
+ var elm = vnode.elm;
894
+ var oldStyle = oldVnode.data.style;
895
+ var style = vnode.data.style;
896
+ if (!oldStyle && !style) return;
897
+ if (oldStyle === style) return;
898
+ oldStyle = oldStyle || {};
899
+ style = style || {};
900
+ var oldHasDel = ('delayed' in oldStyle);
901
+
902
+ for (name in oldStyle) {
903
+ if (!style[name]) {
904
+ if (name[0] === '-' && name[1] === '-') {
905
+ elm.style.removeProperty(name);
906
+ } else {
907
+ elm.style[name] = '';
908
+ }
909
+ }
910
+ }
911
+
912
+ for (name in style) {
913
+ cur = style[name];
914
+
915
+ if (name === 'delayed' && style.delayed) {
916
+ for (const name2 in style.delayed) {
917
+ cur = style.delayed[name2];
918
+
919
+ if (!oldHasDel || cur !== oldStyle.delayed[name2]) {
920
+ setNextFrame(elm.style, name2, cur);
921
+ }
922
+ }
923
+ } else if (name !== 'remove' && cur !== oldStyle[name]) {
924
+ if (name[0] === '-' && name[1] === '-') {
925
+ elm.style.setProperty(name, cur);
926
+ } else {
927
+ elm.style[name] = cur;
928
+ }
483
929
  }
484
- return h_1.h(sel, {
485
- key: key,
486
- hook: { init: init, prepatch: prepatch },
487
- fn: fn,
488
- args: args
489
- });
930
+ }
931
+ }
932
+
933
+ function applyDestroyStyle(vnode) {
934
+ var style;
935
+ var name;
936
+ var elm = vnode.elm;
937
+ var s = vnode.data.style;
938
+ if (!s || !(style = s.destroy)) return;
939
+
940
+ for (name in style) {
941
+ elm.style[name] = style[name];
942
+ }
943
+ }
944
+
945
+ function applyRemoveStyle(vnode, rm) {
946
+ var s = vnode.data.style;
947
+
948
+ if (!s || !s.remove) {
949
+ rm();
950
+ return;
951
+ }
952
+
953
+ if (!reflowForced) {
954
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
955
+ vnode.elm.offsetLeft;
956
+ reflowForced = true;
957
+ }
958
+
959
+ var name;
960
+ var elm = vnode.elm;
961
+ var i = 0;
962
+ var compStyle;
963
+ var style = s.remove;
964
+ var amount = 0;
965
+ var applied = [];
966
+
967
+ for (name in style) {
968
+ applied.push(name);
969
+ elm.style[name] = style[name];
970
+ }
971
+
972
+ compStyle = getComputedStyle(elm);
973
+ var props = compStyle['transition-property'].split(', ');
974
+
975
+ for (; i < props.length; ++i) {
976
+ if (applied.indexOf(props[i]) !== -1) amount++;
977
+ }
978
+
979
+ elm.addEventListener('transitionend', function (ev) {
980
+ if (ev.target === elm) --amount;
981
+ if (amount === 0) rm();
982
+ });
983
+ }
984
+
985
+ function forceReflow() {
986
+ reflowForced = false;
987
+ }
988
+
989
+ const styleModule = {
990
+ pre: forceReflow,
991
+ create: updateStyle,
992
+ update: updateStyle,
993
+ destroy: applyDestroyStyle,
994
+ remove: applyRemoveStyle
490
995
  };
491
- exports.default = exports.thunk;
996
+ exports.styleModule = styleModule;
492
997
 
493
- },{"./h":1}],6:[function(require,module,exports){
998
+ },{}],12:[function(require,module,exports){
494
999
  "use strict";
495
- Object.defineProperty(exports, "__esModule", { value: true });
496
- function vnode(sel, data, children, text, elm) {
497
- var key = data === undefined ? undefined : data.key;
498
- return { sel: sel, data: data, children: children,
499
- text: text, elm: elm, key: key };
1000
+
1001
+ Object.defineProperty(exports, "__esModule", {
1002
+ value: true
1003
+ });
1004
+ exports.toVNode = toVNode;
1005
+
1006
+ var _vnode = require("./vnode.js");
1007
+
1008
+ var _htmldomapi = require("./htmldomapi.js");
1009
+
1010
+ function toVNode(node, domApi) {
1011
+ const api = domApi !== undefined ? domApi : _htmldomapi.htmlDomApi;
1012
+ let text;
1013
+
1014
+ if (api.isElement(node)) {
1015
+ const id = node.id ? '#' + node.id : '';
1016
+ const cn = node.getAttribute('class');
1017
+ const c = cn ? '.' + cn.split(' ').join('.') : '';
1018
+ const sel = api.tagName(node).toLowerCase() + id + c;
1019
+ const attrs = {};
1020
+ const children = [];
1021
+ let name;
1022
+ let i, n;
1023
+ const elmAttrs = node.attributes;
1024
+ const elmChildren = node.childNodes;
1025
+
1026
+ for (i = 0, n = elmAttrs.length; i < n; i++) {
1027
+ name = elmAttrs[i].nodeName;
1028
+
1029
+ if (name !== 'id' && name !== 'class') {
1030
+ attrs[name] = elmAttrs[i].nodeValue;
1031
+ }
1032
+ }
1033
+
1034
+ for (i = 0, n = elmChildren.length; i < n; i++) {
1035
+ children.push(toVNode(elmChildren[i], domApi));
1036
+ }
1037
+
1038
+ return (0, _vnode.vnode)(sel, {
1039
+ attrs
1040
+ }, children, undefined, node);
1041
+ } else if (api.isText(node)) {
1042
+ text = api.getTextContent(node);
1043
+ return (0, _vnode.vnode)(undefined, undefined, undefined, text, node);
1044
+ } else if (api.isComment(node)) {
1045
+ text = api.getTextContent(node);
1046
+ return (0, _vnode.vnode)('!', {}, [], text, node);
1047
+ } else {
1048
+ return (0, _vnode.vnode)('', {}, [], undefined, node);
1049
+ }
500
1050
  }
1051
+
1052
+ },{"./htmldomapi.js":3,"./vnode.js":13}],13:[function(require,module,exports){
1053
+ "use strict";
1054
+
1055
+ Object.defineProperty(exports, "__esModule", {
1056
+ value: true
1057
+ });
501
1058
  exports.vnode = vnode;
502
- exports.default = vnode;
503
1059
 
504
- },{}]},{},[4])(4)
1060
+ function vnode(sel, data, children, text, elm) {
1061
+ const key = data === undefined ? undefined : data.key;
1062
+ return {
1063
+ sel,
1064
+ data,
1065
+ children,
1066
+ text,
1067
+ elm,
1068
+ key
1069
+ };
1070
+ }
1071
+
1072
+ },{}]},{},[1])(1)
505
1073
  });
506
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy8ucmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXItcGFjay82LjAuMi9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiaC5qcyIsImh0bWxkb21hcGkuanMiLCJpcy5qcyIsInNuYWJiZG9tLmpzIiwidGh1bmsuanMiLCJ2bm9kZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdm5vZGVfMSA9IHJlcXVpcmUoXCIuL3Zub2RlXCIpO1xudmFyIGlzID0gcmVxdWlyZShcIi4vaXNcIik7XG5mdW5jdGlvbiBhZGROUyhkYXRhLCBjaGlsZHJlbiwgc2VsKSB7XG4gICAgZGF0YS5ucyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gICAgaWYgKHNlbCAhPT0gJ2ZvcmVpZ25PYmplY3QnICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkRGF0YSA9IGNoaWxkcmVuW2ldLmRhdGE7XG4gICAgICAgICAgICBpZiAoY2hpbGREYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBhZGROUyhjaGlsZERhdGEsIGNoaWxkcmVuW2ldLmNoaWxkcmVuLCBjaGlsZHJlbltpXS5zZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaChzZWwsIGIsIGMpIHtcbiAgICB2YXIgZGF0YSA9IHt9LCBjaGlsZHJlbiwgdGV4dCwgaTtcbiAgICBpZiAoYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRhdGEgPSBiO1xuICAgICAgICBpZiAoaXMuYXJyYXkoYykpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gYztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUoYykpIHtcbiAgICAgICAgICAgIHRleHQgPSBjO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGMgJiYgYy5zZWwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gW2NdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaXMuYXJyYXkoYikpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gYjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUoYikpIHtcbiAgICAgICAgICAgIHRleHQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgJiYgYi5zZWwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gW2JdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IGI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmFycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChpcy5wcmltaXRpdmUoY2hpbGRyZW5baV0pKVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gdm5vZGVfMS52bm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjaGlsZHJlbltpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlbFswXSA9PT0gJ3MnICYmIHNlbFsxXSA9PT0gJ3YnICYmIHNlbFsyXSA9PT0gJ2cnICYmXG4gICAgICAgIChzZWwubGVuZ3RoID09PSAzIHx8IHNlbFszXSA9PT0gJy4nIHx8IHNlbFszXSA9PT0gJyMnKSkge1xuICAgICAgICBhZGROUyhkYXRhLCBjaGlsZHJlbiwgc2VsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlXzEudm5vZGUoc2VsLCBkYXRhLCBjaGlsZHJlbiwgdGV4dCwgdW5kZWZpbmVkKTtcbn1cbmV4cG9ydHMuaCA9IGg7XG47XG5leHBvcnRzLmRlZmF1bHQgPSBoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xufVxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21tZW50KHRleHQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KTtcbn1cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnROb2RlLCBuZXdOb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSk7XG59XG5mdW5jdGlvbiByZW1vdmVDaGlsZChub2RlLCBjaGlsZCkge1xuICAgIG5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGQobm9kZSwgY2hpbGQpIHtcbiAgICBub2RlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIHBhcmVudE5vZGUobm9kZSkge1xuICAgIHJldHVybiBub2RlLnBhcmVudE5vZGU7XG59XG5mdW5jdGlvbiBuZXh0U2libGluZyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG59XG5mdW5jdGlvbiB0YWdOYW1lKGVsbSkge1xuICAgIHJldHVybiBlbG0udGFnTmFtZTtcbn1cbmZ1bmN0aW9uIHNldFRleHRDb250ZW50KG5vZGUsIHRleHQpIHtcbiAgICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGdldFRleHRDb250ZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50ZXh0Q29udGVudDtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDE7XG59XG5mdW5jdGlvbiBpc1RleHQobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAzO1xufVxuZnVuY3Rpb24gaXNDb21tZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gODtcbn1cbmV4cG9ydHMuaHRtbERvbUFwaSA9IHtcbiAgICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50LFxuICAgIGNyZWF0ZUVsZW1lbnROUzogY3JlYXRlRWxlbWVudE5TLFxuICAgIGNyZWF0ZVRleHROb2RlOiBjcmVhdGVUZXh0Tm9kZSxcbiAgICBjcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LFxuICAgIGluc2VydEJlZm9yZTogaW5zZXJ0QmVmb3JlLFxuICAgIHJlbW92ZUNoaWxkOiByZW1vdmVDaGlsZCxcbiAgICBhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsXG4gICAgcGFyZW50Tm9kZTogcGFyZW50Tm9kZSxcbiAgICBuZXh0U2libGluZzogbmV4dFNpYmxpbmcsXG4gICAgdGFnTmFtZTogdGFnTmFtZSxcbiAgICBzZXRUZXh0Q29udGVudDogc2V0VGV4dENvbnRlbnQsXG4gICAgZ2V0VGV4dENvbnRlbnQ6IGdldFRleHRDb250ZW50LFxuICAgIGlzRWxlbWVudDogaXNFbGVtZW50LFxuICAgIGlzVGV4dDogaXNUZXh0LFxuICAgIGlzQ29tbWVudDogaXNDb21tZW50LFxufTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuaHRtbERvbUFwaTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0bWxkb21hcGkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFycmF5ID0gQXJyYXkuaXNBcnJheTtcbmZ1bmN0aW9uIHByaW1pdGl2ZShzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLnByaW1pdGl2ZSA9IHByaW1pdGl2ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHZub2RlXzEgPSByZXF1aXJlKFwiLi92bm9kZVwiKTtcbnZhciBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xudmFyIGh0bWxkb21hcGlfMSA9IHJlcXVpcmUoXCIuL2h0bWxkb21hcGlcIik7XG5mdW5jdGlvbiBpc1VuZGVmKHMpIHsgcmV0dXJuIHMgPT09IHVuZGVmaW5lZDsgfVxuZnVuY3Rpb24gaXNEZWYocykgeyByZXR1cm4gcyAhPT0gdW5kZWZpbmVkOyB9XG52YXIgZW1wdHlOb2RlID0gdm5vZGVfMS5kZWZhdWx0KCcnLCB7fSwgW10sIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbmZ1bmN0aW9uIHNhbWVWbm9kZSh2bm9kZTEsIHZub2RlMikge1xuICAgIHJldHVybiB2bm9kZTEua2V5ID09PSB2bm9kZTIua2V5ICYmIHZub2RlMS5zZWwgPT09IHZub2RlMi5zZWw7XG59XG5mdW5jdGlvbiBpc1Zub2RlKHZub2RlKSB7XG4gICAgcmV0dXJuIHZub2RlLnNlbCAhPT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gY3JlYXRlS2V5VG9PbGRJZHgoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHtcbiAgICB2YXIgaSwgbWFwID0ge30sIGtleSwgY2g7XG4gICAgZm9yIChpID0gYmVnaW5JZHg7IGkgPD0gZW5kSWR4OyArK2kpIHtcbiAgICAgICAgY2ggPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGtleSA9IGNoLmtleTtcbiAgICAgICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBtYXBba2V5XSA9IGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbn1cbnZhciBob29rcyA9IFsnY3JlYXRlJywgJ3VwZGF0ZScsICdyZW1vdmUnLCAnZGVzdHJveScsICdwcmUnLCAncG9zdCddO1xudmFyIGhfMSA9IHJlcXVpcmUoXCIuL2hcIik7XG5leHBvcnRzLmggPSBoXzEuaDtcbnZhciB0aHVua18xID0gcmVxdWlyZShcIi4vdGh1bmtcIik7XG5leHBvcnRzLnRodW5rID0gdGh1bmtfMS50aHVuaztcbmZ1bmN0aW9uIGluaXQobW9kdWxlcywgZG9tQXBpKSB7XG4gICAgdmFyIGksIGosIGNicyA9IHt9O1xuICAgIHZhciBhcGkgPSBkb21BcGkgIT09IHVuZGVmaW5lZCA/IGRvbUFwaSA6IGh0bWxkb21hcGlfMS5kZWZhdWx0O1xuICAgIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjYnNbaG9va3NbaV1dID0gW107XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBtb2R1bGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB2YXIgaG9vayA9IG1vZHVsZXNbal1baG9va3NbaV1dO1xuICAgICAgICAgICAgaWYgKGhvb2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNic1tob29rc1tpXV0ucHVzaChob29rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBlbXB0eU5vZGVBdChlbG0pIHtcbiAgICAgICAgdmFyIGlkID0gZWxtLmlkID8gJyMnICsgZWxtLmlkIDogJyc7XG4gICAgICAgIHZhciBjID0gZWxtLmNsYXNzTmFtZSA/ICcuJyArIGVsbS5jbGFzc05hbWUuc3BsaXQoJyAnKS5qb2luKCcuJykgOiAnJztcbiAgICAgICAgcmV0dXJuIHZub2RlXzEuZGVmYXVsdChhcGkudGFnTmFtZShlbG0pLnRvTG93ZXJDYXNlKCkgKyBpZCArIGMsIHt9LCBbXSwgdW5kZWZpbmVkLCBlbG0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVSbUNiKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJtQ2IoKSB7XG4gICAgICAgICAgICBpZiAoLS1saXN0ZW5lcnMgPT09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50XzEgPSBhcGkucGFyZW50Tm9kZShjaGlsZEVsbSk7XG4gICAgICAgICAgICAgICAgYXBpLnJlbW92ZUNoaWxkKHBhcmVudF8xLCBjaGlsZEVsbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUVsbSh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7XG4gICAgICAgIHZhciBpLCBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLmluaXQpKSB7XG4gICAgICAgICAgICAgICAgaSh2bm9kZSk7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHZub2RlLmRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW4sIHNlbCA9IHZub2RlLnNlbDtcbiAgICAgICAgaWYgKHNlbCA9PT0gJyEnKSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZih2bm9kZS50ZXh0KSkge1xuICAgICAgICAgICAgICAgIHZub2RlLnRleHQgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZub2RlLmVsbSA9IGFwaS5jcmVhdGVDb21tZW50KHZub2RlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBQYXJzZSBzZWxlY3RvclxuICAgICAgICAgICAgdmFyIGhhc2hJZHggPSBzZWwuaW5kZXhPZignIycpO1xuICAgICAgICAgICAgdmFyIGRvdElkeCA9IHNlbC5pbmRleE9mKCcuJywgaGFzaElkeCk7XG4gICAgICAgICAgICB2YXIgaGFzaCA9IGhhc2hJZHggPiAwID8gaGFzaElkeCA6IHNlbC5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgZG90ID0gZG90SWR4ID4gMCA/IGRvdElkeCA6IHNlbC5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgdGFnID0gaGFzaElkeCAhPT0gLTEgfHwgZG90SWR4ICE9PSAtMSA/IHNlbC5zbGljZSgwLCBNYXRoLm1pbihoYXNoLCBkb3QpKSA6IHNlbDtcbiAgICAgICAgICAgIHZhciBlbG0gPSB2bm9kZS5lbG0gPSBpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ucykgPyBhcGkuY3JlYXRlRWxlbWVudE5TKGksIHRhZylcbiAgICAgICAgICAgICAgICA6IGFwaS5jcmVhdGVFbGVtZW50KHRhZyk7XG4gICAgICAgICAgICBpZiAoaGFzaCA8IGRvdClcbiAgICAgICAgICAgICAgICBlbG0uc2V0QXR0cmlidXRlKCdpZCcsIHNlbC5zbGljZShoYXNoICsgMSwgZG90KSk7XG4gICAgICAgICAgICBpZiAoZG90SWR4ID4gMClcbiAgICAgICAgICAgICAgICBlbG0uc2V0QXR0cmlidXRlKCdjbGFzcycsIHNlbC5zbGljZShkb3QgKyAxKS5yZXBsYWNlKC9cXC4vZywgJyAnKSk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmNyZWF0ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBjYnMuY3JlYXRlW2ldKGVtcHR5Tm9kZSwgdm5vZGUpO1xuICAgICAgICAgICAgaWYgKGlzLmFycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5hcHBlbmRDaGlsZChlbG0sIGNyZWF0ZUVsbShjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUodm5vZGUudGV4dCkpIHtcbiAgICAgICAgICAgICAgICBhcGkuYXBwZW5kQ2hpbGQoZWxtLCBhcGkuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSA9IHZub2RlLmRhdGEuaG9vazsgLy8gUmV1c2UgdmFyaWFibGVcbiAgICAgICAgICAgIGlmIChpc0RlZihpKSkge1xuICAgICAgICAgICAgICAgIGlmIChpLmNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGkuaW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2bm9kZS5lbG0gPSBhcGkuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZub2RlLmVsbTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkVm5vZGVzKHBhcmVudEVsbSwgYmVmb3JlLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB2bm9kZXNbc3RhcnRJZHhdO1xuICAgICAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhcGkuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgY3JlYXRlRWxtKGNoLCBpbnNlcnRlZFZub2RlUXVldWUpLCBiZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGludm9rZURlc3Ryb3lIb29rKHZub2RlKSB7XG4gICAgICAgIHZhciBpLCBqLCBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLmRlc3Ryb3kpKVxuICAgICAgICAgICAgICAgIGkodm5vZGUpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGNicy5kZXN0cm95W2ldKHZub2RlKTtcbiAgICAgICAgICAgIGlmICh2bm9kZS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHZub2RlLmNoaWxkcmVuLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB2bm9kZS5jaGlsZHJlbltqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCAmJiB0eXBlb2YgaSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlRGVzdHJveUhvb2soaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgdm5vZGVzLCBzdGFydElkeCwgZW5kSWR4KSB7XG4gICAgICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHtcbiAgICAgICAgICAgIHZhciBpXzEgPSB2b2lkIDAsIGxpc3RlbmVycyA9IHZvaWQgMCwgcm0gPSB2b2lkIDAsIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTtcbiAgICAgICAgICAgIGlmIChjaCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVmKGNoLnNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlRGVzdHJveUhvb2soY2gpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBjYnMucmVtb3ZlLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgICAgIHJtID0gY3JlYXRlUm1DYihjaC5lbG0sIGxpc3RlbmVycyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaV8xID0gMDsgaV8xIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraV8xKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2JzLnJlbW92ZVtpXzFdKGNoLCBybSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0RlZihpXzEgPSBjaC5kYXRhKSAmJiBpc0RlZihpXzEgPSBpXzEuaG9vaykgJiYgaXNEZWYoaV8xID0gaV8xLnJlbW92ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlfMShjaCwgcm0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXBpLnJlbW92ZUNoaWxkKHBhcmVudEVsbSwgY2guZWxtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQ2hpbGRyZW4ocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICB2YXIgb2xkU3RhcnRJZHggPSAwLCBuZXdTdGFydElkeCA9IDA7XG4gICAgICAgIHZhciBvbGRFbmRJZHggPSBvbGRDaC5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgb2xkU3RhcnRWbm9kZSA9IG9sZENoWzBdO1xuICAgICAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdO1xuICAgICAgICB2YXIgbmV3RW5kSWR4ID0gbmV3Q2gubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFswXTtcbiAgICAgICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTtcbiAgICAgICAgdmFyIG9sZEtleVRvSWR4O1xuICAgICAgICB2YXIgaWR4SW5PbGQ7XG4gICAgICAgIHZhciBlbG1Ub01vdmU7XG4gICAgICAgIHZhciBiZWZvcmU7XG4gICAgICAgIHdoaWxlIChvbGRTdGFydElkeCA8PSBvbGRFbmRJZHggJiYgbmV3U3RhcnRJZHggPD0gbmV3RW5kSWR4KSB7XG4gICAgICAgICAgICBpZiAob2xkU3RhcnRWbm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdOyAvLyBWbm9kZSBtaWdodCBoYXZlIGJlZW4gbW92ZWQgbGVmdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob2xkRW5kVm5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV3U3RhcnRWbm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV3RW5kVm5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTtcbiAgICAgICAgICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBhcGkubmV4dFNpYmxpbmcob2xkRW5kVm5vZGUuZWxtKSk7XG4gICAgICAgICAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZEVuZFZub2RlLmVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChvbGRLZXlUb0lkeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZHhJbk9sZCA9IG9sZEtleVRvSWR4W25ld1N0YXJ0Vm5vZGUua2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZihpZHhJbk9sZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIGNyZWF0ZUVsbShuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsbVRvTW92ZSA9IG9sZENoW2lkeEluT2xkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsbVRvTW92ZS5zZWwgIT09IG5ld1N0YXJ0Vm5vZGUuc2VsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcGkuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSksIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUoZWxtVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ2hbaWR4SW5PbGRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIGVsbVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvbGRTdGFydElkeCA+IG9sZEVuZElkeCkge1xuICAgICAgICAgICAgYmVmb3JlID0gbmV3Q2hbbmV3RW5kSWR4ICsgMV0gPT0gbnVsbCA/IG51bGwgOiBuZXdDaFtuZXdFbmRJZHggKyAxXS5lbG07XG4gICAgICAgICAgICBhZGRWbm9kZXMocGFyZW50RWxtLCBiZWZvcmUsIG5ld0NoLCBuZXdTdGFydElkeCwgbmV3RW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5ld1N0YXJ0SWR4ID4gbmV3RW5kSWR4KSB7XG4gICAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcGF0Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICB2YXIgaSwgaG9vaztcbiAgICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5kYXRhKSAmJiBpc0RlZihob29rID0gaS5ob29rKSAmJiBpc0RlZihpID0gaG9vay5wcmVwYXRjaCkpIHtcbiAgICAgICAgICAgIGkob2xkVm5vZGUsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtO1xuICAgICAgICB2YXIgb2xkQ2ggPSBvbGRWbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgIGlmIChvbGRWbm9kZSA9PT0gdm5vZGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh2bm9kZS5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTtcbiAgICAgICAgICAgIGkgPSB2bm9kZS5kYXRhLmhvb2s7XG4gICAgICAgICAgICBpZiAoaXNEZWYoaSkgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSlcbiAgICAgICAgICAgICAgICBpKG9sZFZub2RlLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW5kZWYodm5vZGUudGV4dCkpIHtcbiAgICAgICAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZENoICE9PSBjaClcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW4oZWxtLCBvbGRDaCwgY2gsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNEZWYob2xkVm5vZGUudGV4dCkpXG4gICAgICAgICAgICAgICAgICAgIGFwaS5zZXRUZXh0Q29udGVudChlbG0sICcnKTtcbiAgICAgICAgICAgICAgICBhZGRWbm9kZXMoZWxtLCBudWxsLCBjaCwgMCwgY2gubGVuZ3RoIC0gMSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGVmKG9sZENoKSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZVZub2RlcyhlbG0sIG9sZENoLCAwLCBvbGRDaC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgYXBpLnNldFRleHRDb250ZW50KGVsbSwgJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9sZFZub2RlLnRleHQgIT09IHZub2RlLnRleHQpIHtcbiAgICAgICAgICAgIGFwaS5zZXRUZXh0Q29udGVudChlbG0sIHZub2RlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlZihob29rKSAmJiBpc0RlZihpID0gaG9vay5wb3N0cGF0Y2gpKSB7XG4gICAgICAgICAgICBpKG9sZFZub2RlLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHBhdGNoKG9sZFZub2RlLCB2bm9kZSkge1xuICAgICAgICB2YXIgaSwgZWxtLCBwYXJlbnQ7XG4gICAgICAgIHZhciBpbnNlcnRlZFZub2RlUXVldWUgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5wcmUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICBjYnMucHJlW2ldKCk7XG4gICAgICAgIGlmICghaXNWbm9kZShvbGRWbm9kZSkpIHtcbiAgICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYW1lVm5vZGUob2xkVm5vZGUsIHZub2RlKSkge1xuICAgICAgICAgICAgcGF0Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbG0gPSBvbGRWbm9kZS5lbG07XG4gICAgICAgICAgICBwYXJlbnQgPSBhcGkucGFyZW50Tm9kZShlbG0pO1xuICAgICAgICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGFwaS5pbnNlcnRCZWZvcmUocGFyZW50LCB2bm9kZS5lbG0sIGFwaS5uZXh0U2libGluZyhlbG0pKTtcbiAgICAgICAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50LCBbb2xkVm5vZGVdLCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpbnNlcnRlZFZub2RlUXVldWVbaV0uZGF0YS5ob29rLmluc2VydChpbnNlcnRlZFZub2RlUXVldWVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMucG9zdC5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIGNicy5wb3N0W2ldKCk7XG4gICAgICAgIHJldHVybiB2bm9kZTtcbiAgICB9O1xufVxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNuYWJiZG9tLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGhfMSA9IHJlcXVpcmUoXCIuL2hcIik7XG5mdW5jdGlvbiBjb3B5VG9UaHVuayh2bm9kZSwgdGh1bmspIHtcbiAgICB0aHVuay5lbG0gPSB2bm9kZS5lbG07XG4gICAgdm5vZGUuZGF0YS5mbiA9IHRodW5rLmRhdGEuZm47XG4gICAgdm5vZGUuZGF0YS5hcmdzID0gdGh1bmsuZGF0YS5hcmdzO1xuICAgIHRodW5rLmRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIHRodW5rLmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gICAgdGh1bmsudGV4dCA9IHZub2RlLnRleHQ7XG4gICAgdGh1bmsuZWxtID0gdm5vZGUuZWxtO1xufVxuZnVuY3Rpb24gaW5pdCh0aHVuaykge1xuICAgIHZhciBjdXIgPSB0aHVuay5kYXRhO1xuICAgIHZhciB2bm9kZSA9IGN1ci5mbi5hcHBseSh1bmRlZmluZWQsIGN1ci5hcmdzKTtcbiAgICBjb3B5VG9UaHVuayh2bm9kZSwgdGh1bmspO1xufVxuZnVuY3Rpb24gcHJlcGF0Y2gob2xkVm5vZGUsIHRodW5rKSB7XG4gICAgdmFyIGksIG9sZCA9IG9sZFZub2RlLmRhdGEsIGN1ciA9IHRodW5rLmRhdGE7XG4gICAgdmFyIG9sZEFyZ3MgPSBvbGQuYXJncywgYXJncyA9IGN1ci5hcmdzO1xuICAgIGlmIChvbGQuZm4gIT09IGN1ci5mbiB8fCBvbGRBcmdzLmxlbmd0aCAhPT0gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY29weVRvVGh1bmsoY3VyLmZuLmFwcGx5KHVuZGVmaW5lZCwgYXJncyksIHRodW5rKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAob2xkQXJnc1tpXSAhPT0gYXJnc1tpXSkge1xuICAgICAgICAgICAgY29weVRvVGh1bmsoY3VyLmZuLmFwcGx5KHVuZGVmaW5lZCwgYXJncyksIHRodW5rKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3B5VG9UaHVuayhvbGRWbm9kZSwgdGh1bmspO1xufVxuZXhwb3J0cy50aHVuayA9IGZ1bmN0aW9uIHRodW5rKHNlbCwga2V5LCBmbiwgYXJncykge1xuICAgIGlmIChhcmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncyA9IGZuO1xuICAgICAgICBmbiA9IGtleTtcbiAgICAgICAga2V5ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaF8xLmgoc2VsLCB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBob29rOiB7IGluaXQ6IGluaXQsIHByZXBhdGNoOiBwcmVwYXRjaCB9LFxuICAgICAgICBmbjogZm4sXG4gICAgICAgIGFyZ3M6IGFyZ3NcbiAgICB9KTtcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLnRodW5rO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGh1bmsuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiB2bm9kZShzZWwsIGRhdGEsIGNoaWxkcmVuLCB0ZXh0LCBlbG0pIHtcbiAgICB2YXIga2V5ID0gZGF0YSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZGF0YS5rZXk7XG4gICAgcmV0dXJuIHsgc2VsOiBzZWwsIGRhdGE6IGRhdGEsIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICAgICAgdGV4dDogdGV4dCwgZWxtOiBlbG0sIGtleToga2V5IH07XG59XG5leHBvcnRzLnZub2RlID0gdm5vZGU7XG5leHBvcnRzLmRlZmF1bHQgPSB2bm9kZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZub2RlLmpzLm1hcCJdfQ==