(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
module.exports={
"positions": [
[
111.0246,
52.6046,
46.2259
],
[
114.025,
87.6733,
58.9818
],
[
66.192,
80.898,
55.3943
],
[
72.1133,
35.4918,
30.8714
],
[
97.8045,
116.561,
73.9788
],
[
16.7623,
58.0109,
58.0782
],
[
52.6089,
30.3641,
42.5561
],
[
106.8814,
31.9455,
46.9133
],
[
113.4846,
38.6049,
49.1215
],
[
108.6633,
43.2332,
46.3154
],
[
101.2166,
15.9822,
46.3082
],
[
16.6605,
-16.2883,
93.6187
],
[
40.775,
-10.2288,
85.2764
],
[
23.9269,
-2.5103,
86.7365
],
[
11.1691,
-7.0037,
99.3776
],
[
9.5692,
-34.3939,
141.672
],
[
12.596,
7.1655,
88.741
],
[
61.1809,
8.8142,
76.9968
],
[
39.7195,
-28.9271,
88.9638
],
[
13.7962,
-68.5757,
132.057
],
[
15.2674,
-62.32,
129.688
],
[
14.8446,
-52.6096,
140.113
],
[
12.8917,
-49.7716,
144.741
],
[
35.6042,
-71.758,
81.0639
],
[
47.4625,
-68.6061,
63.3697
],
[
38.2486,
-64.7302,
38.9099
],
[
-12.8917,
-49.7716,
144.741
],
[
-13.7962,
-68.5757,
132.057
],
[
17.8021,
-71.758,
81.0639
],
[
19.1243,
-69.0168,
49.4201
],
[
38.2486,
-66.2756,
17.7762
],
[
12.8928,
-36.7035,
141.672
],
[
109.284,
-93.5899,
27.8243
],
[
122.118,
-36.8894,
35.025
],
[
67.7668,
-30.197,
78.4178
],
[
33.1807,
101.852,
25.3186
],
[
9.4063,
-35.5898,
150.722
],
[
-9.5692,
-34.3939,
141.672
],
[
-9.4063,
-35.5898,
150.722
],
[
11.4565,
-37.8994,
150.722
],
[
-12.596,
7.1655,
88.741
],
[
-11.1691,
-7.0037,
99.3776
],
[
70.2365,
62.8362,
-3.9475
],
[
47.2634,
54.294,
-27.4148
],
[
28.7302,
91.7311,
-24.9726
],
[
69.1676,
6.5862,
-12.7757
],
[
28.7302,
49.1003,
-48.3596
],
[
31.903,
5.692,
-47.822
],
[
35.0758,
-34.4329,
-16.2809
],
[
115.2841,
48.6815,
48.6841
],
[
110.8428,
28.4821,
49.1762
],
[
-19.1243,
-69.0168,
49.4201
],
[
-38.2486,
-66.2756,
17.7762
],
[
-111.0246,
52.6046,
46.2259
],
[
-72.1133,
35.4918,
30.8714
],
[
-66.192,
80.898,
55.3943
],
[
-114.025,
87.6733,
58.9818
],
[
-97.8045,
116.561,
73.9788
],
[
-52.6089,
30.3641,
42.5561
],
[
-16.7623,
58.0109,
58.0782
],
[
-106.8814,
31.9455,
46.9133
],
[
-108.6633,
43.2332,
46.3154
],
[
-113.4846,
38.6049,
49.1215
],
[
-101.2166,
15.9822,
46.3082
],
[
-16.6605,
-16.2883,
93.6187
],
[
-23.9269,
-2.5103,
86.7365
],
[
-40.775,
-10.2288,
85.2764
],
[
-61.1809,
8.8142,
76.9968
],
[
-39.7195,
-28.9271,
88.9638
],
[
-14.8446,
-52.6096,
140.113
],
[
-15.2674,
-62.32,
129.688
],
[
-47.4625,
-68.6061,
63.3697
],
[
-35.6042,
-71.758,
81.0639
],
[
-38.2486,
-64.7302,
38.9099
],
[
-17.8021,
-71.758,
81.0639
],
[
-12.8928,
-36.7035,
141.672
],
[
-67.7668,
-30.197,
78.4178
],
[
-122.118,
-36.8894,
35.025
],
[
-109.284,
-93.5899,
27.8243
],
[
-33.1807,
101.852,
25.3186
],
[
-11.4565,
-37.8994,
150.722
],
[
-70.2365,
62.8362,
-3.9475
],
[
-28.7302,
91.7311,
-24.9726
],
[
-47.2634,
54.294,
-27.4148
],
[
-69.1676,
6.5862,
-12.7757
],
[
-28.7302,
49.1003,
-48.3596
],
[
-31.903,
5.692,
-47.822
],
[
-35.0758,
-34.4329,
-16.2809
],
[
-115.2841,
48.6815,
48.6841
],
[
-110.8428,
28.4821,
49.1762
]
],
"chunks": [
{
"color": [
246,
133,
27
],
"faces": [
[
17,
33,
10
],
[
17,
18,
34
],
[
34,
33,
17
],
[
10,
6,
17
],
[
11,
15,
31
],
[
31,
18,
11
],
[
18,
12,
11
],
[
14,
16,
40
],
[
40,
41,
14
],
[
59,
5,
35
],
[
35,
79,
59
],
[
67,
63,
77
],
[
67,
77,
76
],
[
76,
68,
67
],
[
63,
67,
58
],
[
64,
68,
75
],
[
75,
37,
64
],
[
68,
64,
66
],
[
14,
41,
37
],
[
37,
15,
14
],
[
5,
59,
40
],
[
40,
16,
5
]
]
},
{
"color": [
228,
118,
27
],
"faces": [
[
31,
24,
18
],
[
6,
5,
16
],
[
16,
17,
6
],
[
24,
32,
33
],
[
33,
34,
24
],
[
5,
4,
35
],
[
75,
68,
71
],
[
58,
67,
40
],
[
40,
59,
58
],
[
71,
76,
77
],
[
77,
78,
71
]
]
},
{
"color": [
118,
61,
22
],
"faces": [
[
0,
1,
2
],
[
2,
3,
0
],
[
4,
5,
2
],
[
6,
3,
2
],
[
2,
5,
6
],
[
7,
8,
9
],
[
10,
3,
6
],
[
10,
50,
7
],
[
7,
3,
10
],
[
7,
9,
3
],
[
49,
0,
9
],
[
3,
9,
0
],
[
53,
54,
55
],
[
55,
56,
53
],
[
57,
56,
55
],
[
58,
59,
55
],
[
55,
54,
58
],
[
60,
61,
62
],
[
63,
58,
54
],
[
63,
60,
89
],
[
60,
63,
54
],
[
60,
54,
61
],
[
88,
61,
53
],
[
54,
53,
61
],
[
2,
1,
4
],
[
55,
59,
57
]
]
},
{
"color": [
22,
22,
22
],
"faces": [
[
36,
15,
37
],
[
37,
38,
36
],
[
31,
39,
22
],
[
22,
21,
31
],
[
31,
15,
36
],
[
36,
39,
31
],
[
75,
69,
26
],
[
26,
80,
75
],
[
75,
80,
38
],
[
38,
37,
75
],
[
38,
80,
39
],
[
39,
36,
38
],
[
39,
80,
26
],
[
26,
22,
39
]
]
},
{
"color": [
215,
193,
179
],
"faces": [
[
21,
20,
24
],
[
24,
31,
21
],
[
69,
71,
70
],
[
71,
69,
75
]
]
},
{
"color": [
192,
173,
158
],
"faces": [
[
19,
20,
21
],
[
21,
22,
19
],
[
20,
19,
23
],
[
23,
24,
20
],
[
23,
25,
24
],
[
19,
22,
26
],
[
26,
27,
19
],
[
23,
28,
29
],
[
23,
29,
30
],
[
25,
23,
30
],
[
29,
51,
52
],
[
52,
30,
29
],
[
27,
26,
69
],
[
69,
70,
27
],
[
70,
71,
72
],
[
72,
27,
70
],
[
72,
71,
73
],
[
51,
74,
72
],
[
52,
51,
72
],
[
73,
52,
72
],
[
19,
27,
74
],
[
74,
28,
19
],
[
51,
29,
28
],
[
28,
74,
51
],
[
74,
27,
72
],
[
28,
23,
19
]
]
},
{
"color": [
205,
97,
22
],
"faces": [
[
24,
34,
18
],
[
16,
13,
12
],
[
12,
17,
16
],
[
13,
16,
11
],
[
71,
68,
76
],
[
40,
67,
66
],
[
66,
65,
40
],
[
65,
64,
40
]
]
},
{
"color": [
35,
52,
71
],
"faces": [
[
11,
12,
13
],
[
64,
65,
66
]
]
},
{
"color": [
228,
117,
31
],
"faces": [
[
14,
15,
11
],
[
11,
16,
14
],
[
17,
12,
18
],
[
41,
64,
37
],
[
67,
68,
66
]
]
},
{
"color": [
226,
118,
27
],
"faces": [
[
35,
4,
42
],
[
4,
1,
42
],
[
42,
43,
44
],
[
44,
35,
42
],
[
45,
43,
42
],
[
42,
10,
45
],
[
30,
32,
24
],
[
24,
25,
30
],
[
30,
33,
32
],
[
33,
30,
10
],
[
44,
43,
46
],
[
43,
45,
47
],
[
47,
46,
43
],
[
48,
47,
45
],
[
45,
30,
48
],
[
30,
45,
10
],
[
49,
42,
0
],
[
8,
7,
42
],
[
50,
42,
7
],
[
50,
10,
42
],
[
1,
0,
42
],
[
42,
9,
8
],
[
42,
49,
9
],
[
64,
41,
40
],
[
57,
59,
79
],
[
79,
81,
57
],
[
57,
81,
56
],
[
82,
79,
35
],
[
35,
44,
82
],
[
81,
79,
82
],
[
82,
83,
81
],
[
84,
63,
81
],
[
81,
83,
84
],
[
44,
46,
85
],
[
85,
82,
44
],
[
52,
73,
71
],
[
71,
78,
52
],
[
52,
78,
77
],
[
77,
63,
52
],
[
82,
85,
83
],
[
83,
85,
86
],
[
86,
84,
83
],
[
87,
52,
84
],
[
84,
86,
87
],
[
52,
63,
84
],
[
88,
53,
81
],
[
62,
81,
60
],
[
89,
60,
81
],
[
89,
81,
63
],
[
56,
81,
53
],
[
81,
62,
61
],
[
81,
61,
88
],
[
48,
87,
86
],
[
86,
47,
48
],
[
47,
86,
85
],
[
85,
46,
47
],
[
48,
30,
52
],
[
52,
87,
48
]
]
}
]
}
},{}],2:[function(require,module,exports){
var perspective = require('gl-mat4/perspective')
var multiply = require('gl-mat4/multiply')
var lookAt = require('gl-mat4/lookAt')
var invert = require('gl-mat4/invert')
var rotate = require('gl-mat4/rotate')
var transform = require('gl-vec3/transformMat4')
var foxJSON = require('./fox.json')
var SVG_NS = 'http://w...content-available-to-author-only...3.org/2000/svg'
function createNode (type) {
return document.createElementNS(SVG_NS, type)
}
function setAttribute (node, attribute, value) {
node.setAttributeNS(null, attribute, value)
}
module.exports = function createLogo (options_) {
var options = options_ || {}
var followCursor = !!options.followMouse
var slowDrift = !!options.slowDrift
var shouldRender = true
var DISTANCE = 400
var lookCurrent = [0, 0]
var lookRate = 0.3
var width = options.width || 400
var height = options.height || 400
var container = createNode('svg')
if (!options.pxNotRatio) {
width = (window.innerWidth * (options.width || 0.25)) | 0
height = ((window.innerHeight * options.height) || width) | 0
if ('minWidth' in options && width < options.minWidth) {
width = options.minWidth
height = (options.minWidth * options.height / options.width) | 0
}
}
setAttribute(container, 'width', width + 'px')
setAttribute(container, 'height', height + 'px')
var mouse = {
x: 0,
y: 0
}
window.addEventListener('mousemove', function (ev) {
if (followCursor) {
var target = {
x: ev.clientX,
y: ev.clientY,
}
setLookAt(target)
}
})
function setLookAt(target) {
var bounds = container.getBoundingClientRect()
mouse.x = 1.0 - 2.0 * (target.x - bounds.left) / bounds.width
mouse.y = 1.0 - 2.0 * (target.y - bounds.top) / bounds.height
}
document.body.appendChild(container)
var NUM_VERTS = foxJSON.positions.length
var positions = new Float32Array(3 * NUM_VERTS)
var transformed = new Float32Array(3 * NUM_VERTS)
;(function () {
var pp = foxJSON.positions
var ptr = 0
for (var i = 0; i < pp.length; ++i) {
var p = pp[i]
for (var j = 0; j < 3; ++j) {
positions[ptr++] = p[j]
}
}
})()
function Polygon (svg, indices) {
this.svg = svg
this.indices = indices
this.zIndex = 0
}
var polygons = (function () {
var polygons = []
for (var i = 0; i < foxJSON.chunks.length; ++i) {
var chunk = foxJSON.chunks[i]
var color = 'rgb(' + chunk.color + ')'
var faces = chunk.faces
for (var j = 0; j < faces.length; ++j) {
var f = faces[j]
var polygon = createNode('polygon')
setAttribute(
polygon,
'fill',
color)
setAttribute(
polygon,
'stroke',
color)
setAttribute(
polygon,
'points',
'0,0, 10,0, 0,10')
container.appendChild(polygon)
polygons.push(new Polygon(polygon, f))
}
}
return polygons
})()
var computeMatrix = (function () {
var objectCenter = new Float32Array(3)
var up = new Float32Array([0, 1, 0])
var projection = new Float32Array(16)
var model = new Float32Array(16)
var view = lookAt(
new Float32Array(16),
new Float32Array([0, 0, DISTANCE]),
objectCenter,
up)
var invView = invert(new Float32Array(16), view)
var invProjection = new Float32Array(16)
var target = new Float32Array(3)
var transformed = new Float32Array(16)
var X = new Float32Array([1, 0, 0])
var Y = new Float32Array([0, 1, 0])
var Z = new Float32Array([0, 0, 1])
return function () {
var rect = container.getBoundingClientRect()
var viewportWidth = rect.width
var viewportHeight = rect.height
perspective(
projection,
Math.PI / 4.0,
viewportWidth / viewportHeight,
100.0,
1000.0)
invert(invProjection, projection)
target[0] = lookCurrent[0]
target[1] = lookCurrent[1]
target[2] = 1.2
transform(target, target, invProjection)
transform(target, target, invView)
lookAt(
model,
objectCenter,
target,
up)
if (slowDrift) {
var time = (Date.now() / 1000.0)
rotate(model, model, 0.1 + (Math.sin(time / 3) * 0.2), X)
rotate(model, model, -0.1 + (Math.sin(time / 2) * 0.03), Z)
rotate(model, model, 0.5 + (Math.sin(time / 3) * 0.2), Y)
}
multiply(transformed, projection, view)
multiply(transformed, transformed, model)
return transformed
}
})()
function updatePositions (M) {
var m00 = M[0]
var m01 = M[1]
var m02 = M[2]
var m03 = M[3]
var m10 = M[4]
var m11 = M[5]
var m12 = M[6]
var m13 = M[7]
var m20 = M[8]
var m21 = M[9]
var m22 = M[10]
var m23 = M[11]
var m30 = M[12]
var m31 = M[13]
var m32 = M[14]
var m33 = M[15]
for (var i = 0; i < NUM_VERTS; ++i) {
var x = positions[3 * i]
var y = positions[3 * i + 1]
var z = positions[3 * i + 2]
var tw = x * m03 + y * m13 + z * m23 + m33
transformed[3 * i] =
(x * m00 + y * m10 + z * m20 + m30) / tw
transformed[3 * i + 1] =
(x * m01 + y * m11 + z * m21 + m31) / tw
transformed[3 * i + 2] =
(x * m02 + y * m12 + z * m22 + m32) / tw
}
}
function compareZ (a, b) {
return b.zIndex - a.zIndex
}
var toDraw = []
function updateFaces () {
var i
var rect = container.getBoundingClientRect()
var w = rect.width
var h = rect.height
toDraw.length = 0
for (i = 0; i < polygons.length; ++i) {
var poly = polygons[i]
var indices = poly.indices
var i0 = indices[0]
var i1 = indices[1]
var i2 = indices[2]
var ax = transformed[3 * i0]
var ay = transformed[3 * i0 + 1]
var bx = transformed[3 * i1]
var by = transformed[3 * i1 + 1]
var cx = transformed[3 * i2]
var cy = transformed[3 * i2 + 1]
var det = (bx - ax) * (cy - ay) - (by - ay) * (cx - ax)
if (det < 0) {
continue
}
var points = []
var zmax = -Infinity
var zmin = Infinity
var element = poly.svg
for (var j = 0; j < 3; ++j) {
var idx = indices[j]
points.push(
0.5 * w * (1.0 - transformed[3 * idx]) + ',' +
0.5 * h * (1.0 - transformed[3 * idx + 1]))
var z = transformed[3 * idx + 2]
zmax = Math.max(zmax, z)
zmin = Math.min(zmin, z)
}
poly.zIndex = zmax + 0.25 * zmin
var joinedPoints = points.join(' ')
if (joinedPoints.indexOf('NaN') === -1) {
setAttribute(element, 'points', joinedPoints)
}
toDraw.push(poly)
}
toDraw.sort(compareZ)
container.innerHTML = ''
for (i = 0; i < toDraw.length; ++i) {
container.appendChild(toDraw[i].svg)
}
}
function renderScene () {
if (!shouldRender) return
window.requestAnimationFrame(renderScene)
var li = (1.0 - lookRate)
var bounds = container.getBoundingClientRect()
lookCurrent[0] = li * lookCurrent[0] + lookRate * mouse.x
lookCurrent[1] = li * lookCurrent[1] + lookRate * mouse.y + 0.085
var matrix = computeMatrix()
updatePositions(matrix)
updateFaces()
}
renderScene()
return {
container: container,
lookAt: setLookAt,
setFollowMouse: setFollowMouse,
stopAnimation: stopAnimation,
startAnimation: startAnimation,
}
function stopAnimation() {
shouldRender = false
}
function startAnimation() {
shouldRender = true
}
function setFollowMouse (state) {
followCursor = state
}
}
},{"./fox.json":1,"gl-mat4/invert":4,"gl-mat4/lookAt":5,"gl-mat4/multiply":6,"gl-mat4/perspective":7,"gl-mat4/rotate":8,"gl-vec3/transformMat4":9}],3:[function(require,module,exports){
module.exports = identity;
/**
* Set a mat4 to the identity matrix
*
* @param {mat4} out the receiving matrix
* @returns {mat4} out
*/
function identity(out) {
out[0] = 1;
out[1] = 0;
out[2] = 0;
out[3] = 0;
out[4] = 0;
out[5] = 1;
out[6] = 0;
out[7] = 0;
out[8] = 0;
out[9] = 0;
out[10] = 1;
out[11] = 0;
out[12] = 0;
out[13] = 0;
out[14] = 0;
out[15] = 1;
return out;
};
},{}],4:[function(require,module,exports){
module.exports = invert;
/**
* Inverts a mat4
*
* @param {mat4} out the receiving matrix
* @param {mat4} a the source matrix
* @returns {mat4} out
*/
function invert(out, a) {
var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],
a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],
a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],
b00 = a00 * a11 - a01 * a10,
b01 = a00 * a12 - a02 * a10,
b02 = a00 * a13 - a03 * a10,
b03 = a01 * a12 - a02 * a11,
b04 = a01 * a13 - a03 * a11,
b05 = a02 * a13 - a03 * a12,
b06 = a20 * a31 - a21 * a30,
b07 = a20 * a32 - a22 * a30,
b08 = a20 * a33 - a23 * a30,
b09 = a21 * a32 - a22 * a31,
b10 = a21 * a33 - a23 * a31,
b11 = a22 * a33 - a23 * a32,
// Calculate the determinant
det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
if (!det) {
return null;
}
det = 1.0 / det;
out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;
out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;
out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;
out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;
out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;
out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;
out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;
return out;
};
},{}],5:[function(require,module,exports){
var identity = require('./identity');
module.exports = lookAt;
/**
* Generates a look-at matrix with the given eye position, focal point, and up axis
*
* @param {mat4} out mat4 frustum matrix will be written into
* @param {vec3} eye Position of the viewer
* @param {vec3} center Point the viewer is looking at
* @param {vec3} up vec3 pointing up
* @returns {mat4} out
*/
function lookAt(out, eye, center, up) {
var x0, x1, x2, y0, y1, y2, z0, z1, z2, len,
eyex = eye[0],
eyey = eye[1],
eyez = eye[2],
upx = up[0],
upy = up[1],
upz = up[2],
centerx = center[0],
centery = center[1],
centerz = center[2];
if (Math.abs(eyex - centerx) < 0.000001 &&
Math.abs(eyey - centery) < 0.000001 &&
Math.abs(eyez - centerz) < 0.000001) {
return identity(out);
}
z0 = eyex - centerx;
z1 = eyey - centery;
z2 = eyez - centerz;
len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);
z0 *= len;
z1 *= len;
z2 *= len;
x0 = upy * z2 - upz * z1;
x1 = upz * z0 - upx * z2;
x2 = upx * z1 - upy * z0;
len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);
if (!len) {
x0 = 0;
x1 = 0;
x2 = 0;
} else {
len = 1 / len;
x0 *= len;
x1 *= len;
x2 *= len;
}
y0 = z1 * x2 - z2 * x1;
y1 = z2 * x0 - z0 * x2;
y2 = z0 * x1 - z1 * x0;
len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);
if (!len) {
y0 = 0;
y1 = 0;
y2 = 0;
} else {
len = 1 / len;
y0 *= len;
y1 *= len;
y2 *= len;
}
out[0] = x0;
out[1] = y0;
out[2] = z0;
out[3] = 0;
out[4] = x1;
out[5] = y1;
out[6] = z1;
out[7] = 0;
out[8] = x2;
out[9] = y2;
out[10] = z2;
out[11] = 0;
out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
out[15] = 1;
return out;
};
},{"./identity":3}],6:[function(require,module,exports){
module.exports = multiply;
/**
* Multiplies two mat4's
*
* @param {mat4} out the receiving matrix
* @param {mat4} a the first operand
* @param {mat4} b the second operand
* @returns {mat4} out
*/
function multiply(out, a, b) {
var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],
a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],
a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];
// Cache only the current line of the second matrix
var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];
out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7];
out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11];
out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15];
out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
return out;
};
},{}],7:[function(require,module,exports){
module.exports = perspective;
/**
* Generates a perspective projection matrix with the given bounds
*
* @param {mat4} out mat4 frustum matrix will be written into
* @param {number} fovy Vertical field of view in radians
* @param {number} aspect Aspect ratio. typically viewport width/height
* @param {number} near Near bound of the frustum
* @param {number} far Far bound of the frustum
* @returns {mat4} out
*/
function perspective(out, fovy, aspect, near, far) {
var f = 1.0 / Math.tan(fovy / 2),
nf = 1 / (near - far);
out[0] = f / aspect;
out[1] = 0;
out[2] = 0;
out[3] = 0;
out[4] = 0;
out[5] = f;
out[6] = 0;
out[7] = 0;
out[8] = 0;
out[9] = 0;
out[10] = (far + near) * nf;
out[11] = -1;
out[12] = 0;
out[13] = 0;
out[14] = (2 * far * near) * nf;
out[15] = 0;
return out;
};
},{}],8:[function(require,module,exports){
module.exports = rotate;
/**
* Rotates a mat4 by the given angle
*
* @param {mat4} out the receiving matrix
* @param {mat4} a the matrix to rotate
* @param {Number} rad the angle to rotate the matrix by
* @param {vec3} axis the axis to rotate around
* @returns {mat4} out
*/
function rotate(out, a, rad, axis) {
var x = axis[0], y = axis[1], z = axis[2],
len = Math.sqrt(x * x + y * y + z * z),
s, c, t,
a00, a01, a02, a03,
a10, a11, a12, a13,
a20, a21, a22, a23,
b00, b01, b02,
b10, b11, b12,
b20, b21, b22;
if (Math.abs(len) < 0.000001) { return null; }
len = 1 / len;
x *= len;
y *= len;
z *= len;
s = Math.sin(rad);
c = Math.cos(rad);
t = 1 - c;
a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];
a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];
a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];
// Construct the elements of the rotation matrix
b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s;
b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s;
b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c;
// Perform rotation-specific matrix multiplication
out[0] = a00 * b00 + a10 * b01 + a20 * b02;
out[1] = a01 * b00 + a11 * b01 + a21 * b02;
out[2] = a02 * b00 + a12 * b01 + a22 * b02;
out[3] = a03 * b00 + a13 * b01 + a23 * b02;
out[4] = a00 * b10 + a10 * b11 + a20 * b12;
out[5] = a01 * b10 + a11 * b11 + a21 * b12;
out[6] = a02 * b10 + a12 * b11 + a22 * b12;
out[7] = a03 * b10 + a13 * b11 + a23 * b12;
out[8] = a00 * b20 + a10 * b21 + a20 * b22;
out[9] = a01 * b20 + a11 * b21 + a21 * b22;
out[10] = a02 * b20 + a12 * b21 + a22 * b22;
out[11] = a03 * b20 + a13 * b21 + a23 * b22;
if (a !== out) { // If the source and destination differ, copy the unchanged last row
out[12] = a[12];
out[13] = a[13];
out[14] = a[14];
out[15] = a[15];
}
return out;
};
},{}],9:[function(require,module,exports){
module.exports = transformMat4;
/**
* Transforms the vec3 with a mat4.
* 4th vector component is implicitly '1'
*
* @param {vec3} out the receiving vector
* @param {vec3} a the vector to transform
* @param {mat4} m matrix to transform with
* @returns {vec3} out
*/
function transformMat4(out, a, m) {
var x = a[0], y = a[1], z = a[2],
w = m[3] * x + m[7] * y + m[11] * z + m[15]
w = w || 1.0
out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w
out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w
out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w
return out
}
},{}],10:[function(require,module,exports){
var ModelViewer = require('metamask-logo')
var isMobile = !!detectMobile()
injectMascot()
function injectMascot(){
// get container from DOM
var container = document.getElementById('logo-container')
if (!container) return
// To render with fixed dimensions:
var viewer = ModelViewer({
// Dictates whether width & height are px or multiplied
pxNotRatio: false,
width: 0.10,
height: 0.10,
minWidth: 200,
followMouse: !isMobile,
slowDrift: isMobile,
})
// add viewer to DOM
container.appendChild(viewer.container)
}
function detectMobile() {
return (
navigator.userAgent.match(/Android/i)
|| navigator.userAgent.match(/webOS/i)
|| navigator.userAgent.match(/iPhone/i)
|| navigator.userAgent.match(/iPad/i)
|| navigator.userAgent.match(/iPod/i)
|| navigator.userAgent.match(/BlackBerry/i)
|| navigator.userAgent.match(/Windows Phone/i)
)
}
},{"metamask-logo":2}]},{},[10]);
// your code goes here
KGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cm1vZHVsZS5leHBvcnRzPXsKICAicG9zaXRpb25zIjogWwogICAgWwogICAgICAxMTEuMDI0NiwKICAgICAgNTIuNjA0NiwKICAgICAgNDYuMjI1OQogICAgXSwKICAgIFsKICAgICAgMTE0LjAyNSwKICAgICAgODcuNjczMywKICAgICAgNTguOTgxOAogICAgXSwKICAgIFsKICAgICAgNjYuMTkyLAogICAgICA4MC44OTgsCiAgICAgIDU1LjM5NDMKICAgIF0sCiAgICBbCiAgICAgIDcyLjExMzMsCiAgICAgIDM1LjQ5MTgsCiAgICAgIDMwLjg3MTQKICAgIF0sCiAgICBbCiAgICAgIDk3LjgwNDUsCiAgICAgIDExNi41NjEsCiAgICAgIDczLjk3ODgKICAgIF0sCiAgICBbCiAgICAgIDE2Ljc2MjMsCiAgICAgIDU4LjAxMDksCiAgICAgIDU4LjA3ODIKICAgIF0sCiAgICBbCiAgICAgIDUyLjYwODksCiAgICAgIDMwLjM2NDEsCiAgICAgIDQyLjU1NjEKICAgIF0sCiAgICBbCiAgICAgIDEwNi44ODE0LAogICAgICAzMS45NDU1LAogICAgICA0Ni45MTMzCiAgICBdLAogICAgWwogICAgICAxMTMuNDg0NiwKICAgICAgMzguNjA0OSwKICAgICAgNDkuMTIxNQogICAgXSwKICAgIFsKICAgICAgMTA4LjY2MzMsCiAgICAgIDQzLjIzMzIsCiAgICAgIDQ2LjMxNTQKICAgIF0sCiAgICBbCiAgICAgIDEwMS4yMTY2LAogICAgICAxNS45ODIyLAogICAgICA0Ni4zMDgyCiAgICBdLAogICAgWwogICAgICAxNi42NjA1LAogICAgICAtMTYuMjg4MywKICAgICAgOTMuNjE4NwogICAgXSwKICAgIFsKICAgICAgNDAuNzc1LAogICAgICAtMTAuMjI4OCwKICAgICAgODUuMjc2NAogICAgXSwKICAgIFsKICAgICAgMjMuOTI2OSwKICAgICAgLTIuNTEwMywKICAgICAgODYuNzM2NQogICAgXSwKICAgIFsKICAgICAgMTEuMTY5MSwKICAgICAgLTcuMDAzNywKICAgICAgOTkuMzc3NgogICAgXSwKICAgIFsKICAgICAgOS41NjkyLAogICAgICAtMzQuMzkzOSwKICAgICAgMTQxLjY3MgogICAgXSwKICAgIFsKICAgICAgMTIuNTk2LAogICAgICA3LjE2NTUsCiAgICAgIDg4Ljc0MQogICAgXSwKICAgIFsKICAgICAgNjEuMTgwOSwKICAgICAgOC44MTQyLAogICAgICA3Ni45OTY4CiAgICBdLAogICAgWwogICAgICAzOS43MTk1LAogICAgICAtMjguOTI3MSwKICAgICAgODguOTYzOAogICAgXSwKICAgIFsKICAgICAgMTMuNzk2MiwKICAgICAgLTY4LjU3NTcsCiAgICAgIDEzMi4wNTcKICAgIF0sCiAgICBbCiAgICAgIDE1LjI2NzQsCiAgICAgIC02Mi4zMiwKICAgICAgMTI5LjY4OAogICAgXSwKICAgIFsKICAgICAgMTQuODQ0NiwKICAgICAgLTUyLjYwOTYsCiAgICAgIDE0MC4xMTMKICAgIF0sCiAgICBbCiAgICAgIDEyLjg5MTcsCiAgICAgIC00OS43NzE2LAogICAgICAxNDQuNzQxCiAgICBdLAogICAgWwogICAgICAzNS42MDQyLAogICAgICAtNzEuNzU4LAogICAgICA4MS4wNjM5CiAgICBdLAogICAgWwogICAgICA0Ny40NjI1LAogICAgICAtNjguNjA2MSwKICAgICAgNjMuMzY5NwogICAgXSwKICAgIFsKICAgICAgMzguMjQ4NiwKICAgICAgLTY0LjczMDIsCiAgICAgIDM4LjkwOTkKICAgIF0sCiAgICBbCiAgICAgIC0xMi44OTE3LAogICAgICAtNDkuNzcxNiwKICAgICAgMTQ0Ljc0MQogICAgXSwKICAgIFsKICAgICAgLTEzLjc5NjIsCiAgICAgIC02OC41NzU3LAogICAgICAxMzIuMDU3CiAgICBdLAogICAgWwogICAgICAxNy44MDIxLAogICAgICAtNzEuNzU4LAogICAgICA4MS4wNjM5CiAgICBdLAogICAgWwogICAgICAxOS4xMjQzLAogICAgICAtNjkuMDE2OCwKICAgICAgNDkuNDIwMQogICAgXSwKICAgIFsKICAgICAgMzguMjQ4NiwKICAgICAgLTY2LjI3NTYsCiAgICAgIDE3Ljc3NjIKICAgIF0sCiAgICBbCiAgICAgIDEyLjg5MjgsCiAgICAgIC0zNi43MDM1LAogICAgICAxNDEuNjcyCiAgICBdLAogICAgWwogICAgICAxMDkuMjg0LAogICAgICAtOTMuNTg5OSwKICAgICAgMjcuODI0MwogICAgXSwKICAgIFsKICAgICAgMTIyLjExOCwKICAgICAgLTM2Ljg4OTQsCiAgICAgIDM1LjAyNQogICAgXSwKICAgIFsKICAgICAgNjcuNzY2OCwKICAgICAgLTMwLjE5NywKICAgICAgNzguNDE3OAogICAgXSwKICAgIFsKICAgICAgMzMuMTgwNywKICAgICAgMTAxLjg1MiwKICAgICAgMjUuMzE4NgogICAgXSwKICAgIFsKICAgICAgOS40MDYzLAogICAgICAtMzUuNTg5OCwKICAgICAgMTUwLjcyMgogICAgXSwKICAgIFsKICAgICAgLTkuNTY5MiwKICAgICAgLTM0LjM5MzksCiAgICAgIDE0MS42NzIKICAgIF0sCiAgICBbCiAgICAgIC05LjQwNjMsCiAgICAgIC0zNS41ODk4LAogICAgICAxNTAuNzIyCiAgICBdLAogICAgWwogICAgICAxMS40NTY1LAogICAgICAtMzcuODk5NCwKICAgICAgMTUwLjcyMgogICAgXSwKICAgIFsKICAgICAgLTEyLjU5NiwKICAgICAgNy4xNjU1LAogICAgICA4OC43NDEKICAgIF0sCiAgICBbCiAgICAgIC0xMS4xNjkxLAogICAgICAtNy4wMDM3LAogICAgICA5OS4zNzc2CiAgICBdLAogICAgWwogICAgICA3MC4yMzY1LAogICAgICA2Mi44MzYyLAogICAgICAtMy45NDc1CiAgICBdLAogICAgWwogICAgICA0Ny4yNjM0LAogICAgICA1NC4yOTQsCiAgICAgIC0yNy40MTQ4CiAgICBdLAogICAgWwogICAgICAyOC43MzAyLAogICAgICA5MS43MzExLAogICAgICAtMjQuOTcyNgogICAgXSwKICAgIFsKICAgICAgNjkuMTY3NiwKICAgICAgNi41ODYyLAogICAgICAtMTIuNzc1NwogICAgXSwKICAgIFsKICAgICAgMjguNzMwMiwKICAgICAgNDkuMTAwMywKICAgICAgLTQ4LjM1OTYKICAgIF0sCiAgICBbCiAgICAgIDMxLjkwMywKICAgICAgNS42OTIsCiAgICAgIC00Ny44MjIKICAgIF0sCiAgICBbCiAgICAgIDM1LjA3NTgsCiAgICAgIC0zNC40MzI5LAogICAgICAtMTYuMjgwOQogICAgXSwKICAgIFsKICAgICAgMTE1LjI4NDEsCiAgICAgIDQ4LjY4MTUsCiAgICAgIDQ4LjY4NDEKICAgIF0sCiAgICBbCiAgICAgIDExMC44NDI4LAogICAgICAyOC40ODIxLAogICAgICA0OS4xNzYyCiAgICBdLAogICAgWwogICAgICAtMTkuMTI0MywKICAgICAgLTY5LjAxNjgsCiAgICAgIDQ5LjQyMDEKICAgIF0sCiAgICBbCiAgICAgIC0zOC4yNDg2LAogICAgICAtNjYuMjc1NiwKICAgICAgMTcuNzc2MgogICAgXSwKICAgIFsKICAgICAgLTExMS4wMjQ2LAogICAgICA1Mi42MDQ2LAogICAgICA0Ni4yMjU5CiAgICBdLAogICAgWwogICAgICAtNzIuMTEzMywKICAgICAgMzUuNDkxOCwKICAgICAgMzAuODcxNAogICAgXSwKICAgIFsKICAgICAgLTY2LjE5MiwKICAgICAgODAuODk4LAogICAgICA1NS4zOTQzCiAgICBdLAogICAgWwogICAgICAtMTE0LjAyNSwKICAgICAgODcuNjczMywKICAgICAgNTguOTgxOAogICAgXSwKICAgIFsKICAgICAgLTk3LjgwNDUsCiAgICAgIDExNi41NjEsCiAgICAgIDczLjk3ODgKICAgIF0sCiAgICBbCiAgICAgIC01Mi42MDg5LAogICAgICAzMC4zNjQxLAogICAgICA0Mi41NTYxCiAgICBdLAogICAgWwogICAgICAtMTYuNzYyMywKICAgICAgNTguMDEwOSwKICAgICAgNTguMDc4MgogICAgXSwKICAgIFsKICAgICAgLTEwNi44ODE0LAogICAgICAzMS45NDU1LAogICAgICA0Ni45MTMzCiAgICBdLAogICAgWwogICAgICAtMTA4LjY2MzMsCiAgICAgIDQzLjIzMzIsCiAgICAgIDQ2LjMxNTQKICAgIF0sCiAgICBbCiAgICAgIC0xMTMuNDg0NiwKICAgICAgMzguNjA0OSwKICAgICAgNDkuMTIxNQogICAgXSwKICAgIFsKICAgICAgLTEwMS4yMTY2LAogICAgICAxNS45ODIyLAogICAgICA0Ni4zMDgyCiAgICBdLAogICAgWwogICAgICAtMTYuNjYwNSwKICAgICAgLTE2LjI4ODMsCiAgICAgIDkzLjYxODcKICAgIF0sCiAgICBbCiAgICAgIC0yMy45MjY5LAogICAgICAtMi41MTAzLAogICAgICA4Ni43MzY1CiAgICBdLAogICAgWwogICAgICAtNDAuNzc1LAogICAgICAtMTAuMjI4OCwKICAgICAgODUuMjc2NAogICAgXSwKICAgIFsKICAgICAgLTYxLjE4MDksCiAgICAgIDguODE0MiwKICAgICAgNzYuOTk2OAogICAgXSwKICAgIFsKICAgICAgLTM5LjcxOTUsCiAgICAgIC0yOC45MjcxLAogICAgICA4OC45NjM4CiAgICBdLAogICAgWwogICAgICAtMTQuODQ0NiwKICAgICAgLTUyLjYwOTYsCiAgICAgIDE0MC4xMTMKICAgIF0sCiAgICBbCiAgICAgIC0xNS4yNjc0LAogICAgICAtNjIuMzIsCiAgICAgIDEyOS42ODgKICAgIF0sCiAgICBbCiAgICAgIC00Ny40NjI1LAogICAgICAtNjguNjA2MSwKICAgICAgNjMuMzY5NwogICAgXSwKICAgIFsKICAgICAgLTM1LjYwNDIsCiAgICAgIC03MS43NTgsCiAgICAgIDgxLjA2MzkKICAgIF0sCiAgICBbCiAgICAgIC0zOC4yNDg2LAogICAgICAtNjQuNzMwMiwKICAgICAgMzguOTA5OQogICAgXSwKICAgIFsKICAgICAgLTE3LjgwMjEsCiAgICAgIC03MS43NTgsCiAgICAgIDgxLjA2MzkKICAgIF0sCiAgICBbCiAgICAgIC0xMi44OTI4LAogICAgICAtMzYuNzAzNSwKICAgICAgMTQxLjY3MgogICAgXSwKICAgIFsKICAgICAgLTY3Ljc2NjgsCiAgICAgIC0zMC4xOTcsCiAgICAgIDc4LjQxNzgKICAgIF0sCiAgICBbCiAgICAgIC0xMjIuMTE4LAogICAgICAtMzYuODg5NCwKICAgICAgMzUuMDI1CiAgICBdLAogICAgWwogICAgICAtMTA5LjI4NCwKICAgICAgLTkzLjU4OTksCiAgICAgIDI3LjgyNDMKICAgIF0sCiAgICBbCiAgICAgIC0zMy4xODA3LAogICAgICAxMDEuODUyLAogICAgICAyNS4zMTg2CiAgICBdLAogICAgWwogICAgICAtMTEuNDU2NSwKICAgICAgLTM3Ljg5OTQsCiAgICAgIDE1MC43MjIKICAgIF0sCiAgICBbCiAgICAgIC03MC4yMzY1LAogICAgICA2Mi44MzYyLAogICAgICAtMy45NDc1CiAgICBdLAogICAgWwogICAgICAtMjguNzMwMiwKICAgICAgOTEuNzMxMSwKICAgICAgLTI0Ljk3MjYKICAgIF0sCiAgICBbCiAgICAgIC00Ny4yNjM0LAogICAgICA1NC4yOTQsCiAgICAgIC0yNy40MTQ4CiAgICBdLAogICAgWwogICAgICAtNjkuMTY3NiwKICAgICAgNi41ODYyLAogICAgICAtMTIuNzc1NwogICAgXSwKICAgIFsKICAgICAgLTI4LjczMDIsCiAgICAgIDQ5LjEwMDMsCiAgICAgIC00OC4zNTk2CiAgICBdLAogICAgWwogICAgICAtMzEuOTAzLAogICAgICA1LjY5MiwKICAgICAgLTQ3LjgyMgogICAgXSwKICAgIFsKICAgICAgLTM1LjA3NTgsCiAgICAgIC0zNC40MzI5LAogICAgICAtMTYuMjgwOQogICAgXSwKICAgIFsKICAgICAgLTExNS4yODQxLAogICAgICA0OC42ODE1LAogICAgICA0OC42ODQxCiAgICBdLAogICAgWwogICAgICAtMTEwLjg0MjgsCiAgICAgIDI4LjQ4MjEsCiAgICAgIDQ5LjE3NjIKICAgIF0KICBdLAogICJjaHVua3MiOiBbCiAgICB7CiAgICAgICJjb2xvciI6IFsKICAgICAgICAyNDYsCiAgICAgICAgMTMzLAogICAgICAgIDI3CiAgICAgIF0sCiAgICAgICJmYWNlcyI6IFsKICAgICAgICBbCiAgICAgICAgICAxNywKICAgICAgICAgIDMzLAogICAgICAgICAgMTAKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDE3LAogICAgICAgICAgMTgsCiAgICAgICAgICAzNAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMzQsCiAgICAgICAgICAzMywKICAgICAgICAgIDE3CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAxMCwKICAgICAgICAgIDYsCiAgICAgICAgICAxNwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMTEsCiAgICAgICAgICAxNSwKICAgICAgICAgIDMxCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAzMSwKICAgICAgICAgIDE4LAogICAgICAgICAgMTEKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDE4LAogICAgICAgICAgMTIsCiAgICAgICAgICAxMQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMTQsCiAgICAgICAgICAxNiwKICAgICAgICAgIDQwCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA0MCwKICAgICAgICAgIDQxLAogICAgICAgICAgMTQKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDU5LAogICAgICAgICAgNSwKICAgICAgICAgIDM1CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAzNSwKICAgICAgICAgIDc5LAogICAgICAgICAgNTkKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDY3LAogICAgICAgICAgNjMsCiAgICAgICAgICA3NwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNjcsCiAgICAgICAgICA3NywKICAgICAgICAgIDc2CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA3NiwKICAgICAgICAgIDY4LAogICAgICAgICAgNjcKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDYzLAogICAgICAgICAgNjcsCiAgICAgICAgICA1OAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNjQsCiAgICAgICAgICA2OCwKICAgICAgICAgIDc1CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA3NSwKICAgICAgICAgIDM3LAogICAgICAgICAgNjQKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDY4LAogICAgICAgICAgNjQsCiAgICAgICAgICA2NgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMTQsCiAgICAgICAgICA0MSwKICAgICAgICAgIDM3CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAzNywKICAgICAgICAgIDE1LAogICAgICAgICAgMTQKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDUsCiAgICAgICAgICA1OSwKICAgICAgICAgIDQwCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA0MCwKICAgICAgICAgIDE2LAogICAgICAgICAgNQogICAgICAgIF0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgImNvbG9yIjogWwogICAgICAgIDIyOCwKICAgICAgICAxMTgsCiAgICAgICAgMjcKICAgICAgXSwKICAgICAgImZhY2VzIjogWwogICAgICAgIFsKICAgICAgICAgIDMxLAogICAgICAgICAgMjQsCiAgICAgICAgICAxOAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNiwKICAgICAgICAgIDUsCiAgICAgICAgICAxNgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMTYsCiAgICAgICAgICAxNywKICAgICAgICAgIDYKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDI0LAogICAgICAgICAgMzIsCiAgICAgICAgICAzMwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMzMsCiAgICAgICAgICAzNCwKICAgICAgICAgIDI0CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA1LAogICAgICAgICAgNCwKICAgICAgICAgIDM1CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA3NSwKICAgICAgICAgIDY4LAogICAgICAgICAgNzEKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDU4LAogICAgICAgICAgNjcsCiAgICAgICAgICA0MAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNDAsCiAgICAgICAgICA1OSwKICAgICAgICAgIDU4CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA3MSwKICAgICAgICAgIDc2LAogICAgICAgICAgNzcKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDc3LAogICAgICAgICAgNzgsCiAgICAgICAgICA3MQogICAgICAgIF0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgImNvbG9yIjogWwogICAgICAgIDExOCwKICAgICAgICA2MSwKICAgICAgICAyMgogICAgICBdLAogICAgICAiZmFjZXMiOiBbCiAgICAgICAgWwogICAgICAgICAgMCwKICAgICAgICAgIDEsCiAgICAgICAgICAyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAyLAogICAgICAgICAgMywKICAgICAgICAgIDAKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDQsCiAgICAgICAgICA1LAogICAgICAgICAgMgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNiwKICAgICAgICAgIDMsCiAgICAgICAgICAyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAyLAogICAgICAgICAgNSwKICAgICAgICAgIDYKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDcsCiAgICAgICAgICA4LAogICAgICAgICAgOQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMTAsCiAgICAgICAgICAzLAogICAgICAgICAgNgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMTAsCiAgICAgICAgICA1MCwKICAgICAgICAgIDcKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDcsCiAgICAgICAgICAzLAogICAgICAgICAgMTAKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDcsCiAgICAgICAgICA5LAogICAgICAgICAgMwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNDksCiAgICAgICAgICAwLAogICAgICAgICAgOQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMywKICAgICAgICAgIDksCiAgICAgICAgICAwCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA1MywKICAgICAgICAgIDU0LAogICAgICAgICAgNTUKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDU1LAogICAgICAgICAgNTYsCiAgICAgICAgICA1MwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNTcsCiAgICAgICAgICA1NiwKICAgICAgICAgIDU1CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA1OCwKICAgICAgICAgIDU5LAogICAgICAgICAgNTUKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDU1LAogICAgICAgICAgNTQsCiAgICAgICAgICA1OAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNjAsCiAgICAgICAgICA2MSwKICAgICAgICAgIDYyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA2MywKICAgICAgICAgIDU4LAogICAgICAgICAgNTQKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDYzLAogICAgICAgICAgNjAsCiAgICAgICAgICA4OQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNjAsCiAgICAgICAgICA2MywKICAgICAgICAgIDU0CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA2MCwKICAgICAgICAgIDU0LAogICAgICAgICAgNjEKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDg4LAogICAgICAgICAgNjEsCiAgICAgICAgICA1MwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNTQsCiAgICAgICAgICA1MywKICAgICAgICAgIDYxCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAyLAogICAgICAgICAgMSwKICAgICAgICAgIDQKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDU1LAogICAgICAgICAgNTksCiAgICAgICAgICA1NwogICAgICAgIF0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgImNvbG9yIjogWwogICAgICAgIDIyLAogICAgICAgIDIyLAogICAgICAgIDIyCiAgICAgIF0sCiAgICAgICJmYWNlcyI6IFsKICAgICAgICBbCiAgICAgICAgICAzNiwKICAgICAgICAgIDE1LAogICAgICAgICAgMzcKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDM3LAogICAgICAgICAgMzgsCiAgICAgICAgICAzNgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMzEsCiAgICAgICAgICAzOSwKICAgICAgICAgIDIyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAyMiwKICAgICAgICAgIDIxLAogICAgICAgICAgMzEKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDMxLAogICAgICAgICAgMTUsCiAgICAgICAgICAzNgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMzYsCiAgICAgICAgICAzOSwKICAgICAgICAgIDMxCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA3NSwKICAgICAgICAgIDY5LAogICAgICAgICAgMjYKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDI2LAogICAgICAgICAgODAsCiAgICAgICAgICA3NQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNzUsCiAgICAgICAgICA4MCwKICAgICAgICAgIDM4CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAzOCwKICAgICAgICAgIDM3LAogICAgICAgICAgNzUKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDM4LAogICAgICAgICAgODAsCiAgICAgICAgICAzOQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMzksCiAgICAgICAgICAzNiwKICAgICAgICAgIDM4CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAzOSwKICAgICAgICAgIDgwLAogICAgICAgICAgMjYKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDI2LAogICAgICAgICAgMjIsCiAgICAgICAgICAzOQogICAgICAgIF0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgImNvbG9yIjogWwogICAgICAgIDIxNSwKICAgICAgICAxOTMsCiAgICAgICAgMTc5CiAgICAgIF0sCiAgICAgICJmYWNlcyI6IFsKICAgICAgICBbCiAgICAgICAgICAyMSwKICAgICAgICAgIDIwLAogICAgICAgICAgMjQKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDI0LAogICAgICAgICAgMzEsCiAgICAgICAgICAyMQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNjksCiAgICAgICAgICA3MSwKICAgICAgICAgIDcwCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA3MSwKICAgICAgICAgIDY5LAogICAgICAgICAgNzUKICAgICAgICBdCiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJjb2xvciI6IFsKICAgICAgICAxOTIsCiAgICAgICAgMTczLAogICAgICAgIDE1OAogICAgICBdLAogICAgICAiZmFjZXMiOiBbCiAgICAgICAgWwogICAgICAgICAgMTksCiAgICAgICAgICAyMCwKICAgICAgICAgIDIxCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAyMSwKICAgICAgICAgIDIyLAogICAgICAgICAgMTkKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDIwLAogICAgICAgICAgMTksCiAgICAgICAgICAyMwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMjMsCiAgICAgICAgICAyNCwKICAgICAgICAgIDIwCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAyMywKICAgICAgICAgIDI1LAogICAgICAgICAgMjQKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDE5LAogICAgICAgICAgMjIsCiAgICAgICAgICAyNgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMjYsCiAgICAgICAgICAyNywKICAgICAgICAgIDE5CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAyMywKICAgICAgICAgIDI4LAogICAgICAgICAgMjkKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDIzLAogICAgICAgICAgMjksCiAgICAgICAgICAzMAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMjUsCiAgICAgICAgICAyMywKICAgICAgICAgIDMwCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAyOSwKICAgICAgICAgIDUxLAogICAgICAgICAgNTIKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDUyLAogICAgICAgICAgMzAsCiAgICAgICAgICAyOQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMjcsCiAgICAgICAgICAyNiwKICAgICAgICAgIDY5CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA2OSwKICAgICAgICAgIDcwLAogICAgICAgICAgMjcKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDcwLAogICAgICAgICAgNzEsCiAgICAgICAgICA3MgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNzIsCiAgICAgICAgICAyNywKICAgICAgICAgIDcwCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA3MiwKICAgICAgICAgIDcxLAogICAgICAgICAgNzMKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDUxLAogICAgICAgICAgNzQsCiAgICAgICAgICA3MgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNTIsCiAgICAgICAgICA1MSwKICAgICAgICAgIDcyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA3MywKICAgICAgICAgIDUyLAogICAgICAgICAgNzIKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDE5LAogICAgICAgICAgMjcsCiAgICAgICAgICA3NAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNzQsCiAgICAgICAgICAyOCwKICAgICAgICAgIDE5CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA1MSwKICAgICAgICAgIDI5LAogICAgICAgICAgMjgKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDI4LAogICAgICAgICAgNzQsCiAgICAgICAgICA1MQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNzQsCiAgICAgICAgICAyNywKICAgICAgICAgIDcyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAyOCwKICAgICAgICAgIDIzLAogICAgICAgICAgMTkKICAgICAgICBdCiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJjb2xvciI6IFsKICAgICAgICAyMDUsCiAgICAgICAgOTcsCiAgICAgICAgMjIKICAgICAgXSwKICAgICAgImZhY2VzIjogWwogICAgICAgIFsKICAgICAgICAgIDI0LAogICAgICAgICAgMzQsCiAgICAgICAgICAxOAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMTYsCiAgICAgICAgICAxMywKICAgICAgICAgIDEyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAxMiwKICAgICAgICAgIDE3LAogICAgICAgICAgMTYKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDEzLAogICAgICAgICAgMTYsCiAgICAgICAgICAxMQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNzEsCiAgICAgICAgICA2OCwKICAgICAgICAgIDc2CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA0MCwKICAgICAgICAgIDY3LAogICAgICAgICAgNjYKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDY2LAogICAgICAgICAgNjUsCiAgICAgICAgICA0MAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNjUsCiAgICAgICAgICA2NCwKICAgICAgICAgIDQwCiAgICAgICAgXQogICAgICBdCiAgICB9LAogICAgewogICAgICAiY29sb3IiOiBbCiAgICAgICAgMzUsCiAgICAgICAgNTIsCiAgICAgICAgNzEKICAgICAgXSwKICAgICAgImZhY2VzIjogWwogICAgICAgIFsKICAgICAgICAgIDExLAogICAgICAgICAgMTIsCiAgICAgICAgICAxMwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNjQsCiAgICAgICAgICA2NSwKICAgICAgICAgIDY2CiAgICAgICAgXQogICAgICBdCiAgICB9LAogICAgewogICAgICAiY29sb3IiOiBbCiAgICAgICAgMjI4LAogICAgICAgIDExNywKICAgICAgICAzMQogICAgICBdLAogICAgICAiZmFjZXMiOiBbCiAgICAgICAgWwogICAgICAgICAgMTQsCiAgICAgICAgICAxNSwKICAgICAgICAgIDExCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAxMSwKICAgICAgICAgIDE2LAogICAgICAgICAgMTQKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDE3LAogICAgICAgICAgMTIsCiAgICAgICAgICAxOAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNDEsCiAgICAgICAgICA2NCwKICAgICAgICAgIDM3CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA2NywKICAgICAgICAgIDY4LAogICAgICAgICAgNjYKICAgICAgICBdCiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJjb2xvciI6IFsKICAgICAgICAyMjYsCiAgICAgICAgMTE4LAogICAgICAgIDI3CiAgICAgIF0sCiAgICAgICJmYWNlcyI6IFsKICAgICAgICBbCiAgICAgICAgICAzNSwKICAgICAgICAgIDQsCiAgICAgICAgICA0MgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNCwKICAgICAgICAgIDEsCiAgICAgICAgICA0MgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNDIsCiAgICAgICAgICA0MywKICAgICAgICAgIDQ0CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA0NCwKICAgICAgICAgIDM1LAogICAgICAgICAgNDIKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDQ1LAogICAgICAgICAgNDMsCiAgICAgICAgICA0MgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNDIsCiAgICAgICAgICAxMCwKICAgICAgICAgIDQ1CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAzMCwKICAgICAgICAgIDMyLAogICAgICAgICAgMjQKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDI0LAogICAgICAgICAgMjUsCiAgICAgICAgICAzMAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgMzAsCiAgICAgICAgICAzMywKICAgICAgICAgIDMyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAzMywKICAgICAgICAgIDMwLAogICAgICAgICAgMTAKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDQ0LAogICAgICAgICAgNDMsCiAgICAgICAgICA0NgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNDMsCiAgICAgICAgICA0NSwKICAgICAgICAgIDQ3CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA0NywKICAgICAgICAgIDQ2LAogICAgICAgICAgNDMKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDQ4LAogICAgICAgICAgNDcsCiAgICAgICAgICA0NQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNDUsCiAgICAgICAgICAzMCwKICAgICAgICAgIDQ4CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAzMCwKICAgICAgICAgIDQ1LAogICAgICAgICAgMTAKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDQ5LAogICAgICAgICAgNDIsCiAgICAgICAgICAwCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA4LAogICAgICAgICAgNywKICAgICAgICAgIDQyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA1MCwKICAgICAgICAgIDQyLAogICAgICAgICAgNwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNTAsCiAgICAgICAgICAxMCwKICAgICAgICAgIDQyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICAxLAogICAgICAgICAgMCwKICAgICAgICAgIDQyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA0MiwKICAgICAgICAgIDksCiAgICAgICAgICA4CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA0MiwKICAgICAgICAgIDQ5LAogICAgICAgICAgOQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNjQsCiAgICAgICAgICA0MSwKICAgICAgICAgIDQwCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA1NywKICAgICAgICAgIDU5LAogICAgICAgICAgNzkKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDc5LAogICAgICAgICAgODEsCiAgICAgICAgICA1NwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNTcsCiAgICAgICAgICA4MSwKICAgICAgICAgIDU2CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA4MiwKICAgICAgICAgIDc5LAogICAgICAgICAgMzUKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDM1LAogICAgICAgICAgNDQsCiAgICAgICAgICA4MgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgODEsCiAgICAgICAgICA3OSwKICAgICAgICAgIDgyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA4MiwKICAgICAgICAgIDgzLAogICAgICAgICAgODEKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDg0LAogICAgICAgICAgNjMsCiAgICAgICAgICA4MQogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgODEsCiAgICAgICAgICA4MywKICAgICAgICAgIDg0CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA0NCwKICAgICAgICAgIDQ2LAogICAgICAgICAgODUKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDg1LAogICAgICAgICAgODIsCiAgICAgICAgICA0NAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNTIsCiAgICAgICAgICA3MywKICAgICAgICAgIDcxCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA3MSwKICAgICAgICAgIDc4LAogICAgICAgICAgNTIKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDUyLAogICAgICAgICAgNzgsCiAgICAgICAgICA3NwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNzcsCiAgICAgICAgICA2MywKICAgICAgICAgIDUyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA4MiwKICAgICAgICAgIDg1LAogICAgICAgICAgODMKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDgzLAogICAgICAgICAgODUsCiAgICAgICAgICA4NgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgODYsCiAgICAgICAgICA4NCwKICAgICAgICAgIDgzCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA4NywKICAgICAgICAgIDUyLAogICAgICAgICAgODQKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDg0LAogICAgICAgICAgODYsCiAgICAgICAgICA4NwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNTIsCiAgICAgICAgICA2MywKICAgICAgICAgIDg0CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA4OCwKICAgICAgICAgIDUzLAogICAgICAgICAgODEKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDYyLAogICAgICAgICAgODEsCiAgICAgICAgICA2MAogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgODksCiAgICAgICAgICA2MCwKICAgICAgICAgIDgxCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA4OSwKICAgICAgICAgIDgxLAogICAgICAgICAgNjMKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDU2LAogICAgICAgICAgODEsCiAgICAgICAgICA1MwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgODEsCiAgICAgICAgICA2MiwKICAgICAgICAgIDYxCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA4MSwKICAgICAgICAgIDYxLAogICAgICAgICAgODgKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDQ4LAogICAgICAgICAgODcsCiAgICAgICAgICA4NgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgODYsCiAgICAgICAgICA0NywKICAgICAgICAgIDQ4CiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA0NywKICAgICAgICAgIDg2LAogICAgICAgICAgODUKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgIDg1LAogICAgICAgICAgNDYsCiAgICAgICAgICA0NwogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgNDgsCiAgICAgICAgICAzMCwKICAgICAgICAgIDUyCiAgICAgICAgXSwKICAgICAgICBbCiAgICAgICAgICA1MiwKICAgICAgICAgIDg3LAogICAgICAgICAgNDgKICAgICAgICBdCiAgICAgIF0KICAgIH0KICBdCn0KCn0se31dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewp2YXIgcGVyc3BlY3RpdmUgPSByZXF1aXJlKCdnbC1tYXQ0L3BlcnNwZWN0aXZlJykKdmFyIG11bHRpcGx5ID0gcmVxdWlyZSgnZ2wtbWF0NC9tdWx0aXBseScpCnZhciBsb29rQXQgPSByZXF1aXJlKCdnbC1tYXQ0L2xvb2tBdCcpCnZhciBpbnZlcnQgPSByZXF1aXJlKCdnbC1tYXQ0L2ludmVydCcpCnZhciByb3RhdGUgPSByZXF1aXJlKCdnbC1tYXQ0L3JvdGF0ZScpCnZhciB0cmFuc2Zvcm0gPSByZXF1aXJlKCdnbC12ZWMzL3RyYW5zZm9ybU1hdDQnKQp2YXIgZm94SlNPTiA9IHJlcXVpcmUoJy4vZm94Lmpzb24nKQoKdmFyIFNWR19OUyA9ICdodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uMy5vcmcvMjAwMC9zdmcnCgpmdW5jdGlvbiBjcmVhdGVOb2RlICh0eXBlKSB7CiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIHR5cGUpCn0KCmZ1bmN0aW9uIHNldEF0dHJpYnV0ZSAobm9kZSwgYXR0cmlidXRlLCB2YWx1ZSkgewogIG5vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwgYXR0cmlidXRlLCB2YWx1ZSkKfQoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmVhdGVMb2dvIChvcHRpb25zXykgewogIHZhciBvcHRpb25zID0gb3B0aW9uc18gfHwge30KCiAgdmFyIGZvbGxvd0N1cnNvciA9ICEhb3B0aW9ucy5mb2xsb3dNb3VzZQogIHZhciBzbG93RHJpZnQgPSAhIW9wdGlvbnMuc2xvd0RyaWZ0CiAgdmFyIHNob3VsZFJlbmRlciA9IHRydWUKCiAgdmFyIERJU1RBTkNFID0gNDAwCiAgdmFyIGxvb2tDdXJyZW50ID0gWzAsIDBdCiAgdmFyIGxvb2tSYXRlID0gMC4zCgogIHZhciB3aWR0aCA9IG9wdGlvbnMud2lkdGggfHwgNDAwCiAgdmFyIGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0IHx8IDQwMAogIHZhciBjb250YWluZXIgPSBjcmVhdGVOb2RlKCdzdmcnKQoKICBpZiAoIW9wdGlvbnMucHhOb3RSYXRpbykgewogICAgd2lkdGggPSAod2luZG93LmlubmVyV2lkdGggKiAob3B0aW9ucy53aWR0aCB8fCAwLjI1KSkgfCAwCiAgICBoZWlnaHQgPSAoKHdpbmRvdy5pbm5lckhlaWdodCAqIG9wdGlvbnMuaGVpZ2h0KSB8fCB3aWR0aCkgfCAwCiAgICBpZiAoJ21pbldpZHRoJyBpbiBvcHRpb25zICYmIHdpZHRoIDwgb3B0aW9ucy5taW5XaWR0aCkgewogICAgICB3aWR0aCA9IG9wdGlvbnMubWluV2lkdGgKICAgICAgaGVpZ2h0ID0gKG9wdGlvbnMubWluV2lkdGggKiBvcHRpb25zLmhlaWdodCAvIG9wdGlvbnMud2lkdGgpIHwgMAogICAgfQogIH0KCiAgc2V0QXR0cmlidXRlKGNvbnRhaW5lciwgJ3dpZHRoJywgd2lkdGggKyAncHgnKQogIHNldEF0dHJpYnV0ZShjb250YWluZXIsICdoZWlnaHQnLCBoZWlnaHQgKyAncHgnKQoKICB2YXIgbW91c2UgPSB7CiAgICB4OiAwLAogICAgeTogMAogIH0KICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGV2KSB7CiAgICBpZiAoZm9sbG93Q3Vyc29yKSB7CiAgICAgIHZhciB0YXJnZXQgPSB7CiAgICAgICAgeDogZXYuY2xpZW50WCwKICAgICAgICB5OiBldi5jbGllbnRZLAogICAgICB9CiAgICAgIHNldExvb2tBdCh0YXJnZXQpCiAgICB9CiAgfSkKCiAgZnVuY3Rpb24gc2V0TG9va0F0KHRhcmdldCkgewogICAgdmFyIGJvdW5kcyA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogICAgbW91c2UueCA9IDEuMCAtIDIuMCAqICh0YXJnZXQueCAtIGJvdW5kcy5sZWZ0KSAvIGJvdW5kcy53aWR0aAogICAgbW91c2UueSA9IDEuMCAtIDIuMCAqICh0YXJnZXQueSAtIGJvdW5kcy50b3ApIC8gYm91bmRzLmhlaWdodAogIH0KCiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpCgogIHZhciBOVU1fVkVSVFMgPSBmb3hKU09OLnBvc2l0aW9ucy5sZW5ndGgKCiAgdmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoMyAqIE5VTV9WRVJUUykKICB2YXIgdHJhbnNmb3JtZWQgPSBuZXcgRmxvYXQzMkFycmF5KDMgKiBOVU1fVkVSVFMpCgogIDsoZnVuY3Rpb24gKCkgewogICAgdmFyIHBwID0gZm94SlNPTi5wb3NpdGlvbnMKICAgIHZhciBwdHIgPSAwCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBwLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBwID0gcHBbaV0KICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgICBwb3NpdGlvbnNbcHRyKytdID0gcFtqXQogICAgICB9CiAgICB9CiAgfSkoKQoKICBmdW5jdGlvbiBQb2x5Z29uIChzdmcsIGluZGljZXMpIHsKICAgIHRoaXMuc3ZnID0gc3ZnCiAgICB0aGlzLmluZGljZXMgPSBpbmRpY2VzCiAgICB0aGlzLnpJbmRleCA9IDAKICB9CgogIHZhciBwb2x5Z29ucyA9IChmdW5jdGlvbiAoKSB7CiAgICB2YXIgcG9seWdvbnMgPSBbXQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3hKU09OLmNodW5rcy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgY2h1bmsgPSBmb3hKU09OLmNodW5rc1tpXQogICAgICB2YXIgY29sb3IgPSAncmdiKCcgKyBjaHVuay5jb2xvciArICcpJwogICAgICB2YXIgZmFjZXMgPSBjaHVuay5mYWNlcwogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZhY2VzLmxlbmd0aDsgKytqKSB7CiAgICAgICAgdmFyIGYgPSBmYWNlc1tqXQogICAgICAgIHZhciBwb2x5Z29uID0gY3JlYXRlTm9kZSgncG9seWdvbicpCiAgICAgICAgc2V0QXR0cmlidXRlKAogICAgICAgICAgcG9seWdvbiwKICAgICAgICAgICdmaWxsJywKICAgICAgICAgIGNvbG9yKQogICAgICAgIHNldEF0dHJpYnV0ZSgKICAgICAgICAgIHBvbHlnb24sCiAgICAgICAgICAnc3Ryb2tlJywKICAgICAgICAgIGNvbG9yKQogICAgICAgIHNldEF0dHJpYnV0ZSgKICAgICAgICAgIHBvbHlnb24sCiAgICAgICAgICAncG9pbnRzJywKICAgICAgICAgICcwLDAsIDEwLDAsIDAsMTAnKQogICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwb2x5Z29uKQogICAgICAgIHBvbHlnb25zLnB1c2gobmV3IFBvbHlnb24ocG9seWdvbiwgZikpCiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwb2x5Z29ucwogIH0pKCkKCiAgdmFyIGNvbXB1dGVNYXRyaXggPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIG9iamVjdENlbnRlciA9IG5ldyBGbG9hdDMyQXJyYXkoMykKICAgIHZhciB1cCA9IG5ldyBGbG9hdDMyQXJyYXkoWzAsIDEsIDBdKQogICAgdmFyIHByb2plY3Rpb24gPSBuZXcgRmxvYXQzMkFycmF5KDE2KQogICAgdmFyIG1vZGVsID0gbmV3IEZsb2F0MzJBcnJheSgxNikKICAgIHZhciB2aWV3ID0gbG9va0F0KAogICAgICBuZXcgRmxvYXQzMkFycmF5KDE2KSwKICAgICAgbmV3IEZsb2F0MzJBcnJheShbMCwgMCwgRElTVEFOQ0VdKSwKICAgICAgb2JqZWN0Q2VudGVyLAogICAgICB1cCkKICAgIHZhciBpbnZWaWV3ID0gaW52ZXJ0KG5ldyBGbG9hdDMyQXJyYXkoMTYpLCB2aWV3KQogICAgdmFyIGludlByb2plY3Rpb24gPSBuZXcgRmxvYXQzMkFycmF5KDE2KQogICAgdmFyIHRhcmdldCA9IG5ldyBGbG9hdDMyQXJyYXkoMykKICAgIHZhciB0cmFuc2Zvcm1lZCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpCgogICAgdmFyIFggPSBuZXcgRmxvYXQzMkFycmF5KFsxLCAwLCAwXSkKICAgIHZhciBZID0gbmV3IEZsb2F0MzJBcnJheShbMCwgMSwgMF0pCiAgICB2YXIgWiA9IG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDFdKQoKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpCiAgICAgIHZhciB2aWV3cG9ydFdpZHRoID0gcmVjdC53aWR0aAogICAgICB2YXIgdmlld3BvcnRIZWlnaHQgPSByZWN0LmhlaWdodAogICAgICBwZXJzcGVjdGl2ZSgKICAgICAgICBwcm9qZWN0aW9uLAogICAgICAgIE1hdGguUEkgLyA0LjAsCiAgICAgICAgdmlld3BvcnRXaWR0aCAvIHZpZXdwb3J0SGVpZ2h0LAogICAgICAgIDEwMC4wLAogICAgICAgIDEwMDAuMCkKICAgICAgaW52ZXJ0KGludlByb2plY3Rpb24sIHByb2plY3Rpb24pCiAgICAgIHRhcmdldFswXSA9IGxvb2tDdXJyZW50WzBdCiAgICAgIHRhcmdldFsxXSA9IGxvb2tDdXJyZW50WzFdCiAgICAgIHRhcmdldFsyXSA9IDEuMgogICAgICB0cmFuc2Zvcm0odGFyZ2V0LCB0YXJnZXQsIGludlByb2plY3Rpb24pCiAgICAgIHRyYW5zZm9ybSh0YXJnZXQsIHRhcmdldCwgaW52VmlldykKICAgICAgbG9va0F0KAogICAgICAgIG1vZGVsLAogICAgICAgIG9iamVjdENlbnRlciwKICAgICAgICB0YXJnZXQsCiAgICAgICAgdXApCiAgICAgIGlmIChzbG93RHJpZnQpIHsKICAgICAgICB2YXIgdGltZSA9IChEYXRlLm5vdygpIC8gMTAwMC4wKQogICAgICAgIHJvdGF0ZShtb2RlbCwgbW9kZWwsIDAuMSArIChNYXRoLnNpbih0aW1lIC8gMykgKiAwLjIpLCBYKQogICAgICAgIHJvdGF0ZShtb2RlbCwgbW9kZWwsIC0wLjEgKyAoTWF0aC5zaW4odGltZSAvIDIpICogMC4wMyksIFopCiAgICAgICAgcm90YXRlKG1vZGVsLCBtb2RlbCwgMC41ICsgKE1hdGguc2luKHRpbWUgLyAzKSAqIDAuMiksIFkpCiAgICAgIH0KCiAgICAgIG11bHRpcGx5KHRyYW5zZm9ybWVkLCBwcm9qZWN0aW9uLCB2aWV3KQogICAgICBtdWx0aXBseSh0cmFuc2Zvcm1lZCwgdHJhbnNmb3JtZWQsIG1vZGVsKQoKICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkCiAgICB9CiAgfSkoKQoKICBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbnMgKE0pIHsKICAgIHZhciBtMDAgPSBNWzBdCiAgICB2YXIgbTAxID0gTVsxXQogICAgdmFyIG0wMiA9IE1bMl0KICAgIHZhciBtMDMgPSBNWzNdCiAgICB2YXIgbTEwID0gTVs0XQogICAgdmFyIG0xMSA9IE1bNV0KICAgIHZhciBtMTIgPSBNWzZdCiAgICB2YXIgbTEzID0gTVs3XQogICAgdmFyIG0yMCA9IE1bOF0KICAgIHZhciBtMjEgPSBNWzldCiAgICB2YXIgbTIyID0gTVsxMF0KICAgIHZhciBtMjMgPSBNWzExXQogICAgdmFyIG0zMCA9IE1bMTJdCiAgICB2YXIgbTMxID0gTVsxM10KICAgIHZhciBtMzIgPSBNWzE0XQogICAgdmFyIG0zMyA9IE1bMTVdCgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOVU1fVkVSVFM7ICsraSkgewogICAgICB2YXIgeCA9IHBvc2l0aW9uc1szICogaV0KICAgICAgdmFyIHkgPSBwb3NpdGlvbnNbMyAqIGkgKyAxXQogICAgICB2YXIgeiA9IHBvc2l0aW9uc1szICogaSArIDJdCgogICAgICB2YXIgdHcgPSB4ICogbTAzICsgeSAqIG0xMyArIHogKiBtMjMgKyBtMzMKICAgICAgdHJhbnNmb3JtZWRbMyAqIGldID0KICAgICAgICAoeCAqIG0wMCArIHkgKiBtMTAgKyB6ICogbTIwICsgbTMwKSAvIHR3CiAgICAgIHRyYW5zZm9ybWVkWzMgKiBpICsgMV0gPQogICAgICAgICh4ICogbTAxICsgeSAqIG0xMSArIHogKiBtMjEgKyBtMzEpIC8gdHcKICAgICAgdHJhbnNmb3JtZWRbMyAqIGkgKyAyXSA9CiAgICAgICAgKHggKiBtMDIgKyB5ICogbTEyICsgeiAqIG0yMiArIG0zMikgLyB0dwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tcGFyZVogKGEsIGIpIHsKICAgIHJldHVybiBiLnpJbmRleCAtIGEuekluZGV4CiAgfQoKICB2YXIgdG9EcmF3ID0gW10KICBmdW5jdGlvbiB1cGRhdGVGYWNlcyAoKSB7CiAgICB2YXIgaQogICAgdmFyIHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkKICAgIHZhciB3ID0gcmVjdC53aWR0aAogICAgdmFyIGggPSByZWN0LmhlaWdodAogICAgdG9EcmF3Lmxlbmd0aCA9IDAKICAgIGZvciAoaSA9IDA7IGkgPCBwb2x5Z29ucy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgcG9seSA9IHBvbHlnb25zW2ldCiAgICAgIHZhciBpbmRpY2VzID0gcG9seS5pbmRpY2VzCgogICAgICB2YXIgaTAgPSBpbmRpY2VzWzBdCiAgICAgIHZhciBpMSA9IGluZGljZXNbMV0KICAgICAgdmFyIGkyID0gaW5kaWNlc1syXQogICAgICB2YXIgYXggPSB0cmFuc2Zvcm1lZFszICogaTBdCiAgICAgIHZhciBheSA9IHRyYW5zZm9ybWVkWzMgKiBpMCArIDFdCiAgICAgIHZhciBieCA9IHRyYW5zZm9ybWVkWzMgKiBpMV0KICAgICAgdmFyIGJ5ID0gdHJhbnNmb3JtZWRbMyAqIGkxICsgMV0KICAgICAgdmFyIGN4ID0gdHJhbnNmb3JtZWRbMyAqIGkyXQogICAgICB2YXIgY3kgPSB0cmFuc2Zvcm1lZFszICogaTIgKyAxXQogICAgICB2YXIgZGV0ID0gKGJ4IC0gYXgpICogKGN5IC0gYXkpIC0gKGJ5IC0gYXkpICogKGN4IC0gYXgpCiAgICAgIGlmIChkZXQgPCAwKSB7CiAgICAgICAgY29udGludWUKICAgICAgfQoKICAgICAgdmFyIHBvaW50cyA9IFtdCiAgICAgIHZhciB6bWF4ID0gLUluZmluaXR5CiAgICAgIHZhciB6bWluID0gSW5maW5pdHkKICAgICAgdmFyIGVsZW1lbnQgPSBwb2x5LnN2ZwogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgIHZhciBpZHggPSBpbmRpY2VzW2pdCiAgICAgICAgcG9pbnRzLnB1c2goCiAgICAgICAgICAwLjUgKiB3ICogKDEuMCAtIHRyYW5zZm9ybWVkWzMgKiBpZHhdKSArICcsJyArCiAgICAgICAgICAwLjUgKiBoICogKDEuMCAtIHRyYW5zZm9ybWVkWzMgKiBpZHggKyAxXSkpCiAgICAgICAgdmFyIHogPSB0cmFuc2Zvcm1lZFszICogaWR4ICsgMl0KICAgICAgICB6bWF4ID0gTWF0aC5tYXgoem1heCwgeikKICAgICAgICB6bWluID0gTWF0aC5taW4oem1pbiwgeikKICAgICAgfQogICAgICBwb2x5LnpJbmRleCA9IHptYXggKyAwLjI1ICogem1pbgogICAgICB2YXIgam9pbmVkUG9pbnRzID0gcG9pbnRzLmpvaW4oJyAnKQoKICAgICAgaWYgKGpvaW5lZFBvaW50cy5pbmRleE9mKCdOYU4nKSA9PT0gLTEpIHsKICAgICAgICBzZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ3BvaW50cycsIGpvaW5lZFBvaW50cykKICAgICAgfQoKICAgICAgdG9EcmF3LnB1c2gocG9seSkKICAgIH0KICAgIHRvRHJhdy5zb3J0KGNvbXBhcmVaKQogICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnCiAgICBmb3IgKGkgPSAwOyBpIDwgdG9EcmF3Lmxlbmd0aDsgKytpKSB7CiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b0RyYXdbaV0uc3ZnKQogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVuZGVyU2NlbmUgKCkgewogICAgaWYgKCFzaG91bGRSZW5kZXIpIHJldHVybgogICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShyZW5kZXJTY2VuZSkKCiAgICB2YXIgbGkgPSAoMS4wIC0gbG9va1JhdGUpCiAgICB2YXIgYm91bmRzID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpCgogICAgbG9va0N1cnJlbnRbMF0gPSBsaSAqIGxvb2tDdXJyZW50WzBdICsgbG9va1JhdGUgKiBtb3VzZS54CiAgICBsb29rQ3VycmVudFsxXSA9IGxpICogbG9va0N1cnJlbnRbMV0gKyBsb29rUmF0ZSAqIG1vdXNlLnkgKyAwLjA4NQoKICAgIHZhciBtYXRyaXggPSBjb21wdXRlTWF0cml4KCkKICAgIHVwZGF0ZVBvc2l0aW9ucyhtYXRyaXgpCiAgICB1cGRhdGVGYWNlcygpCiAgfQoKICByZW5kZXJTY2VuZSgpCgogIHJldHVybiB7CiAgICBjb250YWluZXI6IGNvbnRhaW5lciwKICAgIGxvb2tBdDogc2V0TG9va0F0LAogICAgc2V0Rm9sbG93TW91c2U6IHNldEZvbGxvd01vdXNlLAogICAgc3RvcEFuaW1hdGlvbjogc3RvcEFuaW1hdGlvbiwKICAgIHN0YXJ0QW5pbWF0aW9uOiBzdGFydEFuaW1hdGlvbiwKICB9CgogIGZ1bmN0aW9uIHN0b3BBbmltYXRpb24oKSB7CiAgICBzaG91bGRSZW5kZXIgPSBmYWxzZQogIH0KCiAgZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oKSB7CiAgICBzaG91bGRSZW5kZXIgPSB0cnVlCiAgfQoKICBmdW5jdGlvbiBzZXRGb2xsb3dNb3VzZSAoc3RhdGUpIHsKICAgIGZvbGxvd0N1cnNvciA9IHN0YXRlCiAgfQoKfQoKfSx7Ii4vZm94Lmpzb24iOjEsImdsLW1hdDQvaW52ZXJ0Ijo0LCJnbC1tYXQ0L2xvb2tBdCI6NSwiZ2wtbWF0NC9tdWx0aXBseSI6NiwiZ2wtbWF0NC9wZXJzcGVjdGl2ZSI6NywiZ2wtbWF0NC9yb3RhdGUiOjgsImdsLXZlYzMvdHJhbnNmb3JtTWF0NCI6OX1dLDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewptb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5OwoKLyoqCiAqIFNldCBhIG1hdDQgdG8gdGhlIGlkZW50aXR5IG1hdHJpeAogKgogKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeAogKiBAcmV0dXJucyB7bWF0NH0gb3V0CiAqLwpmdW5jdGlvbiBpZGVudGl0eShvdXQpIHsKICAgIG91dFswXSA9IDE7CiAgICBvdXRbMV0gPSAwOwogICAgb3V0WzJdID0gMDsKICAgIG91dFszXSA9IDA7CiAgICBvdXRbNF0gPSAwOwogICAgb3V0WzVdID0gMTsKICAgIG91dFs2XSA9IDA7CiAgICBvdXRbN10gPSAwOwogICAgb3V0WzhdID0gMDsKICAgIG91dFs5XSA9IDA7CiAgICBvdXRbMTBdID0gMTsKICAgIG91dFsxMV0gPSAwOwogICAgb3V0WzEyXSA9IDA7CiAgICBvdXRbMTNdID0gMDsKICAgIG91dFsxNF0gPSAwOwogICAgb3V0WzE1XSA9IDE7CiAgICByZXR1cm4gb3V0Owp9Owp9LHt9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKbW9kdWxlLmV4cG9ydHMgPSBpbnZlcnQ7CgovKioKICogSW52ZXJ0cyBhIG1hdDQKICoKICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXgKICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4CiAqIEByZXR1cm5zIHttYXQ0fSBvdXQKICovCmZ1bmN0aW9uIGludmVydChvdXQsIGEpIHsKICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLAogICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sCiAgICAgICAgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdLAogICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdLAoKICAgICAgICBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTAsCiAgICAgICAgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwLAogICAgICAgIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCwKICAgICAgICBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTEsCiAgICAgICAgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExLAogICAgICAgIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMiwKICAgICAgICBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzAsCiAgICAgICAgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwLAogICAgICAgIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCwKICAgICAgICBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzEsCiAgICAgICAgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxLAogICAgICAgIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMiwKCiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudAogICAgICAgIGRldCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjsKCiAgICBpZiAoIWRldCkgeyAKICAgICAgICByZXR1cm4gbnVsbDsgCiAgICB9CiAgICBkZXQgPSAxLjAgLyBkZXQ7CgogICAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7CiAgICBvdXRbMV0gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDsKICAgIG91dFsyXSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0OwogICAgb3V0WzNdID0gKGEyMiAqIGIwNCAtIGEyMSAqIGIwNSAtIGEyMyAqIGIwMykgKiBkZXQ7CiAgICBvdXRbNF0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldDsKICAgIG91dFs1XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0OwogICAgb3V0WzZdID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7CiAgICBvdXRbN10gPSAoYTIwICogYjA1IC0gYTIyICogYjAyICsgYTIzICogYjAxKSAqIGRldDsKICAgIG91dFs4XSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0OwogICAgb3V0WzldID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXQ7CiAgICBvdXRbMTBdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXQ7CiAgICBvdXRbMTFdID0gKGEyMSAqIGIwMiAtIGEyMCAqIGIwNCAtIGEyMyAqIGIwMCkgKiBkZXQ7CiAgICBvdXRbMTJdID0gKGExMSAqIGIwNyAtIGExMCAqIGIwOSAtIGExMiAqIGIwNikgKiBkZXQ7CiAgICBvdXRbMTNdID0gKGEwMCAqIGIwOSAtIGEwMSAqIGIwNyArIGEwMiAqIGIwNikgKiBkZXQ7CiAgICBvdXRbMTRdID0gKGEzMSAqIGIwMSAtIGEzMCAqIGIwMyAtIGEzMiAqIGIwMCkgKiBkZXQ7CiAgICBvdXRbMTVdID0gKGEyMCAqIGIwMyAtIGEyMSAqIGIwMSArIGEyMiAqIGIwMCkgKiBkZXQ7CgogICAgcmV0dXJuIG91dDsKfTsKfSx7fV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CnZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTsKCm1vZHVsZS5leHBvcnRzID0gbG9va0F0OwoKLyoqCiAqIEdlbmVyYXRlcyBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzCiAqCiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG8KICogQHBhcmFtIHt2ZWMzfSBleWUgUG9zaXRpb24gb2YgdGhlIHZpZXdlcgogKiBAcGFyYW0ge3ZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXQKICogQHBhcmFtIHt2ZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwCiAqIEByZXR1cm5zIHttYXQ0fSBvdXQKICovCmZ1bmN0aW9uIGxvb2tBdChvdXQsIGV5ZSwgY2VudGVyLCB1cCkgewogICAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbiwKICAgICAgICBleWV4ID0gZXllWzBdLAogICAgICAgIGV5ZXkgPSBleWVbMV0sCiAgICAgICAgZXlleiA9IGV5ZVsyXSwKICAgICAgICB1cHggPSB1cFswXSwKICAgICAgICB1cHkgPSB1cFsxXSwKICAgICAgICB1cHogPSB1cFsyXSwKICAgICAgICBjZW50ZXJ4ID0gY2VudGVyWzBdLAogICAgICAgIGNlbnRlcnkgPSBjZW50ZXJbMV0sCiAgICAgICAgY2VudGVyeiA9IGNlbnRlclsyXTsKCiAgICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgMC4wMDAwMDEgJiYKICAgICAgICBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCAwLjAwMDAwMSAmJgogICAgICAgIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IDAuMDAwMDAxKSB7CiAgICAgICAgcmV0dXJuIGlkZW50aXR5KG91dCk7CiAgICB9CgogICAgejAgPSBleWV4IC0gY2VudGVyeDsKICAgIHoxID0gZXlleSAtIGNlbnRlcnk7CiAgICB6MiA9IGV5ZXogLSBjZW50ZXJ6OwoKICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQoejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyKTsKICAgIHowICo9IGxlbjsKICAgIHoxICo9IGxlbjsKICAgIHoyICo9IGxlbjsKCiAgICB4MCA9IHVweSAqIHoyIC0gdXB6ICogejE7CiAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejI7CiAgICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7CiAgICBsZW4gPSBNYXRoLnNxcnQoeDAgKiB4MCArIHgxICogeDEgKyB4MiAqIHgyKTsKICAgIGlmICghbGVuKSB7CiAgICAgICAgeDAgPSAwOwogICAgICAgIHgxID0gMDsKICAgICAgICB4MiA9IDA7CiAgICB9IGVsc2UgewogICAgICAgIGxlbiA9IDEgLyBsZW47CiAgICAgICAgeDAgKj0gbGVuOwogICAgICAgIHgxICo9IGxlbjsKICAgICAgICB4MiAqPSBsZW47CiAgICB9CgogICAgeTAgPSB6MSAqIHgyIC0gejIgKiB4MTsKICAgIHkxID0gejIgKiB4MCAtIHowICogeDI7CiAgICB5MiA9IHowICogeDEgLSB6MSAqIHgwOwoKICAgIGxlbiA9IE1hdGguc3FydCh5MCAqIHkwICsgeTEgKiB5MSArIHkyICogeTIpOwogICAgaWYgKCFsZW4pIHsKICAgICAgICB5MCA9IDA7CiAgICAgICAgeTEgPSAwOwogICAgICAgIHkyID0gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgbGVuID0gMSAvIGxlbjsKICAgICAgICB5MCAqPSBsZW47CiAgICAgICAgeTEgKj0gbGVuOwogICAgICAgIHkyICo9IGxlbjsKICAgIH0KCiAgICBvdXRbMF0gPSB4MDsKICAgIG91dFsxXSA9IHkwOwogICAgb3V0WzJdID0gejA7CiAgICBvdXRbM10gPSAwOwogICAgb3V0WzRdID0geDE7CiAgICBvdXRbNV0gPSB5MTsKICAgIG91dFs2XSA9IHoxOwogICAgb3V0WzddID0gMDsKICAgIG91dFs4XSA9IHgyOwogICAgb3V0WzldID0geTI7CiAgICBvdXRbMTBdID0gejI7CiAgICBvdXRbMTFdID0gMDsKICAgIG91dFsxMl0gPSAtKHgwICogZXlleCArIHgxICogZXlleSArIHgyICogZXlleik7CiAgICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopOwogICAgb3V0WzE0XSA9IC0oejAgKiBleWV4ICsgejEgKiBleWV5ICsgejIgKiBleWV6KTsKICAgIG91dFsxNV0gPSAxOwoKICAgIHJldHVybiBvdXQ7Cn07Cn0seyIuL2lkZW50aXR5IjozfV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cm1vZHVsZS5leHBvcnRzID0gbXVsdGlwbHk7CgovKioKICogTXVsdGlwbGllcyB0d28gbWF0NCdzCiAqCiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4CiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZAogKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kCiAqIEByZXR1cm5zIHttYXQ0fSBvdXQKICovCmZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikgewogICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sCiAgICAgICAgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XSwKICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sCiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV07CgogICAgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4CiAgICB2YXIgYjAgID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTsgIAogICAgb3V0WzBdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwOwogICAgb3V0WzFdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxOwogICAgb3V0WzJdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyOwogICAgb3V0WzNdID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzOwoKICAgIGIwID0gYls0XTsgYjEgPSBiWzVdOyBiMiA9IGJbNl07IGIzID0gYls3XTsKICAgIG91dFs0XSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDsKICAgIG91dFs1XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTsKICAgIG91dFs2XSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjsKICAgIG91dFs3XSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMzsKCiAgICBiMCA9IGJbOF07IGIxID0gYls5XTsgYjIgPSBiWzEwXTsgYjMgPSBiWzExXTsKICAgIG91dFs4XSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDsKICAgIG91dFs5XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTsKICAgIG91dFsxMF0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7CiAgICBvdXRbMTFdID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzOwoKICAgIGIwID0gYlsxMl07IGIxID0gYlsxM107IGIyID0gYlsxNF07IGIzID0gYlsxNV07CiAgICBvdXRbMTJdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwOwogICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTsKICAgIG91dFsxNF0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7CiAgICBvdXRbMTVdID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzOwogICAgcmV0dXJuIG91dDsKfTsKfSx7fV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7Cm1vZHVsZS5leHBvcnRzID0gcGVyc3BlY3RpdmU7CgovKioKICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzCiAqCiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG8KICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zCiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgQXNwZWN0IHJhdGlvLiB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGgvaGVpZ2h0CiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW0KICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW0KICogQHJldHVybnMge21hdDR9IG91dAogKi8KZnVuY3Rpb24gcGVyc3BlY3RpdmUob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikgewogICAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbihmb3Z5IC8gMiksCiAgICAgICAgbmYgPSAxIC8gKG5lYXIgLSBmYXIpOwogICAgb3V0WzBdID0gZiAvIGFzcGVjdDsKICAgIG91dFsxXSA9IDA7CiAgICBvdXRbMl0gPSAwOwogICAgb3V0WzNdID0gMDsKICAgIG91dFs0XSA9IDA7CiAgICBvdXRbNV0gPSBmOwogICAgb3V0WzZdID0gMDsKICAgIG91dFs3XSA9IDA7CiAgICBvdXRbOF0gPSAwOwogICAgb3V0WzldID0gMDsKICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjsKICAgIG91dFsxMV0gPSAtMTsKICAgIG91dFsxMl0gPSAwOwogICAgb3V0WzEzXSA9IDA7CiAgICBvdXRbMTRdID0gKDIgKiBmYXIgKiBuZWFyKSAqIG5mOwogICAgb3V0WzE1XSA9IDA7CiAgICByZXR1cm4gb3V0Owp9Owp9LHt9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKbW9kdWxlLmV4cG9ydHMgPSByb3RhdGU7CgovKioKICogUm90YXRlcyBhIG1hdDQgYnkgdGhlIGdpdmVuIGFuZ2xlCiAqCiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4CiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZQogKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieQogKiBAcGFyYW0ge3ZlYzN9IGF4aXMgdGhlIGF4aXMgdG8gcm90YXRlIGFyb3VuZAogKiBAcmV0dXJucyB7bWF0NH0gb3V0CiAqLwpmdW5jdGlvbiByb3RhdGUob3V0LCBhLCByYWQsIGF4aXMpIHsKICAgIHZhciB4ID0gYXhpc1swXSwgeSA9IGF4aXNbMV0sIHogPSBheGlzWzJdLAogICAgICAgIGxlbiA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5ICsgeiAqIHopLAogICAgICAgIHMsIGMsIHQsCiAgICAgICAgYTAwLCBhMDEsIGEwMiwgYTAzLAogICAgICAgIGExMCwgYTExLCBhMTIsIGExMywKICAgICAgICBhMjAsIGEyMSwgYTIyLCBhMjMsCiAgICAgICAgYjAwLCBiMDEsIGIwMiwKICAgICAgICBiMTAsIGIxMSwgYjEyLAogICAgICAgIGIyMCwgYjIxLCBiMjI7CgogICAgaWYgKE1hdGguYWJzKGxlbikgPCAwLjAwMDAwMSkgeyByZXR1cm4gbnVsbDsgfQogICAgCiAgICBsZW4gPSAxIC8gbGVuOwogICAgeCAqPSBsZW47CiAgICB5ICo9IGxlbjsKICAgIHogKj0gbGVuOwoKICAgIHMgPSBNYXRoLnNpbihyYWQpOwogICAgYyA9IE1hdGguY29zKHJhZCk7CiAgICB0ID0gMSAtIGM7CgogICAgYTAwID0gYVswXTsgYTAxID0gYVsxXTsgYTAyID0gYVsyXTsgYTAzID0gYVszXTsKICAgIGExMCA9IGFbNF07IGExMSA9IGFbNV07IGExMiA9IGFbNl07IGExMyA9IGFbN107CiAgICBhMjAgPSBhWzhdOyBhMjEgPSBhWzldOyBhMjIgPSBhWzEwXTsgYTIzID0gYVsxMV07CgogICAgLy8gQ29uc3RydWN0IHRoZSBlbGVtZW50cyBvZiB0aGUgcm90YXRpb24gbWF0cml4CiAgICBiMDAgPSB4ICogeCAqIHQgKyBjOyBiMDEgPSB5ICogeCAqIHQgKyB6ICogczsgYjAyID0geiAqIHggKiB0IC0geSAqIHM7CiAgICBiMTAgPSB4ICogeSAqIHQgLSB6ICogczsgYjExID0geSAqIHkgKiB0ICsgYzsgYjEyID0geiAqIHkgKiB0ICsgeCAqIHM7CiAgICBiMjAgPSB4ICogeiAqIHQgKyB5ICogczsgYjIxID0geSAqIHogKiB0IC0geCAqIHM7IGIyMiA9IHogKiB6ICogdCArIGM7CgogICAgLy8gUGVyZm9ybSByb3RhdGlvbi1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb24KICAgIG91dFswXSA9IGEwMCAqIGIwMCArIGExMCAqIGIwMSArIGEyMCAqIGIwMjsKICAgIG91dFsxXSA9IGEwMSAqIGIwMCArIGExMSAqIGIwMSArIGEyMSAqIGIwMjsKICAgIG91dFsyXSA9IGEwMiAqIGIwMCArIGExMiAqIGIwMSArIGEyMiAqIGIwMjsKICAgIG91dFszXSA9IGEwMyAqIGIwMCArIGExMyAqIGIwMSArIGEyMyAqIGIwMjsKICAgIG91dFs0XSA9IGEwMCAqIGIxMCArIGExMCAqIGIxMSArIGEyMCAqIGIxMjsKICAgIG91dFs1XSA9IGEwMSAqIGIxMCArIGExMSAqIGIxMSArIGEyMSAqIGIxMjsKICAgIG91dFs2XSA9IGEwMiAqIGIxMCArIGExMiAqIGIxMSArIGEyMiAqIGIxMjsKICAgIG91dFs3XSA9IGEwMyAqIGIxMCArIGExMyAqIGIxMSArIGEyMyAqIGIxMjsKICAgIG91dFs4XSA9IGEwMCAqIGIyMCArIGExMCAqIGIyMSArIGEyMCAqIGIyMjsKICAgIG91dFs5XSA9IGEwMSAqIGIyMCArIGExMSAqIGIyMSArIGEyMSAqIGIyMjsKICAgIG91dFsxMF0gPSBhMDIgKiBiMjAgKyBhMTIgKiBiMjEgKyBhMjIgKiBiMjI7CiAgICBvdXRbMTFdID0gYTAzICogYjIwICsgYTEzICogYjIxICsgYTIzICogYjIyOwoKICAgIGlmIChhICE9PSBvdXQpIHsgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgbGFzdCByb3cKICAgICAgICBvdXRbMTJdID0gYVsxMl07CiAgICAgICAgb3V0WzEzXSA9IGFbMTNdOwogICAgICAgIG91dFsxNF0gPSBhWzE0XTsKICAgICAgICBvdXRbMTVdID0gYVsxNV07CiAgICB9CiAgICByZXR1cm4gb3V0Owp9Owp9LHt9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKbW9kdWxlLmV4cG9ydHMgPSB0cmFuc2Zvcm1NYXQ0OwoKLyoqCiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDQuCiAqIDR0aCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnCiAqCiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yCiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybQogKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoCiAqIEByZXR1cm5zIHt2ZWMzfSBvdXQKICovCmZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7CiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXSwKICAgICAgICB3ID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdCiAgICB3ID0gdyB8fCAxLjAKICAgIG91dFswXSA9IChtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXSkgLyB3CiAgICBvdXRbMV0gPSAobVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10pIC8gdwogICAgb3V0WzJdID0gKG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSkgLyB3CiAgICByZXR1cm4gb3V0Cn0KfSx7fV0sMTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewp2YXIgTW9kZWxWaWV3ZXIgPSByZXF1aXJlKCdtZXRhbWFzay1sb2dvJykKdmFyIGlzTW9iaWxlID0gISFkZXRlY3RNb2JpbGUoKQoKaW5qZWN0TWFzY290KCkKCmZ1bmN0aW9uIGluamVjdE1hc2NvdCgpewogIC8vIGdldCBjb250YWluZXIgZnJvbSBET00KICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tY29udGFpbmVyJykKCiAgaWYgKCFjb250YWluZXIpIHJldHVybgoKICAvLyBUbyByZW5kZXIgd2l0aCBmaXhlZCBkaW1lbnNpb25zOgogIHZhciB2aWV3ZXIgPSBNb2RlbFZpZXdlcih7CgogICAgLy8gRGljdGF0ZXMgd2hldGhlciB3aWR0aCAmIGhlaWdodCBhcmUgcHggb3IgbXVsdGlwbGllZAogICAgcHhOb3RSYXRpbzogZmFsc2UsCiAgICB3aWR0aDogMC4xMCwKICAgIGhlaWdodDogMC4xMCwKICAgIG1pbldpZHRoOiAyMDAsCgogICAgZm9sbG93TW91c2U6ICFpc01vYmlsZSwKICAgIHNsb3dEcmlmdDogaXNNb2JpbGUsCiAgfSkKCiAgLy8gYWRkIHZpZXdlciB0byBET00KICBjb250YWluZXIuYXBwZW5kQ2hpbGQodmlld2VyLmNvbnRhaW5lcikKCn0KCmZ1bmN0aW9uIGRldGVjdE1vYmlsZSgpIHsKICByZXR1cm4gKAogICAgICBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpCiAgIHx8IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL3dlYk9TL2kpCiAgIHx8IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZS9pKQogICB8fCBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGFkL2kpCiAgIHx8IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQb2QvaSkKICAgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKQogICB8fCBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9XaW5kb3dzIFBob25lL2kpCiAgKQp9CgoKfSx7Im1ldGFtYXNrLWxvZ28iOjJ9XX0se30sWzEwXSk7Ci8vIHlvdXIgY29kZSBnb2VzIGhlcmU=