@esotericsoftware/spine-pixi-v8 4.2.63
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.
- package/README.md +3 -0
- package/dist/BatchableSpineSlot.d.ts +58 -0
- package/dist/BatchableSpineSlot.js +103 -0
- package/dist/Spine.d.ts +243 -0
- package/dist/Spine.js +629 -0
- package/dist/SpineDebugRenderer.d.ts +108 -0
- package/dist/SpineDebugRenderer.js +473 -0
- package/dist/SpinePipe.d.ts +45 -0
- package/dist/SpinePipe.js +136 -0
- package/dist/SpineTexture.d.ts +44 -0
- package/dist/SpineTexture.js +116 -0
- package/dist/assets/atlasLoader.d.ts +33 -0
- package/dist/assets/atlasLoader.js +112 -0
- package/dist/assets/skeletonLoader.d.ts +29 -0
- package/dist/assets/skeletonLoader.js +60 -0
- package/dist/darktint/DarkTintBatchGeometry.d.ts +4 -0
- package/dist/darktint/DarkTintBatchGeometry.js +57 -0
- package/dist/darktint/DarkTintBatcher.d.ts +21 -0
- package/dist/darktint/DarkTintBatcher.js +101 -0
- package/dist/darktint/DarkTintShader.d.ts +4 -0
- package/dist/darktint/DarkTintShader.js +32 -0
- package/dist/darktint/darkTintBit.d.ts +22 -0
- package/dist/darktint/darkTintBit.js +49 -0
- package/dist/iife/spine-pixi-v8.js +13425 -0
- package/dist/iife/spine-pixi-v8.js.map +7 -0
- package/dist/iife/spine-pixi-v8.min.js +27 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +42 -0
- package/dist/require-shim.d.ts +33 -0
- package/dist/require-shim.js +39 -0
- package/package.json +39 -0
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
/** ****************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated July 28, 2023. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2023, Esoteric Software LLC
|
|
6
|
+
*
|
|
7
|
+
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
+
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
+
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
+
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
+
*
|
|
12
|
+
* Otherwise, it is permitted to integrate the Spine Runtimes into software or
|
|
13
|
+
* otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
+
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
+
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
+
* include this license and copyright notice.
|
|
17
|
+
*
|
|
18
|
+
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
+
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE
|
|
27
|
+
* SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*****************************************************************************/
|
|
29
|
+
import { Container, Graphics, Text } from 'pixi.js';
|
|
30
|
+
import { ClippingAttachment, MeshAttachment, PathAttachment, RegionAttachment, SkeletonBounds } from '@esotericsoftware/spine-core';
|
|
31
|
+
/**
|
|
32
|
+
* This is a debug renderer that uses PixiJS Graphics under the hood.
|
|
33
|
+
* @public
|
|
34
|
+
*/
|
|
35
|
+
export class SpineDebugRenderer {
|
|
36
|
+
registeredSpines = new Map();
|
|
37
|
+
drawMeshHull = true;
|
|
38
|
+
drawMeshTriangles = true;
|
|
39
|
+
drawBones = true;
|
|
40
|
+
drawPaths = true;
|
|
41
|
+
drawBoundingBoxes = true;
|
|
42
|
+
drawClipping = true;
|
|
43
|
+
drawRegionAttachments = true;
|
|
44
|
+
drawEvents = true;
|
|
45
|
+
lineWidth = 1;
|
|
46
|
+
regionAttachmentsColor = 0x0078ff;
|
|
47
|
+
meshHullColor = 0x0078ff;
|
|
48
|
+
meshTrianglesColor = 0xffcc00;
|
|
49
|
+
clippingPolygonColor = 0xff00ff;
|
|
50
|
+
boundingBoxesRectColor = 0x00ff00;
|
|
51
|
+
boundingBoxesPolygonColor = 0x00ff00;
|
|
52
|
+
boundingBoxesCircleColor = 0x00ff00;
|
|
53
|
+
pathsCurveColor = 0xff0000;
|
|
54
|
+
pathsLineColor = 0xff00ff;
|
|
55
|
+
skeletonXYColor = 0xff0000;
|
|
56
|
+
bonesColor = 0x00eecc;
|
|
57
|
+
eventFontSize = 24;
|
|
58
|
+
eventFontColor = 0x0;
|
|
59
|
+
/**
|
|
60
|
+
* The debug is attached by force to each spine object.
|
|
61
|
+
* So we need to create it inside the spine when we get the first update
|
|
62
|
+
*/
|
|
63
|
+
registerSpine(spine) {
|
|
64
|
+
if (this.registeredSpines.has(spine)) {
|
|
65
|
+
console.warn('SpineDebugRenderer.registerSpine() - this spine is already registered!', spine);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const debugDisplayObjects = {
|
|
69
|
+
parentDebugContainer: new Container(),
|
|
70
|
+
bones: new Container(),
|
|
71
|
+
skeletonXY: new Graphics(),
|
|
72
|
+
regionAttachmentsShape: new Graphics(),
|
|
73
|
+
meshTrianglesLine: new Graphics(),
|
|
74
|
+
meshHullLine: new Graphics(),
|
|
75
|
+
clippingPolygon: new Graphics(),
|
|
76
|
+
boundingBoxesRect: new Graphics(),
|
|
77
|
+
boundingBoxesCircle: new Graphics(),
|
|
78
|
+
boundingBoxesPolygon: new Graphics(),
|
|
79
|
+
pathsCurve: new Graphics(),
|
|
80
|
+
pathsLine: new Graphics(),
|
|
81
|
+
eventText: new Container(),
|
|
82
|
+
eventCallback: {
|
|
83
|
+
event: (_, event) => {
|
|
84
|
+
if (this.drawEvents) {
|
|
85
|
+
const scale = Math.abs(spine.scale.x || spine.scale.y || 1);
|
|
86
|
+
const text = new Text({
|
|
87
|
+
text: event.data.name,
|
|
88
|
+
style: {
|
|
89
|
+
fontSize: this.eventFontSize / scale,
|
|
90
|
+
fill: this.eventFontColor,
|
|
91
|
+
fontFamily: 'monospace'
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
text.scale.x = Math.sign(spine.scale.x);
|
|
95
|
+
text.anchor.set(0.5);
|
|
96
|
+
debugDisplayObjects.eventText.addChild(text);
|
|
97
|
+
setTimeout(() => {
|
|
98
|
+
if (!text.destroyed) {
|
|
99
|
+
text.destroy();
|
|
100
|
+
}
|
|
101
|
+
}, 250);
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.bones);
|
|
107
|
+
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.skeletonXY);
|
|
108
|
+
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.regionAttachmentsShape);
|
|
109
|
+
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.meshTrianglesLine);
|
|
110
|
+
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.meshHullLine);
|
|
111
|
+
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.clippingPolygon);
|
|
112
|
+
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.boundingBoxesRect);
|
|
113
|
+
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.boundingBoxesCircle);
|
|
114
|
+
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.boundingBoxesPolygon);
|
|
115
|
+
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.pathsCurve);
|
|
116
|
+
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.pathsLine);
|
|
117
|
+
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.eventText);
|
|
118
|
+
debugDisplayObjects.parentDebugContainer.zIndex = 9999999;
|
|
119
|
+
// Disable screen reader and mouse input on debug objects.
|
|
120
|
+
debugDisplayObjects.parentDebugContainer.accessibleChildren = false;
|
|
121
|
+
debugDisplayObjects.parentDebugContainer.eventMode = 'none';
|
|
122
|
+
debugDisplayObjects.parentDebugContainer.interactiveChildren = false;
|
|
123
|
+
spine.addChild(debugDisplayObjects.parentDebugContainer);
|
|
124
|
+
spine.state.addListener(debugDisplayObjects.eventCallback);
|
|
125
|
+
this.registeredSpines.set(spine, debugDisplayObjects);
|
|
126
|
+
}
|
|
127
|
+
renderDebug(spine) {
|
|
128
|
+
if (!this.registeredSpines.has(spine)) {
|
|
129
|
+
// This should never happen. Spines are registered when you assign spine.debug
|
|
130
|
+
this.registerSpine(spine);
|
|
131
|
+
}
|
|
132
|
+
const debugDisplayObjects = this.registeredSpines.get(spine);
|
|
133
|
+
if (!debugDisplayObjects) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
spine.addChild(debugDisplayObjects.parentDebugContainer);
|
|
137
|
+
debugDisplayObjects.skeletonXY.clear();
|
|
138
|
+
debugDisplayObjects.regionAttachmentsShape.clear();
|
|
139
|
+
debugDisplayObjects.meshTrianglesLine.clear();
|
|
140
|
+
debugDisplayObjects.meshHullLine.clear();
|
|
141
|
+
debugDisplayObjects.clippingPolygon.clear();
|
|
142
|
+
debugDisplayObjects.boundingBoxesRect.clear();
|
|
143
|
+
debugDisplayObjects.boundingBoxesCircle.clear();
|
|
144
|
+
debugDisplayObjects.boundingBoxesPolygon.clear();
|
|
145
|
+
debugDisplayObjects.pathsCurve.clear();
|
|
146
|
+
debugDisplayObjects.pathsLine.clear();
|
|
147
|
+
for (let len = debugDisplayObjects.bones.children.length; len > 0; len--) {
|
|
148
|
+
debugDisplayObjects.bones.children[len - 1].destroy({ children: true, texture: true, textureSource: true });
|
|
149
|
+
}
|
|
150
|
+
const scale = Math.abs(spine.scale.x || spine.scale.y || 1);
|
|
151
|
+
const lineWidth = this.lineWidth / scale;
|
|
152
|
+
if (this.drawBones) {
|
|
153
|
+
this.drawBonesFunc(spine, debugDisplayObjects, lineWidth, scale);
|
|
154
|
+
}
|
|
155
|
+
if (this.drawPaths) {
|
|
156
|
+
this.drawPathsFunc(spine, debugDisplayObjects, lineWidth);
|
|
157
|
+
}
|
|
158
|
+
if (this.drawBoundingBoxes) {
|
|
159
|
+
this.drawBoundingBoxesFunc(spine, debugDisplayObjects, lineWidth);
|
|
160
|
+
}
|
|
161
|
+
if (this.drawClipping) {
|
|
162
|
+
this.drawClippingFunc(spine, debugDisplayObjects, lineWidth);
|
|
163
|
+
}
|
|
164
|
+
if (this.drawMeshHull || this.drawMeshTriangles) {
|
|
165
|
+
this.drawMeshHullAndMeshTriangles(spine, debugDisplayObjects, lineWidth);
|
|
166
|
+
}
|
|
167
|
+
if (this.drawRegionAttachments) {
|
|
168
|
+
this.drawRegionAttachmentsFunc(spine, debugDisplayObjects, lineWidth);
|
|
169
|
+
}
|
|
170
|
+
if (this.drawEvents) {
|
|
171
|
+
for (const child of debugDisplayObjects.eventText.children) {
|
|
172
|
+
child.alpha -= 0.05;
|
|
173
|
+
child.y -= 2;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
drawBonesFunc(spine, debugDisplayObjects, lineWidth, scale) {
|
|
178
|
+
const skeleton = spine.skeleton;
|
|
179
|
+
const skeletonX = skeleton.x;
|
|
180
|
+
const skeletonY = skeleton.y;
|
|
181
|
+
const bones = skeleton.bones;
|
|
182
|
+
debugDisplayObjects.skeletonXY.strokeStyle = { width: lineWidth, color: this.skeletonXYColor };
|
|
183
|
+
for (let i = 0, len = bones.length; i < len; i++) {
|
|
184
|
+
const bone = bones[i];
|
|
185
|
+
const boneLen = bone.data.length;
|
|
186
|
+
const starX = skeletonX + bone.worldX;
|
|
187
|
+
const starY = skeletonY + bone.worldY;
|
|
188
|
+
const endX = skeletonX + (boneLen * bone.a) + bone.worldX;
|
|
189
|
+
const endY = skeletonY + (boneLen * bone.b) + bone.worldY;
|
|
190
|
+
if (bone.data.name === 'root' || bone.data.parent === null) {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const w = Math.abs(starX - endX);
|
|
194
|
+
const h = Math.abs(starY - endY);
|
|
195
|
+
// a = w, // side length a
|
|
196
|
+
const a2 = Math.pow(w, 2); // square root of side length a
|
|
197
|
+
const b = h; // side length b
|
|
198
|
+
const b2 = Math.pow(h, 2); // square root of side length b
|
|
199
|
+
const c = Math.sqrt(a2 + b2); // side length c
|
|
200
|
+
const c2 = Math.pow(c, 2); // square root of side length c
|
|
201
|
+
const rad = Math.PI / 180;
|
|
202
|
+
// A = Math.acos([a2 + c2 - b2] / [2 * a * c]) || 0, // Angle A
|
|
203
|
+
// C = Math.acos([a2 + b2 - c2] / [2 * a * b]) || 0, // C angle
|
|
204
|
+
const B = Math.acos((c2 + b2 - a2) / (2 * b * c)) || 0; // angle of corner B
|
|
205
|
+
if (c === 0) {
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
const gp = new Graphics();
|
|
209
|
+
debugDisplayObjects.bones.addChild(gp);
|
|
210
|
+
// draw bone
|
|
211
|
+
const refRation = c / 50 / scale;
|
|
212
|
+
gp.context
|
|
213
|
+
.poly([0, 0, 0 - refRation, c - (refRation * 3), 0, c - refRation, 0 + refRation, c - (refRation * 3)])
|
|
214
|
+
.fill(this.bonesColor);
|
|
215
|
+
gp.x = starX;
|
|
216
|
+
gp.y = starY;
|
|
217
|
+
gp.pivot.y = c;
|
|
218
|
+
// Calculate bone rotation angle
|
|
219
|
+
let rotation = 0;
|
|
220
|
+
if (starX < endX && starY < endY) {
|
|
221
|
+
// bottom right
|
|
222
|
+
rotation = -B + (180 * rad);
|
|
223
|
+
}
|
|
224
|
+
else if (starX > endX && starY < endY) {
|
|
225
|
+
// bottom left
|
|
226
|
+
rotation = (180 * rad) + B;
|
|
227
|
+
}
|
|
228
|
+
else if (starX > endX && starY > endY) {
|
|
229
|
+
// top left
|
|
230
|
+
rotation = -B;
|
|
231
|
+
}
|
|
232
|
+
else if (starX < endX && starY > endY) {
|
|
233
|
+
// bottom left
|
|
234
|
+
rotation = B;
|
|
235
|
+
}
|
|
236
|
+
else if (starY === endY && starX < endX) {
|
|
237
|
+
// To the right
|
|
238
|
+
rotation = 90 * rad;
|
|
239
|
+
}
|
|
240
|
+
else if (starY === endY && starX > endX) {
|
|
241
|
+
// go left
|
|
242
|
+
rotation = -90 * rad;
|
|
243
|
+
}
|
|
244
|
+
else if (starX === endX && starY < endY) {
|
|
245
|
+
// down
|
|
246
|
+
rotation = 180 * rad;
|
|
247
|
+
}
|
|
248
|
+
else if (starX === endX && starY > endY) {
|
|
249
|
+
// up
|
|
250
|
+
rotation = 0;
|
|
251
|
+
}
|
|
252
|
+
gp.rotation = rotation;
|
|
253
|
+
// Draw the starting rotation point of the bone
|
|
254
|
+
gp.circle(0, c, refRation * 1.2)
|
|
255
|
+
.fill({ color: 0x000000, alpha: 0.6 })
|
|
256
|
+
.stroke({ width: lineWidth + refRation / 2.4, color: this.bonesColor });
|
|
257
|
+
}
|
|
258
|
+
// Draw the skeleton starting point "X" form
|
|
259
|
+
const startDotSize = lineWidth * 3;
|
|
260
|
+
debugDisplayObjects.skeletonXY.context
|
|
261
|
+
.moveTo(skeletonX - startDotSize, skeletonY - startDotSize)
|
|
262
|
+
.lineTo(skeletonX + startDotSize, skeletonY + startDotSize)
|
|
263
|
+
.moveTo(skeletonX + startDotSize, skeletonY - startDotSize)
|
|
264
|
+
.lineTo(skeletonX - startDotSize, skeletonY + startDotSize)
|
|
265
|
+
.stroke();
|
|
266
|
+
}
|
|
267
|
+
drawRegionAttachmentsFunc(spine, debugDisplayObjects, lineWidth) {
|
|
268
|
+
const skeleton = spine.skeleton;
|
|
269
|
+
const slots = skeleton.slots;
|
|
270
|
+
for (let i = 0, len = slots.length; i < len; i++) {
|
|
271
|
+
const slot = slots[i];
|
|
272
|
+
const attachment = slot.getAttachment();
|
|
273
|
+
if (attachment === null || !(attachment instanceof RegionAttachment)) {
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
const regionAttachment = attachment;
|
|
277
|
+
const vertices = new Float32Array(8);
|
|
278
|
+
regionAttachment.computeWorldVertices(slot, vertices, 0, 2);
|
|
279
|
+
debugDisplayObjects.regionAttachmentsShape.poly(Array.from(vertices.slice(0, 8)));
|
|
280
|
+
}
|
|
281
|
+
debugDisplayObjects.regionAttachmentsShape.stroke({
|
|
282
|
+
color: this.regionAttachmentsColor,
|
|
283
|
+
width: lineWidth
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
drawMeshHullAndMeshTriangles(spine, debugDisplayObjects, lineWidth) {
|
|
287
|
+
const skeleton = spine.skeleton;
|
|
288
|
+
const slots = skeleton.slots;
|
|
289
|
+
for (let i = 0, len = slots.length; i < len; i++) {
|
|
290
|
+
const slot = slots[i];
|
|
291
|
+
if (!slot.bone.active) {
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
const attachment = slot.getAttachment();
|
|
295
|
+
if (attachment === null || !(attachment instanceof MeshAttachment)) {
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
const meshAttachment = attachment;
|
|
299
|
+
const vertices = new Float32Array(meshAttachment.worldVerticesLength);
|
|
300
|
+
const triangles = meshAttachment.triangles;
|
|
301
|
+
let hullLength = meshAttachment.hullLength;
|
|
302
|
+
meshAttachment.computeWorldVertices(slot, 0, meshAttachment.worldVerticesLength, vertices, 0, 2);
|
|
303
|
+
// draw the skinned mesh (triangle)
|
|
304
|
+
if (this.drawMeshTriangles) {
|
|
305
|
+
for (let i = 0, len = triangles.length; i < len; i += 3) {
|
|
306
|
+
const v1 = triangles[i] * 2;
|
|
307
|
+
const v2 = triangles[i + 1] * 2;
|
|
308
|
+
const v3 = triangles[i + 2] * 2;
|
|
309
|
+
debugDisplayObjects.meshTrianglesLine.context
|
|
310
|
+
.moveTo(vertices[v1], vertices[v1 + 1])
|
|
311
|
+
.lineTo(vertices[v2], vertices[v2 + 1])
|
|
312
|
+
.lineTo(vertices[v3], vertices[v3 + 1]);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// draw skin border
|
|
316
|
+
if (this.drawMeshHull && hullLength > 0) {
|
|
317
|
+
hullLength = (hullLength >> 1) * 2;
|
|
318
|
+
let lastX = vertices[hullLength - 2];
|
|
319
|
+
let lastY = vertices[hullLength - 1];
|
|
320
|
+
for (let i = 0, len = hullLength; i < len; i += 2) {
|
|
321
|
+
const x = vertices[i];
|
|
322
|
+
const y = vertices[i + 1];
|
|
323
|
+
debugDisplayObjects.meshHullLine.context
|
|
324
|
+
.moveTo(x, y)
|
|
325
|
+
.lineTo(lastX, lastY);
|
|
326
|
+
lastX = x;
|
|
327
|
+
lastY = y;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
debugDisplayObjects.meshHullLine.stroke({ width: lineWidth, color: this.meshHullColor });
|
|
332
|
+
debugDisplayObjects.meshTrianglesLine.stroke({ width: lineWidth, color: this.meshTrianglesColor });
|
|
333
|
+
}
|
|
334
|
+
drawClippingFunc(spine, debugDisplayObjects, lineWidth) {
|
|
335
|
+
const skeleton = spine.skeleton;
|
|
336
|
+
const slots = skeleton.slots;
|
|
337
|
+
for (let i = 0, len = slots.length; i < len; i++) {
|
|
338
|
+
const slot = slots[i];
|
|
339
|
+
if (!slot.bone.active) {
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
const attachment = slot.getAttachment();
|
|
343
|
+
if (attachment === null || !(attachment instanceof ClippingAttachment)) {
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
const clippingAttachment = attachment;
|
|
347
|
+
const nn = clippingAttachment.worldVerticesLength;
|
|
348
|
+
const world = new Float32Array(nn);
|
|
349
|
+
clippingAttachment.computeWorldVertices(slot, 0, nn, world, 0, 2);
|
|
350
|
+
debugDisplayObjects.clippingPolygon.poly(Array.from(world));
|
|
351
|
+
}
|
|
352
|
+
debugDisplayObjects.clippingPolygon.stroke({
|
|
353
|
+
width: lineWidth, color: this.clippingPolygonColor, alpha: 1
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
drawBoundingBoxesFunc(spine, debugDisplayObjects, lineWidth) {
|
|
357
|
+
// draw the total outline of the bounding box
|
|
358
|
+
const bounds = new SkeletonBounds();
|
|
359
|
+
bounds.update(spine.skeleton, true);
|
|
360
|
+
if (bounds.minX !== Infinity) {
|
|
361
|
+
debugDisplayObjects.boundingBoxesRect
|
|
362
|
+
.rect(bounds.minX, bounds.minY, bounds.getWidth(), bounds.getHeight())
|
|
363
|
+
.stroke({ width: lineWidth, color: this.boundingBoxesRectColor });
|
|
364
|
+
}
|
|
365
|
+
const polygons = bounds.polygons;
|
|
366
|
+
const drawPolygon = (polygonVertices, _offset, count) => {
|
|
367
|
+
if (count < 3) {
|
|
368
|
+
throw new Error('Polygon must contain at least 3 vertices');
|
|
369
|
+
}
|
|
370
|
+
const paths = [];
|
|
371
|
+
const dotSize = lineWidth * 2;
|
|
372
|
+
for (let i = 0, len = polygonVertices.length; i < len; i += 2) {
|
|
373
|
+
const x1 = polygonVertices[i];
|
|
374
|
+
const y1 = polygonVertices[i + 1];
|
|
375
|
+
// draw the bounding box node
|
|
376
|
+
debugDisplayObjects.boundingBoxesCircle.beginFill(this.boundingBoxesCircleColor);
|
|
377
|
+
debugDisplayObjects.boundingBoxesCircle.drawCircle(x1, y1, dotSize);
|
|
378
|
+
debugDisplayObjects.boundingBoxesCircle.fill(0);
|
|
379
|
+
debugDisplayObjects.boundingBoxesCircle
|
|
380
|
+
.circle(x1, y1, dotSize)
|
|
381
|
+
.fill({ color: this.boundingBoxesCircleColor });
|
|
382
|
+
paths.push(x1, y1);
|
|
383
|
+
}
|
|
384
|
+
// draw the bounding box area
|
|
385
|
+
debugDisplayObjects.boundingBoxesPolygon
|
|
386
|
+
.poly(paths)
|
|
387
|
+
.fill({
|
|
388
|
+
color: this.boundingBoxesPolygonColor,
|
|
389
|
+
alpha: 0.1
|
|
390
|
+
})
|
|
391
|
+
.stroke({
|
|
392
|
+
width: lineWidth,
|
|
393
|
+
color: this.boundingBoxesPolygonColor
|
|
394
|
+
});
|
|
395
|
+
};
|
|
396
|
+
for (let i = 0, len = polygons.length; i < len; i++) {
|
|
397
|
+
const polygon = polygons[i];
|
|
398
|
+
drawPolygon(polygon, 0, polygon.length);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
drawPathsFunc(spine, debugDisplayObjects, lineWidth) {
|
|
402
|
+
const skeleton = spine.skeleton;
|
|
403
|
+
const slots = skeleton.slots;
|
|
404
|
+
for (let i = 0, len = slots.length; i < len; i++) {
|
|
405
|
+
const slot = slots[i];
|
|
406
|
+
if (!slot.bone.active) {
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
const attachment = slot.getAttachment();
|
|
410
|
+
if (attachment === null || !(attachment instanceof PathAttachment)) {
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
const pathAttachment = attachment;
|
|
414
|
+
let nn = pathAttachment.worldVerticesLength;
|
|
415
|
+
const world = new Float32Array(nn);
|
|
416
|
+
pathAttachment.computeWorldVertices(slot, 0, nn, world, 0, 2);
|
|
417
|
+
let x1 = world[2];
|
|
418
|
+
let y1 = world[3];
|
|
419
|
+
let x2 = 0;
|
|
420
|
+
let y2 = 0;
|
|
421
|
+
if (pathAttachment.closed) {
|
|
422
|
+
const cx1 = world[0];
|
|
423
|
+
const cy1 = world[1];
|
|
424
|
+
const cx2 = world[nn - 2];
|
|
425
|
+
const cy2 = world[nn - 1];
|
|
426
|
+
x2 = world[nn - 4];
|
|
427
|
+
y2 = world[nn - 3];
|
|
428
|
+
// curve
|
|
429
|
+
debugDisplayObjects.pathsCurve.moveTo(x1, y1);
|
|
430
|
+
debugDisplayObjects.pathsCurve.bezierCurveTo(cx1, cy1, cx2, cy2, x2, y2);
|
|
431
|
+
// handle
|
|
432
|
+
debugDisplayObjects.pathsLine.moveTo(x1, y1);
|
|
433
|
+
debugDisplayObjects.pathsLine.lineTo(cx1, cy1);
|
|
434
|
+
debugDisplayObjects.pathsLine.moveTo(x2, y2);
|
|
435
|
+
debugDisplayObjects.pathsLine.lineTo(cx2, cy2);
|
|
436
|
+
}
|
|
437
|
+
nn -= 4;
|
|
438
|
+
for (let ii = 4; ii < nn; ii += 6) {
|
|
439
|
+
const cx1 = world[ii];
|
|
440
|
+
const cy1 = world[ii + 1];
|
|
441
|
+
const cx2 = world[ii + 2];
|
|
442
|
+
const cy2 = world[ii + 3];
|
|
443
|
+
x2 = world[ii + 4];
|
|
444
|
+
y2 = world[ii + 5];
|
|
445
|
+
// curve
|
|
446
|
+
debugDisplayObjects.pathsCurve.moveTo(x1, y1);
|
|
447
|
+
debugDisplayObjects.pathsCurve.bezierCurveTo(cx1, cy1, cx2, cy2, x2, y2);
|
|
448
|
+
// handle
|
|
449
|
+
debugDisplayObjects.pathsLine.moveTo(x1, y1);
|
|
450
|
+
debugDisplayObjects.pathsLine.lineTo(cx1, cy1);
|
|
451
|
+
debugDisplayObjects.pathsLine.moveTo(x2, y2);
|
|
452
|
+
debugDisplayObjects.pathsLine.lineTo(cx2, cy2);
|
|
453
|
+
x1 = x2;
|
|
454
|
+
y1 = y2;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
debugDisplayObjects.pathsCurve.stroke({ width: lineWidth, color: this.pathsCurveColor });
|
|
458
|
+
debugDisplayObjects.pathsLine.stroke({ width: lineWidth, color: this.pathsLineColor });
|
|
459
|
+
}
|
|
460
|
+
unregisterSpine(spine) {
|
|
461
|
+
if (!this.registeredSpines.has(spine)) {
|
|
462
|
+
console.warn('SpineDebugRenderer.unregisterSpine() - spine is not registered, can\'t unregister!', spine);
|
|
463
|
+
}
|
|
464
|
+
const debugDisplayObjects = this.registeredSpines.get(spine);
|
|
465
|
+
if (!debugDisplayObjects) {
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
spine.state.removeListener(debugDisplayObjects.eventCallback);
|
|
469
|
+
debugDisplayObjects.parentDebugContainer.destroy({ textureSource: true, children: true, texture: true });
|
|
470
|
+
this.registeredSpines.delete(spine);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmVEZWJ1Z1JlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NwaW5lRGVidWdSZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXBELE9BQU8sRUFDTixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLE1BQU0sOEJBQThCLENBQUM7QUEwQ3RDOzs7R0FHRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFDYixnQkFBZ0IsR0FBb0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUV4RSxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN6QixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDakIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDcEIscUJBQXFCLEdBQUcsSUFBSSxDQUFDO0lBQzdCLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFFbEIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNkLHNCQUFzQixHQUFHLFFBQVEsQ0FBQztJQUNsQyxhQUFhLEdBQUcsUUFBUSxDQUFDO0lBQ3pCLGtCQUFrQixHQUFHLFFBQVEsQ0FBQztJQUM5QixvQkFBb0IsR0FBRyxRQUFRLENBQUM7SUFDaEMsc0JBQXNCLEdBQUcsUUFBUSxDQUFDO0lBQ2xDLHlCQUF5QixHQUFHLFFBQVEsQ0FBQztJQUNyQyx3QkFBd0IsR0FBRyxRQUFRLENBQUM7SUFDcEMsZUFBZSxHQUFHLFFBQVEsQ0FBQztJQUMzQixjQUFjLEdBQUcsUUFBUSxDQUFDO0lBQzFCLGVBQWUsR0FBRyxRQUFRLENBQUM7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RSxDQUFDO1lBQ1QsQ0FBQztRQUNGLENBQUM7UUFFRCxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDekYsbUJBQW1CLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFTSxlQUFlLENBQUUsS0FBWTtRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0ZBQW9GLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0csQ0FBQztRQUNELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3RCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMxQixPQUFPO1FBQ1IsQ0FBQztRQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTlELG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEp1bHkgMjgsIDIwMjMuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyMywgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvclxuICogb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRIRVxuICogU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbnRhaW5lciwgR3JhcGhpY3MsIFRleHQgfSBmcm9tICdwaXhpLmpzJztcbmltcG9ydCB7IFNwaW5lIH0gZnJvbSAnLi9TcGluZSc7XG5pbXBvcnQge1xuXHRDbGlwcGluZ0F0dGFjaG1lbnQsXG5cdE1lc2hBdHRhY2htZW50LFxuXHRQYXRoQXR0YWNobWVudCxcblx0UmVnaW9uQXR0YWNobWVudCxcblx0U2tlbGV0b25Cb3VuZHNcbn0gZnJvbSAnQGVzb3Rlcmljc29mdHdhcmUvc3BpbmUtY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgQW5pbWF0aW9uU3RhdGVMaXN0ZW5lciB9IGZyb20gJ0Blc290ZXJpY3NvZnR3YXJlL3NwaW5lLWNvcmUnO1xuXG4vKipcbiAqIE1ha2UgYSBjbGFzcyB0aGF0IGV4dGVuZHMgZnJvbSB0aGlzIGludGVyZmFjZSB0byBjcmVhdGUgeW91ciBvd24gZGVidWcgcmVuZGVyZXIuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNwaW5lRGVidWdSZW5kZXJlciB7XG5cdC8qKlxuXHQgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGV2ZXJ5IGZyYW1lLCBhZnRlciB0aGUgc3BpbmUgaGFzIGJlZW4gdXBkYXRlZC5cblx0ICovXG5cdHJlbmRlckRlYnVnOiAoc3BpbmU6IFNwaW5lKSA9PiB2b2lkO1xuXG5cdC8qKlxuXHQgKiAgVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYHNwaW5lLmRlYnVnYCBvYmplY3QgaXMgc2V0IHRvIG51bGwgb3Igd2hlbiB0aGUgc3BpbmUgaXMgZGVzdHJveWVkLlxuXHQgKi9cblx0dW5yZWdpc3RlclNwaW5lOiAoc3BpbmU6IFNwaW5lKSA9PiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBgc3BpbmUuZGVidWdgIG9iamVjdCBpcyBzZXQgdG8gYSBuZXcgaW5zdGFuY2Ugb2YgYSBkZWJ1ZyByZW5kZXJlci5cblx0ICovXG5cdHJlZ2lzdGVyU3BpbmU6IChzcGluZTogU3BpbmUpID0+IHZvaWQ7XG59XG5cbnR5cGUgRGVidWdEaXNwbGF5T2JqZWN0cyA9IHtcblx0Ym9uZXM6IENvbnRhaW5lcjtcblx0c2tlbGV0b25YWTogR3JhcGhpY3M7XG5cdHJlZ2lvbkF0dGFjaG1lbnRzU2hhcGU6IEdyYXBoaWNzO1xuXHRtZXNoVHJpYW5nbGVzTGluZTogR3JhcGhpY3M7XG5cdG1lc2hIdWxsTGluZTogR3JhcGhpY3M7XG5cdGNsaXBwaW5nUG9seWdvbjogR3JhcGhpY3M7XG5cdGJvdW5kaW5nQm94ZXNSZWN0OiBHcmFwaGljcztcblx0Ym91bmRpbmdCb3hlc0NpcmNsZTogR3JhcGhpY3M7XG5cdGJvdW5kaW5nQm94ZXNQb2x5Z29uOiBHcmFwaGljcztcblx0cGF0aHNDdXJ2ZTogR3JhcGhpY3M7XG5cdHBhdGhzTGluZTogR3JhcGhpY3M7XG5cdHBhcmVudERlYnVnQ29udGFpbmVyOiBDb250YWluZXI7XG5cdGV2ZW50VGV4dDogQ29udGFpbmVyO1xuXHRldmVudENhbGxiYWNrOiBBbmltYXRpb25TdGF0ZUxpc3RlbmVyO1xufTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgZGVidWcgcmVuZGVyZXIgdGhhdCB1c2VzIFBpeGlKUyBHcmFwaGljcyB1bmRlciB0aGUgaG9vZC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFNwaW5lRGVidWdSZW5kZXJlciBpbXBsZW1lbnRzIElTcGluZURlYnVnUmVuZGVyZXIge1xuXHRwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdGVyZWRTcGluZXM6IE1hcDxTcGluZSwgRGVidWdEaXNwbGF5T2JqZWN0cz4gPSBuZXcgTWFwKCk7XG5cblx0cHVibGljIGRyYXdNZXNoSHVsbCA9IHRydWU7XG5cdHB1YmxpYyBkcmF3TWVzaFRyaWFuZ2xlcyA9IHRydWU7XG5cdHB1YmxpYyBkcmF3Qm9uZXMgPSB0cnVlO1xuXHRwdWJsaWMgZHJhd1BhdGhzID0gdHJ1ZTtcblx0cHVibGljIGRyYXdCb3VuZGluZ0JveGVzID0gdHJ1ZTtcblx0cHVibGljIGRyYXdDbGlwcGluZyA9IHRydWU7XG5cdHB1YmxpYyBkcmF3UmVnaW9uQXR0YWNobWVudHMgPSB0cnVlO1xuXHRwdWJsaWMgZHJhd0V2ZW50cyA9IHRydWU7XG5cblx0cHVibGljIGxpbmVXaWR0aCA9IDE7XG5cdHB1YmxpYyByZWdpb25BdHRhY2htZW50c0NvbG9yID0gMHgwMDc4ZmY7XG5cdHB1YmxpYyBtZXNoSHVsbENvbG9yID0gMHgwMDc4ZmY7XG5cdHB1YmxpYyBtZXNoVHJpYW5nbGVzQ29sb3IgPSAweGZmY2MwMDtcblx0cHVibGljIGNsaXBwaW5nUG9seWdvbkNvbG9yID0gMHhmZjAwZmY7XG5cdHB1YmxpYyBib3VuZGluZ0JveGVzUmVjdENvbG9yID0gMHgwMGZmMDA7XG5cdHB1YmxpYyBib3VuZGluZ0JveGVzUG9seWdvbkNvbG9yID0gMHgwMGZmMDA7XG5cdHB1YmxpYyBib3VuZGluZ0JveGVzQ2lyY2xlQ29sb3IgPSAweDAwZmYwMDtcblx0cHVibGljIHBhdGhzQ3VydmVDb2xvciA9IDB4ZmYwMDAwO1xuXHRwdWJsaWMgcGF0aHNMaW5lQ29sb3IgPSAweGZmMDBmZjtcblx0cHVibGljIHNrZWxldG9uWFlDb2xvciA9IDB4ZmYwMDAwO1xuXHRwdWJsaWMgYm9uZXNDb2xvciA9IDB4MDBlZWNjO1xuXHRwdWJsaWMgZXZlbnRGb250U2l6ZSA9IDI0O1xuXHRwdWJsaWMgZXZlbnRGb250Q29sb3IgPSAweDA7XG5cblx0LyoqXG5cdCAqIFRoZSBkZWJ1ZyBpcyBhdHRhY2hlZCBieSBmb3JjZSB0byBlYWNoIHNwaW5lIG9iamVjdC5cblx0ICogU28gd2UgbmVlZCB0byBjcmVhdGUgaXQgaW5zaWRlIHRoZSBzcGluZSB3aGVuIHdlIGdldCB0aGUgZmlyc3QgdXBkYXRlXG5cdCAqL1xuXHRwdWJsaWMgcmVnaXN0ZXJTcGluZSAoc3BpbmU6IFNwaW5lKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMucmVnaXN0ZXJlZFNwaW5lcy5oYXMoc3BpbmUpKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oJ1NwaW5lRGVidWdSZW5kZXJlci5yZWdpc3RlclNwaW5lKCkgLSB0aGlzIHNwaW5lIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCEnLCBzcGluZSk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZGVidWdEaXNwbGF5T2JqZWN0czogRGVidWdEaXNwbGF5T2JqZWN0cyA9IHtcblx0XHRcdHBhcmVudERlYnVnQ29udGFpbmVyOiBuZXcgQ29udGFpbmVyKCksXG5cdFx0XHRib25lczogbmV3IENvbnRhaW5lcigpLFxuXHRcdFx0c2tlbGV0b25YWTogbmV3IEdyYXBoaWNzKCksXG5cdFx0XHRyZWdpb25BdHRhY2htZW50c1NoYXBlOiBuZXcgR3JhcGhpY3MoKSxcblx0XHRcdG1lc2hUcmlhbmdsZXNMaW5lOiBuZXcgR3JhcGhpY3MoKSxcblx0XHRcdG1lc2hIdWxsTGluZTogbmV3IEdyYXBoaWNzKCksXG5cdFx0XHRjbGlwcGluZ1BvbHlnb246IG5ldyBHcmFwaGljcygpLFxuXHRcdFx0Ym91bmRpbmdCb3hlc1JlY3Q6IG5ldyBHcmFwaGljcygpLFxuXHRcdFx0Ym91bmRpbmdCb3hlc0NpcmNsZTogbmV3IEdyYXBoaWNzKCksXG5cdFx0XHRib3VuZGluZ0JveGVzUG9seWdvbjogbmV3IEdyYXBoaWNzKCksXG5cdFx0XHRwYXRoc0N1cnZlOiBuZXcgR3JhcGhpY3MoKSxcblx0XHRcdHBhdGhzTGluZTogbmV3IEdyYXBoaWNzKCksXG5cdFx0XHRldmVudFRleHQ6IG5ldyBDb250YWluZXIoKSxcblx0XHRcdGV2ZW50Q2FsbGJhY2s6IHtcblx0XHRcdFx0ZXZlbnQ6IChfLCBldmVudCkgPT4ge1xuXHRcdFx0XHRcdGlmICh0aGlzLmRyYXdFdmVudHMpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNjYWxlID0gTWF0aC5hYnMoc3BpbmUuc2NhbGUueCB8fCBzcGluZS5zY2FsZS55IHx8IDEpO1xuXHRcdFx0XHRcdFx0Y29uc3QgdGV4dCA9IG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogZXZlbnQuZGF0YS5uYW1lLFxuXHRcdFx0XHRcdFx0XHRzdHlsZToge1xuXHRcdFx0XHRcdFx0XHRcdGZvbnRTaXplOiB0aGlzLmV2ZW50Rm9udFNpemUgLyBzY2FsZSxcblx0XHRcdFx0XHRcdFx0XHRmaWxsOiB0aGlzLmV2ZW50Rm9udENvbG9yLFxuXHRcdFx0XHRcdFx0XHRcdGZvbnRGYW1pbHk6ICdtb25vc3BhY2UnXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHR0ZXh0LnNjYWxlLnggPSBNYXRoLnNpZ24oc3BpbmUuc2NhbGUueCk7XG5cdFx0XHRcdFx0XHR0ZXh0LmFuY2hvci5zZXQoMC41KTtcblx0XHRcdFx0XHRcdGRlYnVnRGlzcGxheU9iamVjdHMuZXZlbnRUZXh0LmFkZENoaWxkKHRleHQpO1xuXHRcdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmICghdGV4dC5kZXN0cm95ZWQpIHtcblx0XHRcdFx0XHRcdFx0XHR0ZXh0LmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSwgMjUwKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhcmVudERlYnVnQ29udGFpbmVyLmFkZENoaWxkKGRlYnVnRGlzcGxheU9iamVjdHMuYm9uZXMpO1xuXHRcdGRlYnVnRGlzcGxheU9iamVjdHMucGFyZW50RGVidWdDb250YWluZXIuYWRkQ2hpbGQoZGVidWdEaXNwbGF5T2JqZWN0cy5za2VsZXRvblhZKTtcblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhcmVudERlYnVnQ29udGFpbmVyLmFkZENoaWxkKGRlYnVnRGlzcGxheU9iamVjdHMucmVnaW9uQXR0YWNobWVudHNTaGFwZSk7XG5cdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5wYXJlbnREZWJ1Z0NvbnRhaW5lci5hZGRDaGlsZChkZWJ1Z0Rpc3BsYXlPYmplY3RzLm1lc2hUcmlhbmdsZXNMaW5lKTtcblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhcmVudERlYnVnQ29udGFpbmVyLmFkZENoaWxkKGRlYnVnRGlzcGxheU9iamVjdHMubWVzaEh1bGxMaW5lKTtcblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhcmVudERlYnVnQ29udGFpbmVyLmFkZENoaWxkKGRlYnVnRGlzcGxheU9iamVjdHMuY2xpcHBpbmdQb2x5Z29uKTtcblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhcmVudERlYnVnQ29udGFpbmVyLmFkZENoaWxkKGRlYnVnRGlzcGxheU9iamVjdHMuYm91bmRpbmdCb3hlc1JlY3QpO1xuXHRcdGRlYnVnRGlzcGxheU9iamVjdHMucGFyZW50RGVidWdDb250YWluZXIuYWRkQ2hpbGQoZGVidWdEaXNwbGF5T2JqZWN0cy5ib3VuZGluZ0JveGVzQ2lyY2xlKTtcblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhcmVudERlYnVnQ29udGFpbmVyLmFkZENoaWxkKGRlYnVnRGlzcGxheU9iamVjdHMuYm91bmRpbmdCb3hlc1BvbHlnb24pO1xuXHRcdGRlYnVnRGlzcGxheU9iamVjdHMucGFyZW50RGVidWdDb250YWluZXIuYWRkQ2hpbGQoZGVidWdEaXNwbGF5T2JqZWN0cy5wYXRoc0N1cnZlKTtcblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhcmVudERlYnVnQ29udGFpbmVyLmFkZENoaWxkKGRlYnVnRGlzcGxheU9iamVjdHMucGF0aHNMaW5lKTtcblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhcmVudERlYnVnQ29udGFpbmVyLmFkZENoaWxkKGRlYnVnRGlzcGxheU9iamVjdHMuZXZlbnRUZXh0KTtcblxuXHRcdChkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhcmVudERlYnVnQ29udGFpbmVyIGFzIGFueSkuekluZGV4ID0gOTk5OTk5OTtcblxuXHRcdC8vIERpc2FibGUgc2NyZWVuIHJlYWRlciBhbmQgbW91c2UgaW5wdXQgb24gZGVidWcgb2JqZWN0cy5cblx0XHQoZGVidWdEaXNwbGF5T2JqZWN0cy5wYXJlbnREZWJ1Z0NvbnRhaW5lciBhcyBhbnkpLmFjY2Vzc2libGVDaGlsZHJlbiA9IGZhbHNlO1xuXHRcdChkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhcmVudERlYnVnQ29udGFpbmVyIGFzIGFueSkuZXZlbnRNb2RlID0gJ25vbmUnO1xuXHRcdChkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhcmVudERlYnVnQ29udGFpbmVyIGFzIGFueSkuaW50ZXJhY3RpdmVDaGlsZHJlbiA9IGZhbHNlO1xuXG5cdFx0c3BpbmUuYWRkQ2hpbGQoZGVidWdEaXNwbGF5T2JqZWN0cy5wYXJlbnREZWJ1Z0NvbnRhaW5lcik7XG5cblx0XHRzcGluZS5zdGF0ZS5hZGRMaXN0ZW5lcihkZWJ1Z0Rpc3BsYXlPYmplY3RzLmV2ZW50Q2FsbGJhY2spO1xuXG5cdFx0dGhpcy5yZWdpc3RlcmVkU3BpbmVzLnNldChzcGluZSwgZGVidWdEaXNwbGF5T2JqZWN0cyk7XG5cdH1cblxuXHRwdWJsaWMgcmVuZGVyRGVidWcgKHNwaW5lOiBTcGluZSk6IHZvaWQge1xuXHRcdGlmICghdGhpcy5yZWdpc3RlcmVkU3BpbmVzLmhhcyhzcGluZSkpIHtcblx0XHRcdC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gU3BpbmVzIGFyZSByZWdpc3RlcmVkIHdoZW4geW91IGFzc2lnbiBzcGluZS5kZWJ1Z1xuXHRcdFx0dGhpcy5yZWdpc3RlclNwaW5lKHNwaW5lKTtcblx0XHR9XG5cblx0XHRjb25zdCBkZWJ1Z0Rpc3BsYXlPYmplY3RzID0gdGhpcy5yZWdpc3RlcmVkU3BpbmVzLmdldChzcGluZSk7XG5cblx0XHRpZiAoIWRlYnVnRGlzcGxheU9iamVjdHMpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0c3BpbmUuYWRkQ2hpbGQoZGVidWdEaXNwbGF5T2JqZWN0cy5wYXJlbnREZWJ1Z0NvbnRhaW5lcik7XG5cblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnNrZWxldG9uWFkuY2xlYXIoKTtcblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnJlZ2lvbkF0dGFjaG1lbnRzU2hhcGUuY2xlYXIoKTtcblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLm1lc2hUcmlhbmdsZXNMaW5lLmNsZWFyKCk7XG5cdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5tZXNoSHVsbExpbmUuY2xlYXIoKTtcblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLmNsaXBwaW5nUG9seWdvbi5jbGVhcigpO1xuXHRcdGRlYnVnRGlzcGxheU9iamVjdHMuYm91bmRpbmdCb3hlc1JlY3QuY2xlYXIoKTtcblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLmJvdW5kaW5nQm94ZXNDaXJjbGUuY2xlYXIoKTtcblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLmJvdW5kaW5nQm94ZXNQb2x5Z29uLmNsZWFyKCk7XG5cdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5wYXRoc0N1cnZlLmNsZWFyKCk7XG5cdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5wYXRoc0xpbmUuY2xlYXIoKTtcblxuXHRcdGZvciAobGV0IGxlbiA9IGRlYnVnRGlzcGxheU9iamVjdHMuYm9uZXMuY2hpbGRyZW4ubGVuZ3RoOyBsZW4gPiAwOyBsZW4tLSkge1xuXHRcdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5ib25lcy5jaGlsZHJlbltsZW4gLSAxXS5kZXN0cm95KHsgY2hpbGRyZW46IHRydWUsIHRleHR1cmU6IHRydWUsIHRleHR1cmVTb3VyY2U6IHRydWUgfSk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2NhbGUgPSBNYXRoLmFicyhzcGluZS5zY2FsZS54IHx8IHNwaW5lLnNjYWxlLnkgfHwgMSk7XG5cdFx0Y29uc3QgbGluZVdpZHRoID0gdGhpcy5saW5lV2lkdGggLyBzY2FsZTtcblxuXHRcdGlmICh0aGlzLmRyYXdCb25lcykge1xuXHRcdFx0dGhpcy5kcmF3Qm9uZXNGdW5jKHNwaW5lLCBkZWJ1Z0Rpc3BsYXlPYmplY3RzLCBsaW5lV2lkdGgsIHNjYWxlKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5kcmF3UGF0aHMpIHtcblx0XHRcdHRoaXMuZHJhd1BhdGhzRnVuYyhzcGluZSwgZGVidWdEaXNwbGF5T2JqZWN0cywgbGluZVdpZHRoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5kcmF3Qm91bmRpbmdCb3hlcykge1xuXHRcdFx0dGhpcy5kcmF3Qm91bmRpbmdCb3hlc0Z1bmMoc3BpbmUsIGRlYnVnRGlzcGxheU9iamVjdHMsIGxpbmVXaWR0aCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZHJhd0NsaXBwaW5nKSB7XG5cdFx0XHR0aGlzLmRyYXdDbGlwcGluZ0Z1bmMoc3BpbmUsIGRlYnVnRGlzcGxheU9iamVjdHMsIGxpbmVXaWR0aCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZHJhd01lc2hIdWxsIHx8IHRoaXMuZHJhd01lc2hUcmlhbmdsZXMpIHtcblx0XHRcdHRoaXMuZHJhd01lc2hIdWxsQW5kTWVzaFRyaWFuZ2xlcyhzcGluZSwgZGVidWdEaXNwbGF5T2JqZWN0cywgbGluZVdpZHRoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5kcmF3UmVnaW9uQXR0YWNobWVudHMpIHtcblx0XHRcdHRoaXMuZHJhd1JlZ2lvbkF0dGFjaG1lbnRzRnVuYyhzcGluZSwgZGVidWdEaXNwbGF5T2JqZWN0cywgbGluZVdpZHRoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5kcmF3RXZlbnRzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIGRlYnVnRGlzcGxheU9iamVjdHMuZXZlbnRUZXh0LmNoaWxkcmVuKSB7XG5cdFx0XHRcdGNoaWxkLmFscGhhIC09IDAuMDU7XG5cdFx0XHRcdGNoaWxkLnkgLT0gMjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGRyYXdCb25lc0Z1bmMgKHNwaW5lOiBTcGluZSwgZGVidWdEaXNwbGF5T2JqZWN0czogRGVidWdEaXNwbGF5T2JqZWN0cywgbGluZVdpZHRoOiBudW1iZXIsIHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCBza2VsZXRvbiA9IHNwaW5lLnNrZWxldG9uO1xuXHRcdGNvbnN0IHNrZWxldG9uWCA9IHNrZWxldG9uLng7XG5cdFx0Y29uc3Qgc2tlbGV0b25ZID0gc2tlbGV0b24ueTtcblx0XHRjb25zdCBib25lcyA9IHNrZWxldG9uLmJvbmVzO1xuXG5cdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5za2VsZXRvblhZLnN0cm9rZVN0eWxlID0geyB3aWR0aDogbGluZVdpZHRoLCBjb2xvcjogdGhpcy5za2VsZXRvblhZQ29sb3IgfTtcblxuXHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSBib25lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0Y29uc3QgYm9uZSA9IGJvbmVzW2ldO1xuXHRcdFx0Y29uc3QgYm9uZUxlbiA9IGJvbmUuZGF0YS5sZW5ndGg7XG5cdFx0XHRjb25zdCBzdGFyWCA9IHNrZWxldG9uWCArIGJvbmUud29ybGRYO1xuXHRcdFx0Y29uc3Qgc3RhclkgPSBza2VsZXRvblkgKyBib25lLndvcmxkWTtcblx0XHRcdGNvbnN0IGVuZFggPSBza2VsZXRvblggKyAoYm9uZUxlbiAqIGJvbmUuYSkgKyBib25lLndvcmxkWDtcblx0XHRcdGNvbnN0IGVuZFkgPSBza2VsZXRvblkgKyAoYm9uZUxlbiAqIGJvbmUuYikgKyBib25lLndvcmxkWTtcblxuXHRcdFx0aWYgKGJvbmUuZGF0YS5uYW1lID09PSAncm9vdCcgfHwgYm9uZS5kYXRhLnBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdyA9IE1hdGguYWJzKHN0YXJYIC0gZW5kWCk7XG5cdFx0XHRjb25zdCBoID0gTWF0aC5hYnMoc3RhclkgLSBlbmRZKTtcblx0XHRcdC8vIGEgPSB3LCAvLyBzaWRlIGxlbmd0aCBhXG5cdFx0XHRjb25zdCBhMiA9IE1hdGgucG93KHcsIDIpOyAvLyBzcXVhcmUgcm9vdCBvZiBzaWRlIGxlbmd0aCBhXG5cdFx0XHRjb25zdCBiID0gaDsgLy8gc2lkZSBsZW5ndGggYlxuXHRcdFx0Y29uc3QgYjIgPSBNYXRoLnBvdyhoLCAyKTsgLy8gc3F1YXJlIHJvb3Qgb2Ygc2lkZSBsZW5ndGggYlxuXHRcdFx0Y29uc3QgYyA9IE1hdGguc3FydChhMiArIGIyKTsgLy8gc2lkZSBsZW5ndGggY1xuXHRcdFx0Y29uc3QgYzIgPSBNYXRoLnBvdyhjLCAyKTsgLy8gc3F1YXJlIHJvb3Qgb2Ygc2lkZSBsZW5ndGggY1xuXHRcdFx0Y29uc3QgcmFkID0gTWF0aC5QSSAvIDE4MDtcblx0XHRcdC8vIEEgPSBNYXRoLmFjb3MoW2EyICsgYzIgLSBiMl0gLyBbMiAqIGEgKiBjXSkgfHwgMCwgLy8gQW5nbGUgQVxuXHRcdFx0Ly8gQyA9IE1hdGguYWNvcyhbYTIgKyBiMiAtIGMyXSAvIFsyICogYSAqIGJdKSB8fCAwLCAvLyBDIGFuZ2xlXG5cdFx0XHRjb25zdCBCID0gTWF0aC5hY29zKChjMiArIGIyIC0gYTIpIC8gKDIgKiBiICogYykpIHx8IDA7IC8vIGFuZ2xlIG9mIGNvcm5lciBCXG5cblx0XHRcdGlmIChjID09PSAwKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBncCA9IG5ldyBHcmFwaGljcygpO1xuXG5cdFx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLmJvbmVzLmFkZENoaWxkKGdwKTtcblxuXHRcdFx0Ly8gZHJhdyBib25lXG5cdFx0XHRjb25zdCByZWZSYXRpb24gPSBjIC8gNTAgLyBzY2FsZTtcblxuXHRcdFx0Z3AuY29udGV4dFxuXHRcdFx0XHQucG9seShbMCwgMCwgMCAtIHJlZlJhdGlvbiwgYyAtIChyZWZSYXRpb24gKiAzKSwgMCwgYyAtIHJlZlJhdGlvbiwgMCArIHJlZlJhdGlvbiwgYyAtIChyZWZSYXRpb24gKiAzKV0pXG5cdFx0XHRcdC5maWxsKHRoaXMuYm9uZXNDb2xvcik7XG5cdFx0XHRncC54ID0gc3Rhclg7XG5cdFx0XHRncC55ID0gc3Rhclk7XG5cdFx0XHRncC5waXZvdC55ID0gYztcblxuXHRcdFx0Ly8gQ2FsY3VsYXRlIGJvbmUgcm90YXRpb24gYW5nbGVcblx0XHRcdGxldCByb3RhdGlvbiA9IDA7XG5cblx0XHRcdGlmIChzdGFyWCA8IGVuZFggJiYgc3RhclkgPCBlbmRZKSB7XG5cdFx0XHRcdC8vIGJvdHRvbSByaWdodFxuXHRcdFx0XHRyb3RhdGlvbiA9IC1CICsgKDE4MCAqIHJhZCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChzdGFyWCA+IGVuZFggJiYgc3RhclkgPCBlbmRZKSB7XG5cdFx0XHRcdC8vIGJvdHRvbSBsZWZ0XG5cdFx0XHRcdHJvdGF0aW9uID0gKDE4MCAqIHJhZCkgKyBCO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoc3RhclggPiBlbmRYICYmIHN0YXJZID4gZW5kWSkge1xuXHRcdFx0XHQvLyB0b3AgbGVmdFxuXHRcdFx0XHRyb3RhdGlvbiA9IC1CO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoc3RhclggPCBlbmRYICYmIHN0YXJZID4gZW5kWSkge1xuXHRcdFx0XHQvLyBib3R0b20gbGVmdFxuXHRcdFx0XHRyb3RhdGlvbiA9IEI7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChzdGFyWSA9PT0gZW5kWSAmJiBzdGFyWCA8IGVuZFgpIHtcblx0XHRcdFx0Ly8gVG8gdGhlIHJpZ2h0XG5cdFx0XHRcdHJvdGF0aW9uID0gOTAgKiByYWQ7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChzdGFyWSA9PT0gZW5kWSAmJiBzdGFyWCA+IGVuZFgpIHtcblx0XHRcdFx0Ly8gZ28gbGVmdFxuXHRcdFx0XHRyb3RhdGlvbiA9IC05MCAqIHJhZDtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHN0YXJYID09PSBlbmRYICYmIHN0YXJZIDwgZW5kWSkge1xuXHRcdFx0XHQvLyBkb3duXG5cdFx0XHRcdHJvdGF0aW9uID0gMTgwICogcmFkO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoc3RhclggPT09IGVuZFggJiYgc3RhclkgPiBlbmRZKSB7XG5cdFx0XHRcdC8vIHVwXG5cdFx0XHRcdHJvdGF0aW9uID0gMDtcblx0XHRcdH1cblx0XHRcdGdwLnJvdGF0aW9uID0gcm90YXRpb247XG5cblx0XHRcdC8vIERyYXcgdGhlIHN0YXJ0aW5nIHJvdGF0aW9uIHBvaW50IG9mIHRoZSBib25lXG5cdFx0XHRncC5jaXJjbGUoMCwgYywgcmVmUmF0aW9uICogMS4yKVxuXHRcdFx0XHQuZmlsbCh7IGNvbG9yOiAweDAwMDAwMCwgYWxwaGE6IDAuNiB9KVxuXHRcdFx0XHQuc3Ryb2tlKHsgd2lkdGg6IGxpbmVXaWR0aCArIHJlZlJhdGlvbiAvIDIuNCwgY29sb3I6IHRoaXMuYm9uZXNDb2xvciB9KTtcblx0XHR9XG5cblx0XHQvLyBEcmF3IHRoZSBza2VsZXRvbiBzdGFydGluZyBwb2ludCBcIlhcIiBmb3JtXG5cdFx0Y29uc3Qgc3RhcnREb3RTaXplID0gbGluZVdpZHRoICogMztcblxuXHRcdGRlYnVnRGlzcGxheU9iamVjdHMuc2tlbGV0b25YWS5jb250ZXh0XG5cdFx0XHQubW92ZVRvKHNrZWxldG9uWCAtIHN0YXJ0RG90U2l6ZSwgc2tlbGV0b25ZIC0gc3RhcnREb3RTaXplKVxuXHRcdFx0LmxpbmVUbyhza2VsZXRvblggKyBzdGFydERvdFNpemUsIHNrZWxldG9uWSArIHN0YXJ0RG90U2l6ZSlcblx0XHRcdC5tb3ZlVG8oc2tlbGV0b25YICsgc3RhcnREb3RTaXplLCBza2VsZXRvblkgLSBzdGFydERvdFNpemUpXG5cdFx0XHQubGluZVRvKHNrZWxldG9uWCAtIHN0YXJ0RG90U2l6ZSwgc2tlbGV0b25ZICsgc3RhcnREb3RTaXplKVxuXHRcdFx0LnN0cm9rZSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBkcmF3UmVnaW9uQXR0YWNobWVudHNGdW5jIChzcGluZTogU3BpbmUsIGRlYnVnRGlzcGxheU9iamVjdHM6IERlYnVnRGlzcGxheU9iamVjdHMsIGxpbmVXaWR0aDogbnVtYmVyKTogdm9pZCB7XG5cdFx0Y29uc3Qgc2tlbGV0b24gPSBzcGluZS5za2VsZXRvbjtcblx0XHRjb25zdCBzbG90cyA9IHNrZWxldG9uLnNsb3RzO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDAsIGxlbiA9IHNsb3RzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBzbG90ID0gc2xvdHNbaV07XG5cdFx0XHRjb25zdCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XG5cblx0XHRcdGlmIChhdHRhY2htZW50ID09PSBudWxsIHx8ICEoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZWdpb25BdHRhY2htZW50ID0gYXR0YWNobWVudDtcblxuXHRcdFx0Y29uc3QgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KDgpO1xuXG5cdFx0XHRyZWdpb25BdHRhY2htZW50LmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNsb3QsIHZlcnRpY2VzLCAwLCAyKTtcblxuXHRcdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5yZWdpb25BdHRhY2htZW50c1NoYXBlLnBvbHkoQXJyYXkuZnJvbSh2ZXJ0aWNlcy5zbGljZSgwLCA4KSkpO1xuXHRcdH1cblxuXHRcdGRlYnVnRGlzcGxheU9iamVjdHMucmVnaW9uQXR0YWNobWVudHNTaGFwZS5zdHJva2Uoe1xuXHRcdFx0Y29sb3I6IHRoaXMucmVnaW9uQXR0YWNobWVudHNDb2xvcixcblx0XHRcdHdpZHRoOiBsaW5lV2lkdGhcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgZHJhd01lc2hIdWxsQW5kTWVzaFRyaWFuZ2xlcyAoc3BpbmU6IFNwaW5lLCBkZWJ1Z0Rpc3BsYXlPYmplY3RzOiBEZWJ1Z0Rpc3BsYXlPYmplY3RzLCBsaW5lV2lkdGg6IG51bWJlcik6IHZvaWQge1xuXHRcdGNvbnN0IHNrZWxldG9uID0gc3BpbmUuc2tlbGV0b247XG5cdFx0Y29uc3Qgc2xvdHMgPSBza2VsZXRvbi5zbG90cztcblxuXHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSBzbG90cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0Y29uc3Qgc2xvdCA9IHNsb3RzW2ldO1xuXG5cdFx0XHRpZiAoIXNsb3QuYm9uZS5hY3RpdmUpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XG5cblx0XHRcdGlmIChhdHRhY2htZW50ID09PSBudWxsIHx8ICEoYXR0YWNobWVudCBpbnN0YW5jZW9mIE1lc2hBdHRhY2htZW50KSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbWVzaEF0dGFjaG1lbnQgPSBhdHRhY2htZW50O1xuXG5cdFx0XHRjb25zdCB2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkobWVzaEF0dGFjaG1lbnQud29ybGRWZXJ0aWNlc0xlbmd0aCk7XG5cdFx0XHRjb25zdCB0cmlhbmdsZXMgPSBtZXNoQXR0YWNobWVudC50cmlhbmdsZXM7XG5cdFx0XHRsZXQgaHVsbExlbmd0aCA9IG1lc2hBdHRhY2htZW50Lmh1bGxMZW5ndGg7XG5cblx0XHRcdG1lc2hBdHRhY2htZW50LmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNsb3QsIDAsIG1lc2hBdHRhY2htZW50LndvcmxkVmVydGljZXNMZW5ndGgsIHZlcnRpY2VzLCAwLCAyKTtcblx0XHRcdC8vIGRyYXcgdGhlIHNraW5uZWQgbWVzaCAodHJpYW5nbGUpXG5cdFx0XHRpZiAodGhpcy5kcmF3TWVzaFRyaWFuZ2xlcykge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMCwgbGVuID0gdHJpYW5nbGVzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAzKSB7XG5cdFx0XHRcdFx0Y29uc3QgdjEgPSB0cmlhbmdsZXNbaV0gKiAyO1xuXHRcdFx0XHRcdGNvbnN0IHYyID0gdHJpYW5nbGVzW2kgKyAxXSAqIDI7XG5cdFx0XHRcdFx0Y29uc3QgdjMgPSB0cmlhbmdsZXNbaSArIDJdICogMjtcblxuXHRcdFx0XHRcdGRlYnVnRGlzcGxheU9iamVjdHMubWVzaFRyaWFuZ2xlc0xpbmUuY29udGV4dFxuXHRcdFx0XHRcdFx0Lm1vdmVUbyh2ZXJ0aWNlc1t2MV0sIHZlcnRpY2VzW3YxICsgMV0pXG5cdFx0XHRcdFx0XHQubGluZVRvKHZlcnRpY2VzW3YyXSwgdmVydGljZXNbdjIgKyAxXSlcblx0XHRcdFx0XHRcdC5saW5lVG8odmVydGljZXNbdjNdLCB2ZXJ0aWNlc1t2MyArIDFdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBkcmF3IHNraW4gYm9yZGVyXG5cdFx0XHRpZiAodGhpcy5kcmF3TWVzaEh1bGwgJiYgaHVsbExlbmd0aCA+IDApIHtcblx0XHRcdFx0aHVsbExlbmd0aCA9IChodWxsTGVuZ3RoID4+IDEpICogMjtcblx0XHRcdFx0bGV0IGxhc3RYID0gdmVydGljZXNbaHVsbExlbmd0aCAtIDJdO1xuXHRcdFx0XHRsZXQgbGFzdFkgPSB2ZXJ0aWNlc1todWxsTGVuZ3RoIC0gMV07XG5cblx0XHRcdFx0Zm9yIChsZXQgaSA9IDAsIGxlbiA9IGh1bGxMZW5ndGg7IGkgPCBsZW47IGkgKz0gMikge1xuXHRcdFx0XHRcdGNvbnN0IHggPSB2ZXJ0aWNlc1tpXTtcblx0XHRcdFx0XHRjb25zdCB5ID0gdmVydGljZXNbaSArIDFdO1xuXG5cdFx0XHRcdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5tZXNoSHVsbExpbmUuY29udGV4dFxuXHRcdFx0XHRcdFx0Lm1vdmVUbyh4LCB5KVxuXHRcdFx0XHRcdFx0LmxpbmVUbyhsYXN0WCwgbGFzdFkpO1xuXHRcdFx0XHRcdGxhc3RYID0geDtcblx0XHRcdFx0XHRsYXN0WSA9IHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLm1lc2hIdWxsTGluZS5zdHJva2UoeyB3aWR0aDogbGluZVdpZHRoLCBjb2xvcjogdGhpcy5tZXNoSHVsbENvbG9yIH0pO1xuXHRcdGRlYnVnRGlzcGxheU9iamVjdHMubWVzaFRyaWFuZ2xlc0xpbmUuc3Ryb2tlKHsgd2lkdGg6IGxpbmVXaWR0aCwgY29sb3I6IHRoaXMubWVzaFRyaWFuZ2xlc0NvbG9yIH0pO1xuXHR9XG5cblx0ZHJhd0NsaXBwaW5nRnVuYyAoc3BpbmU6IFNwaW5lLCBkZWJ1Z0Rpc3BsYXlPYmplY3RzOiBEZWJ1Z0Rpc3BsYXlPYmplY3RzLCBsaW5lV2lkdGg6IG51bWJlcik6IHZvaWQge1xuXHRcdGNvbnN0IHNrZWxldG9uID0gc3BpbmUuc2tlbGV0b247XG5cdFx0Y29uc3Qgc2xvdHMgPSBza2VsZXRvbi5zbG90cztcblxuXHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSBzbG90cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0Y29uc3Qgc2xvdCA9IHNsb3RzW2ldO1xuXG5cdFx0XHRpZiAoIXNsb3QuYm9uZS5hY3RpdmUpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XG5cblx0XHRcdGlmIChhdHRhY2htZW50ID09PSBudWxsIHx8ICEoYXR0YWNobWVudCBpbnN0YW5jZW9mIENsaXBwaW5nQXR0YWNobWVudCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNsaXBwaW5nQXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7XG5cblx0XHRcdGNvbnN0IG5uID0gY2xpcHBpbmdBdHRhY2htZW50LndvcmxkVmVydGljZXNMZW5ndGg7XG5cdFx0XHRjb25zdCB3b3JsZCA9IG5ldyBGbG9hdDMyQXJyYXkobm4pO1xuXG5cdFx0XHRjbGlwcGluZ0F0dGFjaG1lbnQuY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgMCwgbm4sIHdvcmxkLCAwLCAyKTtcblx0XHRcdGRlYnVnRGlzcGxheU9iamVjdHMuY2xpcHBpbmdQb2x5Z29uLnBvbHkoQXJyYXkuZnJvbSh3b3JsZCkpO1xuXHRcdH1cblxuXHRcdGRlYnVnRGlzcGxheU9iamVjdHMuY2xpcHBpbmdQb2x5Z29uLnN0cm9rZSh7XG5cdFx0XHR3aWR0aDogbGluZVdpZHRoLCBjb2xvcjogdGhpcy5jbGlwcGluZ1BvbHlnb25Db2xvciwgYWxwaGE6IDFcblx0XHR9KTtcblx0fVxuXG5cdGRyYXdCb3VuZGluZ0JveGVzRnVuYyAoc3BpbmU6IFNwaW5lLCBkZWJ1Z0Rpc3BsYXlPYmplY3RzOiBEZWJ1Z0Rpc3BsYXlPYmplY3RzLCBsaW5lV2lkdGg6IG51bWJlcik6IHZvaWQge1xuXHRcdC8vIGRyYXcgdGhlIHRvdGFsIG91dGxpbmUgb2YgdGhlIGJvdW5kaW5nIGJveFxuXHRcdGNvbnN0IGJvdW5kcyA9IG5ldyBTa2VsZXRvbkJvdW5kcygpO1xuXHRcdGJvdW5kcy51cGRhdGUoc3BpbmUuc2tlbGV0b24sIHRydWUpO1xuXG5cdFx0aWYgKGJvdW5kcy5taW5YICE9PSBJbmZpbml0eSkge1xuXHRcdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5ib3VuZGluZ0JveGVzUmVjdFxuXHRcdFx0XHQucmVjdChib3VuZHMubWluWCwgYm91bmRzLm1pblksIGJvdW5kcy5nZXRXaWR0aCgpLCBib3VuZHMuZ2V0SGVpZ2h0KCkpXG5cdFx0XHRcdC5zdHJva2UoeyB3aWR0aDogbGluZVdpZHRoLCBjb2xvcjogdGhpcy5ib3VuZGluZ0JveGVzUmVjdENvbG9yIH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBvbHlnb25zID0gYm91bmRzLnBvbHlnb25zO1xuXHRcdGNvbnN0IGRyYXdQb2x5Z29uID0gKHBvbHlnb25WZXJ0aWNlczogQXJyYXlMaWtlPG51bWJlcj4sIF9vZmZzZXQ6IHVua25vd24sIGNvdW50OiBudW1iZXIpOiB2b2lkID0+IHtcblx0XHRcdGlmIChjb3VudCA8IDMpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdQb2x5Z29uIG11c3QgY29udGFpbiBhdCBsZWFzdCAzIHZlcnRpY2VzJyk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwYXRoczogbnVtYmVyW10gPSBbXTtcblx0XHRcdGNvbnN0IGRvdFNpemUgPSBsaW5lV2lkdGggKiAyO1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMCwgbGVuID0gcG9seWdvblZlcnRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAyKSB7XG5cdFx0XHRcdGNvbnN0IHgxID0gcG9seWdvblZlcnRpY2VzW2ldO1xuXHRcdFx0XHRjb25zdCB5MSA9IHBvbHlnb25WZXJ0aWNlc1tpICsgMV07XG5cblx0XHRcdFx0Ly8gZHJhdyB0aGUgYm91bmRpbmcgYm94IG5vZGVcblx0XHRcdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5ib3VuZGluZ0JveGVzQ2lyY2xlLmJlZ2luRmlsbCh0aGlzLmJvdW5kaW5nQm94ZXNDaXJjbGVDb2xvcik7XG5cdFx0XHRcdGRlYnVnRGlzcGxheU9iamVjdHMuYm91bmRpbmdCb3hlc0NpcmNsZS5kcmF3Q2lyY2xlKHgxLCB5MSwgZG90U2l6ZSk7XG5cdFx0XHRcdGRlYnVnRGlzcGxheU9iamVjdHMuYm91bmRpbmdCb3hlc0NpcmNsZS5maWxsKDApO1xuXG5cdFx0XHRcdGRlYnVnRGlzcGxheU9iamVjdHMuYm91bmRpbmdCb3hlc0NpcmNsZVxuXHRcdFx0XHRcdC5jaXJjbGUoeDEsIHkxLCBkb3RTaXplKVxuXHRcdFx0XHRcdC5maWxsKHsgY29sb3I6IHRoaXMuYm91bmRpbmdCb3hlc0NpcmNsZUNvbG9yIH0pXG5cblx0XHRcdFx0cGF0aHMucHVzaCh4MSwgeTEpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBkcmF3IHRoZSBib3VuZGluZyBib3ggYXJlYVxuXHRcdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5ib3VuZGluZ0JveGVzUG9seWdvblxuXHRcdFx0XHQucG9seShwYXRocylcblx0XHRcdFx0LmZpbGwoe1xuXHRcdFx0XHRcdGNvbG9yOiB0aGlzLmJvdW5kaW5nQm94ZXNQb2x5Z29uQ29sb3IsXG5cdFx0XHRcdFx0YWxwaGE6IDAuMVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuc3Ryb2tlKHtcblx0XHRcdFx0XHR3aWR0aDogbGluZVdpZHRoLFxuXHRcdFx0XHRcdGNvbG9yOiB0aGlzLmJvdW5kaW5nQm94ZXNQb2x5Z29uQ29sb3Jcblx0XHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSBwb2x5Z29ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0Y29uc3QgcG9seWdvbiA9IHBvbHlnb25zW2ldO1xuXG5cdFx0XHRkcmF3UG9seWdvbihwb2x5Z29uLCAwLCBwb2x5Z29uLmxlbmd0aCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBkcmF3UGF0aHNGdW5jIChzcGluZTogU3BpbmUsIGRlYnVnRGlzcGxheU9iamVjdHM6IERlYnVnRGlzcGxheU9iamVjdHMsIGxpbmVXaWR0aDogbnVtYmVyKTogdm9pZCB7XG5cdFx0Y29uc3Qgc2tlbGV0b24gPSBzcGluZS5za2VsZXRvbjtcblx0XHRjb25zdCBzbG90cyA9IHNrZWxldG9uLnNsb3RzO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDAsIGxlbiA9IHNsb3RzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBzbG90ID0gc2xvdHNbaV07XG5cblx0XHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcblxuXHRcdFx0aWYgKGF0dGFjaG1lbnQgPT09IG51bGwgfHwgIShhdHRhY2htZW50IGluc3RhbmNlb2YgUGF0aEF0dGFjaG1lbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBwYXRoQXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7XG5cdFx0XHRsZXQgbm4gPSBwYXRoQXR0YWNobWVudC53b3JsZFZlcnRpY2VzTGVuZ3RoO1xuXHRcdFx0Y29uc3Qgd29ybGQgPSBuZXcgRmxvYXQzMkFycmF5KG5uKTtcblxuXHRcdFx0cGF0aEF0dGFjaG1lbnQuY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgMCwgbm4sIHdvcmxkLCAwLCAyKTtcblx0XHRcdGxldCB4MSA9IHdvcmxkWzJdO1xuXHRcdFx0bGV0IHkxID0gd29ybGRbM107XG5cdFx0XHRsZXQgeDIgPSAwO1xuXHRcdFx0bGV0IHkyID0gMDtcblxuXHRcdFx0aWYgKHBhdGhBdHRhY2htZW50LmNsb3NlZCkge1xuXHRcdFx0XHRjb25zdCBjeDEgPSB3b3JsZFswXTtcblx0XHRcdFx0Y29uc3QgY3kxID0gd29ybGRbMV07XG5cdFx0XHRcdGNvbnN0IGN4MiA9IHdvcmxkW25uIC0gMl07XG5cdFx0XHRcdGNvbnN0IGN5MiA9IHdvcmxkW25uIC0gMV07XG5cblx0XHRcdFx0eDIgPSB3b3JsZFtubiAtIDRdO1xuXHRcdFx0XHR5MiA9IHdvcmxkW25uIC0gM107XG5cblx0XHRcdFx0Ly8gY3VydmVcblx0XHRcdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5wYXRoc0N1cnZlLm1vdmVUbyh4MSwgeTEpO1xuXHRcdFx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhdGhzQ3VydmUuYmV6aWVyQ3VydmVUbyhjeDEsIGN5MSwgY3gyLCBjeTIsIHgyLCB5Mik7XG5cblx0XHRcdFx0Ly8gaGFuZGxlXG5cdFx0XHRcdGRlYnVnRGlzcGxheU9iamVjdHMucGF0aHNMaW5lLm1vdmVUbyh4MSwgeTEpO1xuXHRcdFx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhdGhzTGluZS5saW5lVG8oY3gxLCBjeTEpO1xuXHRcdFx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhdGhzTGluZS5tb3ZlVG8oeDIsIHkyKTtcblx0XHRcdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5wYXRoc0xpbmUubGluZVRvKGN4MiwgY3kyKTtcblx0XHRcdH1cblx0XHRcdG5uIC09IDQ7XG5cdFx0XHRmb3IgKGxldCBpaSA9IDQ7IGlpIDwgbm47IGlpICs9IDYpIHtcblx0XHRcdFx0Y29uc3QgY3gxID0gd29ybGRbaWldO1xuXHRcdFx0XHRjb25zdCBjeTEgPSB3b3JsZFtpaSArIDFdO1xuXHRcdFx0XHRjb25zdCBjeDIgPSB3b3JsZFtpaSArIDJdO1xuXHRcdFx0XHRjb25zdCBjeTIgPSB3b3JsZFtpaSArIDNdO1xuXG5cdFx0XHRcdHgyID0gd29ybGRbaWkgKyA0XTtcblx0XHRcdFx0eTIgPSB3b3JsZFtpaSArIDVdO1xuXHRcdFx0XHQvLyBjdXJ2ZVxuXHRcdFx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhdGhzQ3VydmUubW92ZVRvKHgxLCB5MSk7XG5cdFx0XHRcdGRlYnVnRGlzcGxheU9iamVjdHMucGF0aHNDdXJ2ZS5iZXppZXJDdXJ2ZVRvKGN4MSwgY3kxLCBjeDIsIGN5MiwgeDIsIHkyKTtcblxuXHRcdFx0XHQvLyBoYW5kbGVcblx0XHRcdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5wYXRoc0xpbmUubW92ZVRvKHgxLCB5MSk7XG5cdFx0XHRcdGRlYnVnRGlzcGxheU9iamVjdHMucGF0aHNMaW5lLmxpbmVUbyhjeDEsIGN5MSk7XG5cdFx0XHRcdGRlYnVnRGlzcGxheU9iamVjdHMucGF0aHNMaW5lLm1vdmVUbyh4MiwgeTIpO1xuXHRcdFx0XHRkZWJ1Z0Rpc3BsYXlPYmplY3RzLnBhdGhzTGluZS5saW5lVG8oY3gyLCBjeTIpO1xuXHRcdFx0XHR4MSA9IHgyO1xuXHRcdFx0XHR5MSA9IHkyO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGRlYnVnRGlzcGxheU9iamVjdHMucGF0aHNDdXJ2ZS5zdHJva2UoeyB3aWR0aDogbGluZVdpZHRoLCBjb2xvcjogdGhpcy5wYXRoc0N1cnZlQ29sb3IgfSk7XG5cdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5wYXRoc0xpbmUuc3Ryb2tlKHsgd2lkdGg6IGxpbmVXaWR0aCwgY29sb3I6IHRoaXMucGF0aHNMaW5lQ29sb3IgfSk7XG5cdH1cblxuXHRwdWJsaWMgdW5yZWdpc3RlclNwaW5lIChzcGluZTogU3BpbmUpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMucmVnaXN0ZXJlZFNwaW5lcy5oYXMoc3BpbmUpKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oJ1NwaW5lRGVidWdSZW5kZXJlci51bnJlZ2lzdGVyU3BpbmUoKSAtIHNwaW5lIGlzIG5vdCByZWdpc3RlcmVkLCBjYW5cXCd0IHVucmVnaXN0ZXIhJywgc3BpbmUpO1xuXHRcdH1cblx0XHRjb25zdCBkZWJ1Z0Rpc3BsYXlPYmplY3RzID0gdGhpcy5yZWdpc3RlcmVkU3BpbmVzLmdldChzcGluZSk7XG5cblx0XHRpZiAoIWRlYnVnRGlzcGxheU9iamVjdHMpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzcGluZS5zdGF0ZS5yZW1vdmVMaXN0ZW5lcihkZWJ1Z0Rpc3BsYXlPYmplY3RzLmV2ZW50Q2FsbGJhY2spO1xuXG5cdFx0ZGVidWdEaXNwbGF5T2JqZWN0cy5wYXJlbnREZWJ1Z0NvbnRhaW5lci5kZXN0cm95KHsgdGV4dHVyZVNvdXJjZTogdHJ1ZSwgY2hpbGRyZW46IHRydWUsIHRleHR1cmU6IHRydWUgfSk7XG5cdFx0dGhpcy5yZWdpc3RlcmVkU3BpbmVzLmRlbGV0ZShzcGluZSk7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** ****************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated July 28, 2023. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2023, Esoteric Software LLC
|
|
6
|
+
*
|
|
7
|
+
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
+
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
+
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
+
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
+
*
|
|
12
|
+
* Otherwise, it is permitted to integrate the Spine Runtimes into software or
|
|
13
|
+
* otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
+
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
+
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
+
* include this license and copyright notice.
|
|
17
|
+
*
|
|
18
|
+
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
+
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE
|
|
27
|
+
* SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*****************************************************************************/
|
|
29
|
+
import { ExtensionType, InstructionSet, type Renderer, type RenderPipe } from 'pixi.js';
|
|
30
|
+
import { Spine } from './Spine';
|
|
31
|
+
export declare class SpinePipe implements RenderPipe<Spine> {
|
|
32
|
+
/** @ignore */
|
|
33
|
+
static extension: {
|
|
34
|
+
readonly type: readonly [ExtensionType.WebGLPipes, ExtensionType.WebGPUPipes, ExtensionType.CanvasPipes];
|
|
35
|
+
readonly name: "spine";
|
|
36
|
+
};
|
|
37
|
+
renderer: Renderer;
|
|
38
|
+
private gpuSpineData;
|
|
39
|
+
constructor(renderer: Renderer);
|
|
40
|
+
validateRenderable(spine: Spine): boolean;
|
|
41
|
+
addRenderable(spine: Spine, instructionSet: InstructionSet): void;
|
|
42
|
+
updateRenderable(spine: Spine): void;
|
|
43
|
+
destroyRenderable(spine: Spine): void;
|
|
44
|
+
destroy(): void;
|
|
45
|
+
}
|