@esotericsoftware/spine-core 4.2.115 → 4.3.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.
Files changed (129) hide show
  1. package/dist/Animation.d.ts +426 -274
  2. package/dist/Animation.js +1174 -1210
  3. package/dist/AnimationState.d.ts +246 -201
  4. package/dist/AnimationState.js +508 -471
  5. package/dist/AnimationStateData.d.ts +12 -10
  6. package/dist/AnimationStateData.js +19 -20
  7. package/dist/AssetManagerBase.d.ts +29 -23
  8. package/dist/AssetManagerBase.js +67 -43
  9. package/dist/AtlasAttachmentLoader.d.ts +18 -12
  10. package/dist/AtlasAttachmentLoader.js +28 -39
  11. package/dist/Bone.d.ts +15 -109
  12. package/dist/Bone.js +22 -362
  13. package/dist/BoneData.d.ts +13 -28
  14. package/dist/BoneData.js +20 -29
  15. package/dist/BonePose.d.ts +130 -0
  16. package/dist/BonePose.js +426 -0
  17. package/dist/Constraint.d.ts +41 -0
  18. package/dist/Constraint.js +38 -0
  19. package/dist/ConstraintData.d.ts +7 -5
  20. package/dist/ConstraintData.js +5 -9
  21. package/dist/DrawOrder.d.ts +48 -0
  22. package/dist/DrawOrder.js +64 -0
  23. package/dist/Event.d.ts +11 -6
  24. package/dist/Event.js +10 -5
  25. package/dist/EventData.d.ts +10 -6
  26. package/dist/EventData.js +18 -7
  27. package/dist/IkConstraint.d.ts +22 -28
  28. package/dist/IkConstraint.js +115 -117
  29. package/dist/IkConstraintData.d.ts +23 -18
  30. package/dist/IkConstraintData.js +32 -22
  31. package/dist/IkConstraintPose.d.ts +49 -0
  32. package/dist/IkConstraintPose.js +55 -0
  33. package/dist/PathConstraint.d.ts +18 -22
  34. package/dist/PathConstraint.js +160 -136
  35. package/dist/PathConstraintData.d.ts +11 -14
  36. package/dist/PathConstraintData.js +14 -16
  37. package/dist/PathConstraintPose.d.ts +43 -0
  38. package/dist/PathConstraintPose.js +49 -0
  39. package/dist/Physics.d.ts +39 -0
  40. package/dist/Physics.js +41 -0
  41. package/dist/PhysicsConstraint.d.ts +26 -30
  42. package/dist/PhysicsConstraint.js +102 -94
  43. package/dist/PhysicsConstraintData.d.ts +22 -12
  44. package/dist/PhysicsConstraintData.js +23 -12
  45. package/dist/PhysicsConstraintPose.d.ts +47 -0
  46. package/dist/PhysicsConstraintPose.js +55 -0
  47. package/dist/Pose.d.ts +33 -0
  48. package/dist/Pose.js +30 -0
  49. package/dist/Posed.d.ts +58 -0
  50. package/dist/Posed.js +78 -0
  51. package/dist/PosedActive.d.ts +41 -0
  52. package/dist/{attachments/HasTextureRegion.js → PosedActive.js} +17 -2
  53. package/dist/PosedData.d.ts +40 -0
  54. package/dist/PosedData.js +45 -0
  55. package/dist/Skeleton.d.ts +110 -99
  56. package/dist/Skeleton.js +271 -449
  57. package/dist/SkeletonBinary.d.ts +2 -2
  58. package/dist/SkeletonBinary.js +644 -466
  59. package/dist/SkeletonBounds.d.ts +4 -4
  60. package/dist/SkeletonBounds.js +45 -46
  61. package/dist/SkeletonClipping.d.ts +26 -22
  62. package/dist/SkeletonClipping.js +654 -340
  63. package/dist/SkeletonData.d.ts +18 -35
  64. package/dist/SkeletonData.js +57 -97
  65. package/dist/SkeletonJson.d.ts +8 -6
  66. package/dist/SkeletonJson.js +892 -641
  67. package/dist/SkeletonRendererCore.d.ts +58 -0
  68. package/dist/SkeletonRendererCore.js +310 -0
  69. package/dist/Skin.d.ts +20 -16
  70. package/dist/Skin.js +58 -53
  71. package/dist/Slider.d.ts +46 -0
  72. package/dist/Slider.js +115 -0
  73. package/dist/SliderData.d.ts +58 -0
  74. package/dist/SliderData.js +59 -0
  75. package/dist/SliderPose.d.ts +37 -0
  76. package/dist/SliderPose.js +40 -0
  77. package/dist/Slot.d.ts +16 -38
  78. package/dist/Slot.js +37 -60
  79. package/dist/SlotData.d.ts +5 -12
  80. package/dist/SlotData.js +7 -15
  81. package/dist/SlotPose.d.ts +59 -0
  82. package/dist/SlotPose.js +81 -0
  83. package/dist/Texture.d.ts +1 -0
  84. package/dist/Texture.js +2 -1
  85. package/dist/TextureAtlas.d.ts +3 -3
  86. package/dist/TextureAtlas.js +49 -49
  87. package/dist/TransformConstraint.d.ts +16 -28
  88. package/dist/TransformConstraint.js +72 -209
  89. package/dist/TransformConstraintData.d.ts +108 -20
  90. package/dist/TransformConstraintData.js +274 -24
  91. package/dist/TransformConstraintPose.d.ts +45 -0
  92. package/dist/TransformConstraintPose.js +52 -0
  93. package/dist/Triangulator.d.ts +1 -1
  94. package/dist/Triangulator.js +91 -107
  95. package/dist/{Updatable.d.ts → Update.d.ts} +5 -12
  96. package/dist/Update.js +30 -0
  97. package/dist/Utils.d.ts +13 -4
  98. package/dist/Utils.js +78 -37
  99. package/dist/attachments/Attachment.d.ts +27 -19
  100. package/dist/attachments/Attachment.js +59 -35
  101. package/dist/attachments/AttachmentLoader.d.ts +14 -14
  102. package/dist/attachments/AttachmentLoader.js +1 -1
  103. package/dist/attachments/BoundingBoxAttachment.d.ts +1 -1
  104. package/dist/attachments/BoundingBoxAttachment.js +2 -2
  105. package/dist/attachments/ClippingAttachment.d.ts +10 -3
  106. package/dist/attachments/ClippingAttachment.js +12 -3
  107. package/dist/attachments/{HasTextureRegion.d.ts → HasSequence.d.ts} +11 -14
  108. package/dist/attachments/HasSequence.js +30 -0
  109. package/dist/attachments/MeshAttachment.d.ts +28 -35
  110. package/dist/attachments/MeshAttachment.js +85 -97
  111. package/dist/attachments/PathAttachment.d.ts +3 -3
  112. package/dist/attachments/PathAttachment.js +6 -6
  113. package/dist/attachments/PointAttachment.d.ts +11 -6
  114. package/dist/attachments/PointAttachment.js +8 -3
  115. package/dist/attachments/RegionAttachment.d.ts +25 -27
  116. package/dist/attachments/RegionAttachment.js +101 -113
  117. package/dist/attachments/Sequence.d.ts +31 -6
  118. package/dist/attachments/Sequence.js +79 -13
  119. package/dist/esm/spine-core.min.mjs +2 -2
  120. package/dist/esm/spine-core.mjs +7651 -6090
  121. package/dist/esm/spine-core.mjs.map +4 -4
  122. package/dist/iife/spine-core.js +7651 -6090
  123. package/dist/iife/spine-core.js.map +4 -4
  124. package/dist/iife/spine-core.min.js +2 -2
  125. package/dist/index.d.ts +32 -11
  126. package/dist/index.js +33 -12
  127. package/dist/polyfills.js +4 -5
  128. package/package.json +1 -1
  129. package/dist/Updatable.js +0 -30
@@ -27,13 +27,14 @@
27
27
  * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
28
  *****************************************************************************/
29
29
  import { PathAttachment } from "./attachments/PathAttachment.js";
30
- import { RotateMode, SpacingMode, PositionMode } from "./PathConstraintData.js";
31
- import { Utils, MathUtils } from "./Utils.js";
32
- /** Stores the current pose for a path constraint. A path constraint adjusts the rotation, translation, and scale of the
33
- * constrained bones so they follow a {@link PathAttachment}.
30
+ import { Constraint } from "./Constraint.js";
31
+ import { PositionMode, RotateMode, SpacingMode } from "./PathConstraintData.js";
32
+ import { PathConstraintPose } from "./PathConstraintPose.js";
33
+ import { MathUtils, Utils } from "./Utils.js";
34
+ /** Adjusts the rotation, translation, and scale of the constrained bones so they follow a {@link PathAttachment}.
34
35
  *
35
36
  * See [Path constraints](http://esotericsoftware.com/spine-path-constraints) in the Spine User Guide. */
