easy-file-system 1.5.18 → 1.5.20

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.
@@ -32,17 +32,11 @@ class DragEntryItem extends EntryItem {
32
32
  return;
33
33
  }
34
34
 
35
- const oldPath = this.getOldPath(),
36
- newPath = this.getNewPath(),
37
- sourceEntryPath = oldPath, ///
38
- targetEntryPath = newPath, ///
39
- pathMap = this.getPathMap(sourceEntryPath, targetEntryPath),
40
- explorer = this.getExplorer();
41
-
42
- explorer.callPathChangeHandlersAsync(pathMap, (success) => {
43
- success ?
44
- this.update() :
45
- this.cancel();
35
+ const explorer = this.getExplorer(),
36
+ dragEntryItem = this; ///
37
+
38
+ explorer.renameDragEntryItem(dragEntryItem, () => {
39
+ this.cancel();
46
40
  });
47
41
  }
48
42
 
@@ -83,56 +77,33 @@ class DragEntryItem extends EntryItem {
83
77
  markerEntryItemExplorer.dropDragEntryItem(dragEntryItem, done);
84
78
  }
85
79
 
86
- getName() {
87
- const nameButtonName = this.getNameButtonName(),
88
- name = nameButtonName; ///
89
-
90
- return name;
91
- }
92
-
93
- getOldName() {
94
- const nameButtonName = this.getNameButtonName(),
95
- oldName = nameButtonName; ///
96
-
97
- return oldName;
98
- }
99
-
100
- getNewName() {
80
+ getInputName() {
101
81
  const nameInputName = this.getNameInputName(),
102
- oldName = nameInputName; ///
103
-
104
- return oldName;
105
- }
106
-
107
- getOldPath() {
108
- const path = this.getPath(),
109
- oldName = this.getOldName(),
110
- pathWithoutBottommostName = pathWithoutBottommostNameFromPath(path),
111
- oldPath = (pathWithoutBottommostName === null) ?
112
- oldName :
113
- concatenatePaths(pathWithoutBottommostName, oldName);
82
+ inputName = nameInputName; ///
114
83
 
115
- return oldPath;
84
+ return inputName;
116
85
  }
117
86
 
118
- getNewPath() {
87
+ getInputPath() {
119
88
  const path = this.getPath(),
120
- newName = this.getNewName(),
89
+ inputName = this.getInputName(),
121
90
  pathWithoutBottommostName = pathWithoutBottommostNameFromPath(path),
122
- newPath = (pathWithoutBottommostName === null) ?
123
- newName :
124
- concatenatePaths(pathWithoutBottommostName, newName);
91
+ inputPath = (pathWithoutBottommostName === null) ?
92
+ inputName :
93
+ concatenatePaths(pathWithoutBottommostName, inputName);
125
94
 
126
- return newPath;
95
+ return inputPath;
127
96
  }
128
97
 
129
98
  getPathMap(sourceEntryPath, targetEntryPath) {
130
99
  const name = this.getName(),
131
100
  collapsed = this.isCollapsed(),
101
+ nameInputName = this.getNameInputName(),
132
102
  entryDirectory = this.isEntryDirectory();
133
103
 
134
104
  sourceEntryPath = adjustSourceEntryPath(sourceEntryPath, name); ///
135
- targetEntryPath = adjustTargetEntryPath(targetEntryPath, name); ///
105
+
106
+ targetEntryPath = adjustTargetEntryPath(targetEntryPath, nameInputName); ///
136
107
 
137
108
  const pathMap = {
138
109
  collapsed,
@@ -155,9 +126,9 @@ class DragEntryItem extends EntryItem {
155
126
  }
156
127
 
157
128
  hasNameChanged() {
158
- const newName = this.getOldName(),
159
- oldName = this.getNewName(),
160
- nameChanged = (newName !== oldName);
129
+ const name = this.getName(),
130
+ inputName = this.getInputName(),
131
+ nameChanged = (inputName !== name);
161
132
 
162
133
  return nameChanged;
163
134
  }
@@ -188,8 +159,8 @@ class DragEntryItem extends EntryItem {
188
159
  }
189
160
 
190
161
  cancel() {
191
- const nameButtonName = this.getNameButtonName(),
192
- nameInputName = nameButtonName; ///
162
+ const name = this.getName(),
163
+ nameInputName = name; ///
193
164
 
194
165
  this.setNameInputName(nameInputName);
195
166
 
@@ -197,24 +168,6 @@ class DragEntryItem extends EntryItem {
197
168
  this.hideNameInput();
198
169
  }
199
170
 
200
- update() {
201
- const nameInputName = this.getNameInputName(),
202
- nameButtonName = nameInputName; ///
203
-
204
- this.setNameButtonName(nameButtonName);
205
-
206
- this.showNameButton();
207
- this.hideNameInput();
208
-
209
- const parentElement = this.getParentElement(),
210
- entriesList = parentElement, ///
211
- entryItem = this; ///
212
-
213
- entriesList.removeEntryItem(entryItem);
214
-
215
- entriesList.addEntryItem(entryItem);
216
- }
217
-
218
171
  didMount() {
219
172
  this.hideNameInput();
220
173
 
package/src/item/entry.js CHANGED
@@ -2,11 +2,12 @@
2
2
 
3
3
  import withStyle from "easy-with-style"; ///
4
4
 
5
- import { arrayUtilities } from "necessary";
5
+ import { pathUtilities, arrayUtilities } from "necessary";
6
6
 
7
7
  import { Element } from "easy";
8
8
 
9
- const { first } = arrayUtilities;
9
+ const { first } = arrayUtilities,
10
+ { concatenatePaths } = pathUtilities;
10
11
 
11
12
  class EntryItem extends Element {
12
13
  getParentDirectoryNameDragEntryItem() {
@@ -36,7 +37,7 @@ class EntryItem extends Element {
36
37
  } else {
37
38
  const parentDirectoryNameDragEntryItemPath = parentDirectoryNameDragEntryItem.getPath();
38
39
 
39
- path = `${parentDirectoryNameDragEntryItemPath}/${name}`;
40
+ path = concatenatePaths(parentDirectoryNameDragEntryItemPath, name);
40
41
  }
41
42
 
42
43
  return path;
@@ -92,33 +92,23 @@ function callMoveHandlersAsync(pathMaps, done) {
92
92
 
93
93
  forEach(eventListeners, (eventListener, next) => {
94
94
  const { handler, element } = eventListener,
95
- moveHandler = handler, ///
96
- done = next; ///
95
+ moveHandler = handler, ///
96
+ done = next; ///
97
97
 
98
98
  moveHandler.call(element, pathMaps, done);
99
99
  }, done);
100
100
  }
101
101
 
102
- function callPathChangeHandlersAsync(pathMap, callback) {
103
- let notSuccess = false;
104
-
105
- const done = () => {
106
- const success = !notSuccess;
107
-
108
- callback(success);
109
- },
110
- eventType = PATH_CHANGE_EVENT_TYPE,
102
+ function callPathChangeHandlersAsync(pathMaps, done) {
103
+ const eventType = PATH_CHANGE_EVENT_TYPE,
111
104
  eventListeners = this.findEventListeners(eventType);
112
105
 
113
106
  forEach(eventListeners, (eventListener, next) => {
114
107
  const { handler, element } = eventListener,
115
- pathChangeHandler = handler; ///
116
-
117
- pathChangeHandler.call(element, pathMap, (success) => {
118
- notSuccess = !success;
108
+ pathChangeHandler = handler, ///
109
+ done = next; ///
119
110
 
120
- next();
121
- });
111
+ pathChangeHandler.call(element, pathMaps, done);
122
112
  }, done);
123
113
  }
124
114
 
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ import { asynchronousUtilities } from "necessary";
4
+
5
+ import { REMOVE_EVENT_TYPE } from "../eventTypes";
6
+
7
+ const { forEach } = asynchronousUtilities;
8
+
9
+ function onRemove(removeHandler, element) {
10
+ const eventType = REMOVE_EVENT_TYPE,
11
+ handler = removeHandler; ///
12
+
13
+ this.addEventListener(eventType, handler, element);
14
+ }
15
+
16
+ function offRemove(removeHandler, element) {
17
+ const eventType = REMOVE_EVENT_TYPE,
18
+ handler = removeHandler; ///
19
+
20
+ this.removeEventListener(eventType, handler, element);
21
+ }
22
+
23
+ function callRemoveHandlersAsync(pathMaps, done) {
24
+ const eventType = REMOVE_EVENT_TYPE,
25
+ eventListeners = this.findEventListeners(eventType);
26
+
27
+ forEach(eventListeners, (eventListener, next) => {
28
+ const { handler, element } = eventListener,
29
+ removeHandler = handler, ///
30
+ done = next; ///
31
+
32
+ removeHandler.call(element, pathMaps, done);
33
+ }, done);
34
+ }
35
+
36
+ const rubbishBinMixins = {
37
+ onRemove,
38
+ offRemove,
39
+ callRemoveHandlersAsync
40
+ };
41
+
42
+ export default rubbishBinMixins;
package/src/rubbishBin.js CHANGED
@@ -4,21 +4,18 @@ import withStyle from "easy-with-style"; ///
4
4
 
5
5
  import { Element } from "easy";
6
6
  import { dropMixins } from "easy-drag-and-drop";
7
- import { asynchronousUtilities } from "necessary";
8
7
 
9
8
  import DragEntryItem from "./item/entry/drag";
9
+ import rubbishBinMixins from "./mixins/rubbishBin";
10
10
  import OpenRubbishBinSVG from "./svg/rubbishBin/open";
11
11
  import ClosedRubbishBinSVG from "./svg/rubbishBin/closed";
12
12
  import FileNameMarkerEntryItem from "./item/entry/marker/fileName";
13
13
  import DirectoryNameMarkerEntryItem from "./item/entry/marker/directoryName";
14
14
 
15
- import { REMOVE_EVENT_TYPE } from "./eventTypes";
16
15
  import { nonNullPathFromName } from "./utilities/pathMap";
17
- import { sourceEntryPathFromDragEntryItemPath } from "./utilities/pathMap";
16
+ import { sourceEntryPathFromEntryItem } from "./utilities/pathMap";
18
17
  import { DIRECTORY_NAME_DRAG_ENTRY_TYPE, FILE_NAME_DRAG_ENTRY_TYPE } from "./entryTypes";
19
18
 
20
- const { forEach } = asynchronousUtilities;
21
-
22
19
  class RubbishBin extends Element {
23
20
  dropHandler = (dragElement, aborted, element, done) => {
24
21
  const dragElementDragEntryItem = (dragElement instanceof DragEntryItem);
@@ -161,24 +158,9 @@ class RubbishBin extends Element {
161
158
  });
162
159
  }
163
160
 
164
- onRemove(removeHandler, element) {
165
- const eventType = REMOVE_EVENT_TYPE,
166
- handler = removeHandler; ///
167
-
168
- this.addEventListener(eventType, handler, element);
169
- }
170
-
171
- offRemove(removeHandler, element) {
172
- const eventType = REMOVE_EVENT_TYPE,
173
- handler = removeHandler; ///
174
-
175
- this.removeEventListener(eventType, handler, element);
176
- }
177
-
178
161
  dropDragEntryItem(dragEntryItem, done) {
179
- const dragEntryItemPath = dragEntryItem.getPath(),
180
- dragEntryItemExplorer = dragEntryItem.getExplorer(),
181
- sourceEntryPath = sourceEntryPathFromDragEntryItemPath(dragEntryItemPath),
162
+ const dragEntryItemExplorer = dragEntryItem.getExplorer(),
163
+ sourceEntryPath = sourceEntryPathFromEntryItem(dragEntryItem),
182
164
  targetEntryPath = null,
183
165
  pathMaps = dragEntryItem.getPathMaps(sourceEntryPath, targetEntryPath),
184
166
  explorer = dragEntryItemExplorer; ///
@@ -230,19 +212,6 @@ class RubbishBin extends Element {
230
212
  explorer.removeDirectoryPath(directoryPath);
231
213
  }
232
214
 
233
- callRemoveHandlersAsync(pathMaps, done) {
234
- const eventType = REMOVE_EVENT_TYPE,
235
- eventListeners = this.findEventListeners(eventType);
236
-
237
- forEach(eventListeners, (eventListener, next) => {
238
- const { handler, element } = eventListener,
239
- removeHandler = handler, ///
240
- done = next; ///
241
-
242
- removeHandler.call(element, pathMaps, done);
243
- }, done);
244
- }
245
-
246
215
  open() {
247
216
  this.showOpenRubbishBinSVG();
248
217
  this.hideClosedRubbishBinSVG();
@@ -347,6 +316,7 @@ class RubbishBin extends Element {
347
316
  }
348
317
 
349
318
  Object.assign(RubbishBin.prototype, dropMixins);
319
+ Object.assign(RubbishBin.prototype, rubbishBinMixins);
350
320
 
351
321
  export default withStyle(RubbishBin)`
352
322
 
package/src/styles.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
- export const markerSVGHeight = "2rem";
4
3
  export const explorerPadding = "2rem";
4
+ export const markerSVGHeight = "2rem";
5
5
  export const toggleSVGHeight = "2rem";
6
6
  export const fileNameSVGHeight = "2rem";
7
7
  export const rubbishBinSVGHeight = "4rem";
@@ -4,18 +4,20 @@ import { pathUtilities } from "necessary";
4
4
 
5
5
  import { EMPTY_STRING } from "../constants";
6
6
 
7
- const { pathWithoutBottommostNameFromPath } = pathUtilities;
7
+ const { concatenatePaths, pathWithoutBottommostNameFromPath } = pathUtilities;
8
8
 
9
- export function sourceEntryPathFromDragEntryItemPath(dragEntryItemPath) {
10
- const dragEntryItemPathWithoutBottommostName = pathWithoutBottommostNameFromPath(dragEntryItemPath),
11
- sourceEntryPath = nonNullPathFromName(dragEntryItemPathWithoutBottommostName); ///
9
+ export function sourceEntryPathFromEntryItem(entryItem) {
10
+ const entryItemPath = entryItem.getPath(),
11
+ entryItemPathWithoutBottommostName = pathWithoutBottommostNameFromPath(entryItemPath),
12
+ sourceEntryPath = nonNullPathFromName(entryItemPathWithoutBottommostName); ///
12
13
 
13
14
  return sourceEntryPath;
14
15
  }
15
16
 
16
- export function targetEntryPathFromMarkerEntryItemPath(markerEntryItemPath) {
17
- const markerEntryItemPathWithoutBottommostName = pathWithoutBottommostNameFromPath(markerEntryItemPath),
18
- targetEntryPath = nonNullPathFromName(markerEntryItemPathWithoutBottommostName); ///
17
+ export function targetEntryPathFromEntryItem(entryItem) {
18
+ const entryItemPath = entryItem.getPath(),
19
+ entryItemPathWithoutBottommostName = pathWithoutBottommostNameFromPath(entryItemPath),
20
+ targetEntryPath = nonNullPathFromName(entryItemPathWithoutBottommostName); ///
19
21
 
20
22
  return targetEntryPath;
21
23
  }
@@ -26,21 +28,21 @@ export function adjustSourceEntryPath(sourceEntryPath, name) {
26
28
  } else if (sourceEntryPath === EMPTY_STRING) {
27
29
  sourceEntryPath = name; ///
28
30
  } else {
29
- sourceEntryPath = `${sourceEntryPath}/${name}`;
31
+ sourceEntryPath = concatenatePaths(sourceEntryPath, name);
30
32
  }
31
33
 
32
34
  return sourceEntryPath;
33
35
  }
34
36
 
35
- export function adjustTargetEntryPath(targetEntryPath, name) {
37
+ export function adjustTargetEntryPath(targetEntryPath, nameInputName) {
36
38
  if (false) {
37
39
  ///
38
40
  } else if (targetEntryPath === null) {
39
41
  targetEntryPath = null;
40
42
  } else if (targetEntryPath === EMPTY_STRING) {
41
- targetEntryPath = name; ///
43
+ targetEntryPath = nameInputName; ///
42
44
  } else {
43
- targetEntryPath = `${targetEntryPath}/${name}`;
45
+ targetEntryPath = concatenatePaths(targetEntryPath, nameInputName);
44
46
  }
45
47
 
46
48
  return targetEntryPath;
@@ -1,99 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "default", {
6
- enumerable: true,
7
- get: function() {
8
- return _default;
9
- }
10
- });
11
- var _necessary = require("necessary");
12
- var _eventTypes = require("../eventTypes");
13
- var forEach = _necessary.asynchronousUtilities.forEach;
14
- function onMove(moveHandler, element) {
15
- var eventType = _eventTypes.MOVE_EVENT_TYPE, handler = moveHandler; ///
16
- this.addEventListener(eventType, handler, element);
17
- }
18
- function offMove(moveHandler, element) {
19
- var eventType = _eventTypes.MOVE_EVENT_TYPE, handler = moveHandler; ///
20
- this.removeEventListener(eventType, handler, element);
21
- }
22
- function onOpen(openHandler, element) {
23
- var eventType = _eventTypes.OPEN_EVENT_TYPE, handler = openHandler; ///
24
- this.addEventListener(eventType, handler, element);
25
- }
26
- function offOpen(openHandler, element) {
27
- var eventType = _eventTypes.OPEN_EVENT_TYPE, handler = openHandler; ///
28
- this.removeEventListener(eventType, handler, element);
29
- }
30
- function onSelect(selectHandler, element) {
31
- var eventType = _eventTypes.SELECT_EVENT_TYPE, handler = selectHandler; ///
32
- this.addEventListener(eventType, handler, element);
33
- }
34
- function offSelect(selectHandler, element) {
35
- var eventType = _eventTypes.SELECT_EVENT_TYPE, handler = selectHandler; ///
36
- this.removeEventListener(eventType, handler, element);
37
- }
38
- function onPathChange(pathChangeHandler, element) {
39
- var eventType = _eventTypes.PATH_CHANGE_EVENT_TYPE, handler = pathChangeHandler; ///
40
- this.addEventListener(eventType, handler, element);
41
- }
42
- function offPathChange(pathChangeHandler, element) {
43
- var eventType = _eventTypes.PATH_CHANGE_EVENT_TYPE, handler = pathChangeHandler; ///
44
- this.removeEventListener(eventType, handler, element);
45
- }
46
- function callOpenHandlers(filePath) {
47
- var _this = this;
48
- var eventType = _eventTypes.OPEN_EVENT_TYPE, eventListeners = this.findEventListeners(eventType);
49
- eventListeners.forEach(function(eventListener) {
50
- var handler = eventListener.handler, element = eventListener.element, openHandler = handler; ///
51
- openHandler.call(element, filePath, _this); ///
52
- });
53
- }
54
- function callSelectHandlers(path, selected) {
55
- var _this = this;
56
- var eventType = _eventTypes.SELECT_EVENT_TYPE, eventListeners = this.findEventListeners(eventType);
57
- eventListeners.forEach(function(eventListener) {
58
- var handler = eventListener.handler, element = eventListener.element, selectHandler = handler; ///
59
- selectHandler.call(element, path, selected, _this); ///
60
- });
61
- }
62
- function callMoveHandlersAsync(pathMaps, done) {
63
- var eventType = _eventTypes.MOVE_EVENT_TYPE, eventListeners = this.findEventListeners(eventType);
64
- forEach(eventListeners, function(eventListener, next) {
65
- var handler = eventListener.handler, element = eventListener.element, moveHandler = handler, _$done = next; ///
66
- moveHandler.call(element, pathMaps, _$done);
67
- }, done);
68
- }
69
- function callPathChangeHandlersAsync(pathMap, callback) {
70
- var notSuccess = false;
71
- var done = function() {
72
- var success = !notSuccess;
73
- callback(success);
74
- }, eventType = _eventTypes.PATH_CHANGE_EVENT_TYPE, eventListeners = this.findEventListeners(eventType);
75
- forEach(eventListeners, function(eventListener, next) {
76
- var handler = eventListener.handler, element = eventListener.element, pathChangeHandler = handler; ///
77
- pathChangeHandler.call(element, pathMap, function(success) {
78
- notSuccess = !success;
79
- next();
80
- });
81
- }, done);
82
- }
83
- var eventMixins = {
84
- onMove: onMove,
85
- offMove: offMove,
86
- onOpen: onOpen,
87
- offOpen: offOpen,
88
- onSelect: onSelect,
89
- offSelect: offSelect,
90
- onPathChange: onPathChange,
91
- offPathChange: offPathChange,
92
- callOpenHandlers: callOpenHandlers,
93
- callSelectHandlers: callSelectHandlers,
94
- callMoveHandlersAsync: callMoveHandlersAsync,
95
- callPathChangeHandlersAsync: callPathChangeHandlersAsync
96
- };
97
- var _default = eventMixins;
98
-
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taXhpbnMvZXZlbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFzeW5jaHJvbm91c1V0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IHsgTU9WRV9FVkVOVF9UWVBFLCBPUEVOX0VWRU5UX1RZUEUsIFBBVEhfQ0hBTkdFX0VWRU5UX1RZUEUsIFNFTEVDVF9FVkVOVF9UWVBFIH0gZnJvbSBcIi4uL2V2ZW50VHlwZXNcIjtcblxuY29uc3QgeyBmb3JFYWNoIH0gPSBhc3luY2hyb25vdXNVdGlsaXRpZXM7XG5cbmZ1bmN0aW9uIG9uTW92ZShtb3ZlSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBldmVudFR5cGUgPSBNT1ZFX0VWRU5UX1RZUEUsXG4gICAgICAgIGhhbmRsZXIgPSBtb3ZlSGFuZGxlcjsgIC8vL1xuXG4gIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZNb3ZlKG1vdmVIYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGV2ZW50VHlwZSA9IE1PVkVfRVZFTlRfVFlQRSxcbiAgICAgICAgaGFuZGxlciA9IG1vdmVIYW5kbGVyOyAgLy8vXG5cbiAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9uT3BlbihvcGVuSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBldmVudFR5cGUgPSBPUEVOX0VWRU5UX1RZUEUsXG4gICAgICAgIGhhbmRsZXIgPSBvcGVuSGFuZGxlcjsgIC8vL1xuXG4gIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvZmZPcGVuKG9wZW5IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGV2ZW50VHlwZSA9IE9QRU5fRVZFTlRfVFlQRSxcbiAgICAgICAgaGFuZGxlciA9IG9wZW5IYW5kbGVyOyAgLy8vXG5cbiAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9uU2VsZWN0KHNlbGVjdEhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgZXZlbnRUeXBlID0gU0VMRUNUX0VWRU5UX1RZUEUsXG4gICAgICAgIGhhbmRsZXIgPSBzZWxlY3RIYW5kbGVyOyAgLy8vXG5cbiAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9mZlNlbGVjdChzZWxlY3RIYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGV2ZW50VHlwZSA9IFNFTEVDVF9FVkVOVF9UWVBFLFxuICAgICAgICBoYW5kbGVyID0gc2VsZWN0SGFuZGxlcjsgIC8vL1xuXG4gIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBvblBhdGhDaGFuZ2UocGF0aENoYW5nZUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgZXZlbnRUeXBlID0gUEFUSF9DSEFOR0VfRVZFTlRfVFlQRSxcbiAgICAgICAgaGFuZGxlciA9IHBhdGhDaGFuZ2VIYW5kbGVyOyAgLy8vXG5cbiAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIG9mZlBhdGhDaGFuZ2UocGF0aENoYW5nZUhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgZXZlbnRUeXBlID0gUEFUSF9DSEFOR0VfRVZFTlRfVFlQRSxcbiAgICAgICAgaGFuZGxlciA9IHBhdGhDaGFuZ2VIYW5kbGVyOyAgLy8vXG5cbiAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIGNhbGxPcGVuSGFuZGxlcnMoZmlsZVBhdGgpIHtcbiAgY29uc3QgZXZlbnRUeXBlID0gT1BFTl9FVkVOVF9UWVBFLFxuICAgICAgICBldmVudExpc3RlbmVycyA9IHRoaXMuZmluZEV2ZW50TGlzdGVuZXJzKGV2ZW50VHlwZSk7XG5cbiAgZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaCgoZXZlbnRMaXN0ZW5lcikgPT4ge1xuICAgIGNvbnN0IHsgaGFuZGxlciwgZWxlbWVudCB9ID0gZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgb3BlbkhhbmRsZXIgPSBoYW5kbGVyOyAgLy8vXG5cbiAgICBvcGVuSGFuZGxlci5jYWxsKGVsZW1lbnQsIGZpbGVQYXRoLCB0aGlzKTsgIC8vL1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2FsbFNlbGVjdEhhbmRsZXJzKHBhdGgsIHNlbGVjdGVkKSB7XG4gIGNvbnN0IGV2ZW50VHlwZSA9IFNFTEVDVF9FVkVOVF9UWVBFLFxuICAgICAgICBldmVudExpc3RlbmVycyA9IHRoaXMuZmluZEV2ZW50TGlzdGVuZXJzKGV2ZW50VHlwZSk7XG5cbiAgZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaCgoZXZlbnRMaXN0ZW5lcikgPT4ge1xuICAgIGNvbnN0IHsgaGFuZGxlciwgZWxlbWVudCB9ID0gZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgc2VsZWN0SGFuZGxlciA9IGhhbmRsZXI7ICAvLy9cblxuICAgIHNlbGVjdEhhbmRsZXIuY2FsbChlbGVtZW50LCBwYXRoLCBzZWxlY3RlZCwgdGhpcyk7ICAvLy9cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNhbGxNb3ZlSGFuZGxlcnNBc3luYyhwYXRoTWFwcywgZG9uZSkge1xuICBjb25zdCBldmVudFR5cGUgPSBNT1ZFX0VWRU5UX1RZUEUsXG4gICAgICAgIGV2ZW50TGlzdGVuZXJzID0gdGhpcy5maW5kRXZlbnRMaXN0ZW5lcnMoZXZlbnRUeXBlKTtcblxuICBmb3JFYWNoKGV2ZW50TGlzdGVuZXJzLCAoZXZlbnRMaXN0ZW5lciwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaGFuZGxlciwgZWxlbWVudCB9ID0gZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgbW92ZUhhbmRsZXIgPSBoYW5kbGVyLCAgLy8vXG4gICAgICAgIGRvbmUgPSBuZXh0OyAgLy8vXG5cbiAgICBtb3ZlSGFuZGxlci5jYWxsKGVsZW1lbnQsIHBhdGhNYXBzLCBkb25lKTtcbiAgfSwgZG9uZSk7XG59XG5cbmZ1bmN0aW9uIGNhbGxQYXRoQ2hhbmdlSGFuZGxlcnNBc3luYyhwYXRoTWFwLCBjYWxsYmFjaykge1xuICBsZXQgbm90U3VjY2VzcyA9IGZhbHNlO1xuXG4gIGNvbnN0IGRvbmUgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3VjY2VzcyA9ICFub3RTdWNjZXNzO1xuXG4gICAgICAgICAgY2FsbGJhY2soc3VjY2Vzcyk7XG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50VHlwZSA9IFBBVEhfQ0hBTkdFX0VWRU5UX1RZUEUsXG4gICAgICAgIGV2ZW50TGlzdGVuZXJzID0gdGhpcy5maW5kRXZlbnRMaXN0ZW5lcnMoZXZlbnRUeXBlKTtcblxuICBmb3JFYWNoKGV2ZW50TGlzdGVuZXJzLCAoZXZlbnRMaXN0ZW5lciwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaGFuZGxlciwgZWxlbWVudCB9ID0gZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgICBwYXRoQ2hhbmdlSGFuZGxlciA9IGhhbmRsZXI7ICAvLy9cblxuICAgIHBhdGhDaGFuZ2VIYW5kbGVyLmNhbGwoZWxlbWVudCwgcGF0aE1hcCwgKHN1Y2Nlc3MpID0+IHtcbiAgICAgIG5vdFN1Y2Nlc3MgPSAhc3VjY2VzcztcblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCBkb25lKTtcbn1cblxuY29uc3QgZXZlbnRNaXhpbnMgPSB7XG4gIG9uTW92ZSxcbiAgb2ZmTW92ZSxcbiAgb25PcGVuLFxuICBvZmZPcGVuLFxuICBvblNlbGVjdCxcbiAgb2ZmU2VsZWN0LFxuICBvblBhdGhDaGFuZ2UsXG4gIG9mZlBhdGhDaGFuZ2UsXG4gIGNhbGxPcGVuSGFuZGxlcnMsXG4gIGNhbGxTZWxlY3RIYW5kbGVycyxcbiAgY2FsbE1vdmVIYW5kbGVyc0FzeW5jLFxuICBjYWxsUGF0aENoYW5nZUhhbmRsZXJzQXN5bmNcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV2ZW50TWl4aW5zO1xuIl0sIm5hbWVzIjpbImZvckVhY2giLCJhc3luY2hyb25vdXNVdGlsaXRpZXMiLCJvbk1vdmUiLCJtb3ZlSGFuZGxlciIsImVsZW1lbnQiLCJldmVudFR5cGUiLCJNT1ZFX0VWRU5UX1RZUEUiLCJoYW5kbGVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9mZk1vdmUiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib25PcGVuIiwib3BlbkhhbmRsZXIiLCJPUEVOX0VWRU5UX1RZUEUiLCJvZmZPcGVuIiwib25TZWxlY3QiLCJzZWxlY3RIYW5kbGVyIiwiU0VMRUNUX0VWRU5UX1RZUEUiLCJvZmZTZWxlY3QiLCJvblBhdGhDaGFuZ2UiLCJwYXRoQ2hhbmdlSGFuZGxlciIsIlBBVEhfQ0hBTkdFX0VWRU5UX1RZUEUiLCJvZmZQYXRoQ2hhbmdlIiwiY2FsbE9wZW5IYW5kbGVycyIsImZpbGVQYXRoIiwiZXZlbnRMaXN0ZW5lcnMiLCJmaW5kRXZlbnRMaXN0ZW5lcnMiLCJldmVudExpc3RlbmVyIiwiY2FsbCIsImNhbGxTZWxlY3RIYW5kbGVycyIsInBhdGgiLCJzZWxlY3RlZCIsImNhbGxNb3ZlSGFuZGxlcnNBc3luYyIsInBhdGhNYXBzIiwiZG9uZSIsIm5leHQiLCJjYWxsUGF0aENoYW5nZUhhbmRsZXJzQXN5bmMiLCJwYXRoTWFwIiwiY2FsbGJhY2siLCJub3RTdWNjZXNzIiwic3VjY2VzcyIsImV2ZW50TWl4aW5zIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkEySUE7OztlQUFBOzs7eUJBeklzQzswQkFFc0Q7QUFFNUYsSUFBTSxBQUFFQSxVQUFZQyxnQ0FBcUIsQ0FBakNEO0FBRVIsU0FBU0UsT0FBT0MsV0FBVyxFQUFFQyxP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