36
- export class PathConstraint {
37
+ export class PathConstraint extends Constraint {
37
38
  static NONE = -1;
38
39
  static BEFORE = -2;
39
40
  static AFTER = -3;
@@ -43,93 +44,67 @@ export class PathConstraint {
43
44
  /** The bones that will be modified by this path constraint. */
44
45
  bones;
45
46
  /** The slot whose path attachment will be used to constrained the bones. */
46
- target;
47
- /** The position along the path. */
48
- position = 0;
49
- /** The spacing between bones. */
50
- spacing = 0;
51
- mixRotate = 0;
52
- mixX = 0;
53
- mixY = 0;
54
- spaces = new Array();
55
- positions = new Array();
56
- world = new Array();
57
- curves = new Array();
58
- lengths = new Array();
59
- segments = new Array();
60
- active = false;
47
+ slot;
48
+ spaces = [];
49
+ positions = [];
50
+ world = [];
51
+ curves = [];
52
+ lengths = [];
53
+ segments = [];
61
54
  constructor(data, skeleton) {
62
- if (!data)
63
- throw new Error("data cannot be null.");
55
+ super(data, new PathConstraintPose(), new PathConstraintPose());
64
56
  if (!skeleton)
65
57
  throw new Error("skeleton cannot be null.");
66
58
  this.data = data;
67
- this.bones = new Array();
68
- for (let i = 0, n = data.bones.length; i < n; i++) {
69
- let bone = skeleton.findBone(data.bones[i].name);
70
- if (!bone)
71
- throw new Error(`Couldn't find bone ${data.bones[i].name}.`);
72
- this.bones.push(bone);
73
- }
74
- let target = skeleton.findSlot(data.target.name);
75
- if (!target)
76
- throw new Error(`Couldn't find target bone ${data.target.name}`);
77
- this.target = target;
78
- this.position = data.position;
79
- this.spacing = data.spacing;
80
- this.mixRotate = data.mixRotate;
81
- this.mixX = data.mixX;
82
- this.mixY = data.mixY;
83
- }
84
- isActive() {
85
- return this.active;
59
+ this.bones = [];
60
+ for (const boneData of this.data.bones)
61
+ this.bones.push(skeleton.bones[boneData.index].constrainedPose);
62
+ this.slot = skeleton.slots[data.slot.index];
86
63
  }
87
- setToSetupPose() {
88
- const data = this.data;
89
- this.position = data.position;
90
- this.spacing = data.spacing;
91
- this.mixRotate = data.mixRotate;
92
- this.mixX = data.mixX;
93
- this.mixY = data.mixY;
64
+ copy(skeleton) {
65
+ var copy = new PathConstraint(this.data, skeleton);
66
+ copy.pose.set(this.pose);
67
+ return copy;
94
68
  }
95
- update(physics) {
96
- let attachment = this.target.getAttachment();
69
+ update(skeleton, physics) {
70
+ const attachment = this.slot.appliedPose.attachment;
97
71
  if (!(attachment instanceof PathAttachment))
98
72
  return;
99
- let mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY;
100
- if (mixRotate == 0 && mixX == 0 && mixY == 0)
73
+ const p = this.appliedPose;
74
+ const mixRotate = p.mixRotate, mixX = p.mixX, mixY = p.mixY;
75
+ if (mixRotate === 0 && mixX === 0 && mixY === 0)
101
76
  return;
102
- let data = this.data;
103
- let tangents = data.rotateMode == RotateMode.Tangent, scale = data.rotateMode == RotateMode.ChainScale;
104
- let bones = this.bones;
105
- let boneCount = bones.length, spacesCount = tangents ? boneCount : boneCount + 1;
106
- let spaces = Utils.setArraySize(this.spaces, spacesCount), lengths = scale ? this.lengths = Utils.setArraySize(this.lengths, boneCount) : [];
107
- let spacing = this.spacing;
77
+ const data = this.data;
78
+ const tangents = data.rotateMode === RotateMode.Tangent, scale = data.rotateMode === RotateMode.ChainScale;
79
+ const bones = this.bones;
80
+ const boneCount = bones.length, spacesCount = tangents ? boneCount : boneCount + 1;
81
+ const spaces = Utils.setArraySize(this.spaces, spacesCount), lengths = scale ? this.lengths = Utils.setArraySize(this.lengths, boneCount) : [];
82
+ const spacing = p.spacing;
108
83
  switch (data.spacingMode) {
109
84
  case SpacingMode.Percent:
110
85
  if (scale) {
111
86
  for (let i = 0, n = spacesCount - 1; i < n; i++) {
112
- let bone = bones[i];
113
- let setupLength = bone.data.length;
114
- let x = setupLength * bone.a, y = setupLength * bone.c;
87
+ const bone = bones[i];
88
+ const setupLength = bone.bone.data.length;
89
+ const x = setupLength * bone.a, y = setupLength * bone.c;
115
90
  lengths[i] = Math.sqrt(x * x + y * y);
116
91
  }
117
92
  }
118
93
  Utils.arrayFill(spaces, 1, spacesCount, spacing);
119
94
  break;
120
- case SpacingMode.Proportional:
95
+ case SpacingMode.Proportional: {
121
96
  let sum = 0;
122
97
  for (let i = 0, n = spacesCount - 1; i < n;) {
123
- let bone = bones[i];
124
- let setupLength = bone.data.length;
98
+ const bone = bones[i];
99
+ const setupLength = bone.bone.data.length;
125
100
  if (setupLength < PathConstraint.epsilon) {
126
101
  if (scale)
127
102
  lengths[i] = 0;
128
103
  spaces[++i] = spacing;
129
104
  }
130
105
  else {
131
- let x = setupLength * bone.a, y = setupLength * bone.c;
132
- let length = Math.sqrt(x * x + y * y);
106
+ const x = setupLength * bone.a, y = setupLength * bone.c;
107
+ const length = Math.sqrt(x * x + y * y);
133
108
  if (scale)
134
109
  lengths[i] = length;
135
110
  spaces[++i] = length;
@@ -142,44 +117,46 @@ export class PathConstraint {
142
117
  spaces[i] *= sum;
143
118
  }
144
119
  break;
145
- default:
146
- let lengthSpacing = data.spacingMode == SpacingMode.Length;
120
+ }
121
+ default: {
122
+ const lengthSpacing = data.spacingMode === SpacingMode.Length;
147
123
  for (let i = 0, n = spacesCount - 1; i < n;) {
148
- let bone = bones[i];
149
- let setupLength = bone.data.length;
124
+ const bone = bones[i];
125
+ const setupLength = bone.bone.data.length;
150
126
  if (setupLength < PathConstraint.epsilon) {
151
127
  if (scale)
152
128
  lengths[i] = 0;
153
129
  spaces[++i] = spacing;
154
130
  }
155
131
  else {
156
- let x = setupLength * bone.a, y = setupLength * bone.c;
157
- let length = Math.sqrt(x * x + y * y);
132
+ const x = setupLength * bone.a, y = setupLength * bone.c;
133
+ const length = Math.sqrt(x * x + y * y);
158
134
  if (scale)
159
135
  lengths[i] = length;
160
- spaces[++i] = (lengthSpacing ? setupLength + spacing : spacing) * length / setupLength;
136
+ spaces[++i] = (lengthSpacing ? Math.max(0, setupLength + spacing) : spacing) * length / setupLength;
161
137
  }
162
138
  }
139
+ }
163
140
  }
164
- let positions = this.computeWorldPositions(attachment, spacesCount, tangents);
141
+ const positions = this.computeWorldPositions(skeleton, attachment, spacesCount, tangents);
165
142
  let boneX = positions[0], boneY = positions[1], offsetRotation = data.offsetRotation;
166
143
  let tip = false;
167
- if (offsetRotation == 0)
168
- tip = data.rotateMode == RotateMode.Chain;
144
+ if (offsetRotation === 0)
145
+ tip = data.rotateMode === RotateMode.Chain;
169
146
  else {
170
147
  tip = false;
171
- let p = this.target.bone;
172
- offsetRotation *= p.a * p.d - p.b * p.c > 0 ? MathUtils.degRad : -MathUtils.degRad;
148
+ const bone = this.slot.bone.appliedPose;
149
+ offsetRotation *= bone.a * bone.d - bone.b * bone.c > 0 ? MathUtils.degRad : -MathUtils.degRad;
173
150
  }
174
- for (let i = 0, p = 3; i < boneCount; i++, p += 3) {
175
- let bone = bones[i];
151
+ for (let i = 0, ip = 3, u = skeleton._update; i < boneCount; i++, ip += 3) {
152
+ const bone = bones[i];
176
153
  bone.worldX += (boneX - bone.worldX) * mixX;
177
154
  bone.worldY += (boneY - bone.worldY) * mixY;
178
- let x = positions[p], y = positions[p + 1], dx = x - boneX, dy = y - boneY;
155
+ const x = positions[ip], y = positions[ip + 1], dx = x - boneX, dy = y - boneY;
179
156
  if (scale) {
180
- let length = lengths[i];
181
- if (length != 0) {
182
- let s = (Math.sqrt(dx * dx + dy * dy) / length - 1) * mixRotate + 1;
157
+ const length = lengths[i];
158
+ if (length !== 0) {
159
+ const s = (Math.sqrt(dx * dx + dy * dy) / length - 1) * mixRotate + 1;
183
160
  bone.a *= s;
184
161
  bone.c *= s;
185
162
  }
@@ -189,16 +166,16 @@ export class PathConstraint {
189
166
  if (mixRotate > 0) {
190
167
  let a = bone.a, b = bone.b, c = bone.c, d = bone.d, r = 0, cos = 0, sin = 0;
191
168
  if (tangents)
192
- r = positions[p - 1];
193
- else if (spaces[i + 1] == 0)
194
- r = positions[p + 2];
169
+ r = positions[ip - 1];
170
+ else if (spaces[i + 1] === 0)
171
+ r = positions[ip + 2];
195
172
  else
196
173
  r = Math.atan2(dy, dx);
197
174
  r -= Math.atan2(c, a);
198
175
  if (tip) {
199
176
  cos = Math.cos(r);
200
177
  sin = Math.sin(r);
201
- let length = bone.data.length;
178
+ const length = bone.bone.data.length;
202
179
  boneX += (length * (cos * a - sin * c) - dx) * mixRotate;
203
180
  boneY += (length * (sin * a + cos * c) - dy) * mixRotate;
204
181
  }
@@ -217,20 +194,20 @@ export class PathConstraint {
217
194
  bone.c = sin * a + cos * c;
218
195
  bone.d = sin * b + cos * d;
219
196
  }
220
- bone.updateAppliedTransform();
197
+ bone.modifyWorld(u);
221
198
  }
222
199
  }
223
- computeWorldPositions(path, spacesCount, tangents) {
224
- let target = this.target;
225
- let position = this.position;
200
+ computeWorldPositions(skeleton, path, spacesCount, tangents) {
201
+ const slot = this.slot;
202
+ let position = this.appliedPose.position;
226
203
  let spaces = this.spaces, out = Utils.setArraySize(this.positions, spacesCount * 3 + 2), world = this.world;
227
- let closed = path.closed;
204
+ const closed = path.closed;
228
205
  let verticesLength = path.worldVerticesLength, curveCount = verticesLength / 6, prevCurve = PathConstraint.NONE;
229
206
  if (!path.constantSpeed) {
230
- let lengths = path.lengths;
207
+ const lengths = path.lengths;
231
208
  curveCount -= closed ? 1 : 2;
232
- let pathLength = lengths[curveCount];
233
- if (this.data.positionMode == PositionMode.Percent)
209
+ const pathLength = lengths[curveCount];
210
+ if (this.data.positionMode === PositionMode.Percent)
234
211
  position *= pathLength;
235
212
  let multiplier;
236
213
  switch (this.data.spacingMode) {
@@ -240,12 +217,11 @@ export class PathConstraint {
240
217
  case SpacingMode.Proportional:
241
218
  multiplier = pathLength / spacesCount;
242
219
  break;
243
- default:
244
- multiplier = 1;
220
+ default: multiplier = 1;
245
221
  }
246
222
  world = Utils.setArraySize(this.world, 8);
247
223
  for (let i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) {
248
- let space = spaces[i] * multiplier;
224
+ const space = spaces[i] * multiplier;
249
225
  position += space;
250
226
  let p = position;
251
227
  if (closed) {
@@ -255,44 +231,44 @@ export class PathConstraint {
255
231
  curve = 0;
256
232
  }
257
233
  else if (p < 0) {
258
- if (prevCurve != PathConstraint.BEFORE) {
234
+ if (prevCurve !== PathConstraint.BEFORE) {
259
235
  prevCurve = PathConstraint.BEFORE;
260
- path.computeWorldVertices(target, 2, 4, world, 0, 2);
236
+ path.computeWorldVertices(skeleton, slot, 2, 4, world, 0, 2);
261
237
  }
262
238
  this.addBeforePosition(p, world, 0, out, o);
263
239
  continue;
264
240
  }
265
241
  else if (p > pathLength) {
266
- if (prevCurve != PathConstraint.AFTER) {
242
+ if (prevCurve !== PathConstraint.AFTER) {
267
243
  prevCurve = PathConstraint.AFTER;
268
- path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2);
244
+ path.computeWorldVertices(skeleton, slot, verticesLength - 6, 4, world, 0, 2);
269
245
  }
270
246
  this.addAfterPosition(p - pathLength, world, 0, out, o);
271
247
  continue;
272
248
  }
273
249
  // Determine curve containing position.
274
250
  for (;; curve++) {
275
- let length = lengths[curve];
251
+ const length = lengths[curve];
276
252
  if (p > length)
277
253
  continue;
278
- if (curve == 0)
254
+ if (curve === 0)
279
255
  p /= length;
280
256
  else {
281
- let prev = lengths[curve - 1];
257
+ const prev = lengths[curve - 1];
282
258
  p = (p - prev) / (length - prev);
283
259
  }
284
260
  break;
285
261
  }
286
- if (curve != prevCurve) {
262
+ if (curve !== prevCurve) {
287
263
  prevCurve = curve;
288
- if (closed && curve == curveCount) {
289
- path.computeWorldVertices(target, verticesLength - 4, 4, world, 0, 2);
290
- path.computeWorldVertices(target, 0, 4, world, 4, 2);
264
+ if (closed && curve === curveCount) {
265
+ path.computeWorldVertices(skeleton, slot, verticesLength - 4, 4, world, 0, 2);
266
+ path.computeWorldVertices(skeleton, slot, 0, 4, world, 4, 2);
291
267
  }
292
268
  else
293
- path.computeWorldVertices(target, curve * 6 + 2, 8, world, 0, 2);
269
+ path.computeWorldVertices(skeleton, slot, curve * 6 + 2, 8, world, 0, 2);
294
270
  }
295
- this.addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o, tangents || (i > 0 && space == 0));
271
+ this.addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o, tangents || (i > 0 && space === 0));
296
272
  }
297
273
  return out;
298
274
  }
@@ -300,8 +276,8 @@ export class PathConstraint {
300
276
  if (closed) {
301
277
  verticesLength += 2;
302
278
  world = Utils.setArraySize(this.world, verticesLength);
303
- path.computeWorldVertices(target, 2, verticesLength - 4, world, 0, 2);
304
- path.computeWorldVertices(target, 0, 2, world, verticesLength - 4, 2);
279
+ path.computeWorldVertices(skeleton, slot, 2, verticesLength - 4, world, 0, 2);
280
+ path.computeWorldVertices(skeleton, slot, 0, 2, world, verticesLength - 4, 2);
305
281
  world[verticesLength - 2] = world[0];
306
282
  world[verticesLength - 1] = world[1];
307
283
  }
@@ -309,10 +285,10 @@ export class PathConstraint {
309
285
  curveCount--;
310
286
  verticesLength -= 4;
311
287
  world = Utils.setArraySize(this.world, verticesLength);
312
- path.computeWorldVertices(target, 2, verticesLength, world, 0, 2);
288
+ path.computeWorldVertices(skeleton, slot, 2, verticesLength, world, 0, 2);
313
289
  }
314
290
  // Curve lengths.
315
- let curves = Utils.setArraySize(this.curves, curveCount);
291
+ const curves = Utils.setArraySize(this.curves, curveCount);
316
292
  let pathLength = 0;
317
293
  let x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0;
318
294
  let tmpx = 0, tmpy = 0, dddfx = 0, dddfy = 0, ddfx = 0, ddfy = 0, dfx = 0, dfy = 0;
@@ -347,7 +323,7 @@ export class PathConstraint {
347
323
  x1 = x2;
348
324
  y1 = y2;
349
325
  }
350
- if (this.data.positionMode == PositionMode.Percent)
326
+ if (this.data.positionMode === PositionMode.Percent)
351
327
  position *= pathLength;
352
328
  let multiplier;
353
329
  switch (this.data.spacingMode) {
@@ -357,13 +333,12 @@ export class PathConstraint {
357
333
  case SpacingMode.Proportional:
358
334
  multiplier = pathLength / spacesCount;
359
335
  break;
360
- default:
361
- multiplier = 1;
336
+ default: multiplier = 1;
362
337
  }
363
- let segments = this.segments;
338
+ const segments = this.segments;
364
339
  let curveLength = 0;
365
340
  for (let i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) {
366
- let space = spaces[i] * multiplier;
341
+ const space = spaces[i] * multiplier;
367
342
  position += space;
368
343
  let p = position;
369
344
  if (closed) {
@@ -371,6 +346,7 @@ export class PathConstraint {
371
346
  if (p < 0)
372
347
  p += pathLength;
373
348
  curve = 0;
349
+ segment = 0;
374
350
  }
375
351
  else if (p < 0) {
376
352
  this.addBeforePosition(p, world, 0, out, o);
@@ -382,19 +358,19 @@ export class PathConstraint {
382
358
  }
383
359
  // Determine curve containing position.
384
360
  for (;; curve++) {
385
- let length = curves[curve];
361
+ const length = curves[curve];
386
362
  if (p > length)
387
363
  continue;
388
- if (curve == 0)
364
+ if (curve === 0)
389
365
  p /= length;
390
366
  else {
391
- let prev = curves[curve - 1];
367
+ const prev = curves[curve - 1];
392
368
  p = (p - prev) / (length - prev);
393
369
  }
394
370
  break;
395
371
  }
396
372
  // Curve segment lengths.
397
- if (curve != prevCurve) {
373
+ if (curve !== prevCurve) {
398
374
  prevCurve = curve;
399
375
  let ii = curve * 6;
400
376
  x1 = world[ii];
@@ -436,43 +412,43 @@ export class PathConstraint {
436
412
  // Weight by segment length.
437
413
  p *= curveLength;
438
414
  for (;; segment++) {
439
- let length = segments[segment];
415
+ const length = segments[segment];
440
416
  if (p > length)
441
417
  continue;
442
- if (segment == 0)
418
+ if (segment === 0)
443
419
  p /= length;
444
420
  else {
445
- let prev = segments[segment - 1];
421
+ const prev = segments[segment - 1];
446
422
  p = segment + (p - prev) / (length - prev);
447
423
  }
448
424
  break;
449
425
  }
450
- this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0));
426
+ this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space === 0));
451
427
  }
452
428
  return out;
453
429
  }
454
430
  addBeforePosition(p, temp, i, out, o) {
455
- let x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = Math.atan2(dy, dx);
431
+ const x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = Math.atan2(dy, dx);
456
432
  out[o] = x1 + p * Math.cos(r);
457
433
  out[o + 1] = y1 + p * Math.sin(r);
458
434
  out[o + 2] = r;
459
435
  }
460
436
  addAfterPosition(p, temp, i, out, o) {
461
- let x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = Math.atan2(dy, dx);
437
+ const x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = Math.atan2(dy, dx);
462
438
  out[o] = x1 + p * Math.cos(r);
463
439
  out[o + 1] = y1 + p * Math.sin(r);
464
440
  out[o + 2] = r;
465
441
  }
466
442
  addCurvePosition(p, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents) {
467
- if (p == 0 || isNaN(p)) {
443
+ if (p === 0 || Number.isNaN(p)) {
468
444
  out[o] = x1;
469
445
  out[o + 1] = y1;
470
446
  out[o + 2] = Math.atan2(cy1 - y1, cx1 - x1);
471
447
  return;
472
448
  }
473
- let tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u;
474
- let ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p;
475
- let x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt;
449
+ const tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u;
450
+ const ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p;
451
+ const x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt;
476
452
  out[o] = x;
477
453
  out[o + 1] = y;
478
454
  if (tangents) {
@@ -482,5 +458,53 @@ export class PathConstraint {
482
458
  out[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt));
483
459
  }
484
460
  }
461
+ sort(skeleton) {
462
+ const slotIndex = this.slot.data.index;
463
+ const slotBone = this.slot.bone;
464
+ if (skeleton.skin != null)
465
+ this.sortPathSlot(skeleton, skeleton.skin, slotIndex, slotBone);
466
+ if (skeleton.data.defaultSkin != null && skeleton.data.defaultSkin !== skeleton.skin)
467
+ this.sortPathSlot(skeleton, skeleton.data.defaultSkin, slotIndex, slotBone);
468
+ this.sortPath(skeleton, this.slot.pose.attachment, slotBone);
469
+ const bones = this.bones;
470
+ const boneCount = this.bones.length;
471
+ for (let i = 0; i < boneCount; i++) {
472
+ const bone = bones[i].bone;
473
+ skeleton.sortBone(bone);
474
+ skeleton.constrained(bone);
475
+ }
476
+ skeleton._updateCache.push(this);
477
+ for (let i = 0; i < boneCount; i++)
478
+ skeleton.sortReset(bones[i].bone.children);
479
+ for (let i = 0; i < boneCount; i++)
480
+ bones[i].bone.sorted = true;
481
+ }
482
+ sortPathSlot(skeleton, skin, slotIndex, slotBone) {
483
+ const entries = skin.getAttachments();
484
+ for (let i = 0, n = entries.length; i < n; i++) {
485
+ const entry = entries[i];
486
+ if (entry.slotIndex === slotIndex)
487
+ this.sortPath(skeleton, entry.attachment, slotBone);
488
+ }
489
+ }
490
+ sortPath(skeleton, attachment, slotBone) {
491
+ if (!(attachment instanceof PathAttachment))
492
+ return;
493
+ const pathBones = attachment.bones;
494
+ if (pathBones == null)
495
+ skeleton.sortBone(slotBone);
496
+ else {
497
+ const bones = skeleton.bones;
498
+ for (let i = 0, n = pathBones.length; i < n;) {
499
+ let nn = pathBones[i++];
500
+ nn += i;
501
+ while (i < nn)
502
+ skeleton.sortBone(bones[pathBones[i++]]);
503
+ }
504
+ }
505
+ }
506
+ isSourceActive() {
507
+ return this.slot.bone.active;
508
+ }
485
509
  }
486
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0aENvbnN0cmFpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUGF0aENvbnN0cmFpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRS9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRSxPQUFPLEVBQXNCLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJcEcsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHOUM7Ozt5R0FHeUc7QUFDekcsTUFBTSxPQUFPLGNBQWM7SUFDMUIsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBRXpCLDZDQUE2QztJQUM3QyxJQUFJLENBQXFCO0lBRXpCLCtEQUErRDtJQUMvRCxLQUFLLENBQWM7SUFFbkIsNEVBQTRFO0lBQzVFLE1BQU0sQ0FBTztJQUViLG1DQUFtQztJQUNuQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRWIsaUNBQWlDO0lBQ2pDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFFWixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRWQsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUVULElBQUksR0FBRyxDQUFDLENBQUM7SUFFVCxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUFDLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBQzlELEtBQUssR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFBQyxPQUFPLEdB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QUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCxpQkFBaUI7UUFDakIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyRixJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNuRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BELEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuQixHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuQixHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDckMsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQ3JDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQzlDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQzlDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDeEIsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLFVBQVUsQ0FBQztZQUNwRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsVUFBVSxDQUFDO1lBQ3BELFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLEdBQUcsSUFBSSxJQUFJLENBQUM7WUFDWixHQUFHLElBQUksSUFBSSxDQUFDO1lBQ1osSUFBSSxJQUFJLEtBQUssQ0FBQztZQUNkLElBQUksSUFBSSxLQUFLLENBQUM7WUFDZCxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFH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QUVELGlCQUFpQixDQUFFLENBQVMsRUFBRSxJQUFtQixFQUFFLENBQVMsRUFBRSxHQUFrQixFQUFFLENBQVM7UUFDMUYsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELGdCQUFnQixDQUFFLENBQVMsRUFBRSxJQUFtQixFQUFFLENBQVMsRUFBRSxHQUFrQixFQUFFLENBQVM7UUFDekYsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELGdCQUFnQixDQUFFLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEdBQVcsRUFBRSxHQUFXLEVBQUUsR0FBVyxFQUFFLEdBQVcsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUM5SCxHQUFrQixFQUFFLENBQVMsRUFBRSxRQUFpQjtRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNaLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM1QyxPQUFPO1FBQ1IsQ0FBQztRQUNELElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO1FBQ3pHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksUUFBUSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsR0FBRyxLQUFLO2dCQUNaLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQzs7Z0JBRTVDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVHLENBQUM7SUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBQYXRoQXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL1BhdGhBdHRhY2htZW50LmpzXCI7XG5pbXBvcnQgeyBCb25lIH0gZnJvbSBcIi4vQm9uZS5qc1wiO1xuaW1wb3J0IHsgUGF0aENvbnN0cmFpbnREYXRhLCBSb3RhdGVNb2RlLCBTcGFjaW5nTW9kZSwgUG9zaXRpb25Nb2RlIH0gZnJvbSBcIi4vUGF0aENvbnN0cmFpbnREYXRhLmpzXCI7XG5pbXBvcnQgeyBQaHlzaWNzLCBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgeyBTbG90IH0gZnJvbSBcIi4vU2xvdC5qc1wiO1xuaW1wb3J0IHsgVXBkYXRhYmxlIH0gZnJvbSBcIi4vVXBkYXRhYmxlLmpzXCI7XG5pbXBvcnQgeyBVdGlscywgTWF0aFV0aWxzIH0gZnJvbSBcIi4vVXRpbHMuanNcIjtcblxuXG4vKiogU3RvcmVzIHRoZSBjdXJyZW50IHBvc2UgZm9yIGEgcGF0aCBjb25zdHJhaW50LiBBIHBhdGggY29uc3RyYWludCBhZGp1c3RzIHRoZSByb3RhdGlvbiwgdHJhbnNsYXRpb24sIGFuZCBzY2FsZSBvZiB0aGVcbiAqIGNvbnN0cmFpbmVkIGJvbmVzIHNvIHRoZXkgZm9sbG93IGEge0BsaW5rIFBhdGhBdHRhY2htZW50fS5cbiAqXG4gKiBTZWUgW1BhdGggY29uc3RyYWludHNdKGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1wYXRoLWNvbnN0cmFpbnRzKSBpbiB0aGUgU3BpbmUgVXNlciBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoQ29uc3RyYWludCBpbXBsZW1lbnRzIFVwZGF0YWJsZSB7XG5cdHN0YXRpYyBOT05FID0gLTE7IHN0YXRpYyBCRUZPUkUgPSAtMjsgc3RhdGljIEFGVEVSID0gLTM7XG5cdHN0YXRpYyBlcHNpbG9uID0gMC4wMDAwMTtcblxuXHQvKiogVGhlIHBhdGggY29uc3RyYWludCdzIHNldHVwIHBvc2UgZGF0YS4gKi9cblx0ZGF0YTogUGF0aENvbnN0cmFpbnREYXRhO1xuXG5cdC8qKiBUaGUgYm9uZXMgdGhhdCB3aWxsIGJlIG1vZGlmaWVkIGJ5IHRoaXMgcGF0aCBjb25zdHJhaW50LiAqL1xuXHRib25lczogQXJyYXk8Qm9uZT47XG5cblx0LyoqIFRoZSBzbG90IHdob3NlIHBhdGggYXR0YWNobWVudCB3aWxsIGJlIHVzZWQgdG8gY29uc3RyYWluZWQgdGhlIGJvbmVzLiAqL1xuXHR0YXJnZXQ6IFNsb3Q7XG5cblx0LyoqIFRoZSBwb3NpdGlvbiBhbG9uZyB0aGUgcGF0aC4gKi9cblx0cG9zaXRpb24gPSAwO1xuXG5cdC8qKiBUaGUgc3BhY2luZyBiZXR3ZWVuIGJvbmVzLiAqL1xuXHRzcGFjaW5nID0gMDtcblxuXHRtaXhSb3RhdGUgPSAwO1xuXG5cdG1peFggPSAwO1xuXG5cdG1peFkgPSAwO1xuXG5cdHNwYWNlcyA9IG5ldyBBcnJheTxudW1iZXI+KCk7IHBvc2l0aW9ucyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cdHdvcmxkID0gbmV3IEFycmF5PG51bWJlcj4oKTsgY3VydmVzID0gbmV3IEFycmF5PG51bWJlcj4oKTsgbGVuZ3RocyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cdHNlZ21lbnRzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcblxuXHRhY3RpdmUgPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvciAoZGF0YTogUGF0aENvbnN0cmFpbnREYXRhLCBza2VsZXRvbjogU2tlbGV0b24pIHtcblx0XHRpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcihcImRhdGEgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdGlmICghc2tlbGV0b24pIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXG5cdFx0dGhpcy5ib25lcyA9IG5ldyBBcnJheTxCb25lPigpO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gZGF0YS5ib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGxldCBib25lID0gc2tlbGV0b24uZmluZEJvbmUoZGF0YS5ib25lc1tpXS5uYW1lKTtcblx0XHRcdGlmICghYm9uZSkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGJvbmUgJHtkYXRhLmJvbmVzW2ldLm5hbWV9LmApO1xuXHRcdFx0dGhpcy5ib25lcy5wdXNoKGJvbmUpO1xuXHRcdH1cblx0XHRsZXQgdGFyZ2V0ID0gc2tlbGV0b24uZmluZFNsb3QoZGF0YS50YXJnZXQubmFtZSk7XG5cdFx0aWYgKCF0YXJnZXQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCB0YXJnZXQgYm9uZSAke2RhdGEudGFyZ2V0Lm5hbWV9YCk7XG5cdFx0dGhpcy50YXJnZXQgPSB0YXJnZXQ7XG5cblx0XHR0aGlzLnBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjtcblx0XHR0aGlzLnNwYWNpbmcgPSBkYXRhLnNwYWNpbmc7XG5cdFx0dGhpcy5taXhSb3RhdGUgPSBkYXRhLm1peFJvdGF0ZTtcblx0XHR0aGlzLm1peFggPSBkYXRhLm1peFg7XG5cdFx0dGhpcy5taXhZID0gZGF0YS5taXhZO1xuXHR9XG5cblx0aXNBY3RpdmUgKCkge1xuXHRcdHJldHVybiB0aGlzLmFjdGl2ZTtcblx0fVxuXG5cdHNldFRvU2V0dXBQb3NlICgpIHtcblx0XHRjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuXHRcdHRoaXMucG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uO1xuXHRcdHRoaXMuc3BhY2luZyA9IGRhdGEuc3BhY2luZztcblx0XHR0aGlzLm1peFJvdGF0ZSA9IGRhdGEubWl4Um90YXRlO1xuXHRcdHRoaXMubWl4WCA9IGRhdGEubWl4WDtcblx0XHR0aGlzLm1peFkgPSBkYXRhLm1peFk7XG5cdH1cblxuXHR1cGRhdGUgKHBoeXNpY3M6IFBoeXNpY3MpIHtcblx0XHRsZXQgYXR0YWNobWVudCA9IHRoaXMudGFyZ2V0LmdldEF0dGFjaG1lbnQoKTtcblx0XHRpZiAoIShhdHRhY2htZW50IGluc3RhbmNlb2YgUGF0aEF0dGFjaG1lbnQpKSByZXR1cm47XG5cblx0XHRsZXQgbWl4Um90YXRlID0gdGhpcy5taXhSb3RhdGUsIG1peFggPSB0aGlzLm1peFgsIG1peFkgPSB0aGlzLm1peFk7XG5cdFx0aWYgKG1peFJvdGF0ZSA9PSAwICYmIG1peFggPT0gMCAmJiBtaXhZID09IDApIHJldHVybjtcblxuXHRcdGxldCBkYXRhID0gdGhpcy5kYXRhO1xuXHRcdGxldCB0YW5nZW50cyA9IGRhdGEucm90YXRlTW9kZSA9PSBSb3RhdGVNb2RlLlRhbmdlbnQsIHNjYWxlID0gZGF0YS5yb3RhdGVNb2RlID09IFJvdGF0ZU1vZGUuQ2hhaW5TY2FsZTtcblxuXHRcdGxldCBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0bGV0IGJvbmVDb3VudCA9IGJvbmVzLmxlbmd0aCwgc3BhY2VzQ291bnQgPSB0YW5nZW50cyA/IGJvbmVDb3VudCA6IGJvbmVDb3VudCArIDE7XG5cdFx0bGV0IHNwYWNlcyA9IFV0aWxzLnNldEFycmF5U2l6ZSh0aGlzLnNwYWNlcywgc3BhY2VzQ291bnQpLCBsZW5ndGhzOiBBcnJheTxudW1iZXI+ID0gc2NhbGUgPyB0aGlzLmxlbmd0aHMgPSBVdGlscy5zZXRBcnJheVNpemUodGhpcy5sZW5ndGhzLCBib25lQ291bnQpIDogW107XG5cdFx0bGV0IHNwYWNpbmcgPSB0aGlzLnNwYWNpbmc7XG5cblx0XHRzd2l0Y2ggKGRhdGEuc3BhY2luZ01vZGUpIHtcblx0XHRcdGNhc2UgU3BhY2luZ01vZGUuUGVyY2VudDpcblx0XHRcdFx0aWYgKHNjYWxlKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBzcGFjZXNDb3VudCAtIDE7IGkgPCBuOyBpKyspIHtcblx0XHRcdFx0XHRcdGxldCBib25lID0gYm9uZXNbaV07XG5cdFx0XHRcdFx0XHRsZXQgc2V0dXBMZW5ndGggPSBib25lLmRhdGEubGVuZ3RoO1xuXHRcdFx0XHRcdFx0bGV0IHggPSBzZXR1cExlbmd0aCAqIGJvbmUuYSwgeSA9IHNldHVwTGVuZ3RoICogYm9uZS5jO1xuXHRcdFx0XHRcdFx0bGVuZ3Roc1tpXSA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0VXRpbHMuYXJyYXlGaWxsKHNwYWNlcywgMSwgc3BhY2VzQ291bnQsIHNwYWNpbmcpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgU3BhY2luZ01vZGUuUHJvcG9ydGlvbmFsOlxuXHRcdFx0XHRsZXQgc3VtID0gMDtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBzcGFjZXNDb3VudCAtIDE7IGkgPCBuOykge1xuXHRcdFx0XHRcdGxldCBib25lID0gYm9uZXNbaV07XG5cdFx0XHRcdFx0bGV0IHNldHVwTGVuZ3RoID0gYm9uZS5kYXRhLmxlbmd0aDtcblx0XHRcdFx0XHRpZiAoc2V0dXBMZW5ndGggPCBQYXRoQ29uc3RyYWludC5lcHNpbG9uKSB7XG5cdFx0XHRcdFx0XHRpZiAoc2NhbGUpIGxlbmd0aHNbaV0gPSAwO1xuXHRcdFx0XHRcdFx0c3BhY2VzWysraV0gPSBzcGFjaW5nO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRsZXQgeCA9IHNldHVwTGVuZ3RoICogYm9uZS5hLCB5ID0gc2V0dXBMZW5ndGggKiBib25lLmM7XG5cdFx0XHRcdFx0XHRsZXQgbGVuZ3RoID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuXHRcdFx0XHRcdFx0aWYgKHNjYWxlKSBsZW5ndGhzW2ldID0gbGVuZ3RoO1xuXHRcdFx0XHRcdFx0c3BhY2VzWysraV0gPSBsZW5ndGg7XG5cdFx0XHRcdFx0XHRzdW0gKz0gbGVuZ3RoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc3VtID4gMCkge1xuXHRcdFx0XHRcdHN1bSA9IHNwYWNlc0NvdW50IC8gc3VtICogc3BhY2luZztcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMTsgaSA8IHNwYWNlc0NvdW50OyBpKyspXG5cdFx0XHRcdFx0XHRzcGFjZXNbaV0gKj0gc3VtO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0bGV0IGxlbmd0aFNwYWNpbmcgPSBkYXRhLnNwYWNpbmdNb2RlID09IFNwYWNpbmdNb2RlLkxlbmd0aDtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBzcGFjZXNDb3VudCAtIDE7IGkgPCBuOykge1xuXHRcdFx0XHRcdGxldCBib25lID0gYm9uZXNbaV07XG5cdFx0XHRcdFx0bGV0IHNldHVwTGVuZ3RoID0gYm9uZS5kYXRhLmxlbmd0aDtcblx0XHRcdFx0XHRpZiAoc2V0dXBMZW5ndGggPCBQYXRoQ29uc3RyYWludC5lcHNpbG9uKSB7XG5cdFx0XHRcdFx0XHRpZiAoc2NhbGUpIGxlbmd0aHNbaV0gPSAwO1xuXHRcdFx0XHRcdFx0c3BhY2VzWysraV0gPSBzcGFjaW5nO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRsZXQgeCA9IHNldHVwTGVuZ3RoICogYm9uZS5hLCB5ID0gc2V0dXBMZW5ndGggKiBib25lLmM7XG5cdFx0XHRcdFx0XHRsZXQgbGVuZ3RoID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuXHRcdFx0XHRcdFx0aWYgKHNjYWxlKSBsZW5ndGhzW2ldID0gbGVuZ3RoO1xuXHRcdFx0XHRcdFx0c3BhY2VzWysraV0gPSAobGVuZ3RoU3BhY2luZyA/IHNldHVwTGVuZ3RoICsgc3BhY2luZyA6IHNwYWNpbmcpICogbGVuZ3RoIC8gc2V0dXBMZW5ndGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHBvc2l0aW9ucyA9IHRoaXMuY29tcHV0ZVdvcmxkUG9zaXRpb25zKDxQYXRoQXR0YWNobWVudD5hdHRhY2htZW50LCBzcGFjZXNDb3VudCwgdGFuZ2VudHMpO1xuXHRcdGxldCBib25lWCA9IHBvc2l0aW9uc1swXSwgYm9uZVkgPSBwb3NpdGlvbnNbMV0sIG9mZnNldFJvdGF0aW9uID0gZGF0YS5vZmZzZXRSb3RhdGlvbjtcblx0XHRsZXQgdGlwID0gZmFsc2U7XG5cdFx0aWYgKG9mZnNldFJvdGF0aW9uID09IDApXG5cdFx0XHR0aXAgPSBkYXRhLnJvdGF0ZU1vZGUgPT0gUm90YXRlTW9kZS5DaGFpbjtcblx0XHRlbHNlIHtcblx0XHRcdHRpcCA9IGZhbHNlO1xuXHRcdFx0bGV0IHAgPSB0aGlzLnRhcmdldC5ib25lO1xuXHRcdFx0b2Zmc2V0Um90YXRpb24gKj0gcC5hICogcC5kIC0gcC5iICogcC5jID4gMCA/IE1hdGhVdGlscy5kZWdSYWQgOiAtTWF0aFV0aWxzLmRlZ1JhZDtcblx0XHR9XG5cdFx0Zm9yIChsZXQgaSA9IDAsIHAgPSAzOyBpIDwgYm9uZUNvdW50OyBpKyssIHAgKz0gMykge1xuXHRcdFx0bGV0IGJvbmUgPSBib25lc1tpXTtcblx0XHRcdGJvbmUud29ybGRYICs9IChib25lWCAtIGJvbmUud29ybGRYKSAqIG1peFg7XG5cdFx0XHRib25lLndvcmxkWSArPSAoYm9uZVkgLSBib25lLndvcmxkWSkgKiBtaXhZO1xuXHRcdFx0bGV0IHggPSBwb3NpdGlvbnNbcF0sIHkgPSBwb3NpdGlvbnNbcCArIDFdLCBkeCA9IHggLSBib25lWCwgZHkgPSB5IC0gYm9uZVk7XG5cdFx0XHRpZiAoc2NhbGUpIHtcblx0XHRcdFx0bGV0IGxlbmd0aCA9IGxlbmd0aHNbaV07XG5cdFx0XHRcdGlmIChsZW5ndGggIT0gMCkge1xuXHRcdFx0XHRcdGxldCBzID0gKE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkgLyBsZW5ndGggLSAxKSAqIG1peFJvdGF0ZSArIDE7XG5cdFx0XHRcdFx0Ym9uZS5hICo9IHM7XG5cdFx0XHRcdFx0Ym9uZS5jICo9IHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGJvbmVYID0geDtcblx0XHRcdGJvbmVZID0geTtcblx0XHRcdGlmIChtaXhSb3RhdGUgPiAwKSB7XG5cdFx0XHRcdGxldCBhID0gYm9uZS5hLCBiID0gYm9uZS5iLCBjID0gYm9uZS5jLCBkID0gYm9uZS5kLCByID0gMCwgY29zID0gMCwgc2luID0gMDtcblx0XHRcdFx0aWYgKHRhbmdlbnRzKVxuXHRcdFx0XHRcdHIgPSBwb3NpdGlvbnNbcCAtIDFdO1xuXHRcdFx0XHRlbHNlIGlmIChzcGFjZXNbaSArIDFdID09IDApXG5cdFx0XHRcdFx0ciA9IHBvc2l0aW9uc1twICsgMl07XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyID0gTWF0aC5hdGFuMihkeSwgZHgpO1xuXHRcdFx0XHRyIC09IE1hdGguYXRhbjIoYywgYSk7XG5cdFx0XHRcdGlmICh0aXApIHtcblx0XHRcdFx0XHRjb3MgPSBNYXRoLmNvcyhyKTtcblx0XHRcdFx0XHRzaW4gPSBNYXRoLnNpbihyKTtcblx0XHRcdFx0XHRsZXQgbGVuZ3RoID0gYm9uZS5kYXRhLmxlbmd0aDtcblx0XHRcdFx0XHRib25lWCArPSAobGVuZ3RoICogKGNvcyAqIGEgLSBzaW4gKiBjKSAtIGR4KSAqIG1peFJvdGF0ZTtcblx0XHRcdFx0XHRib25lWSArPSAobGVuZ3RoICogKHNpbiAqIGEgKyBjb3MgKiBjKSAtIGR5KSAqIG1peFJvdGF0ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyICs9IG9mZnNldFJvdGF0aW9uO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyID4gTWF0aFV0aWxzLlBJKVxuXHRcdFx0XHRcdHIgLT0gTWF0aFV0aWxzLlBJMjtcblx0XHRcdFx0ZWxzZSBpZiAociA8IC1NYXRoVXRpbHMuUEkpIC8vXG5cdFx0XHRcdFx0ciArPSBNYXRoVXRpbHMuUEkyO1xuXHRcdFx0XHRyICo9IG1peFJvdGF0ZTtcblx0XHRcdFx0Y29zID0gTWF0aC5jb3Mocik7XG5cdFx0XHRcdHNpbiA9IE1hdGguc2luKHIpO1xuXHRcdFx0XHRib25lLmEgPSBjb3MgKiBhIC0gc2luICogYztcblx0XHRcdFx0Ym9uZS5iID0gY29zICogYiAtIHNpbiAqIGQ7XG5cdFx0XHRcdGJvbmUuYyA9IHNpbiAqIGEgKyBjb3MgKiBjO1xuXHRcdFx0XHRib25lLmQgPSBzaW4gKiBiICsgY29zICogZDtcblx0XHRcdH1cblx0XHRcdGJvbmUudXBkYXRlQXBwbGllZFRyYW5zZm9ybSgpO1xuXHRcdH1cblx0fVxuXG5cdGNvbXB1dGVXb3JsZFBvc2l0aW9ucyAocGF0aDogUGF0aEF0dGFjaG1lbnQsIHNwYWNlc0NvdW50OiBudW1iZXIsIHRhbmdlbnRzOiBib29sZWFuKSB7XG5cdFx0bGV0IHRhcmdldCA9IHRoaXMudGFyZ2V0O1xuXHRcdGxldCBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb247XG5cdFx0bGV0IHNwYWNlcyA9IHRoaXMuc3BhY2VzLCBvdXQgPSBVdGlscy5zZXRBcnJheVNpemUodGhpcy5wb3NpdGlvbnMsIHNwYWNlc0NvdW50ICogMyArIDIpLCB3b3JsZDogQXJyYXk8bnVtYmVyPiA9IHRoaXMud29ybGQ7XG5cdFx0bGV0IGNsb3NlZCA9IHBhdGguY2xvc2VkO1xuXHRcdGxldCB2ZXJ0aWNlc0xlbmd0aCA9IHBhdGgud29ybGRWZXJ0aWNlc0xlbmd0aCwgY3VydmVDb3VudCA9IHZlcnRpY2VzTGVuZ3RoIC8gNiwgcHJldkN1cnZlID0gUGF0aENvbnN0cmFpbnQuTk9ORTtcblxuXHRcdGlmICghcGF0aC5jb25zdGFudFNwZWVkKSB7XG5cdFx0XHRsZXQgbGVuZ3RocyA9IHBhdGgubGVuZ3Rocztcblx0XHRcdGN1cnZlQ291bnQgLT0gY2xvc2VkID8gMSA6IDI7XG5cdFx0XHRsZXQgcGF0aExlbmd0aCA9IGxlbmd0aHNbY3VydmVDb3VudF07XG5cdFx0XHRpZiAodGhpcy5kYXRhLnBvc2l0aW9uTW9kZSA9PSBQb3NpdGlvbk1vZGUuUGVyY2VudCkgcG9zaXRpb24gKj0gcGF0aExlbmd0aDtcblxuXHRcdFx0bGV0IG11bHRpcGxpZXI7XG5cdFx0XHRzd2l0Y2ggKHRoaXMuZGF0YS5zcGFjaW5nTW9kZSkge1xuXHRcdFx0XHRjYXNlIFNwYWNpbmdNb2RlLlBlcmNlbnQ6XG5cdFx0XHRcdFx0bXVsdGlwbGllciA9IHBhdGhMZW5ndGg7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgU3BhY2luZ01vZGUuUHJvcG9ydGlvbmFsOlxuXHRcdFx0XHRcdG11bHRpcGxpZXIgPSBwYXRoTGVuZ3RoIC8gc3BhY2VzQ291bnQ7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0bXVsdGlwbGllciA9IDE7XG5cdFx0XHR9XG5cdFx0XHR3b3JsZCA9IFV0aWxzLnNldEFycmF5U2l6ZSh0aGlzLndvcmxkLCA4KTtcblx0XHRcdGZvciAobGV0IGkgPSAwLCBvID0gMCwgY3VydmUgPSAwOyBpIDwgc3BhY2VzQ291bnQ7IGkrKywgbyArPSAzKSB7XG5cdFx0XHRcdGxldCBzcGFjZSA9IHNwYWNlc1tpXSAqIG11bHRpcGxpZXI7XG5cdFx0XHRcdHBvc2l0aW9uICs9IHNwYWNlO1xuXHRcdFx0XHRsZXQgcCA9IHBvc2l0aW9uO1xuXG5cdFx0XHRcdGlmIChjbG9zZWQpIHtcblx0XHRcdFx0XHRwICU9IHBhdGhMZW5ndGg7XG5cdFx0XHRcdFx0aWYgKHAgPCAwKSBwICs9IHBhdGhMZW5ndGg7XG5cdFx0XHRcdFx0Y3VydmUgPSAwO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHAgPCAwKSB7XG5cdFx0XHRcdFx0aWYgKHByZXZDdXJ2ZSAhPSBQYXRoQ29uc3RyYWludC5CRUZPUkUpIHtcblx0XHRcdFx0XHRcdHByZXZDdXJ2ZSA9IFBhdGhDb25zdHJhaW50LkJFRk9SRTtcblx0XHRcdFx0XHRcdHBhdGguY29tcHV0ZVdvcmxkVmVydGljZXModGFyZ2V0LCAyLCA0LCB3b3JsZCwgMCwgMik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuYWRkQmVmb3JlUG9zaXRpb24ocCwgd29ybGQsIDAsIG91dCwgbyk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocCA+IHBhdGhMZW5ndGgpIHtcblx0XHRcdFx0XHRpZiAocHJldkN1cnZlICE9IFBhdGhDb25zdHJhaW50LkFGVEVSKSB7XG5cdFx0XHRcdFx0XHRwcmV2Q3VydmUgPSBQYXRoQ29uc3RyYWludC5BRlRFUjtcblx0XHRcdFx0XHRcdHBhdGguY29tcHV0ZVdvcmxkVmVydGljZXModGFyZ2V0LCB2ZXJ0aWNlc0xlbmd0aCAtIDYsIDQsIHdvcmxkLCAwLCAyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5hZGRBZnRlclBvc2l0aW9uKHAgLSBwYXRoTGVuZ3RoLCB3b3JsZCwgMCwgb3V0LCBvKTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIERldGVybWluZSBjdXJ2ZSBjb250YWluaW5nIHBvc2l0aW9uLlxuXHRcdFx0XHRmb3IgKDsgOyBjdXJ2ZSsrKSB7XG5cdFx0XHRcdFx0bGV0IGxlbmd0aCA9IGxlbmd0aHNbY3VydmVdO1xuXHRcdFx0XHRcdGlmIChwID4gbGVuZ3RoKSBjb250aW51ZTtcblx0XHRcdFx0XHRpZiAoY3VydmUgPT0gMClcblx0XHRcdFx0XHRcdHAgLz0gbGVuZ3RoO1xuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0bGV0IHByZXYgPSBsZW5ndGhzW2N1cnZlIC0gMV07XG5cdFx0XHRcdFx0XHRwID0gKHAgLSBwcmV2KSAvIChsZW5ndGggLSBwcmV2KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGN1cnZlICE9IHByZXZDdXJ2ZSkge1xuXHRcdFx0XHRcdHByZXZDdXJ2ZSA9IGN1cnZlO1xuXHRcdFx0XHRcdGlmIChjbG9zZWQgJiYgY3VydmUgPT0gY3VydmVDb3VudCkge1xuXHRcdFx0XHRcdFx0cGF0aC5jb21wdXRlV29ybGRWZXJ0aWNlcyh0YXJnZXQsIHZlcnRpY2VzTGVuZ3RoIC0gNCwgNCwgd29ybGQsIDAsIDIpO1xuXHRcdFx0XHRcdFx0cGF0aC5jb21wdXRlV29ybGRWZXJ0aWNlcyh0YXJnZXQsIDAsIDQsIHdvcmxkLCA0LCAyKTtcblx0XHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRcdHBhdGguY29tcHV0ZVdvcmxkVmVydGljZXModGFyZ2V0LCBjdXJ2ZSAqIDYgKyAyLCA4LCB3b3JsZCwgMCwgMik7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5hZGRDdXJ2ZVBvc2l0aW9uKHAsIHdvcmxkWzBdLCB3b3JsZFsxXSwgd29ybGRbMl0sIHdvcmxkWzNdLCB3b3JsZFs0XSwgd29ybGRbNV0sIHdvcmxkWzZdLCB3b3JsZFs3XSwgb3V0LCBvLFxuXHRcdFx0XHRcdHRhbmdlbnRzIHx8IChpID4gMCAmJiBzcGFjZSA9PSAwKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb3V0O1xuXHRcdH1cblxuXHRcdC8vIFdvcmxkIHZlcnRpY2VzLlxuXHRcdGlmIChjbG9zZWQpIHtcblx0XHRcdHZlcnRpY2VzTGVuZ3RoICs9IDI7XG5cdFx0XHR3b3JsZCA9IFV0aWxzLnNldEFycmF5U2l6ZSh0aGlzLndvcmxkLCB2ZXJ0aWNlc0xlbmd0aCk7XG5cdFx0XHRwYXRoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHRhcmdldCwgMiwgdmVydGljZXNMZW5ndGggLSA0LCB3b3JsZCwgMCwgMik7XG5cdFx0XHRwYXRoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHRhcmdldCwgMCwgMiwgd29ybGQsIHZlcnRpY2VzTGVuZ3RoIC0gNCwgMik7XG5cdFx0XHR3b3JsZFt2ZXJ0aWNlc0xlbmd0aCAtIDJdID0gd29ybGRbMF07XG5cdFx0XHR3b3JsZFt2ZXJ0aWNlc0xlbmd0aCAtIDFdID0gd29ybGRbMV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1cnZlQ291bnQtLTtcblx0XHRcdHZlcnRpY2VzTGVuZ3RoIC09IDQ7XG5cdFx0XHR3b3JsZCA9IFV0aWxzLnNldEFycmF5U2l6ZSh0aGlzLndvcmxkLCB2ZXJ0aWNlc0xlbmd0aCk7XG5cdFx0XHRwYXRoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHRhcmdldCwgMiwgdmVydGljZXNMZW5ndGgsIHdvcmxkLCAwLCAyKTtcblx0XHR9XG5cblx0XHQvLyBDdXJ2ZSBsZW5ndGhzLlxuXHRcdGxldCBjdXJ2ZXMgPSBVdGlscy5zZXRBcnJheVNpemUodGhpcy5jdXJ2ZXMsIGN1cnZlQ291bnQpO1xuXHRcdGxldCBwYXRoTGVuZ3RoID0gMDtcblx0XHRsZXQgeDEgPSB3b3JsZFswXSwgeTEgPSB3b3JsZFsxXSwgY3gxID0gMCwgY3kxID0gMCwgY3gyID0gMCwgY3kyID0gMCwgeDIgPSAwLCB5MiA9IDA7XG5cdFx0bGV0IHRtcHggPSAwLCB0bXB5ID0gMCwgZGRkZnggPSAwLCBkZGRmeSA9IDAsIGRkZnggPSAwLCBkZGZ5ID0gMCwgZGZ4ID0gMCwgZGZ5ID0gMDtcblx0XHRmb3IgKGxldCBpID0gMCwgdyA9IDI7IGkgPCBjdXJ2ZUNvdW50OyBpKyssIHcgKz0gNikge1xuXHRcdFx0Y3gxID0gd29ybGRbd107XG5cdFx0XHRjeTEgPSB3b3JsZFt3ICsgMV07XG5cdFx0XHRjeDIgPSB3b3JsZFt3ICsgMl07XG5cdFx0XHRjeTIgPSB3b3JsZFt3ICsgM107XG5cdFx0XHR4MiA9IHdvcmxkW3cgKyA0XTtcblx0XHRcdHkyID0gd29ybGRbdyArIDVdO1xuXHRcdFx0dG1weCA9ICh4MSAtIGN4MSAqIDIgKyBjeDIpICogMC4xODc1O1xuXHRcdFx0dG1weSA9ICh5MSAtIGN5MSAqIDIgKyBjeTIpICogMC4xODc1O1xuXHRcdFx0ZGRkZnggPSAoKGN4MSAtIGN4MikgKiAzIC0geDEgKyB4MikgKiAwLjA5Mzc1O1xuXHRcdFx0ZGRkZnkgPSAoKGN5MSAtIGN5MikgKiAzIC0geTEgKyB5MikgKiAwLjA5Mzc1O1xuXHRcdFx0ZGRmeCA9IHRtcHggKiAyICsgZGRkZng7XG5cdFx0XHRkZGZ5ID0gdG1weSAqIDIgKyBkZGRmeTtcblx0XHRcdGRmeCA9IChjeDEgLSB4MSkgKiAwLjc1ICsgdG1weCArIGRkZGZ4ICogMC4xNjY2NjY2Nztcblx0XHRcdGRmeSA9IChjeTEgLSB5MSkgKiAwLjc1ICsgdG1weSArIGRkZGZ5ICogMC4xNjY2NjY2Nztcblx0XHRcdHBhdGhMZW5ndGggKz0gTWF0aC5zcXJ0KGRmeCAqIGRmeCArIGRmeSAqIGRmeSk7XG5cdFx0XHRkZnggKz0gZGRmeDtcblx0XHRcdGRmeSArPSBkZGZ5O1xuXHRcdFx0ZGRmeCArPSBkZGRmeDtcblx0XHRcdGRkZnkgKz0gZGRkZnk7XG5cdFx0XHRwYXRoTGVuZ3RoICs9IE1hdGguc3FydChkZnggKiBkZnggKyBkZnkgKiBkZnkpO1xuXHRcdFx0ZGZ4ICs9IGRkZng7XG5cdFx0XHRkZnkgKz0gZGRmeTtcblx0XHRcdHBhdGhMZW5ndGggKz0gTWF0aC5zcXJ0KGRmeCAqIGRmeCArIGRmeSAqIGRmeSk7XG5cdFx0XHRkZnggKz0gZGRmeCArIGRkZGZ4O1xuXHRcdFx0ZGZ5ICs9IGRkZnkgKyBkZGRmeTtcblx0XHRcdHBhdGhMZW5ndGggKz0gTWF0aC5zcXJ0KGRmeCAqIGRmeCArIGRmeSAqIGRmeSk7XG5cdFx0XHRjdXJ2ZXNbaV0gPSBwYXRoTGVuZ3RoO1xuXHRcdFx0eDEgPSB4Mjtcblx0XHRcdHkxID0geTI7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZGF0YS5wb3NpdGlvbk1vZGUgPT0gUG9zaXRpb25Nb2RlLlBlcmNlbnQpIHBvc2l0aW9uICo9IHBhdGhMZW5ndGg7XG5cblx0XHRsZXQgbXVsdGlwbGllcjtcblx0XHRzd2l0Y2ggKHRoaXMuZGF0YS5zcGFjaW5nTW9kZSkge1xuXHRcdFx0Y2FzZSBTcGFjaW5nTW9kZS5QZXJjZW50OlxuXHRcdFx0XHRtdWx0aXBsaWVyID0gcGF0aExlbmd0aDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFNwYWNpbmdNb2RlLlByb3BvcnRpb25hbDpcblx0XHRcdFx0bXVsdGlwbGllciA9IHBhdGhMZW5ndGggLyBzcGFjZXNDb3VudDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRtdWx0aXBsaWVyID0gMTtcblx0XHR9XG5cblx0XHRsZXQgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzO1xuXHRcdGxldCBjdXJ2ZUxlbmd0aCA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG8gPSAwLCBjdXJ2ZSA9IDAsIHNlZ21lbnQgPSAwOyBpIDwgc3BhY2VzQ291bnQ7IGkrKywgbyArPSAzKSB7XG5cdFx0XHRsZXQgc3BhY2UgPSBzcGFjZXNbaV0gKiBtdWx0aXBsaWVyO1xuXHRcdFx0cG9zaXRpb24gKz0gc3BhY2U7XG5cdFx0XHRsZXQgcCA9IHBvc2l0aW9uO1xuXG5cdFx0XHRpZiAoY2xvc2VkKSB7XG5cdFx0XHRcdHAgJT0gcGF0aExlbmd0aDtcblx0XHRcdFx0aWYgKHAgPCAwKSBwICs9IHBhdGhMZW5ndGg7XG5cdFx0XHRcdGN1cnZlID0gMDtcblx0XHRcdH0gZWxzZSBpZiAocCA8IDApIHtcblx0XHRcdFx0dGhpcy5hZGRCZWZvcmVQb3NpdGlvbihwLCB3b3JsZCwgMCwgb3V0LCBvKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9IGVsc2UgaWYgKHAgPiBwYXRoTGVuZ3RoKSB7XG5cdFx0XHRcdHRoaXMuYWRkQWZ0ZXJQb3NpdGlvbihwIC0gcGF0aExlbmd0aCwgd29ybGQsIHZlcnRpY2VzTGVuZ3RoIC0gNCwgb3V0LCBvKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERldGVybWluZSBjdXJ2ZSBjb250YWluaW5nIHBvc2l0aW9uLlxuXHRcdFx0Zm9yICg7IDsgY3VydmUrKykge1xuXHRcdFx0XHRsZXQgbGVuZ3RoID0gY3VydmVzW2N1cnZlXTtcblx0XHRcdFx0aWYgKHAgPiBsZW5ndGgpIGNvbnRpbnVlO1xuXHRcdFx0XHRpZiAoY3VydmUgPT0gMClcblx0XHRcdFx0XHRwIC89IGxlbmd0aDtcblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0bGV0IHByZXYgPSBjdXJ2ZXNbY3VydmUgLSAxXTtcblx0XHRcdFx0XHRwID0gKHAgLSBwcmV2KSAvIChsZW5ndGggLSBwcmV2KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ3VydmUgc2VnbWVudCBsZW5ndGhzLlxuXHRcdFx0aWYgKGN1cnZlICE9IHByZXZDdXJ2ZSkge1xuXHRcdFx0XHRwcmV2Q3VydmUgPSBjdXJ2ZTtcblx0XHRcdFx0bGV0IGlpID0gY3VydmUgKiA2O1xuXHRcdFx0XHR4MSA9IHdvcmxkW2lpXTtcblx0XHRcdFx0eTEgPSB3b3JsZFtpaSArIDFdO1xuXHRcdFx0XHRjeDEgPSB3b3JsZFtpaSArIDJdO1xuXHRcdFx0XHRjeTEgPSB3b3JsZFtpaSArIDNdO1xuXHRcdFx0XHRjeDIgPSB3b3JsZFtpaSArIDRdO1xuXHRcdFx0XHRjeTIgPSB3b3JsZFtpaSArIDVdO1xuXHRcdFx0XHR4MiA9IHdvcmxkW2lpICsgNl07XG5cdFx0XHRcdHkyID0gd29ybGRbaWkgKyA3XTtcblx0XHRcdFx0dG1weCA9ICh4MSAtIGN4MSAqIDIgKyBjeDIpICogMC4wMztcblx0XHRcdFx0dG1weSA9ICh5MSAtIGN5MSAqIDIgKyBjeTIpICogMC4wMztcblx0XHRcdFx0ZGRkZnggPSAoKGN4MSAtIGN4MikgKiAzIC0geDEgKyB4MikgKiAwLjAwNjtcblx0XHRcdFx0ZGRkZnkgPSAoKGN5MSAtIGN5MikgKiAzIC0geTEgKyB5MikgKiAwLjAwNjtcblx0XHRcdFx0ZGRmeCA9IHRtcHggKiAyICsgZGRkZng7XG5cdFx0XHRcdGRkZnkgPSB0bXB5ICogMiArIGRkZGZ5O1xuXHRcdFx0XHRkZnggPSAoY3gxIC0geDEpICogMC4zICsgdG1weCArIGRkZGZ4ICogMC4xNjY2NjY2Nztcblx0XHRcdFx0ZGZ5ID0gKGN5MSAtIHkxKSAqIDAuMyArIHRtcHkgKyBkZGRmeSAqIDAuMTY2NjY2Njc7XG5cdFx0XHRcdGN1cnZlTGVuZ3RoID0gTWF0aC5zcXJ0KGRmeCAqIGRmeCArIGRmeSAqIGRmeSk7XG5cdFx0XHRcdHNlZ21lbnRzWzBdID0gY3VydmVMZW5ndGg7XG5cdFx0XHRcdGZvciAoaWkgPSAxOyBpaSA8IDg7IGlpKyspIHtcblx0XHRcdFx0XHRkZnggKz0gZGRmeDtcblx0XHRcdFx0XHRkZnkgKz0gZGRmeTtcblx0XHRcdFx0XHRkZGZ4ICs9IGRkZGZ4O1xuXHRcdFx0XHRcdGRkZnkgKz0gZGRkZnk7XG5cdFx0XHRcdFx0Y3VydmVMZW5ndGggKz0gTWF0aC5zcXJ0KGRmeCAqIGRmeCArIGRmeSAqIGRmeSk7XG5cdFx0XHRcdFx0c2VnbWVudHNbaWldID0gY3VydmVMZW5ndGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGZ4ICs9IGRkZng7XG5cdFx0XHRcdGRmeSArPSBkZGZ5O1xuXHRcdFx0XHRjdXJ2ZUxlbmd0aCArPSBNYXRoLnNxcnQoZGZ4ICogZGZ4ICsgZGZ5ICogZGZ5KTtcblx0XHRcdFx0c2VnbWVudHNbOF0gPSBjdXJ2ZUxlbmd0aDtcblx0XHRcdFx0ZGZ4ICs9IGRkZnggKyBkZGRmeDtcblx0XHRcdFx0ZGZ5ICs9IGRkZnkgKyBkZGRmeTtcblx0XHRcdFx0Y3VydmVMZW5ndGggKz0gTWF0aC5zcXJ0KGRmeCAqIGRmeCArIGRmeSAqIGRmeSk7XG5cdFx0XHRcdHNlZ21lbnRzWzldID0gY3VydmVMZW5ndGg7XG5cdFx0XHRcdHNlZ21lbnQgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZWlnaHQgYnkgc2VnbWVudCBsZW5ndGguXG5cdFx0XHRwICo9IGN1cnZlTGVuZ3RoO1xuXHRcdFx0Zm9yICg7IDsgc2VnbWVudCsrKSB7XG5cdFx0XHRcdGxldCBsZW5ndGggPSBzZWdtZW50c1tzZWdtZW50XTtcblx0XHRcdFx0aWYgKHAgPiBsZW5ndGgpIGNvbnRpbnVlO1xuXHRcdFx0XHRpZiAoc2VnbWVudCA9PSAwKVxuXHRcdFx0XHRcdHAgLz0gbGVuZ3RoO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRsZXQgcHJldiA9IHNlZ21lbnRzW3NlZ21lbnQgLSAxXTtcblx0XHRcdFx0XHRwID0gc2VnbWVudCArIChwIC0gcHJldikgLyAobGVuZ3RoIC0gcHJldik7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmFkZEN1cnZlUG9zaXRpb24ocCAqIDAuMSwgeDEsIHkxLCBjeDEsIGN5MSwgY3gyLCBjeTIsIHgyLCB5Miwgb3V0LCBvLCB0YW5nZW50cyB8fCAoaSA+IDAgJiYgc3BhY2UgPT0gMCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gb3V0O1xuXHR9XG5cblx0YWRkQmVmb3JlUG9zaXRpb24gKHA6IG51bWJlciwgdGVtcDogQXJyYXk8bnVtYmVyPiwgaTogbnVtYmVyLCBvdXQ6IEFycmF5PG51bWJlcj4sIG86IG51bWJlcikge1xuXHRcdGxldCB4MSA9IHRlbXBbaV0sIHkxID0gdGVtcFtpICsgMV0sIGR4ID0gdGVtcFtpICsgMl0gLSB4MSwgZHkgPSB0ZW1wW2kgKyAzXSAtIHkxLCByID0gTWF0aC5hdGFuMihkeSwgZHgpO1xuXHRcdG91dFtvXSA9IHgxICsgcCAqIE1hdGguY29zKHIpO1xuXHRcdG91dFtvICsgMV0gPSB5MSArIHAgKiBNYXRoLnNpbihyKTtcblx0XHRvdXRbbyArIDJdID0gcjtcblx0fVxuXG5cdGFkZEFmdGVyUG9zaXRpb24gKHA6IG51bWJlciwgdGVtcDogQXJyYXk8bnVtYmVyPiwgaTogbnVtYmVyLCBvdXQ6IEFycmF5PG51bWJlcj4sIG86IG51bWJlcikge1xuXHRcdGxldCB4MSA9IHRlbXBbaSArIDJdLCB5MSA9IHRlbXBbaSArIDNdLCBkeCA9IHgxIC0gdGVtcFtpXSwgZHkgPSB5MSAtIHRlbXBbaSArIDFdLCByID0gTWF0aC5hdGFuMihkeSwgZHgpO1xuXHRcdG91dFtvXSA9IHgxICsgcCAqIE1hdGguY29zKHIpO1xuXHRcdG91dFtvICsgMV0gPSB5MSArIHAgKiBNYXRoLnNpbihyKTtcblx0XHRvdXRbbyArIDJdID0gcjtcblx0fVxuXG5cdGFkZEN1cnZlUG9zaXRpb24gKHA6IG51bWJlciwgeDE6IG51bWJlciwgeTE6IG51bWJlciwgY3gxOiBudW1iZXIsIGN5MTogbnVtYmVyLCBjeDI6IG51bWJlciwgY3kyOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsXG5cdFx0b3V0OiBBcnJheTxudW1iZXI+LCBvOiBudW1iZXIsIHRhbmdlbnRzOiBib29sZWFuKSB7XG5cdFx0aWYgKHAgPT0gMCB8fCBpc05hTihwKSkge1xuXHRcdFx0b3V0W29dID0geDE7XG5cdFx0XHRvdXRbbyArIDFdID0geTE7XG5cdFx0XHRvdXRbbyArIDJdID0gTWF0aC5hdGFuMihjeTEgLSB5MSwgY3gxIC0geDEpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsZXQgdHQgPSBwICogcCwgdHR0ID0gdHQgKiBwLCB1ID0gMSAtIHAsIHV1ID0gdSAqIHUsIHV1dSA9IHV1ICogdTtcblx0XHRsZXQgdXQgPSB1ICogcCwgdXQzID0gdXQgKiAzLCB1dXQzID0gdSAqIHV0MywgdXR0MyA9IHV0MyAqIHA7XG5cdFx0bGV0IHggPSB4MSAqIHV1dSArIGN4MSAqIHV1dDMgKyBjeDIgKiB1dHQzICsgeDIgKiB0dHQsIHkgPSB5MSAqIHV1dSArIGN5MSAqIHV1dDMgKyBjeTIgKiB1dHQzICsgeTIgKiB0dHQ7XG5cdFx0b3V0W29dID0geDtcblx0XHRvdXRbbyArIDFdID0geTtcblx0XHRpZiAodGFuZ2VudHMpIHtcblx0XHRcdGlmIChwIDwgMC4wMDEpXG5cdFx0XHRcdG91dFtvICsgMl0gPSBNYXRoLmF0YW4yKGN5MSAtIHkxLCBjeDEgLSB4MSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdG91dFtvICsgMl0gPSBNYXRoLmF0YW4yKHkgLSAoeTEgKiB1dSArIGN5MSAqIHV0ICogMiArIGN5MiAqIHR0KSwgeCAtICh4MSAqIHV1ICsgY3gxICogdXQgKiAyICsgY3gyICogdHQpKTtcblx0XHR9XG5cdH1cbn1cbiJdfQ==
510
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0aENvbnN0cmFpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUGF0aENvbnN0cmFpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUdqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUEyQixZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRzlDOzt5R0FFeUc7QUFDekcsTUFBTSxPQUFPLGNBQWUsU0FBUSxVQUFrRTtJQUNyRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDeEQsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFFekIsNkNBQTZDO0lBQzdDLElBQUksQ0FBcUI7SUFFekIsK0RBQStEO0lBQy9ELEtBQUssQ0FBa0I7SUFFdkIsNEVBQTRFO0lBQzVFLElBQUksQ0FBTztJQUVYLE1BQU0sR0FBRyxFQUFjLENBQUM7SUFBQyxTQUFTLEdBQUcsRUFBYyxDQUFDO0lBQ3BELEtBQUssR0FBRyxFQUFjLENBQUM7SUFBQyxNQUFNLEdBQUcsRUFBYyxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQWMsQ0FBQztJQUMxRSxRQUFRLEdBQUcsRUFBYyxDQUFDO0lBRTFCLFlBQWEsSUFBd0IsRUFBRSxRQUFrQjtRQUN4RCxLQUFLLENBQUMsSUFBSSxFQUFF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QUMsQ0FBQztRQUNuRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BELEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuQixHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuQixHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDckMsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQ3JDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQzlDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQzlDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDeEIsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFH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QUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNoQixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDNUMsT0FBTztRQUNSLENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDL0QsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUMzRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEdBQUcsS0FBSztnQkFDWixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7O2dCQUU1QyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RyxDQUFDO0lBQ0YsQ0FBQztJQUVELElBQUksQ0FBRSxRQUFrQjtRQUN2QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMzRixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsS0FBSyxRQUFRLENBQUMsSUFBSTtZQUNuRixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDM0IsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRTtZQUNqQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUU7WUFDakMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFTyxZQUFZLENBQUUsUUFBa0IsRUFBRSxJQUFVLEVBQUUsU0FBaUIsRUFBRSxRQUFjO1FBQ3RGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDaEQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTO2dCQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEYsQ0FBQztJQUNGLENBQUM7SUFFTyxRQUFRLENBQUUsUUFBa0IsRUFBRSxVQUE2QixFQUFFLFFBQWM7UUFDbEYsSUFBSSxDQUFDLENBQUMsVUFBVSxZQUFZLGNBQWMsQ0FBQztZQUFFLE9BQU87UUFDcEQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUNuQyxJQUFJLFNBQVMsSUFBSSxJQUFJO1lBQ3BCLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDeEIsQ0FBQztZQUNMLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUM5QyxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDeEIsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDUixPQUFPLENBQUMsR0FBRyxFQUFFO29CQUNaLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0YsQ0FBQztJQUNGLENBQUM7SUFFRCxjQUFjO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHR5cGUgeyBBdHRhY2htZW50IH0gZnJvbSBcIi4vYXR0YWNobWVudHMvQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHsgUGF0aEF0dGFjaG1lbnQgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9QYXRoQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCb25lIH0gZnJvbSBcIi4vQm9uZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCb25lUG9zZSB9IGZyb20gXCIuL0JvbmVQb3NlLmpzXCI7XG5pbXBvcnQgeyBDb25zdHJhaW50IH0gZnJvbSBcIi4vQ29uc3RyYWludC5qc1wiO1xuaW1wb3J0IHsgdHlwZSBQYXRoQ29uc3RyYWludERhdGEsIFBvc2l0aW9uTW9kZSwgUm90YXRlTW9kZSwgU3BhY2luZ01vZGUgfSBmcm9tIFwiLi9QYXRoQ29uc3RyYWludERhdGEuanNcIjtcbmltcG9ydCB7IFBhdGhDb25zdHJhaW50UG9zZSB9IGZyb20gXCIuL1BhdGhDb25zdHJhaW50UG9zZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQaHlzaWNzIH0gZnJvbSBcIi4vUGh5c2ljcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNraW4gfSBmcm9tIFwiLi9Ta2luLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNsb3QgfSBmcm9tIFwiLi9TbG90LmpzXCI7XG5pbXBvcnQgeyBNYXRoVXRpbHMsIFV0aWxzIH0gZnJvbSBcIi4vVXRpbHMuanNcIjtcblxuXG4vKiogQWRqdXN0cyB0aGUgcm90YXRpb24sIHRyYW5zbGF0aW9uLCBhbmQgc2NhbGUgb2YgdGhlIGNvbnN0cmFpbmVkIGJvbmVzIHNvIHRoZXkgZm9sbG93IGEge0BsaW5rIFBhdGhBdHRhY2htZW50fS5cbiAqXG4gKiBTZWUgW1BhdGggY29uc3RyYWludHNdKGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1wYXRoLWNvbnN0cmFpbnRzKSBpbiB0aGUgU3BpbmUgVXNlciBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBQYXRoQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQ8UGF0aENvbnN0cmFpbnQsIFBhdGhDb25zdHJhaW50RGF0YSwgUGF0aENvbnN0cmFpbnRQb3NlPiB7XG5cdHN0YXRpYyBOT05FID0gLTE7IHN0YXRpYyBCRUZPUkUgPSAtMjsgc3RhdGljIEFGVEVSID0gLTM7XG5cdHN0YXRpYyBlcHNpbG9uID0gMC4wMDAwMTtcblxuXHQvKiogVGhlIHBhdGggY29uc3RyYWludCdzIHNldHVwIHBvc2UgZGF0YS4gKi9cblx0ZGF0YTogUGF0aENvbnN0cmFpbnREYXRhO1xuXG5cdC8qKiBUaGUgYm9uZXMgdGhhdCB3aWxsIGJlIG1vZGlmaWVkIGJ5IHRoaXMgcGF0aCBjb25zdHJhaW50LiAqL1xuXHRib25lczogQXJyYXk8Qm9uZVBvc2U+O1xuXG5cdC8qKiBUaGUgc2xvdCB3aG9zZSBwYXRoIGF0dGFjaG1lbnQgd2lsbCBiZSB1c2VkIHRvIGNvbnN0cmFpbmVkIHRoZSBib25lcy4gKi9cblx0c2xvdDogU2xvdDtcblxuXHRzcGFjZXMgPSBbXSBhcyBudW1iZXJbXTsgcG9zaXRpb25zID0gW10gYXMgbnVtYmVyW107XG5cdHdvcmxkID0gW10gYXMgbnVtYmVyW107IGN1cnZlcyA9IFtdIGFzIG51bWJlcltdOyBsZW5ndGhzID0gW10gYXMgbnVtYmVyW107XG5cdHNlZ21lbnRzID0gW10gYXMgbnVtYmVyW107XG5cblx0Y29uc3RydWN0b3IgKGRhdGE6IFBhdGhDb25zdHJhaW50RGF0YSwgc2tlbGV0b246IFNrZWxldG9uKSB7XG5cdFx0c3VwZXIoZGF0YSwgbmV3IFBhdGhDb25zdHJhaW50UG9zZSgpLCBuZXcgUGF0aENvbnN0cmFpbnRQb3NlKCkpO1xuXHRcdGlmICghc2tlbGV0b24pIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXG5cdFx0dGhpcy5ib25lcyA9IFtdIGFzIEJvbmVQb3NlW107XG5cdFx0Zm9yIChjb25zdCBib25lRGF0YSBvZiB0aGlzLmRhdGEuYm9uZXMpXG5cdFx0XHR0aGlzLmJvbmVzLnB1c2goc2tlbGV0b24uYm9uZXNbYm9uZURhdGEuaW5kZXhdLmNvbnN0cmFpbmVkUG9zZSk7XG5cblx0XHR0aGlzLnNsb3QgPSBza2VsZXRvbi5zbG90c1tkYXRhLnNsb3QuaW5kZXhdO1xuXHR9XG5cblx0cHVibGljIGNvcHkgKHNrZWxldG9uOiBTa2VsZXRvbikge1xuXHRcdHZhciBjb3B5ID0gbmV3IFBhdGhDb25zdHJhaW50KHRoaXMuZGF0YSwgc2tlbGV0b24pO1xuXHRcdGNvcHkucG9zZS5zZXQodGhpcy5wb3NlKTtcblx0XHRyZXR1cm4gY29weTtcblx0fVxuXG5cdHVwZGF0ZSAoc2tlbGV0b246IFNrZWxldG9uLCBwaHlzaWNzOiBQaHlzaWNzKSB7XG5cdFx0Y29uc3QgYXR0YWNobWVudCA9IHRoaXMuc2xvdC5hcHBsaWVkUG9zZS5hdHRhY2htZW50O1xuXHRcdGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBQYXRoQXR0YWNobWVudCkpIHJldHVybjtcblxuXHRcdGNvbnN0IHAgPSB0aGlzLmFwcGxpZWRQb3NlO1xuXHRcdGNvbnN0IG1peFJvdGF0ZSA9IHAubWl4Um90YXRlLCBtaXhYID0gcC5taXhYLCBtaXhZID0gcC5taXhZO1xuXHRcdGlmIChtaXhSb3RhdGUgPT09IDAgJiYgbWl4WCA9PT0gMCAmJiBtaXhZID09PSAwKSByZXR1cm47XG5cblx0XHRjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuXHRcdGNvbnN0IHRhbmdlbnRzID0gZGF0YS5yb3RhdGVNb2RlID09PSBSb3RhdGVNb2RlLlRhbmdlbnQsIHNjYWxlID0gZGF0YS5yb3RhdGVNb2RlID09PSBSb3RhdGVNb2RlLkNoYWluU2NhbGU7XG5cblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0Y29uc3QgYm9uZUNvdW50ID0gYm9uZXMubGVuZ3RoLCBzcGFjZXNDb3VudCA9IHRhbmdlbnRzID8gYm9uZUNvdW50IDogYm9uZUNvdW50ICsgMTtcblx0XHRjb25zdCBzcGFjZXMgPSBVdGlscy5zZXRBcnJheVNpemUodGhpcy5zcGFjZXMsIHNwYWNlc0NvdW50KSwgbGVuZ3RoczogQXJyYXk8bnVtYmVyPiA9IHNjYWxlID8gdGhpcy5sZW5ndGhzID0gVXRpbHMuc2V0QXJyYXlTaXplKHRoaXMubGVuZ3RocywgYm9uZUNvdW50KSA6IFtdO1xuXHRcdGNvbnN0IHNwYWNpbmcgPSBwLnNwYWNpbmc7XG5cblx0XHRzd2l0Y2ggKGRhdGEuc3BhY2luZ01vZGUpIHtcblx0XHRcdGNhc2UgU3BhY2luZ01vZGUuUGVyY2VudDpcblx0XHRcdFx0aWYgKHNjYWxlKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBzcGFjZXNDb3VudCAtIDE7IGkgPCBuOyBpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IGJvbmUgPSBib25lc1tpXTtcblx0XHRcdFx0XHRcdGNvbnN0IHNldHVwTGVuZ3RoID0gYm9uZS5ib25lLmRhdGEubGVuZ3RoO1xuXHRcdFx0XHRcdFx0Y29uc3QgeCA9IHNldHVwTGVuZ3RoICogYm9uZS5hLCB5ID0gc2V0dXBMZW5ndGggKiBib25lLmM7XG5cdFx0XHRcdFx0XHRsZW5ndGhzW2ldID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRVdGlscy5hcnJheUZpbGwoc3BhY2VzLCAxLCBzcGFjZXNDb3VudCwgc3BhY2luZyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBTcGFjaW5nTW9kZS5Qcm9wb3J0aW9uYWw6IHtcblx0XHRcdFx0bGV0IHN1bSA9IDA7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwLCBuID0gc3BhY2VzQ291bnQgLSAxOyBpIDwgbjspIHtcblx0XHRcdFx0XHRjb25zdCBib25lID0gYm9uZXNbaV07XG5cdFx0XHRcdFx0Y29uc3Qgc2V0dXBMZW5ndGggPSBib25lLmJvbmUuZGF0YS5sZW5ndGg7XG5cdFx0XHRcdFx0aWYgKHNldHVwTGVuZ3RoIDwgUGF0aENvbnN0cmFpbnQuZXBzaWxvbikge1xuXHRcdFx0XHRcdFx0aWYgKHNjYWxlKSBsZW5ndGhzW2ldID0gMDtcblx0XHRcdFx0XHRcdHNwYWNlc1srK2ldID0gc3BhY2luZztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgeCA9IHNldHVwTGVuZ3RoICogYm9uZS5hLCB5ID0gc2V0dXBMZW5ndGggKiBib25lLmM7XG5cdFx0XHRcdFx0XHRjb25zdCBsZW5ndGggPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG5cdFx0XHRcdFx0XHRpZiAoc2NhbGUpIGxlbmd0aHNbaV0gPSBsZW5ndGg7XG5cdFx0XHRcdFx0XHRzcGFjZXNbKytpXSA9IGxlbmd0aDtcblx0XHRcdFx0XHRcdHN1bSArPSBsZW5ndGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzdW0gPiAwKSB7XG5cdFx0XHRcdFx0c3VtID0gc3BhY2VzQ291bnQgLyBzdW0gKiBzcGFjaW5nO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAxOyBpIDwgc3BhY2VzQ291bnQ7IGkrKylcblx0XHRcdFx0XHRcdHNwYWNlc1tpXSAqPSBzdW07XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRkZWZhdWx0OiB7XG5cdFx0XHRcdGNvbnN0IGxlbmd0aFNwYWNpbmcgPSBkYXRhLnNwYWNpbmdNb2RlID09PSBTcGFjaW5nTW9kZS5MZW5ndGg7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwLCBuID0gc3BhY2VzQ291bnQgLSAxOyBpIDwgbjspIHtcblx0XHRcdFx0XHRjb25zdCBib25lID0gYm9uZXNbaV07XG5cdFx0XHRcdFx0Y29uc3Qgc2V0dXBMZW5ndGggPSBib25lLmJvbmUuZGF0YS5sZW5ndGg7XG5cdFx0XHRcdFx0aWYgKHNldHVwTGVuZ3RoIDwgUGF0aENvbnN0cmFpbnQuZXBzaWxvbikge1xuXHRcdFx0XHRcdFx0aWYgKHNjYWxlKSBsZW5ndGhzW2ldID0gMDtcblx0XHRcdFx0XHRcdHNwYWNlc1srK2ldID0gc3BhY2luZztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgeCA9IHNldHVwTGVuZ3RoICogYm9uZS5hLCB5ID0gc2V0dXBMZW5ndGggKiBib25lLmM7XG5cdFx0XHRcdFx0XHRjb25zdCBsZW5ndGggPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG5cdFx0XHRcdFx0XHRpZiAoc2NhbGUpIGxlbmd0aHNbaV0gPSBsZW5ndGg7XG5cdFx0XHRcdFx0XHRzcGFjZXNbKytpXSA9IChsZW5ndGhTcGFjaW5nID8gTWF0aC5tYXgoMCwgc2V0dXBMZW5ndGggKyBzcGFjaW5nKSA6IHNwYWNpbmcpICogbGVuZ3RoIC8gc2V0dXBMZW5ndGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgcG9zaXRpb25zID0gdGhpcy5jb21wdXRlV29ybGRQb3NpdGlvbnMoc2tlbGV0b24sIGF0dGFjaG1lbnQsIHNwYWNlc0NvdW50LCB0YW5nZW50cyk7XG5cdFx0bGV0IGJvbmVYID0gcG9zaXRpb25zWzBdLCBib25lWSA9IHBvc2l0aW9uc1sxXSwgb2Zmc2V0Um90YXRpb24gPSBkYXRhLm9mZnNldFJvdGF0aW9uO1xuXHRcdGxldCB0aXAgPSBmYWxzZTtcblx0XHRpZiAob2Zmc2V0Um90YXRpb24gPT09IDApXG5cdFx0XHR0aXAgPSBkYXRhLnJvdGF0ZU1vZGUgPT09IFJvdGF0ZU1vZGUuQ2hhaW47XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aXAgPSBmYWxzZTtcblx0XHRcdGNvbnN0IGJvbmUgPSB0aGlzLnNsb3QuYm9uZS5hcHBsaWVkUG9zZTtcblx0XHRcdG9mZnNldFJvdGF0aW9uICo9IGJvbmUuYSAqIGJvbmUuZCAtIGJvbmUuYiAqIGJvbmUuYyA+IDAgPyBNYXRoVXRpbHMuZGVnUmFkIDogLU1hdGhVdGlscy5kZWdSYWQ7XG5cdFx0fVxuXHRcdGZvciAobGV0IGkgPSAwLCBpcCA9IDMsIHUgPSBza2VsZXRvbi5fdXBkYXRlOyBpIDwgYm9uZUNvdW50OyBpKyssIGlwICs9IDMpIHtcblx0XHRcdGNvbnN0IGJvbmUgPSBib25lc1tpXTtcblx0XHRcdGJvbmUud29ybGRYICs9IChib25lWCAtIGJvbmUud29ybGRYKSAqIG1peFg7XG5cdFx0XHRib25lLndvcmxkWSArPSAoYm9uZVkgLSBib25lLndvcmxkWSkgKiBtaXhZO1xuXHRcdFx0Y29uc3QgeCA9IHBvc2l0aW9uc1tpcF0sIHkgPSBwb3NpdGlvbnNbaXAgKyAxXSwgZHggPSB4IC0gYm9uZVgsIGR5ID0geSAtIGJvbmVZO1xuXHRcdFx0aWYgKHNjYWxlKSB7XG5cdFx0XHRcdGNvbnN0IGxlbmd0aCA9IGxlbmd0aHNbaV07XG5cdFx0XHRcdGlmIChsZW5ndGggIT09IDApIHtcblx0XHRcdFx0XHRjb25zdCBzID0gKE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkgLyBsZW5ndGggLSAxKSAqIG1peFJvdGF0ZSArIDE7XG5cdFx0XHRcdFx0Ym9uZS5hICo9IHM7XG5cdFx0XHRcdFx0Ym9uZS5jICo9IHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGJvbmVYID0geDtcblx0XHRcdGJvbmVZID0geTtcblx0XHRcdGlmIChtaXhSb3RhdGUgPiAwKSB7XG5cdFx0XHRcdGxldCBhID0gYm9uZS5hLCBiID0gYm9uZS5iLCBjID0gYm9uZS5jLCBkID0gYm9uZS5kLCByID0gMCwgY29zID0gMCwgc2luID0gMDtcblx0XHRcdFx0aWYgKHRhbmdlbnRzKVxuXHRcdFx0XHRcdHIgPSBwb3NpdGlvbnNbaXAgLSAxXTtcblx0XHRcdFx0ZWxzZSBpZiAoc3BhY2VzW2kgKyAxXSA9PT0gMClcblx0XHRcdFx0XHRyID0gcG9zaXRpb25zW2lwICsgMl07XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyID0gTWF0aC5hdGFuMihkeSwgZHgpO1xuXHRcdFx0XHRyIC09IE1hdGguYXRhbjIoYywgYSk7XG5cdFx0XHRcdGlmICh0aXApIHtcblx0XHRcdFx0XHRjb3MgPSBNYXRoLmNvcyhyKTtcblx0XHRcdFx0XHRzaW4gPSBNYXRoLnNpbihyKTtcblx0XHRcdFx0XHRjb25zdCBsZW5ndGggPSBib25lLmJvbmUuZGF0YS5sZW5ndGg7XG5cdFx0XHRcdFx0Ym9uZVggKz0gKGxlbmd0aCAqIChjb3MgKiBhIC0gc2luICogYykgLSBkeCkgKiBtaXhSb3RhdGU7XG5cdFx0XHRcdFx0Ym9uZVkgKz0gKGxlbmd0aCAqIChzaW4gKiBhICsgY29zICogYykgLSBkeSkgKiBtaXhSb3RhdGU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ciArPSBvZmZzZXRSb3RhdGlvbjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAociA+IE1hdGhVdGlscy5QSSlcblx0XHRcdFx0XHRyIC09IE1hdGhVdGlscy5QSTI7XG5cdFx0XHRcdGVsc2UgaWYgKHIgPCAtTWF0aFV0aWxzLlBJKSAvL1xuXHRcdFx0XHRcdHIgKz0gTWF0aFV0aWxzLlBJMjtcblx0XHRcdFx0ciAqPSBtaXhSb3RhdGU7XG5cdFx0XHRcdGNvcyA9IE1hdGguY29zKHIpO1xuXHRcdFx0XHRzaW4gPSBNYXRoLnNpbihyKTtcblx0XHRcdFx0Ym9uZS5hID0gY29zICogYSAtIHNpbiAqIGM7XG5cdFx0XHRcdGJvbmUuYiA9IGNvcyAqIGIgLSBzaW4gKiBkO1xuXHRcdFx0XHRib25lLmMgPSBzaW4gKiBhICsgY29zICogYztcblx0XHRcdFx0Ym9uZS5kID0gc2luICogYiArIGNvcyAqIGQ7XG5cdFx0XHR9XG5cdFx0XHRib25lLm1vZGlmeVdvcmxkKHUpO1xuXHRcdH1cblx0fVxuXG5cdGNvbXB1dGVXb3JsZFBvc2l0aW9ucyAoc2tlbGV0b246IFNrZWxldG9uLCBwYXRoOiBQYXRoQXR0YWNobWVudCwgc3BhY2VzQ291bnQ6IG51bWJlciwgdGFuZ2VudHM6IGJvb2xlYW4pIHtcblx0XHRjb25zdCBzbG90ID0gdGhpcy5zbG90O1xuXHRcdGxldCBwb3NpdGlvbiA9IHRoaXMuYXBwbGllZFBvc2UucG9zaXRpb247XG5cdFx0bGV0IHNwYWNlcyA9IHRoaXMuc3BhY2VzLCBvdXQgPSBVdGlscy5zZXRBcnJheVNpemUodGhpcy5wb3NpdGlvbnMsIHNwYWNlc0NvdW50ICogMyArIDIpLCB3b3JsZDogQXJyYXk8bnVtYmVyPiA9IHRoaXMud29ybGQ7XG5cdFx0Y29uc3QgY2xvc2VkID0gcGF0aC5jbG9zZWQ7XG5cdFx0bGV0IHZlcnRpY2VzTGVuZ3RoID0gcGF0aC53b3JsZFZlcnRpY2VzTGVuZ3RoLCBjdXJ2ZUNvdW50ID0gdmVydGljZXNMZW5ndGggLyA2LCBwcmV2Q3VydmUgPSBQYXRoQ29uc3RyYWludC5OT05FO1xuXG5cdFx0aWYgKCFwYXRoLmNvbnN0YW50U3BlZWQpIHtcblx0XHRcdGNvbnN0IGxlbmd0aHMgPSBwYXRoLmxlbmd0aHM7XG5cdFx0XHRjdXJ2ZUNvdW50IC09IGNsb3NlZCA/IDEgOiAyO1xuXHRcdFx0Y29uc3QgcGF0aExlbmd0aCA9IGxlbmd0aHNbY3VydmVDb3VudF07XG5cdFx0XHRpZiAodGhpcy5kYXRhLnBvc2l0aW9uTW9kZSA9PT0gUG9zaXRpb25Nb2RlLlBlcmNlbnQpIHBvc2l0aW9uICo9IHBhdGhMZW5ndGg7XG5cblx0XHRcdGxldCBtdWx0aXBsaWVyOiBudW1iZXI7XG5cdFx0XHRzd2l0Y2ggKHRoaXMuZGF0YS5zcGFjaW5nTW9kZSkge1xuXHRcdFx0XHRjYXNlIFNwYWNpbmdNb2RlLlBlcmNlbnQ6IG11bHRpcGxpZXIgPSBwYXRoTGVuZ3RoOyBicmVhaztcblx0XHRcdFx0Y2FzZSBTcGFjaW5nTW9kZS5Qcm9wb3J0aW9uYWw6IG11bHRpcGxpZXIgPSBwYXRoTGVuZ3RoIC8gc3BhY2VzQ291bnQ7IGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OiBtdWx0aXBsaWVyID0gMTtcblx0XHRcdH1cblxuXHRcdFx0d29ybGQgPSBVdGlscy5zZXRBcnJheVNpemUodGhpcy53b3JsZCwgOCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMCwgbyA9IDAsIGN1cnZlID0gMDsgaSA8IHNwYWNlc0NvdW50OyBpKyssIG8gKz0gMykge1xuXHRcdFx0XHRjb25zdCBzcGFjZSA9IHNwYWNlc1tpXSAqIG11bHRpcGxpZXI7XG5cdFx0XHRcdHBvc2l0aW9uICs9IHNwYWNlO1xuXHRcdFx0XHRsZXQgcCA9IHBvc2l0aW9uO1xuXG5cdFx0XHRcdGlmIChjbG9zZWQpIHtcblx0XHRcdFx0XHRwICU9IHBhdGhMZW5ndGg7XG5cdFx0XHRcdFx0aWYgKHAgPCAwKSBwICs9IHBhdGhMZW5ndGg7XG5cdFx0XHRcdFx0Y3VydmUgPSAwO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHAgPCAwKSB7XG5cdFx0XHRcdFx0aWYgKHByZXZDdXJ2ZSAhPT0gUGF0aENvbnN0cmFpbnQuQkVGT1JFKSB7XG5cdFx0XHRcdFx0XHRwcmV2Q3VydmUgPSBQYXRoQ29uc3RyYWludC5CRUZPUkU7XG5cdFx0XHRcdFx0XHRwYXRoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNrZWxldG9uLCBzbG90LCAyLCA0LCB3b3JsZCwgMCwgMik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuYWRkQmVmb3JlUG9zaXRpb24ocCwgd29ybGQsIDAsIG91dCwgbyk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocCA+IHBhdGhMZW5ndGgpIHtcblx0XHRcdFx0XHRpZiAocHJldkN1cnZlICE9PSBQYXRoQ29uc3RyYWludC5BRlRFUikge1xuXHRcdFx0XHRcdFx0cHJldkN1cnZlID0gUGF0aENvbnN0cmFpbnQuQUZURVI7XG5cdFx0XHRcdFx0XHRwYXRoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNrZWxldG9uLCBzbG90LCB2ZXJ0aWNlc0xlbmd0aCAtIDYsIDQsIHdvcmxkLCAwLCAyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5hZGRBZnRlclBvc2l0aW9uKHAgLSBwYXRoTGVuZ3RoLCB3b3JsZCwgMCwgb3V0LCBvKTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIERldGVybWluZSBjdXJ2ZSBjb250YWluaW5nIHBvc2l0aW9uLlxuXHRcdFx0XHRmb3IgKDsgOyBjdXJ2ZSsrKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGVuZ3RoID0gbGVuZ3Roc1tjdXJ2ZV07XG5cdFx0XHRcdFx0aWYgKHAgPiBsZW5ndGgpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGlmIChjdXJ2ZSA9PT0gMClcblx0XHRcdFx0XHRcdHAgLz0gbGVuZ3RoO1xuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgcHJldiA9IGxlbmd0aHNbY3VydmUgLSAxXTtcblx0XHRcdFx0XHRcdHAgPSAocCAtIHByZXYpIC8gKGxlbmd0aCAtIHByZXYpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY3VydmUgIT09IHByZXZDdXJ2ZSkge1xuXHRcdFx0XHRcdHByZXZDdXJ2ZSA9IGN1cnZlO1xuXHRcdFx0XHRcdGlmIChjbG9zZWQgJiYgY3VydmUgPT09IGN1cnZlQ291bnQpIHtcblx0XHRcdFx0XHRcdHBhdGguY29tcHV0ZVdvcmxkVmVydGljZXMoc2tlbGV0b24sIHNsb3QsIHZlcnRpY2VzTGVuZ3RoIC0gNCwgNCwgd29ybGQsIDAsIDIpO1xuXHRcdFx0XHRcdFx0cGF0aC5jb21wdXRlV29ybGRWZXJ0aWNlcyhza2VsZXRvbiwgc2xvdCwgMCwgNCwgd29ybGQsIDQsIDIpO1xuXHRcdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdFx0cGF0aC5jb21wdXRlV29ybGRWZXJ0aWNlcyhza2VsZXRvbiwgc2xvdCwgY3VydmUgKiA2ICsgMiwgOCwgd29ybGQsIDAsIDIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuYWRkQ3VydmVQb3NpdGlvbihwLCB3b3JsZFswXSwgd29ybGRbMV0sIHdvcmxkWzJdLCB3b3JsZFszXSwgd29ybGRbNF0sIHdvcmxkWzVdLCB3b3JsZFs2XSwgd29ybGRbN10sIG91dCwgbyxcblx0XHRcdFx0XHR0YW5nZW50cyB8fCAoaSA+IDAgJiYgc3BhY2UgPT09IDApKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvdXQ7XG5cdFx0fVxuXG5cdFx0Ly8gV29ybGQgdmVydGljZXMuXG5cdFx0aWYgKGNsb3NlZCkge1xuXHRcdFx0dmVydGljZXNMZW5ndGggKz0gMjtcblx0XHRcdHdvcmxkID0gVXRpbHMuc2V0QXJyYXlTaXplKHRoaXMud29ybGQsIHZlcnRpY2VzTGVuZ3RoKTtcblx0XHRcdHBhdGguY29tcHV0ZVdvcmxkVmVydGljZXMoc2tlbGV0b24sIHNsb3QsIDIsIHZlcnRpY2VzTGVuZ3RoIC0gNCwgd29ybGQsIDAsIDIpO1xuXHRcdFx0cGF0aC5jb21wdXRlV29ybGRWZXJ0aWNlcyhza2VsZXRvbiwgc2xvdCwgMCwgMiwgd29ybGQsIHZlcnRpY2VzTGVuZ3RoIC0gNCwgMik7XG5cdFx0XHR3b3JsZFt2ZXJ0aWNlc0xlbmd0aCAtIDJdID0gd29ybGRbMF07XG5cdFx0XHR3b3JsZFt2ZXJ0aWNlc0xlbmd0aCAtIDFdID0gd29ybGRbMV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1cnZlQ291bnQtLTtcblx0XHRcdHZlcnRpY2VzTGVuZ3RoIC09IDQ7XG5cdFx0XHR3b3JsZCA9IFV0aWxzLnNldEFycmF5U2l6ZSh0aGlzLndvcmxkLCB2ZXJ0aWNlc0xlbmd0aCk7XG5cdFx0XHRwYXRoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNrZWxldG9uLCBzbG90LCAyLCB2ZXJ0aWNlc0xlbmd0aCwgd29ybGQsIDAsIDIpO1xuXHRcdH1cblxuXHRcdC8vIEN1cnZlIGxlbmd0aHMuXG5cdFx0Y29uc3QgY3VydmVzID0gVXRpbHMuc2V0QXJyYXlTaXplKHRoaXMuY3VydmVzLCBjdXJ2ZUNvdW50KTtcblx0XHRsZXQgcGF0aExlbmd0aCA9IDA7XG5cdFx0bGV0IHgxID0gd29ybGRbMF0sIHkxID0gd29ybGRbMV0sIGN4MSA9IDAsIGN5MSA9IDAsIGN4MiA9IDAsIGN5MiA9IDAsIHgyID0gMCwgeTIgPSAwO1xuXHRcdGxldCB0bXB4ID0gMCwgdG1weSA9IDAsIGRkZGZ4ID0gMCwgZGRkZnkgPSAwLCBkZGZ4ID0gMCwgZGRmeSA9IDAsIGRmeCA9IDAsIGRmeSA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIHcgPSAyOyBpIDwgY3VydmVDb3VudDsgaSsrLCB3ICs9IDYpIHtcblx0XHRcdGN4MSA9IHdvcmxkW3ddO1xuXHRcdFx0Y3kxID0gd29ybGRbdyArIDFdO1xuXHRcdFx0Y3gyID0gd29ybGRbdyArIDJdO1xuXHRcdFx0Y3kyID0gd29ybGRbdyArIDNdO1xuXHRcdFx0eDIgPSB3b3JsZFt3ICsgNF07XG5cdFx0XHR5MiA9IHdvcmxkW3cgKyA1XTtcblx0XHRcdHRtcHggPSAoeDEgLSBjeDEgKiAyICsgY3gyKSAqIDAuMTg3NTtcblx0XHRcdHRtcHkgPSAoeTEgLSBjeTEgKiAyICsgY3kyKSAqIDAuMTg3NTtcblx0XHRcdGRkZGZ4ID0gKChjeDEgLSBjeDIpICogMyAtIHgxICsgeDIpICogMC4wOTM3NTtcblx0XHRcdGRkZGZ5ID0gKChjeTEgLSBjeTIpICogMyAtIHkxICsgeTIpICogMC4wOTM3NTtcblx0XHRcdGRkZnggPSB0bXB4ICogMiArIGRkZGZ4O1xuXHRcdFx0ZGRmeSA9IHRtcHkgKiAyICsgZGRkZnk7XG5cdFx0XHRkZnggPSAoY3gxIC0geDEpICogMC43NSArIHRtcHggKyBkZGRmeCAqIDAuMTY2NjY2Njc7XG5cdFx0XHRkZnkgPSAoY3kxIC0geTEpICogMC43NSArIHRtcHkgKyBkZGRmeSAqIDAuMTY2NjY2Njc7XG5cdFx0XHRwYXRoTGVuZ3RoICs9IE1hdGguc3FydChkZnggKiBkZnggKyBkZnkgKiBkZnkpO1xuXHRcdFx0ZGZ4ICs9IGRkZng7XG5cdFx0XHRkZnkgKz0gZGRmeTtcblx0XHRcdGRkZnggKz0gZGRkZng7XG5cdFx0XHRkZGZ5ICs9IGRkZGZ5O1xuXHRcdFx0cGF0aExlbmd0aCArPSBNYXRoLnNxcnQoZGZ4ICogZGZ4ICsgZGZ5ICogZGZ5KTtcblx0XHRcdGRmeCArPSBkZGZ4O1xuXHRcdFx0ZGZ5ICs9IGRkZnk7XG5cdFx0XHRwYXRoTGVuZ3RoICs9IE1hdGguc3FydChkZnggKiBkZnggKyBkZnkgKiBkZnkpO1xuXHRcdFx0ZGZ4ICs9IGRkZnggKyBkZGRmeDtcblx0XHRcdGRmeSArPSBkZGZ5ICsgZGRkZnk7XG5cdFx0XHRwYXRoTGVuZ3RoICs9IE1hdGguc3FydChkZnggKiBkZnggKyBkZnkgKiBkZnkpO1xuXHRcdFx0Y3VydmVzW2ldID0gcGF0aExlbmd0aDtcblx0XHRcdHgxID0geDI7XG5cdFx0XHR5MSA9IHkyO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmRhdGEucG9zaXRpb25Nb2RlID09PSBQb3NpdGlvbk1vZGUuUGVyY2VudCkgcG9zaXRpb24gKj0gcGF0aExlbmd0aDtcblxuXHRcdGxldCBtdWx0aXBsaWVyOiBudW1iZXI7XG5cdFx0c3dpdGNoICh0aGlzLmRhdGEuc3BhY2luZ01vZGUpIHtcblx0XHRcdGNhc2UgU3BhY2luZ01vZGUuUGVyY2VudDogbXVsdGlwbGllciA9IHBhdGhMZW5ndGg7IGJyZWFrO1xuXHRcdFx0Y2FzZSBTcGFjaW5nTW9kZS5Qcm9wb3J0aW9uYWw6IG11bHRpcGxpZXIgPSBwYXRoTGVuZ3RoIC8gc3BhY2VzQ291bnQ7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogbXVsdGlwbGllciA9IDE7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzO1xuXHRcdGxldCBjdXJ2ZUxlbmd0aCA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG8gPSAwLCBjdXJ2ZSA9IDAsIHNlZ21lbnQgPSAwOyBpIDwgc3BhY2VzQ291bnQ7IGkrKywgbyArPSAzKSB7XG5cdFx0XHRjb25zdCBzcGFjZSA9IHNwYWNlc1tpXSAqIG11bHRpcGxpZXI7XG5cdFx0XHRwb3NpdGlvbiArPSBzcGFjZTtcblx0XHRcdGxldCBwID0gcG9zaXRpb247XG5cblx0XHRcdGlmIChjbG9zZWQpIHtcblx0XHRcdFx0cCAlPSBwYXRoTGVuZ3RoO1xuXHRcdFx0XHRpZiAocCA8IDApIHAgKz0gcGF0aExlbmd0aDtcblx0XHRcdFx0Y3VydmUgPSAwO1xuXHRcdFx0XHRzZWdtZW50ID0gMDtcblx0XHRcdH0gZWxzZSBpZiAocCA8IDApIHtcblx0XHRcdFx0dGhpcy5hZGRCZWZvcmVQb3NpdGlvbihwLCB3b3JsZCwgMCwgb3V0LCBvKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9IGVsc2UgaWYgKHAgPiBwYXRoTGVuZ3RoKSB7XG5cdFx0XHRcdHRoaXMuYWRkQWZ0ZXJQb3NpdGlvbihwIC0gcGF0aExlbmd0aCwgd29ybGQsIHZlcnRpY2VzTGVuZ3RoIC0gNCwgb3V0LCBvKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERldGVybWluZSBjdXJ2ZSBjb250YWluaW5nIHBvc2l0aW9uLlxuXHRcdFx0Zm9yICg7IDsgY3VydmUrKykge1xuXHRcdFx0XHRjb25zdCBsZW5ndGggPSBjdXJ2ZXNbY3VydmVdO1xuXHRcdFx0XHRpZiAocCA+IGxlbmd0aCkgY29udGludWU7XG5cdFx0XHRcdGlmIChjdXJ2ZSA9PT0gMClcblx0XHRcdFx0XHRwIC89IGxlbmd0aDtcblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgcHJldiA9IGN1cnZlc1tjdXJ2ZSAtIDFdO1xuXHRcdFx0XHRcdHAgPSAocCAtIHByZXYpIC8gKGxlbmd0aCAtIHByZXYpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDdXJ2ZSBzZWdtZW50IGxlbmd0aHMuXG5cdFx0XHRpZiAoY3VydmUgIT09IHByZXZDdXJ2ZSkge1xuXHRcdFx0XHRwcmV2Q3VydmUgPSBjdXJ2ZTtcblx0XHRcdFx0bGV0IGlpID0gY3VydmUgKiA2O1xuXHRcdFx0XHR4MSA9IHdvcmxkW2lpXTtcblx0XHRcdFx0eTEgPSB3b3JsZFtpaSArIDFdO1xuXHRcdFx0XHRjeDEgPSB3b3JsZFtpaSArIDJdO1xuXHRcdFx0XHRjeTEgPSB3b3JsZFtpaSArIDNdO1xuXHRcdFx0XHRjeDIgPSB3b3JsZFtpaSArIDRdO1xuXHRcdFx0XHRjeTIgPSB3b3JsZFtpaSArIDVdO1xuXHRcdFx0XHR4MiA9IHdvcmxkW2lpICsgNl07XG5cdFx0XHRcdHkyID0gd29ybGRbaWkgKyA3XTtcblx0XHRcdFx0dG1weCA9ICh4MSAtIGN4MSAqIDIgKyBjeDIpICogMC4wMztcblx0XHRcdFx0dG1weSA9ICh5MSAtIGN5MSAqIDIgKyBjeTIpICogMC4wMztcblx0XHRcdFx0ZGRkZnggPSAoKGN4MSAtIGN4MikgKiAzIC0geDEgKyB4MikgKiAwLjAwNjtcblx0XHRcdFx0ZGRkZnkgPSAoKGN5MSAtIGN5MikgKiAzIC0geTEgKyB5MikgKiAwLjAwNjtcblx0XHRcdFx0ZGRmeCA9IHRtcHggKiAyICsgZGRkZng7XG5cdFx0XHRcdGRkZnkgPSB0bXB5ICogMiArIGRkZGZ5O1xuXHRcdFx0XHRkZnggPSAoY3gxIC0geDEpICogMC4zICsgdG1weCArIGRkZGZ4ICogMC4xNjY2NjY2Nztcblx0XHRcdFx0ZGZ5ID0gKGN5MSAtIHkxKSAqIDAuMyArIHRtcHkgKyBkZGRmeSAqIDAuMTY2NjY2Njc7XG5cdFx0XHRcdGN1cnZlTGVuZ3RoID0gTWF0aC5zcXJ0KGRmeCAqIGRmeCArIGRmeSAqIGRmeSk7XG5cdFx0XHRcdHNlZ21lbnRzWzBdID0gY3VydmVMZW5ndGg7XG5cdFx0XHRcdGZvciAoaWkgPSAxOyBpaSA8IDg7IGlpKyspIHtcblx0XHRcdFx0XHRkZnggKz0gZGRmeDtcblx0XHRcdFx0XHRkZnkgKz0gZGRmeTtcblx0XHRcdFx0XHRkZGZ4ICs9IGRkZGZ4O1xuXHRcdFx0XHRcdGRkZnkgKz0gZGRkZnk7XG5cdFx0XHRcdFx0Y3VydmVMZW5ndGggKz0gTWF0aC5zcXJ0KGRmeCAqIGRmeCArIGRmeSAqIGRmeSk7XG5cdFx0XHRcdFx0c2VnbWVudHNbaWldID0gY3VydmVMZW5ndGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGZ4ICs9IGRkZng7XG5cdFx0XHRcdGRmeSArPSBkZGZ5O1xuXHRcdFx0XHRjdXJ2ZUxlbmd0aCArPSBNYXRoLnNxcnQoZGZ4ICogZGZ4ICsgZGZ5ICogZGZ5KTtcblx0XHRcdFx0c2VnbWVudHNbOF0gPSBjdXJ2ZUxlbmd0aDtcblx0XHRcdFx0ZGZ4ICs9IGRkZnggKyBkZGRmeDtcblx0XHRcdFx0ZGZ5ICs9IGRkZnkgKyBkZGRmeTtcblx0XHRcdFx0Y3VydmVMZW5ndGggKz0gTWF0aC5zcXJ0KGRmeCAqIGRmeCArIGRmeSAqIGRmeSk7XG5cdFx0XHRcdHNlZ21lbnRzWzldID0gY3VydmVMZW5ndGg7XG5cdFx0XHRcdHNlZ21lbnQgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZWlnaHQgYnkgc2VnbWVudCBsZW5ndGguXG5cdFx0XHRwICo9IGN1cnZlTGVuZ3RoO1xuXHRcdFx0Zm9yICg7IDsgc2VnbWVudCsrKSB7XG5cdFx0XHRcdGNvbnN0IGxlbmd0aCA9IHNlZ21lbnRzW3NlZ21lbnRdO1xuXHRcdFx0XHRpZiAocCA+IGxlbmd0aCkgY29udGludWU7XG5cdFx0XHRcdGlmIChzZWdtZW50ID09PSAwKVxuXHRcdFx0XHRcdHAgLz0gbGVuZ3RoO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBwcmV2ID0gc2VnbWVudHNbc2VnbWVudCAtIDFdO1xuXHRcdFx0XHRcdHAgPSBzZWdtZW50ICsgKHAgLSBwcmV2KSAvIChsZW5ndGggLSBwcmV2KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHRoaXMuYWRkQ3VydmVQb3NpdGlvbihwICogMC4xLCB4MSwgeTEsIGN4MSwgY3kxLCBjeDIsIGN5MiwgeDIsIHkyLCBvdXQsIG8sIHRhbmdlbnRzIHx8IChpID4gMCAmJiBzcGFjZSA9PT0gMCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gb3V0O1xuXHR9XG5cblx0YWRkQmVmb3JlUG9zaXRpb24gKHA6IG51bWJlciwgdGVtcDogQXJyYXk8bnVtYmVyPiwgaTogbnVtYmVyLCBvdXQ6IEFycmF5PG51bWJlcj4sIG86IG51bWJlcikge1xuXHRcdGNvbnN0IHgxID0gdGVtcFtpXSwgeTEgPSB0ZW1wW2kgKyAxXSwgZHggPSB0ZW1wW2kgKyAyXSAtIHgxLCBkeSA9IHRlbXBbaSArIDNdIC0geTEsIHIgPSBNYXRoLmF0YW4yKGR5LCBkeCk7XG5cdFx0b3V0W29dID0geDEgKyBwICogTWF0aC5jb3Mocik7XG5cdFx0b3V0W28gKyAxXSA9IHkxICsgcCAqIE1hdGguc2luKHIpO1xuXHRcdG91dFtvICsgMl0gPSByO1xuXHR9XG5cblx0YWRkQWZ0ZXJQb3NpdGlvbiAocDogbnVtYmVyLCB0ZW1wOiBBcnJheTxudW1iZXI+LCBpOiBudW1iZXIsIG91dDogQXJyYXk8bnVtYmVyPiwgbzogbnVtYmVyKSB7XG5cdFx0Y29uc3QgeDEgPSB0ZW1wW2kgKyAyXSwgeTEgPSB0ZW1wW2kgKyAzXSwgZHggPSB4MSAtIHRlbXBbaV0sIGR5ID0geTEgLSB0ZW1wW2kgKyAxXSwgciA9IE1hdGguYXRhbjIoZHksIGR4KTtcblx0XHRvdXRbb10gPSB4MSArIHAgKiBNYXRoLmNvcyhyKTtcblx0XHRvdXRbbyArIDFdID0geTEgKyBwICogTWF0aC5zaW4ocik7XG5cdFx0b3V0W28gKyAyXSA9IHI7XG5cdH1cblxuXHRhZGRDdXJ2ZVBvc2l0aW9uIChwOiBudW1iZXIsIHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIGN4MTogbnVtYmVyLCBjeTE6IG51bWJlciwgY3gyOiBudW1iZXIsIGN5MjogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLFxuXHRcdG91dDogQXJyYXk8bnVtYmVyPiwgbzogbnVtYmVyLCB0YW5nZW50czogYm9vbGVhbikge1xuXHRcdGlmIChwID09PSAwIHx8IE51bWJlci5pc05hTihwKSkge1xuXHRcdFx0b3V0W29dID0geDE7XG5cdFx0XHRvdXRbbyArIDFdID0geTE7XG5cdFx0XHRvdXRbbyArIDJdID0gTWF0aC5hdGFuMihjeTEgLSB5MSwgY3gxIC0geDEpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB0dCA9IHAgKiBwLCB0dHQgPSB0dCAqIHAsIHUgPSAxIC0gcCwgdXUgPSB1ICogdSwgdXV1ID0gdXUgKiB1O1xuXHRcdGNvbnN0IHV0ID0gdSAqIHAsIHV0MyA9IHV0ICogMywgdXV0MyA9IHUgKiB1dDMsIHV0dDMgPSB1dDMgKiBwO1xuXHRcdGNvbnN0IHggPSB4MSAqIHV1dSArIGN4MSAqIHV1dDMgKyBjeDIgKiB1dHQzICsgeDIgKiB0dHQsIHkgPSB5MSAqIHV1dSArIGN5MSAqIHV1dDMgKyBjeTIgKiB1dHQzICsgeTIgKiB0dHQ7XG5cdFx0b3V0W29dID0geDtcblx0XHRvdXRbbyArIDFdID0geTtcblx0XHRpZiAodGFuZ2VudHMpIHtcblx0XHRcdGlmIChwIDwgMC4wMDEpXG5cdFx0XHRcdG91dFtvICsgMl0gPSBNYXRoLmF0YW4yKGN5MSAtIHkxLCBjeDEgLSB4MSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdG91dFtvICsgMl0gPSBNYXRoLmF0YW4yKHkgLSAoeTEgKiB1dSArIGN5MSAqIHV0ICogMiArIGN5MiAqIHR0KSwgeCAtICh4MSAqIHV1ICsgY3gxICogdXQgKiAyICsgY3gyICogdHQpKTtcblx0XHR9XG5cdH1cblxuXHRzb3J0IChza2VsZXRvbjogU2tlbGV0b24pIHtcblx0XHRjb25zdCBzbG90SW5kZXggPSB0aGlzLnNsb3QuZGF0YS5pbmRleDtcblx0XHRjb25zdCBzbG90Qm9uZSA9IHRoaXMuc2xvdC5ib25lO1xuXHRcdGlmIChza2VsZXRvbi5za2luICE9IG51bGwpIHRoaXMuc29ydFBhdGhTbG90KHNrZWxldG9uLCBza2VsZXRvbi5za2luLCBzbG90SW5kZXgsIHNsb3RCb25lKTtcblx0XHRpZiAoc2tlbGV0b24uZGF0YS5kZWZhdWx0U2tpbiAhPSBudWxsICYmIHNrZWxldG9uLmRhdGEuZGVmYXVsdFNraW4gIT09IHNrZWxldG9uLnNraW4pXG5cdFx0XHR0aGlzLnNvcnRQYXRoU2xvdChza2VsZXRvbiwgc2tlbGV0b24uZGF0YS5kZWZhdWx0U2tpbiwgc2xvdEluZGV4LCBzbG90Qm9uZSk7XG5cdFx0dGhpcy5zb3J0UGF0aChza2VsZXRvbiwgdGhpcy5zbG90LnBvc2UuYXR0YWNobWVudCwgc2xvdEJvbmUpO1xuXHRcdGNvbnN0IGJvbmVzID0gdGhpcy5ib25lcztcblx0XHRjb25zdCBib25lQ291bnQgPSB0aGlzLmJvbmVzLmxlbmd0aDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGJvbmVDb3VudDsgaSsrKSB7XG5cdFx0XHRjb25zdCBib25lID0gYm9uZXNbaV0uYm9uZTtcblx0XHRcdHNrZWxldG9uLnNvcnRCb25lKGJvbmUpO1xuXHRcdFx0c2tlbGV0b24uY29uc3RyYWluZWQoYm9uZSk7XG5cdFx0fVxuXHRcdHNrZWxldG9uLl91cGRhdGVDYWNoZS5wdXNoKHRoaXMpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYm9uZUNvdW50OyBpKyspXG5cdFx0XHRza2VsZXRvbi5zb3J0UmVzZXQoYm9uZXNbaV0uYm9uZS5jaGlsZHJlbik7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBib25lQ291bnQ7IGkrKylcblx0XHRcdGJvbmVzW2ldLmJvbmUuc29ydGVkID0gdHJ1ZTtcblx0fVxuXG5cdHByaXZhdGUgc29ydFBhdGhTbG90IChza2VsZXRvbjogU2tlbGV0b24sIHNraW46IFNraW4sIHNsb3RJbmRleDogbnVtYmVyLCBzbG90Qm9uZTogQm9uZSkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSBza2luLmdldEF0dGFjaG1lbnRzKCk7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBlbnRyaWVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3QgZW50cnkgPSBlbnRyaWVzW2ldO1xuXHRcdFx0aWYgKGVudHJ5LnNsb3RJbmRleCA9PT0gc2xvdEluZGV4KSB0aGlzLnNvcnRQYXRoKHNrZWxldG9uLCBlbnRyeS5hdHRhY2htZW50LCBzbG90Qm9uZSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzb3J0UGF0aCAoc2tlbGV0b246IFNrZWxldG9uLCBhdHRhY2htZW50OiBBdHRhY2htZW50IHwgbnVsbCwgc2xvdEJvbmU6IEJvbmUpIHtcblx0XHRpZiAoIShhdHRhY2htZW50IGluc3RhbmNlb2YgUGF0aEF0dGFjaG1lbnQpKSByZXR1cm47XG5cdFx0Y29uc3QgcGF0aEJvbmVzID0gYXR0YWNobWVudC5ib25lcztcblx0XHRpZiAocGF0aEJvbmVzID09IG51bGwpXG5cdFx0XHRza2VsZXRvbi5zb3J0Qm9uZShzbG90Qm9uZSk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRjb25zdCBib25lcyA9IHNrZWxldG9uLmJvbmVzO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBwYXRoQm9uZXMubGVuZ3RoOyBpIDwgbjspIHtcblx0XHRcdFx0bGV0IG5uID0gcGF0aEJvbmVzW2krK107XG5cdFx0XHRcdG5uICs9IGk7XG5cdFx0XHRcdHdoaWxlIChpIDwgbm4pXG5cdFx0XHRcdFx0c2tlbGV0b24uc29ydEJvbmUoYm9uZXNbcGF0aEJvbmVzW2krK11dKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpc1NvdXJjZUFjdGl2ZSAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2xvdC5ib25lLmFjdGl2ZTtcblx0fVxufVxuIl19