easy-email-pro-kit 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.cjs.js +1 -1
- package/lib/index.es.js +266 -258
- package/package.json +1 -1
package/lib/index.es.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
1
|
+
var it = Object.defineProperty, at = Object.defineProperties;
|
|
2
|
+
var dt = Object.getOwnPropertyDescriptors;
|
|
3
3
|
var H = Object.getOwnPropertySymbols;
|
|
4
|
-
var Ze = Object.prototype.hasOwnProperty,
|
|
5
|
-
var ce = (e, t, l) => t in e ?
|
|
4
|
+
var Ze = Object.prototype.hasOwnProperty, we = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var ce = (e, t, l) => t in e ? it(e, t, { enumerable: !0, configurable: !0, writable: !0, value: l }) : e[t] = l, K = (e, t) => {
|
|
6
6
|
for (var l in t || (t = {}))
|
|
7
7
|
Ze.call(t, l) && ce(e, l, t[l]);
|
|
8
8
|
if (H)
|
|
9
9
|
for (var l of H(t))
|
|
10
|
-
|
|
10
|
+
we.call(t, l) && ce(e, l, t[l]);
|
|
11
11
|
return e;
|
|
12
|
-
}, E = (e, t) =>
|
|
13
|
-
var
|
|
12
|
+
}, E = (e, t) => at(e, dt(t));
|
|
13
|
+
var ge = (e, t) => {
|
|
14
14
|
var l = {};
|
|
15
15
|
for (var s in e)
|
|
16
16
|
Ze.call(e, s) && t.indexOf(s) < 0 && (l[s] = e[s]);
|
|
17
17
|
if (e != null && H)
|
|
18
18
|
for (var s of H(e))
|
|
19
|
-
t.indexOf(s) < 0 &&
|
|
19
|
+
t.indexOf(s) < 0 && we.call(e, s) && (l[s] = e[s]);
|
|
20
20
|
return l;
|
|
21
21
|
};
|
|
22
22
|
var Te = (e, t, l) => (ce(e, typeof t != "symbol" ? t + "" : t, l), l);
|
|
@@ -36,25 +36,25 @@ var z = (e, t, l) => new Promise((s, c) => {
|
|
|
36
36
|
}, n = (o) => o.done ? s(o.value) : Promise.resolve(o.value).then(i, a);
|
|
37
37
|
n((l = l.apply(e, t)).next());
|
|
38
38
|
});
|
|
39
|
-
import { useEmailRenderContext as
|
|
40
|
-
import { get as
|
|
41
|
-
import b, { useState as ve, useEffect as
|
|
42
|
-
import
|
|
43
|
-
import { AttributesPanelWrapper as
|
|
44
|
-
import { Collapse as C, Button as
|
|
45
|
-
import { useSlate as
|
|
46
|
-
import { ActiveTabKeys as
|
|
39
|
+
import { useEmailRenderContext as mt, EmailRenderProvider as R, components as ye, ElementType as ie, ResponsivePlugin as bt, BlockManager as he, classnames as A, mergeBlock as Q, createCustomBlock as Ee, t as N, ElementCategory as ze, NodeUtils as ut, ElementPlugin as Ve } from "easy-email-pro-core";
|
|
40
|
+
import { get as je, set as O, flatMap as pt, cloneDeep as ee, isEqual as Oe } from "lodash";
|
|
41
|
+
import b, { useState as ve, useEffect as Pe } from "react";
|
|
42
|
+
import Mt from "react-dom/server";
|
|
43
|
+
import { AttributesPanelWrapper as Qe, ResponsiveTabs as Ue, useEditorForm as Je, CollapseWrapper as Fe, ResponsiveField as S, AttributeField as Y, ConfigPanelsMap as He, previewLoadImage as yt } from "easy-email-pro-theme";
|
|
44
|
+
import { Collapse as C, Button as Re, Grid as ae, Message as Ae } from "@arco-design/web-react";
|
|
45
|
+
import { useSlate as ht, ReactEditor as xt } from "slate-react";
|
|
46
|
+
import { ActiveTabKeys as v, useEditorProps as Be, useSelectedNode as $e, useEditorState as _e } from "easy-email-pro-editor";
|
|
47
47
|
const { Raw: B } = ye;
|
|
48
|
-
function
|
|
49
|
-
const { desktop: t, mobile: l } = e, s =
|
|
48
|
+
function Zt(e) {
|
|
49
|
+
const { desktop: t, mobile: l } = e, s = mt(), { displayMode: c = "desktop-mobile" } = s;
|
|
50
50
|
return c === "only-desktop" ? /* @__PURE__ */ b.createElement(R, E(K({}, s), { displayMode: "only-desktop" }), /* @__PURE__ */ b.createElement(b.Fragment, null, /* @__PURE__ */ b.createElement(t, null))) : c === "only-mobile" ? /* @__PURE__ */ b.createElement(b.Fragment, null, /* @__PURE__ */ b.createElement(B, null, "<!-- htmlmin:ignore --><!--[if !mso]><!--><!-- htmlmin:ignore -->"), /* @__PURE__ */ b.createElement(R, E(K({}, s), { displayMode: "only-mobile" }), /* @__PURE__ */ b.createElement(b.Fragment, null, /* @__PURE__ */ b.createElement(l, null))), /* @__PURE__ */ b.createElement(B, null, "<!-- htmlmin:ignore --><!--<![endif]--><!-- htmlmin:ignore -->")) : /* @__PURE__ */ b.createElement(b.Fragment, null, /* @__PURE__ */ b.createElement(R, E(K({}, s), { displayMode: "only-desktop" }), /* @__PURE__ */ b.createElement(b.Fragment, null, /* @__PURE__ */ b.createElement(t, null))), /* @__PURE__ */ b.createElement(B, null, "<!-- htmlmin:ignore --><!--[if !mso]><!--><!-- htmlmin:ignore -->"), /* @__PURE__ */ b.createElement(R, E(K({}, s), { displayMode: "only-mobile" }), /* @__PURE__ */ b.createElement(b.Fragment, null, /* @__PURE__ */ b.createElement(l, null))), /* @__PURE__ */ b.createElement(B, null, "<!-- htmlmin:ignore --><!--<![endif]--><!-- htmlmin:ignore -->"));
|
|
51
51
|
}
|
|
52
|
-
const wt = "hide-desktop-block",
|
|
52
|
+
const wt = "hide-desktop-block", gt = "hide-mobile-block", Tt = "hide-desktop-inline-block", Nt = "hide-mobile-inline-block", Ne = [
|
|
53
53
|
ie.GROUP,
|
|
54
54
|
ie.COLUMN,
|
|
55
55
|
ie.NAVBAR_LINK
|
|
56
56
|
];
|
|
57
|
-
class
|
|
57
|
+
class jn extends bt {
|
|
58
58
|
constructor() {
|
|
59
59
|
super(...arguments);
|
|
60
60
|
Te(this, "generateResponsive", (l) => {
|
|
@@ -74,22 +74,22 @@ class On extends ut {
|
|
|
74
74
|
const y = he.getBlockByType(i.type);
|
|
75
75
|
if (!y)
|
|
76
76
|
throw new Error(`${i.type} block is not registered`);
|
|
77
|
-
const M = i.mobileAttributes && Object.keys(i.mobileAttributes).some((Z) => i.mobileAttributes[Z] !== i.attributes[Z]), m = Ne.includes(y.type) ?
|
|
77
|
+
const M = i.mobileAttributes && Object.keys(i.mobileAttributes).some((Z) => i.mobileAttributes[Z] !== i.attributes[Z]), m = Ne.includes(y.type) ? Tt : wt, h = Ne.includes(y.type) ? Nt : gt, w = je(i, "attributes.css-class") || "";
|
|
78
78
|
if (c === "only-desktop") {
|
|
79
|
-
if (
|
|
79
|
+
if (w.includes(m))
|
|
80
80
|
return null;
|
|
81
|
-
|
|
81
|
+
w.includes(h) || O(
|
|
82
82
|
i,
|
|
83
83
|
"attributes.css-class",
|
|
84
|
-
A(
|
|
84
|
+
A(w, h)
|
|
85
85
|
);
|
|
86
86
|
} else if (c === "only-mobile") {
|
|
87
|
-
if (
|
|
87
|
+
if (w.includes(h))
|
|
88
88
|
return null;
|
|
89
|
-
|
|
89
|
+
w.includes(m) || O(
|
|
90
90
|
i,
|
|
91
91
|
"attributes.css-class",
|
|
92
|
-
A(
|
|
92
|
+
A(w, m)
|
|
93
93
|
);
|
|
94
94
|
}
|
|
95
95
|
c === "only-mobile" ? i.attributes = Q(
|
|
@@ -104,11 +104,11 @@ class On extends ut {
|
|
|
104
104
|
), i.visible === "desktop" ? O(
|
|
105
105
|
i,
|
|
106
106
|
"attributes.css-class",
|
|
107
|
-
A(
|
|
107
|
+
A(w, h)
|
|
108
108
|
) : i.visible === "mobile" && O(
|
|
109
109
|
i,
|
|
110
110
|
"attributes.css-class",
|
|
111
|
-
A(
|
|
111
|
+
A(w, m)
|
|
112
112
|
);
|
|
113
113
|
const W = y.render({
|
|
114
114
|
mode: s,
|
|
@@ -123,7 +123,7 @@ class On extends ut {
|
|
|
123
123
|
mergetagsData: n
|
|
124
124
|
});
|
|
125
125
|
return M && (u = /* @__PURE__ */ b.createElement(b.Fragment, null, /* @__PURE__ */ b.createElement(
|
|
126
|
-
|
|
126
|
+
Zt,
|
|
127
127
|
{
|
|
128
128
|
desktop: () => /* @__PURE__ */ b.createElement(b.Fragment, null, p),
|
|
129
129
|
mobile: () => /* @__PURE__ */ b.createElement(b.Fragment, null, W)
|
|
@@ -133,7 +133,7 @@ class On extends ut {
|
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
const pe = 60, _ = 60 * pe, $ = 24 * _;
|
|
136
|
-
function
|
|
136
|
+
function qe(e) {
|
|
137
137
|
const t = Math.floor(e / $), l = Math.floor((e - t * $) / _), s = Math.floor((e - t * $ - l * _) / pe), c = Math.floor(e - t * $ - l * _ - s * pe);
|
|
138
138
|
return {
|
|
139
139
|
day: t < 10 ? "0" + t : t.toString(),
|
|
@@ -142,12 +142,12 @@ function et(e) {
|
|
|
142
142
|
second: c < 10 ? "0" + c : c.toString()
|
|
143
143
|
};
|
|
144
144
|
}
|
|
145
|
-
const q = document.createElement("canvas"), We = q.getContext("2d"),
|
|
145
|
+
const q = document.createElement("canvas"), We = q.getContext("2d"), Wt = (e) => z(void 0, null, function* () {
|
|
146
146
|
const t = new Image();
|
|
147
147
|
return t.src = e, yield new Promise((l, s) => {
|
|
148
148
|
t.onload = l, t.onerror = s;
|
|
149
149
|
}), t;
|
|
150
|
-
}),
|
|
150
|
+
}), Yt = (e) => z(void 0, null, function* () {
|
|
151
151
|
const t = new Image();
|
|
152
152
|
return t.crossOrigin = "anonymous", new Promise((l, s) => {
|
|
153
153
|
t.onload = () => {
|
|
@@ -155,14 +155,14 @@ const q = document.createElement("canvas"), We = q.getContext("2d"), Yt = (e) =>
|
|
|
155
155
|
q.width = c, q.height = i, We.clearRect(0, 0, c, i), We.drawImage(t, 0, 0), l(q.toDataURL());
|
|
156
156
|
}, t.onerror = s, t.src = e.src;
|
|
157
157
|
});
|
|
158
|
-
}),
|
|
158
|
+
}), Lt = pt(
|
|
159
159
|
["padding", "margin", "border"].map((e) => [
|
|
160
160
|
`${e}-top`,
|
|
161
161
|
`${e}-right`,
|
|
162
162
|
`${e}-bottom`,
|
|
163
163
|
`${e}-left`
|
|
164
164
|
])
|
|
165
|
-
),
|
|
165
|
+
), Gt = [
|
|
166
166
|
"color",
|
|
167
167
|
"width",
|
|
168
168
|
"height",
|
|
@@ -184,22 +184,22 @@ const q = document.createElement("canvas"), We = q.getContext("2d"), Yt = (e) =>
|
|
|
184
184
|
"opacity",
|
|
185
185
|
"visibility",
|
|
186
186
|
"textTransform",
|
|
187
|
-
...
|
|
187
|
+
...Lt
|
|
188
188
|
];
|
|
189
|
-
function
|
|
189
|
+
function et(e) {
|
|
190
190
|
const t = e.cloneNode(!0);
|
|
191
191
|
if (!(t instanceof HTMLElement && e instanceof HTMLElement))
|
|
192
192
|
return t;
|
|
193
193
|
const l = window.getComputedStyle(e);
|
|
194
|
-
return
|
|
194
|
+
return Gt.forEach((s) => {
|
|
195
195
|
t.style.setProperty(s, l.getPropertyValue(s));
|
|
196
196
|
}), t.childNodes.forEach((s, c) => {
|
|
197
|
-
t.replaceChild(
|
|
197
|
+
t.replaceChild(et(e.childNodes[c]), s);
|
|
198
198
|
}), t;
|
|
199
199
|
}
|
|
200
|
-
const
|
|
200
|
+
const St = function(l) {
|
|
201
201
|
return z(this, arguments, function* (e, t = {}) {
|
|
202
|
-
const s = t.width || e.offsetWidth, c = t.height || e.offsetHeight, { overwrite: i = [], wrapper: a = (d) => d } = t, n =
|
|
202
|
+
const s = t.width || e.offsetWidth, c = t.height || e.offsetHeight, { overwrite: i = [], wrapper: a = (d) => d } = t, n = et(e);
|
|
203
203
|
if (n.setAttribute("xmlns", "http://www.w3.org/1999/xhtml"), n.classList.remove("outline"), t.styleText) {
|
|
204
204
|
const d = document.createElement("style");
|
|
205
205
|
d.innerHTML = t.styleText, n.appendChild(d);
|
|
@@ -214,7 +214,7 @@ const Dt = function(l) {
|
|
|
214
214
|
});
|
|
215
215
|
}
|
|
216
216
|
n.querySelectorAll(d.selector).forEach((p) => {
|
|
217
|
-
if (
|
|
217
|
+
if (je(p, "nodeType") === 1) {
|
|
218
218
|
const u = p, y = u.style;
|
|
219
219
|
if (d.style && Object.keys(d.style).forEach((M) => {
|
|
220
220
|
y.setProperty(M, d.style[M]);
|
|
@@ -225,7 +225,7 @@ const Dt = function(l) {
|
|
|
225
225
|
});
|
|
226
226
|
}), yield Promise.all(
|
|
227
227
|
[...n.querySelectorAll("img")].map((d) => z(this, null, function* () {
|
|
228
|
-
d.src = yield
|
|
228
|
+
d.src = yield Yt(d);
|
|
229
229
|
}))
|
|
230
230
|
);
|
|
231
231
|
const o = new XMLSerializer().serializeToString(a(n));
|
|
@@ -233,14 +233,14 @@ const Dt = function(l) {
|
|
|
233
233
|
return r = r.replace(/\n/g, "").replace(/\t/g, "").replace(/#/g, "%23"), r;
|
|
234
234
|
});
|
|
235
235
|
};
|
|
236
|
-
var
|
|
236
|
+
var Dt = Object.defineProperty, It = Object.defineProperties, Kt = Object.getOwnPropertyDescriptors, Ye = Object.getOwnPropertySymbols, kt = Object.prototype.hasOwnProperty, Xt = Object.prototype.propertyIsEnumerable, X = Math.pow, Le = (e, t, l) => t in e ? Dt(e, t, { enumerable: !0, configurable: !0, writable: !0, value: l }) : e[t] = l, j = (e, t) => {
|
|
237
237
|
for (var l in t || (t = {}))
|
|
238
|
-
|
|
238
|
+
kt.call(t, l) && Le(e, l, t[l]);
|
|
239
239
|
if (Ye)
|
|
240
240
|
for (var l of Ye(t))
|
|
241
241
|
Xt.call(t, l) && Le(e, l, t[l]);
|
|
242
242
|
return e;
|
|
243
|
-
}, F = (e, t) =>
|
|
243
|
+
}, F = (e, t) => It(e, Kt(t)), V = (e, t, l) => new Promise((s, c) => {
|
|
244
244
|
var i = (o) => {
|
|
245
245
|
try {
|
|
246
246
|
n(l.next(o));
|
|
@@ -256,7 +256,7 @@ var It = Object.defineProperty, Kt = Object.defineProperties, kt = Object.getOwn
|
|
|
256
256
|
}, n = (o) => o.done ? s(o.value) : Promise.resolve(o.value).then(i, a);
|
|
257
257
|
n((l = l.apply(e, t)).next());
|
|
258
258
|
});
|
|
259
|
-
const
|
|
259
|
+
const ft = typeof window < "u", T = 65536 - 1, P = T * T, Ct = 512 - 1, de = [
|
|
260
260
|
0,
|
|
261
261
|
20,
|
|
262
262
|
40,
|
|
@@ -1035,20 +1035,20 @@ function me(e) {
|
|
|
1035
1035
|
return T;
|
|
1036
1036
|
t = e * (e * (e + -144107) / T + 132114) / T + 14379;
|
|
1037
1037
|
for (let l = 0; l < 2; l++) {
|
|
1038
|
-
const s = t * t * t, c = e + (2 * s +
|
|
1039
|
-
t = (t * (2 * e + (s +
|
|
1038
|
+
const s = t * t * t, c = e + (2 * s + P / 2) / P;
|
|
1039
|
+
t = (t * (2 * e + (s + P / 2) / P) + c / 2) / c;
|
|
1040
1040
|
}
|
|
1041
1041
|
return t;
|
|
1042
1042
|
}
|
|
1043
|
-
function
|
|
1043
|
+
function f(e, t) {
|
|
1044
1044
|
return (e ^ t) < 0 ? (e - t / 2) / t : (e + t / 2) / t;
|
|
1045
1045
|
}
|
|
1046
|
-
function
|
|
1046
|
+
function tt(e) {
|
|
1047
1047
|
const t = de[e >> 16 & 255], l = de[e >> 8 & 255], s = de[e & 255], c = (27015 * t + 35149 * l + 3372 * s + T / 2) / T, i = (13887 * t + 44610 * l + 7038 * s + T / 2) / T, a = (5787 * t + 18462 * l + 41286 * s + T / 2) / T, n = me(c), o = me(i), r = me(a);
|
|
1048
1048
|
return [
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1049
|
+
f(13792 * n + 52010 * o - 267 * r, T),
|
|
1050
|
+
f(129628 * n - 159158 * o + 29530 * r, T),
|
|
1051
|
+
f(1698 * n + 51299 * o - 52997 * r, T)
|
|
1052
1052
|
];
|
|
1053
1053
|
}
|
|
1054
1054
|
function be(e) {
|
|
@@ -1057,32 +1057,32 @@ function be(e) {
|
|
|
1057
1057
|
if (e >= T)
|
|
1058
1058
|
return 255;
|
|
1059
1059
|
{
|
|
1060
|
-
const t = e *
|
|
1060
|
+
const t = e * Ct, l = ~~(t / T), s = t % T, c = Ge[l], i = Ge[l + 1];
|
|
1061
1061
|
return (s * (i - c) + T / 2) / T + c;
|
|
1062
1062
|
}
|
|
1063
1063
|
}
|
|
1064
|
-
function
|
|
1065
|
-
const t = e[0] +
|
|
1064
|
+
function Et(e) {
|
|
1065
|
+
const t = e[0] + f(25974 * e[1], T) + f(14143 * e[2], T), l = e[0] + f(-6918 * e[1], T) + f(-4185 * e[2], T), s = e[0] + f(-5864 * e[1], T) + f(-84638 * e[2], T), c = X(t, 2) * t / P, i = X(l, 2) * l / P, a = X(s, 2) * s / P, n = be((267169 * c + -216771 * i + 15137 * a + T / 2) / T), o = be((-83127 * c + 171030 * i + -22368 * a + T / 2) / T), r = be((-275 * c + -46099 * i + 111909 * a + T / 2) / T);
|
|
1066
1066
|
return n << 16 | o << 8 | r;
|
|
1067
1067
|
}
|
|
1068
|
-
function
|
|
1068
|
+
function zt(e) {
|
|
1069
1069
|
const t = { l: 0, a: 1, b: 2 }, l = e[0], s = e[1], c = e[2], i = t[l], a = t[s], n = t[c];
|
|
1070
1070
|
return (o, r) => o.oklab[i] - r.oklab[i] || o.oklab[a] - r.oklab[a] || o.oklab[n] - r.oklab[n];
|
|
1071
1071
|
}
|
|
1072
|
-
function
|
|
1072
|
+
function Vt(e, t, l) {
|
|
1073
1073
|
return e >= t ? t >= l ? "lab" : e >= l ? "lba" : "bla" : e >= l ? "alb" : t >= l ? "abl" : "bal";
|
|
1074
1074
|
}
|
|
1075
|
-
function
|
|
1075
|
+
function jt(e) {
|
|
1076
1076
|
return new Promise((t) => {
|
|
1077
1077
|
const l = new Image();
|
|
1078
1078
|
l.decoding = "sync", l.loading = "eager", l.crossOrigin = "anonymous", l.onload = () => t(l), l.onerror = () => t(l), l.src = e;
|
|
1079
1079
|
});
|
|
1080
1080
|
}
|
|
1081
|
-
function
|
|
1081
|
+
function nt(e) {
|
|
1082
1082
|
return e && typeof e == "object" && "__CONTEXT__" in e;
|
|
1083
1083
|
}
|
|
1084
|
-
function
|
|
1085
|
-
return
|
|
1084
|
+
function Ot(e) {
|
|
1085
|
+
return nt(e) ? e : vt(e);
|
|
1086
1086
|
}
|
|
1087
1087
|
function vt(e = {}) {
|
|
1088
1088
|
const {
|
|
@@ -1104,21 +1104,21 @@ function vt(e = {}) {
|
|
|
1104
1104
|
finderCache: /* @__PURE__ */ new Map()
|
|
1105
1105
|
};
|
|
1106
1106
|
}
|
|
1107
|
-
function
|
|
1108
|
-
const t =
|
|
1107
|
+
function lt(e) {
|
|
1108
|
+
const t = nt(e) ? e : e.context, {
|
|
1109
1109
|
colorBoxesIndexTree: l,
|
|
1110
1110
|
finderCache: s
|
|
1111
1111
|
} = t;
|
|
1112
1112
|
function c(a, n, o) {
|
|
1113
1113
|
const { left: r, right: d, longest: p, oklab: u, colorBoxIndex: y } = l[a], M = Math.min(
|
|
1114
|
-
|
|
1114
|
+
X(n[0] - u[0], 2) + X(n[1] - u[1], 2) + X(n[2] - u[2], 2),
|
|
1115
1115
|
4294967295 - 1
|
|
1116
1116
|
);
|
|
1117
1117
|
M < o.dist && (o.colorBoxIndex = y, o.dist = M);
|
|
1118
1118
|
let m, h;
|
|
1119
1119
|
if (r !== -1 || d !== -1) {
|
|
1120
|
-
const
|
|
1121
|
-
|
|
1120
|
+
const w = n[p] - u[p];
|
|
1121
|
+
w <= 0 ? (m = r, h = d) : (m = d, h = r), m !== -1 && c(m, n, o), h !== -1 && X(w, 2) < o.dist && c(h, n, o);
|
|
1122
1122
|
}
|
|
1123
1123
|
}
|
|
1124
1124
|
function i(a) {
|
|
@@ -1133,10 +1133,10 @@ function st(e) {
|
|
|
1133
1133
|
let o = s.get(n);
|
|
1134
1134
|
o || (o = /* @__PURE__ */ new Map(), s.set(n, o));
|
|
1135
1135
|
let r = o.get(a);
|
|
1136
|
-
return r !== void 0 || (r = i(
|
|
1136
|
+
return r !== void 0 || (r = i(tt(a)), o.set(a, r)), r;
|
|
1137
1137
|
};
|
|
1138
1138
|
}
|
|
1139
|
-
function
|
|
1139
|
+
function Pt(e, t) {
|
|
1140
1140
|
const { colorBoxes: l } = e, s = l.reduce((a, n) => a + n.weight, 0);
|
|
1141
1141
|
if (!t)
|
|
1142
1142
|
return e.colorBoxes.map((a) => {
|
|
@@ -1212,7 +1212,7 @@ function Me(e, t, l) {
|
|
|
1212
1212
|
if (!M)
|
|
1213
1213
|
return;
|
|
1214
1214
|
const m = M.canvas;
|
|
1215
|
-
return
|
|
1215
|
+
return jt(t).then((h) => (M.clearRect(0, 0, m.width, m.height), m.width = h.width, m.height = h.height, M.drawImage(h, 0, 0, m.width, m.height), Me(
|
|
1216
1216
|
e,
|
|
1217
1217
|
M.getImageData(0, 0, m.width, m.height).data,
|
|
1218
1218
|
l
|
|
@@ -1229,13 +1229,13 @@ function Me(e, t, l) {
|
|
|
1229
1229
|
);
|
|
1230
1230
|
}
|
|
1231
1231
|
for (let M = y.length, m = 0; m < M; m += 4) {
|
|
1232
|
-
const h = y[m],
|
|
1233
|
-
if (r && x === 0 || d === "diff" && o && h === o[m] &&
|
|
1232
|
+
const h = y[m], w = y[m + 1], W = y[m + 2], x = y[m + 3];
|
|
1233
|
+
if (r && x === 0 || d === "diff" && o && h === o[m] && w === o[m + 1] && W === o[m + 2] && x === o[m + 3])
|
|
1234
1234
|
continue;
|
|
1235
|
-
const Z = h << 16 |
|
|
1235
|
+
const Z = h << 16 | w << 8 | W, g = x * 1e8 + Z, L = g % 32768;
|
|
1236
1236
|
let G = u.get(L);
|
|
1237
1237
|
G || (G = /* @__PURE__ */ new Map(), u.set(L, G));
|
|
1238
|
-
let k = G.get(
|
|
1238
|
+
let k = G.get(g);
|
|
1239
1239
|
if (k !== void 0) {
|
|
1240
1240
|
p[k].count++;
|
|
1241
1241
|
continue;
|
|
@@ -1243,13 +1243,13 @@ function Me(e, t, l) {
|
|
|
1243
1243
|
k = p.push({
|
|
1244
1244
|
alpha: x,
|
|
1245
1245
|
srgb: Z,
|
|
1246
|
-
oklab:
|
|
1246
|
+
oklab: tt(Z),
|
|
1247
1247
|
count: 1
|
|
1248
|
-
}) - 1, G.set(
|
|
1248
|
+
}) - 1, G.set(g, k);
|
|
1249
1249
|
}
|
|
1250
1250
|
return y;
|
|
1251
1251
|
}
|
|
1252
|
-
function
|
|
1252
|
+
function st(e, t) {
|
|
1253
1253
|
const { colorSamples: l } = t, { start: s, end: c } = e;
|
|
1254
1254
|
e.length = c - s, e.weight = 0;
|
|
1255
1255
|
const i = [0, 0, 0];
|
|
@@ -1265,9 +1265,9 @@ function ot(e, t) {
|
|
|
1265
1265
|
const a = [0, 0, 0];
|
|
1266
1266
|
for (let n = s; n < c; n++) {
|
|
1267
1267
|
const o = l[n];
|
|
1268
|
-
a[0] +=
|
|
1268
|
+
a[0] += X(o.oklab[0] - e.oklab[0], 2) * o.count, a[1] += X(o.oklab[1] - e.oklab[1], 2) * o.count, a[2] += X(o.oklab[2] - e.oklab[2], 2) * o.count;
|
|
1269
1269
|
}
|
|
1270
|
-
e.sort =
|
|
1270
|
+
e.sort = Vt(a[0], a[1], a[2]), e.score = Math.max(a[0], a[1], a[2]);
|
|
1271
1271
|
}
|
|
1272
1272
|
function Se(e, t) {
|
|
1273
1273
|
const l = j({
|
|
@@ -1281,9 +1281,9 @@ function Se(e, t) {
|
|
|
1281
1281
|
srgb: 0,
|
|
1282
1282
|
oklab: [0, 0, 0]
|
|
1283
1283
|
}, e);
|
|
1284
|
-
return
|
|
1284
|
+
return st(l, t), l;
|
|
1285
1285
|
}
|
|
1286
|
-
function
|
|
1286
|
+
function Qt(e) {
|
|
1287
1287
|
const { colorBoxes: t } = e, l = [], s = /* @__PURE__ */ new Map();
|
|
1288
1288
|
for (let a = -1, n = t.length, o = 0; o < n; o++) {
|
|
1289
1289
|
const { srgb: r } = t[o];
|
|
@@ -1338,7 +1338,7 @@ function Ut(e) {
|
|
|
1338
1338
|
}
|
|
1339
1339
|
return l;
|
|
1340
1340
|
}
|
|
1341
|
-
function
|
|
1341
|
+
function Ut(e, t = {}) {
|
|
1342
1342
|
const {
|
|
1343
1343
|
maxColors: l,
|
|
1344
1344
|
colorSamples: s
|
|
@@ -1367,29 +1367,29 @@ function Jt(e, t = {}) {
|
|
|
1367
1367
|
end: p.end,
|
|
1368
1368
|
sorted: p.sorted
|
|
1369
1369
|
}, e);
|
|
1370
|
-
p.end -= y.length,
|
|
1370
|
+
p.end -= y.length, st(p, e), o.push(y), n++;
|
|
1371
1371
|
}
|
|
1372
1372
|
for (; a && a.length > 1; ) {
|
|
1373
1373
|
const { start: p, end: u, sort: y, sorted: M } = a;
|
|
1374
1374
|
if (y !== M) {
|
|
1375
|
-
const x = s.slice(p, u).sort(
|
|
1376
|
-
for (let Z = x.length,
|
|
1377
|
-
s[p +
|
|
1375
|
+
const x = s.slice(p, u).sort(zt(y));
|
|
1376
|
+
for (let Z = x.length, g = 0; g < Z; g++)
|
|
1377
|
+
s[p + g] = x[g];
|
|
1378
1378
|
a.sorted = y;
|
|
1379
1379
|
}
|
|
1380
1380
|
const m = a.weight + 1 >> 1;
|
|
1381
|
-
let h = p,
|
|
1382
|
-
for (let x = u - 2; h < x && (
|
|
1381
|
+
let h = p, w = 0;
|
|
1382
|
+
for (let x = u - 2; h < x && (w += s[h].count, !(w > m)); h++)
|
|
1383
1383
|
;
|
|
1384
1384
|
d(a, h);
|
|
1385
1385
|
const W = r();
|
|
1386
1386
|
a = W >= 0 ? o[W] : null;
|
|
1387
1387
|
}
|
|
1388
1388
|
for (let p = o.length, u = 0; u < p; u++)
|
|
1389
|
-
o[u].srgb =
|
|
1390
|
-
e.colorBoxes = o.sort((p, u) => p.srgb - u.srgb), e.colorBoxesIndexTree =
|
|
1389
|
+
o[u].srgb = Et(o[u].oklab);
|
|
1390
|
+
e.colorBoxes = o.sort((p, u) => p.srgb - u.srgb), e.colorBoxesIndexTree = Qt(e), i && (e.colorSamples = [], e.colorSamplesCache.clear()), e.finderCache.clear();
|
|
1391
1391
|
}
|
|
1392
|
-
function
|
|
1392
|
+
function Jt(e, t, l) {
|
|
1393
1393
|
const { colorBoxes: s } = e;
|
|
1394
1394
|
if (!t)
|
|
1395
1395
|
return;
|
|
@@ -1434,17 +1434,17 @@ function Ft(e, t, l) {
|
|
|
1434
1434
|
index: i
|
|
1435
1435
|
};
|
|
1436
1436
|
}
|
|
1437
|
-
function
|
|
1437
|
+
function Ft(e) {
|
|
1438
1438
|
e.colorSamples = [], e.colorSamplesCache.clear(), e.colorBoxes = [], e.colorBoxesIndexTree = [], e.finderCache.clear();
|
|
1439
1439
|
}
|
|
1440
1440
|
function De(e) {
|
|
1441
|
-
const t =
|
|
1441
|
+
const t = Ot(e), {
|
|
1442
1442
|
statsMode: l,
|
|
1443
1443
|
samples: s,
|
|
1444
1444
|
skipTransparent: c
|
|
1445
1445
|
} = t, i = function() {
|
|
1446
1446
|
let r;
|
|
1447
|
-
return () => (!r &&
|
|
1447
|
+
return () => (!r && ft && (r = document.createElement("canvas").getContext("2d", {
|
|
1448
1448
|
willReadFrequently: !0
|
|
1449
1449
|
})), r);
|
|
1450
1450
|
}();
|
|
@@ -1464,22 +1464,22 @@ function De(e) {
|
|
|
1464
1464
|
},
|
|
1465
1465
|
generate(r = {}) {
|
|
1466
1466
|
const { clearSamples: d = !0 } = r;
|
|
1467
|
-
return d && (a = null),
|
|
1467
|
+
return d && (a = null), Ut(t, r), this;
|
|
1468
1468
|
},
|
|
1469
|
-
getColors: (r) =>
|
|
1470
|
-
findNearestColor: (r) => (n || (n =
|
|
1471
|
-
reset: () =>
|
|
1469
|
+
getColors: (r) => Pt(t, r),
|
|
1470
|
+
findNearestColor: (r) => (n || (n = lt(t)), Jt(t, n, r)),
|
|
1471
|
+
reset: () => Ft(t)
|
|
1472
1472
|
};
|
|
1473
1473
|
return s.length && (s.forEach((r) => o.addSample(r)), t.samples = []), o;
|
|
1474
1474
|
}
|
|
1475
|
-
const ne = "[modern-gif]",
|
|
1476
|
-
function
|
|
1475
|
+
const ne = "[modern-gif]", Ht = "GIF", Rt = 44, ot = 33, At = 255, Bt = 11, $t = 249, _t = 4, qt = 59, en = (...e) => console.warn(ne, ...e), tn = (...e) => console.debug(ne, ...e), nn = (e) => console.time(`${ne} ${e}`), ln = (e) => console.timeEnd(`${ne} ${e}`);
|
|
1476
|
+
function sn(e) {
|
|
1477
1477
|
const t = new Uint8Array(
|
|
1478
1478
|
e.reduce((l, s) => l + s.byteLength, 0)
|
|
1479
1479
|
);
|
|
1480
1480
|
return e.reduce((l, s) => (t.set(s, l), l + s.byteLength), 0), t;
|
|
1481
1481
|
}
|
|
1482
|
-
function
|
|
1482
|
+
function on(e, t, l) {
|
|
1483
1483
|
let s;
|
|
1484
1484
|
if (ArrayBuffer.isView(e))
|
|
1485
1485
|
s = e.buffer;
|
|
@@ -1502,27 +1502,27 @@ function rn(e, t, l) {
|
|
|
1502
1502
|
throw new Error("Unsupported output format");
|
|
1503
1503
|
}
|
|
1504
1504
|
}
|
|
1505
|
-
function
|
|
1505
|
+
function rn(e) {
|
|
1506
1506
|
const t = new Image();
|
|
1507
1507
|
return t.decoding = "sync", t.loading = "eager", t.crossOrigin = "anonymous", t.src = e, t;
|
|
1508
1508
|
}
|
|
1509
|
-
function
|
|
1509
|
+
function cn(e) {
|
|
1510
1510
|
return new Promise((t, l) => {
|
|
1511
|
-
const s =
|
|
1511
|
+
const s = rn(e);
|
|
1512
1512
|
s.onload = () => t(s), s.onerror = l;
|
|
1513
1513
|
});
|
|
1514
1514
|
}
|
|
1515
|
-
function
|
|
1515
|
+
function an(e, t) {
|
|
1516
1516
|
var l;
|
|
1517
1517
|
const { top: s = 0, left: c = 0, width: i, height: a, rawWidth: n, rate: o = 4, callback: r } = t, d = new Uint8ClampedArray(i * a * o), p = c * o, u = s * o, y = i * o, M = n * o;
|
|
1518
1518
|
for (let m = 0; m < a; m++)
|
|
1519
1519
|
for (let h = 0; h < y; h++) {
|
|
1520
|
-
const
|
|
1521
|
-
d[m * y + h] = (l = r == null ? void 0 : r(
|
|
1520
|
+
const w = (u + m) * M + (p + h);
|
|
1521
|
+
d[m * y + h] = (l = r == null ? void 0 : r(w)) != null ? l : e[w];
|
|
1522
1522
|
}
|
|
1523
1523
|
return d;
|
|
1524
1524
|
}
|
|
1525
|
-
function
|
|
1525
|
+
function rt(e = {}) {
|
|
1526
1526
|
const {
|
|
1527
1527
|
chunkSize: t = 4096
|
|
1528
1528
|
} = e;
|
|
@@ -1550,7 +1550,7 @@ function ct(e = {}) {
|
|
|
1550
1550
|
}
|
|
1551
1551
|
};
|
|
1552
1552
|
}
|
|
1553
|
-
function
|
|
1553
|
+
function dn(e) {
|
|
1554
1554
|
var t, l, s;
|
|
1555
1555
|
const c = j({
|
|
1556
1556
|
version: "89a",
|
|
@@ -1578,43 +1578,43 @@ function mn(e) {
|
|
|
1578
1578
|
if (c.backgroundColorIndex === 0)
|
|
1579
1579
|
throw new Error("Background index explicitly passed as 0.");
|
|
1580
1580
|
}
|
|
1581
|
-
const a =
|
|
1581
|
+
const a = rt(), {
|
|
1582
1582
|
writeByte: n,
|
|
1583
1583
|
writeBytes: o,
|
|
1584
1584
|
writeUnsigned: r,
|
|
1585
1585
|
writeString: d,
|
|
1586
1586
|
flush: p
|
|
1587
1587
|
} = a;
|
|
1588
|
-
return d(
|
|
1588
|
+
return d(Ht), d(c.version), r(c.width), r(c.height), n(parseInt(`${c.colorTableSize ? 1 : 0}1110${c.colorTableSize.toString(2).padStart(3, "0")}`, 2)), n(c.backgroundColorIndex), n(c.pixelAspectRatio), o((s = (l = c.colorTable) == null ? void 0 : l.flat()) != null ? s : []), c.looped && (n(ot), n(At), n(Bt), d("NETSCAPE2.0"), n(3), n(1), r(c.loopCount), n(0)), p();
|
|
1589
1589
|
}
|
|
1590
|
-
function
|
|
1590
|
+
function mn(e, t, l) {
|
|
1591
1591
|
const { writeByte: s, getCursor: c, calculateDistance: i } = l;
|
|
1592
1592
|
s(e);
|
|
1593
1593
|
let a = c();
|
|
1594
1594
|
s(0);
|
|
1595
1595
|
const n = 1 << e, o = n - 1, r = n + 1;
|
|
1596
1596
|
let d = r + 1, p = e + 1, u = 0, y = 0;
|
|
1597
|
-
function M(
|
|
1598
|
-
for (; u >=
|
|
1597
|
+
function M(g) {
|
|
1598
|
+
for (; u >= g; )
|
|
1599
1599
|
s(y & 255), y >>= 8, u -= 8, i(a) === 256 && (s(255, a), a = c(), s(0));
|
|
1600
1600
|
}
|
|
1601
|
-
function m(
|
|
1602
|
-
y |=
|
|
1601
|
+
function m(g) {
|
|
1602
|
+
y |= g << u, u += p, M(8);
|
|
1603
1603
|
}
|
|
1604
|
-
let h = t[0] & o,
|
|
1604
|
+
let h = t[0] & o, w = {}, W, x, Z;
|
|
1605
1605
|
m(n);
|
|
1606
|
-
for (let
|
|
1607
|
-
if (Z = t[L] & o, W = h << 8 | Z, x =
|
|
1606
|
+
for (let g = t.length, L = 1; L < g; ++L)
|
|
1607
|
+
if (Z = t[L] & o, W = h << 8 | Z, x = w[W], x === void 0) {
|
|
1608
1608
|
for (y |= h << u, u += p; u >= 8; )
|
|
1609
1609
|
s(y & 255), y >>= 8, u -= 8, i(a) === 256 && (s(255, a), a = c(), s(0));
|
|
1610
|
-
d === 4096 ? (m(n), d = r + 1, p = e + 1,
|
|
1610
|
+
d === 4096 ? (m(n), d = r + 1, p = e + 1, w = {}) : (d >= 1 << p && ++p, w[W] = d++), h = Z;
|
|
1611
1611
|
} else
|
|
1612
1612
|
h = x;
|
|
1613
1613
|
m(h), m(r), M(1), i(a) === 1 ? s(0, a) : (s(i(a) - 1, a), s(0));
|
|
1614
1614
|
}
|
|
1615
|
-
function
|
|
1615
|
+
function bn(e) {
|
|
1616
1616
|
var t, l, s;
|
|
1617
|
-
const c =
|
|
1617
|
+
const c = rt(), {
|
|
1618
1618
|
writeByte: i,
|
|
1619
1619
|
writeBytes: a,
|
|
1620
1620
|
writeUnsigned: n,
|
|
@@ -1631,7 +1631,7 @@ function un(e) {
|
|
|
1631
1631
|
disposal: m = 0
|
|
1632
1632
|
} = e;
|
|
1633
1633
|
const h = (t = e.graphicControl) == null ? void 0 : t.transparent;
|
|
1634
|
-
let
|
|
1634
|
+
let w = (s = (l = e.graphicControl) == null ? void 0 : l.transparentIndex) != null ? s : 255;
|
|
1635
1635
|
if (r < 0 || r > 65535)
|
|
1636
1636
|
throw new Error("Left invalid.");
|
|
1637
1637
|
if (d < 0 || d > 65535)
|
|
@@ -1647,14 +1647,14 @@ function un(e) {
|
|
|
1647
1647
|
for (; x >>= 1; )
|
|
1648
1648
|
++W;
|
|
1649
1649
|
}
|
|
1650
|
-
return i(
|
|
1650
|
+
return i(ot), i($t), i(_t), h ? m || (m = 2) : w = 0, i(parseInt(`000${Number(m & 7).toString(2).padStart(3, "0")}0${h ? 1 : 0}`, 2)), n(y / 10), i(w), i(0), i(Rt), n(r), n(d), n(p), n(u), M != null && M.length ? (i(parseInt(`10000${(W - 1).toString(2).padStart(3, "0")}`, 2)), a(M.flat())) : i(0), mn(W, e.imageData, c), o();
|
|
1651
1651
|
}
|
|
1652
|
-
function
|
|
1652
|
+
function un(e) {
|
|
1653
1653
|
const {
|
|
1654
1654
|
frames: t,
|
|
1655
1655
|
palette: l,
|
|
1656
1656
|
transparentIndex: s
|
|
1657
|
-
} = e, c =
|
|
1657
|
+
} = e, c = lt(l);
|
|
1658
1658
|
return t.map(({ imageData: i }) => {
|
|
1659
1659
|
let a = !1;
|
|
1660
1660
|
const n = new Uint8ClampedArray(i.length / 4);
|
|
@@ -1668,7 +1668,7 @@ function pn(e) {
|
|
|
1668
1668
|
};
|
|
1669
1669
|
});
|
|
1670
1670
|
}
|
|
1671
|
-
function
|
|
1671
|
+
function pn(e) {
|
|
1672
1672
|
const { frames: t, transparentIndex: l } = e;
|
|
1673
1673
|
let s;
|
|
1674
1674
|
const c = t.length;
|
|
@@ -1730,8 +1730,8 @@ function Mn(e) {
|
|
|
1730
1730
|
for (; u < M; ) {
|
|
1731
1731
|
let x = !0;
|
|
1732
1732
|
for (let Z = 0; Z < n; Z++) {
|
|
1733
|
-
const
|
|
1734
|
-
if (d[
|
|
1733
|
+
const g = n * u + Z;
|
|
1734
|
+
if (d[g] !== s[g]) {
|
|
1735
1735
|
x = !1;
|
|
1736
1736
|
break;
|
|
1737
1737
|
}
|
|
@@ -1743,8 +1743,8 @@ function Mn(e) {
|
|
|
1743
1743
|
for (; M > u; ) {
|
|
1744
1744
|
let x = !0;
|
|
1745
1745
|
for (let Z = 0; Z < n; Z++) {
|
|
1746
|
-
const
|
|
1747
|
-
if (d[
|
|
1746
|
+
const g = n * M + Z;
|
|
1747
|
+
if (d[g] !== s[g]) {
|
|
1748
1748
|
x = !1;
|
|
1749
1749
|
break;
|
|
1750
1750
|
}
|
|
@@ -1759,8 +1759,8 @@ function Mn(e) {
|
|
|
1759
1759
|
for (; p < y; ) {
|
|
1760
1760
|
let x = !0;
|
|
1761
1761
|
for (let Z = u; Z <= M; Z++) {
|
|
1762
|
-
const
|
|
1763
|
-
if (d[
|
|
1762
|
+
const g = Z * n + p;
|
|
1763
|
+
if (d[g] !== s[g]) {
|
|
1764
1764
|
x = !1;
|
|
1765
1765
|
break;
|
|
1766
1766
|
}
|
|
@@ -1772,8 +1772,8 @@ function Mn(e) {
|
|
|
1772
1772
|
for (; y > p; ) {
|
|
1773
1773
|
let x = !0;
|
|
1774
1774
|
for (let Z = u; Z <= M; Z++) {
|
|
1775
|
-
const
|
|
1776
|
-
if (d[
|
|
1775
|
+
const g = Z * n + y;
|
|
1776
|
+
if (d[g] !== s[g]) {
|
|
1777
1777
|
x = !1;
|
|
1778
1778
|
break;
|
|
1779
1779
|
}
|
|
@@ -1786,13 +1786,13 @@ function Mn(e) {
|
|
|
1786
1786
|
}
|
|
1787
1787
|
m = s, s = d;
|
|
1788
1788
|
}
|
|
1789
|
-
const h = y + 1 - p,
|
|
1789
|
+
const h = y + 1 - p, w = M + 1 - u, W = an(
|
|
1790
1790
|
d,
|
|
1791
1791
|
{
|
|
1792
1792
|
left: p,
|
|
1793
1793
|
top: u,
|
|
1794
1794
|
width: h,
|
|
1795
|
-
height:
|
|
1795
|
+
height: w,
|
|
1796
1796
|
rawWidth: n,
|
|
1797
1797
|
rate: 1,
|
|
1798
1798
|
callback: (x) => {
|
|
@@ -1805,21 +1805,21 @@ function Mn(e) {
|
|
|
1805
1805
|
left: p,
|
|
1806
1806
|
top: u,
|
|
1807
1807
|
width: h,
|
|
1808
|
-
height:
|
|
1808
|
+
height: w,
|
|
1809
1809
|
disposal: r && a !== c - 1 ? 2 : 1,
|
|
1810
1810
|
imageData: W
|
|
1811
1811
|
};
|
|
1812
1812
|
});
|
|
1813
1813
|
}
|
|
1814
|
-
function
|
|
1814
|
+
function Mn(e) {
|
|
1815
1815
|
return {
|
|
1816
|
-
time: (t) => e &&
|
|
1817
|
-
timeEnd: (t) => e &&
|
|
1818
|
-
debug: (...t) => e &&
|
|
1819
|
-
warn: (...t) => e &&
|
|
1816
|
+
time: (t) => e && nn(t),
|
|
1817
|
+
timeEnd: (t) => e && ln(t),
|
|
1818
|
+
debug: (...t) => e && tn(...t),
|
|
1819
|
+
warn: (...t) => e && en(...t)
|
|
1820
1820
|
};
|
|
1821
1821
|
}
|
|
1822
|
-
function
|
|
1822
|
+
function yn(e) {
|
|
1823
1823
|
const t = /* @__PURE__ */ new Map(), { workerUrl: l } = e;
|
|
1824
1824
|
let { workerNumber: s = 1 } = e;
|
|
1825
1825
|
const c = [...new Array(l ? s : 0)].map(() => {
|
|
@@ -1852,7 +1852,7 @@ function hn(e) {
|
|
|
1852
1852
|
}()
|
|
1853
1853
|
};
|
|
1854
1854
|
}
|
|
1855
|
-
function
|
|
1855
|
+
function hn(e) {
|
|
1856
1856
|
const {
|
|
1857
1857
|
width: t,
|
|
1858
1858
|
height: l,
|
|
@@ -1867,27 +1867,27 @@ function xn(e) {
|
|
|
1867
1867
|
height: l,
|
|
1868
1868
|
maxColors: n,
|
|
1869
1869
|
frames: [],
|
|
1870
|
-
log:
|
|
1870
|
+
log: Mn(o),
|
|
1871
1871
|
palette: De({
|
|
1872
1872
|
skipTransparent: !1
|
|
1873
1873
|
}),
|
|
1874
|
-
worker:
|
|
1874
|
+
worker: yn({ workerUrl: s, workerNumber: c }),
|
|
1875
1875
|
encodeId: 0,
|
|
1876
1876
|
encode(m) {
|
|
1877
1877
|
return V(this, null, function* () {
|
|
1878
|
-
const { log: h, frames:
|
|
1878
|
+
const { log: h, frames: w, encodeId: W, width: x, height: Z } = r;
|
|
1879
1879
|
r.encodeId++;
|
|
1880
|
-
const { width:
|
|
1880
|
+
const { width: g = x, height: L = Z } = m;
|
|
1881
1881
|
let { imageData: G } = m;
|
|
1882
1882
|
h.time(`palette:sample-${W}`);
|
|
1883
1883
|
try {
|
|
1884
|
-
G = typeof G == "string" ? yield
|
|
1885
|
-
const k =
|
|
1886
|
-
width:
|
|
1884
|
+
G = typeof G == "string" ? yield cn(G) : G;
|
|
1885
|
+
const k = on(G, "uint8ClampedArray", {
|
|
1886
|
+
width: g,
|
|
1887
1887
|
height: L
|
|
1888
1888
|
});
|
|
1889
|
-
|
|
1890
|
-
width:
|
|
1889
|
+
w.push(F(j({
|
|
1890
|
+
width: g,
|
|
1891
1891
|
height: L
|
|
1892
1892
|
}, m), {
|
|
1893
1893
|
imageData: k
|
|
@@ -1899,9 +1899,9 @@ function xn(e) {
|
|
|
1899
1899
|
},
|
|
1900
1900
|
flush() {
|
|
1901
1901
|
return V(this, null, function* () {
|
|
1902
|
-
const { log: m, frames: h, width:
|
|
1902
|
+
const { log: m, frames: h, width: w, height: W, maxColors: x, palette: Z } = r;
|
|
1903
1903
|
m.time("palette:generate");
|
|
1904
|
-
const
|
|
1904
|
+
const g = yield p(x), L = De(g).getColors("rgb").map((I) => I.value);
|
|
1905
1905
|
m.debug("palette:maxColors", x);
|
|
1906
1906
|
const G = L.map((I) => {
|
|
1907
1907
|
const J = I[0].toString(16).padStart(2, "0"), oe = I[1].toString(16).padStart(2, "0"), re = I[2].toString(16).padStart(2, "0");
|
|
@@ -1915,7 +1915,7 @@ function xn(e) {
|
|
|
1915
1915
|
m.timeEnd("palette:generate"), m.time("frames:index");
|
|
1916
1916
|
const k = yield u({
|
|
1917
1917
|
frames: h,
|
|
1918
|
-
palette:
|
|
1918
|
+
palette: g,
|
|
1919
1919
|
transparentIndex: a
|
|
1920
1920
|
});
|
|
1921
1921
|
m.timeEnd("frames:index"), m.time("frames:crop");
|
|
@@ -1939,13 +1939,13 @@ function xn(e) {
|
|
|
1939
1939
|
})
|
|
1940
1940
|
)));
|
|
1941
1941
|
m.timeEnd("frames:encode"), m.time("output");
|
|
1942
|
-
const D =
|
|
1942
|
+
const D = dn(F(j({}, e), {
|
|
1943
1943
|
colorTable: L,
|
|
1944
1944
|
backgroundColorIndex: a,
|
|
1945
|
-
width:
|
|
1945
|
+
width: w,
|
|
1946
1946
|
height: W
|
|
1947
|
-
})), xe =
|
|
1948
|
-
return U.set(D), U.set(xe, D.byteLength), U[U.length - 1] =
|
|
1947
|
+
})), xe = sn(se), U = new Uint8Array(D.length + xe.byteLength + 1);
|
|
1948
|
+
return U.set(D), U.set(xe, D.byteLength), U[U.length - 1] = qt, m.timeEnd("output"), Z.reset(), r.frames = [], r.encodeId = 0, U;
|
|
1949
1949
|
});
|
|
1950
1950
|
}
|
|
1951
1951
|
};
|
|
@@ -1974,7 +1974,7 @@ function xn(e) {
|
|
|
1974
1974
|
return (yield r.worker.call(
|
|
1975
1975
|
"frames:index",
|
|
1976
1976
|
m
|
|
1977
|
-
)) ||
|
|
1977
|
+
)) || un(m);
|
|
1978
1978
|
});
|
|
1979
1979
|
}
|
|
1980
1980
|
function y(m) {
|
|
@@ -1982,8 +1982,8 @@ function xn(e) {
|
|
|
1982
1982
|
return (yield r.worker.call(
|
|
1983
1983
|
"frames:crop",
|
|
1984
1984
|
m,
|
|
1985
|
-
m.frames.map((
|
|
1986
|
-
)) ||
|
|
1985
|
+
m.frames.map((w) => w.imageData.buffer)
|
|
1986
|
+
)) || pn(m);
|
|
1987
1987
|
});
|
|
1988
1988
|
}
|
|
1989
1989
|
function M(m) {
|
|
@@ -1992,20 +1992,20 @@ function xn(e) {
|
|
|
1992
1992
|
"frame:encode",
|
|
1993
1993
|
m,
|
|
1994
1994
|
[m.imageData.buffer]
|
|
1995
|
-
)) ||
|
|
1995
|
+
)) || bn(m);
|
|
1996
1996
|
});
|
|
1997
1997
|
}
|
|
1998
1998
|
return r;
|
|
1999
1999
|
}
|
|
2000
|
-
function
|
|
2000
|
+
function xn(e) {
|
|
2001
2001
|
return V(this, null, function* () {
|
|
2002
|
-
const { frames: t } = e, l =
|
|
2002
|
+
const { frames: t } = e, l = hn(e);
|
|
2003
2003
|
for (let s = t.length, c = 0; c < s; c++)
|
|
2004
2004
|
yield l.encode(t[c]);
|
|
2005
2005
|
return yield l.flush();
|
|
2006
2006
|
});
|
|
2007
2007
|
}
|
|
2008
|
-
const gn = "data:application/javascript;base64,dmFyIEdlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgc2U9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczt2YXIgSGU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxxZT1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO3ZhciBBPU1hdGgucG93LGllPShCLHgsayk9PnggaW4gQj9HZShCLHgse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmt9KTpCW3hdPWssWj0oQix4KT0+e2Zvcih2YXIgayBpbiB4fHwoeD17fSkpSGUuY2FsbCh4LGspJiZpZShCLGsseFtrXSk7aWYoc2UpZm9yKHZhciBrIG9mIHNlKHgpKXFlLmNhbGwoeCxrKSYmaWUoQixrLHhba10pO3JldHVybiBCfTsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Y29uc3QgQj10eXBlb2Ygd2luZG93PCJ1Iix4PTY1NTM2LTEsaz14KngsY2U9NTEyLTEsTD1bMCwyMCw0MCw2MCw4MCw5OSwxMTksMTM5LDE1OSwxNzksMTk5LDIxOSwyNDEsMjY0LDI4OCwzMTMsMzQwLDM2NywzOTYsNDI3LDQ1OCw0OTEsNTI2LDU2Miw1OTksNjM3LDY3Nyw3MTgsNzYxLDgwNSw4NTEsODk4LDk0Nyw5OTcsMTA0OCwxMTAxLDExNTYsMTIxMiwxMjcwLDEzMzAsMTM5MSwxNDUzLDE1MTcsMTU4MywxNjUxLDE3MjAsMTc5MCwxODYzLDE5MzcsMjAxMywyMDkwLDIxNzAsMjI1MCwyMzMzLDI0MTgsMjUwNCwyNTkyLDI2ODEsMjc3MywyODY2LDI5NjEsMzA1OCwzMTU3LDMyNTgsMzM2MCwzNDY0LDM1NzAsMzY3OCwzNzg4LDM5MDAsNDAxNCw0MTI5LDQyNDcsNDM2Niw0NDg4LDQ2MTEsNDczNiw0ODY0LDQ5OTMsNTEyNCw1MjU3LDUzOTIsNTUzMCw1NjY5LDU4MTAsNTk1Myw2MDk5LDYyNDYsNjM5NSw2NTQ3LDY3MDAsNjg1Niw3MDE0LDcxNzQsNzMzNSw3NTAwLDc2NjYsNzgzNCw4MDA0LDgxNzcsODM1Miw4NTI4LDg3MDgsODg4OSw5MDcyLDkyNTgsOTQ0NSw5NjM1LDk4MjgsMTAwMjIsMTAyMTksMTA0MTcsMTA2MTksMTA4MjIsMTEwMjgsMTEyMzUsMTE0NDYsMTE2NTgsMTE4NzMsMTIwOTAsMTIzMDksMTI1MzAsMTI3NTQsMTI5ODAsMTMyMDksMTM0NDAsMTM2NzMsMTM5MDksMTQxNDYsMTQzODcsMTQ2MjksMTQ4NzQsMTUxMjIsMTUzNzEsMTU2MjMsMTU4NzgsMTYxMzUsMTYzOTQsMTY2NTYsMTY5MjAsMTcxODcsMTc0NTYsMTc3MjcsMTgwMDEsMTgyNzcsMTg1NTYsMTg4MzcsMTkxMjEsMTk0MDcsMTk2OTYsMTk5ODcsMjAyODEsMjA1NzcsMjA4NzYsMjExNzcsMjE0ODEsMjE3ODcsMjIwOTYsMjI0MDcsMjI3MjEsMjMwMzgsMjMzNTcsMjM2NzgsMjQwMDIsMjQzMjksMjQ2NTgsMjQ5OTAsMjUzMjUsMjU2NjIsMjYwMDEsMjYzNDQsMjY2ODgsMjcwMzYsMjczODYsMjc3MzksMjgwOTQsMjg0NTIsMjg4MTMsMjkxNzYsMjk1NDIsMjk5MTEsMzAyODIsMzA2NTYsMzEwMzMsMzE0MTIsMzE3OTQsMzIxNzksMzI1NjcsMzI5NTcsMzMzNTAsMzM3NDUsMzQxNDMsMzQ1NDQsMzQ5NDgsMzUzNTUsMzU3NjQsMzYxNzYsMzY1OTEsMzcwMDgsMzc0MjksMzc4NTIsMzgyNzgsMzg3MDYsMzkxMzgsMzk1NzIsNDAwMDksNDA0NDksNDA4OTEsNDEzMzcsNDE3ODUsNDIyMzYsNDI2OTAsNDMxNDcsNDM2MDYsNDQwNjksNDQ1MzQsNDUwMDIsNDU0NzMsNDU5NDcsNDY0MjMsNDY5MDMsNDczODUsNDc4NzEsNDgzNTksNDg4NTAsNDkzNDQsNDk4NDEsNTAzNDEsNTA4NDQsNTEzNDksNTE4NTgsNTIzNjksNTI4ODQsNTM0MDEsNTM5MjEsNTQ0NDUsNTQ5NzEsNTU1MDAsNTYwMzIsNTY1NjcsNTcxMDUsNTc2NDYsNTgxOTAsNTg3MzcsNTkyODcsNTk4NDAsNjAzOTYsNjA5NTUsNjE1MTcsNjIwODIsNjI2NTAsNjMyMjEsNjM3OTUsNjQzNzIsNjQ5NTIsNjU1MzVdLEc9WzAsNiwxMywxOCwyMiwyNSwyOCwzMSwzNCwzNiwzOCw0MCw0Miw0NCw0Niw0OCw1MCw1MSw1Myw1NCw1Niw1Nyw1OSw2MCw2MSw2Miw2NCw2NSw2Niw2Nyw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Niw4Nyw4OCw4OSw5MCw5MSw5MSw5Miw5Myw5NCw5NSw5NSw5Niw5Nyw5OCw5OCw5OSwxMDAsMTAxLDEwMSwxMDIsMTAzLDEwMywxMDQsMTA1LDEwNiwxMDYsMTA3LDEwOCwxMDgsMTA5LDExMCwxMTAsMTExLDExMSwxMTIsMTEzLDExMywxMTQsMTE1LDExNSwxMTYsMTE2LDExNywxMTgsMTE4LDExOSwxMTksMTIwLDEyMSwxMjEsMTIyLDEyMiwxMjMsMTIzLDEyNCwxMjUsMTI1LDEyNiwxMjYsMTI3LDEyNywxMjgsMTI4LDEyOSwxMjksMTMwLDEzMCwxMzEsMTMyLDEzMiwxMzMsMTMzLDEzNCwxMzQsMTM1LDEzNSwxMzYsMTM2LDEzNywxMzcsMTM4LDEzOCwxMzksMTM5LDE0MCwxNDAsMTQwLDE0MSwxNDEsMTQyLDE0MiwxNDMsMTQzLDE0NCwxNDQsMTQ1LDE0NSwxNDYsMTQ2LDE0NywxNDcsMTQ3LDE0OCwxNDgsMTQ5LDE0OSwxNTAsMTUwLDE1MSwxNTEsMTUxLDE1MiwxNTIsMTUzLDE1MywxNTQsMTU0LDE1NCwxNTUsMTU1LDE1NiwxNTYsMTU2LDE1NywxNTcsMTU4LDE1OCwxNTksMTU5LDE1OSwxNjAsMTYwLDE2MSwxNjEsMTYxLDE2MiwxNjIsMTYzLDE2MywxNjMsMTY0LDE2NCwxNjUsMTY1LDE2NSwxNjYsMTY2LDE2NiwxNjcsMTY3LDE2OCwxNjgsMTY4LDE2OSwxNjksMTY5LDE3MCwxNzAsMTcxLDE3MSwxNzEsMTcyLDE3MiwxNzIsMTczLDE3MywxNzQsMTc0LDE3NCwxNzUsMTc1LDE3NSwxNzYsMTc2LDE3NiwxNzcsMTc3LDE3NywxNzgsMTc4LDE3OSwxNzksMTc5LDE4MCwxODAsMTgwLDE4MSwxODEsMTgxLDE4MiwxODIsMTgyLDE4MywxODMsMTgzLDE4NCwxODQsMTg0LDE4NSwxODUsMTg1LDE4NiwxODYsMTg2LDE4NywxODcsMTg3LDE4OCwxODgsMTg4LDE4OSwxODksMTg5LDE5MCwxOTAsMTkwLDE5MSwxOTEsMTkxLDE5MiwxOTIsMTkyLDE5MywxOTMsMTkzLDE5MywxOTQsMTk0LDE5NCwxOTUsMTk1LDE5NSwxOTYsMTk2LDE5NiwxOTcsMTk3LDE5NywxOTgsMTk4LDE5OCwxOTgsMTk5LDE5OSwxOTksMjAwLDIwMCwyMDAsMjAxLDIwMSwyMDEsMjAxLDIwMiwyMDIsMjAyLDIwMywyMDMsMjAzLDIwNCwyMDQsMjA0LDIwNCwyMDUsMjA1LDIwNSwyMDYsMjA2LDIwNiwyMDYsMjA3LDIwNywyMDcsMjA4LDIwOCwyMDgsMjA4LDIwOSwyMDksMjA5LDIxMCwyMTAsMjEwLDIxMCwyMTEsMjExLDIxMSwyMTIsMjEyLDIxMiwyMTIsMjEzLDIxMywyMTMsMjE0LDIxNCwyMTQsMjE0LDIxNSwyMTUsMjE1LDIxNSwyMTYsMjE2LDIxNiwyMTcsMjE3LDIxNywyMTcsMjE4LDIxOCwyMTgsMjE4LDIxOSwyMTksMjE5LDIyMCwyMjAsMjIwLDIyMCwyMjEsMjIxLDIyMSwyMjEsMjIyLDIyMiwyMjIsMjIyLDIyMywyMjMsMjIzLDIyNCwyMjQsMjI0LDIyNCwyMjUsMjI1LDIyNSwyMjUsMjI2LDIyNiwyMjYsMjI2LDIyNywyMjcsMjI3LDIyNywyMjgsMjI4LDIyOCwyMjgsMjI5LDIyOSwyMjksMjI5LDIzMCwyMzAsMjMwLDIzMCwyMzEsMjMxLDIzMSwyMzEsMjMyLDIzMiwyMzIsMjMyLDIzMywyMzMsMjMzLDIzMywyMzQsMjM0LDIzNCwyMzQsMjM1LDIzNSwyMzUsMjM1LDIzNiwyMzYsMjM2LDIzNiwyMzcsMjM3LDIzNywyMzcsMjM4LDIzOCwyMzgsMjM4LDIzOSwyMzksMjM5LDIzOSwyMzksMjQwLDI0MCwyNDAsMjQwLDI0MSwyNDEsMjQxLDI0MSwyNDIsMjQyLDI0MiwyNDIsMjQzLDI0MywyNDMsMjQzLDI0MywyNDQsMjQ0LDI0NCwyNDQsMjQ1LDI0NSwyNDUsMjQ1LDI0NiwyNDYsMjQ2LDI0NiwyNDYsMjQ3LDI0NywyNDcsMjQ3LDI0OCwyNDgsMjQ4LDI0OCwyNDksMjQ5LDI0OSwyNDksMjQ5LDI1MCwyNTAsMjUwLDI1MCwyNTEsMjUxLDI1MSwyNTEsMjUxLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1NCwyNTQsMjU0LDI1NCwyNTUsMjU1LDI1NV07ZnVuY3Rpb24gUihuKXtsZXQgZTtpZihuPD0wKXJldHVybiAwO2lmKG4+PXgpcmV0dXJuIHg7ZT1uKihuKihuKy0xNDQxMDcpL3grMTMyMTE0KS94KzE0Mzc5O2ZvcihsZXQgbz0wO288MjtvKyspe2NvbnN0IGk9ZSplKmUsbD1uKygyKmkray8yKS9rO2U9KGUqKDIqbisoaStrLzIpL2spK2wvMikvbH1yZXR1cm4gZX1mdW5jdGlvbiBfKG4sZSl7cmV0dXJuKG5eZSk8MD8obi1lLzIpL2U6KG4rZS8yKS9lfWZ1bmN0aW9uIEgobil7Y29uc3QgZT1MW24+PjE2JjI1NV0sbz1MW24+PjgmMjU1XSxpPUxbbiYyNTVdLGw9KDI3MDE1KmUrMzUxNDkqbyszMzcyKmkreC8yKS94LGM9KDEzODg3KmUrNDQ2MTAqbys3MDM4KmkreC8yKS94LGE9KDU3ODcqZSsxODQ2MipvKzQxMjg2KmkreC8yKS94LHQ9UihsKSxyPVIoYykscz1SKGEpO3JldHVybltfKDEzNzkyKnQrNTIwMTAqci0yNjcqcyx4KSxfKDEyOTYyOCp0LTE1OTE1OCpyKzI5NTMwKnMseCksXygxNjk4KnQrNTEyOTkqci01Mjk5NypzLHgpXX1mdW5jdGlvbiB6KG4pe2lmKG48PTApcmV0dXJuIDA7aWYobj49eClyZXR1cm4gMjU1O3tjb25zdCBlPW4qY2Usbz1+fihlL3gpLGk9ZSV4LGw9R1tvXSxjPUdbbysxXTtyZXR1cm4oaSooYy1sKSt4LzIpL3grbH19ZnVuY3Rpb24gZmUobil7Y29uc3QgZT1uWzBdK18oMjU5NzQqblsxXSx4KStfKDE0MTQzKm5bMl0seCksbz1uWzBdK18oLTY5MTgqblsxXSx4KStfKC00MTg1Km5bMl0seCksaT1uWzBdK18oLTU4NjQqblsxXSx4KStfKC04NDYzOCpuWzJdLHgpLGw9QShlLDIpKmUvayxjPUEobywyKSpvL2ssYT1BKGksMikqaS9rLHQ9eigoMjY3MTY5KmwrLTIxNjc3MSpjKzE1MTM3KmEreC8yKS94KSxyPXooKC04MzEyNypsKzE3MTAzMCpjKy0yMjM2OCphK3gvMikveCkscz16KCgtMjc1KmwrLTQ2MDk5KmMrMTExOTA5KmEreC8yKS94KTtyZXR1cm4gdDw8MTZ8cjw8OHxzfWZ1bmN0aW9uIGRlKG4pe2NvbnN0IGU9e2w6MCxhOjEsYjoyfSxvPW5bMF0saT1uWzFdLGw9blsyXSxjPWVbb10sYT1lW2ldLHQ9ZVtsXTtyZXR1cm4ocixzKT0+ci5va2xhYltjXS1zLm9rbGFiW2NdfHxyLm9rbGFiW2FdLXMub2tsYWJbYV18fHIub2tsYWJbdF0tcy5va2xhYlt0XX1mdW5jdGlvbiB1ZShuLGUsbyl7cmV0dXJuIG4+PWU/ZT49bz8ibGFiIjpuPj1vPyJsYmEiOiJibGEiOm4+PW8/ImFsYiI6ZT49bz8iYWJsIjoiYmFsIn1mdW5jdGlvbiBoZShuKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e2NvbnN0IG89bmV3IEltYWdlO28uZGVjb2Rpbmc9InN5bmMiLG8ubG9hZGluZz0iZWFnZXIiLG8uY3Jvc3NPcmlnaW49ImFub255bW91cyIsby5vbmxvYWQ9KCk9PmUobyksby5vbmVycm9yPSgpPT5lKG8pLG8uc3JjPW59KX1mdW5jdGlvbiBxKG4pe3JldHVybiBuJiZ0eXBlb2Ygbj09Im9iamVjdCImJiJfX0NPTlRFWFRfXyJpbiBufWZ1bmN0aW9uIGdlKG4pe3JldHVybiBxKG4pP246cGUobil9ZnVuY3Rpb24gcGUobj17fSl7Y29uc3R7bWF4Q29sb3JzOmU9MjU2LHN0YXRzTW9kZTpvPSJmdWxsIixzYW1wbGVzOmk9W10sc2tpcFRyYW5zcGFyZW50Omw9ITB9PW47cmV0dXJue19fQ09OVEVYVF9fOiEwLHNhbXBsZXM6aSxtYXhDb2xvcnM6ZSxzdGF0c01vZGU6byxza2lwVHJhbnNwYXJlbnQ6bCxjb2xvclNhbXBsZXM6W10sY29sb3JTYW1wbGVzQ2FjaGU6bmV3IE1hcCxjb2xvckJveGVzOltdLGNvbG9yQm94ZXNJbmRleFRyZWU6W10sZmluZGVyQ2FjaGU6bmV3IE1hcH19ZnVuY3Rpb24gWShuKXtjb25zdCBlPXEobik/bjpuLmNvbnRleHQse2NvbG9yQm94ZXNJbmRleFRyZWU6byxmaW5kZXJDYWNoZTppfT1lO2Z1bmN0aW9uIGwoYSx0LHIpe2NvbnN0e2xlZnQ6cyxyaWdodDp1LGxvbmdlc3Q6ZCxva2xhYjpoLGNvbG9yQm94SW5kZXg6Yn09b1thXSxwPU1hdGgubWluKEEodFswXS1oWzBdLDIpK0EodFsxXS1oWzFdLDIpK0EodFsyXS1oWzJdLDIpLDQyOTQ5NjcyOTUtMSk7cDxyLmRpc3QmJihyLmNvbG9yQm94SW5kZXg9YixyLmRpc3Q9cCk7bGV0IGYsZztpZihzIT09LTF8fHUhPT0tMSl7Y29uc3QgQz10W2RdLWhbZF07Qzw9MD8oZj1zLGc9dSk6KGY9dSxnPXMpLGYhPT0tMSYmbChmLHQsciksZyE9PS0xJiZBKEMsMik8ci5kaXN0JiZsKGcsdCxyKX19ZnVuY3Rpb24gYyhhKXtjb25zdCB0PXtkaXN0Ok51bWJlci5NQVhfU0FGRV9JTlRFR0VSLGNvbG9yQm94SW5kZXg6LTF9O3JldHVybiBsKDAsYSx0KSx0LmNvbG9yQm94SW5kZXh9cmV0dXJuIGE9Pntjb25zdCB0PWElMzI3Njg7bGV0IHI9aS5nZXQodCk7cnx8KHI9bmV3IE1hcCxpLnNldCh0LHIpKTtsZXQgcz1yLmdldChhKTtyZXR1cm4gcyE9PXZvaWQgMHx8KHM9YyhIKGEpKSxyLnNldChhLHMpKSxzfX1mdW5jdGlvbiBtZShuLGUpe2NvbnN0e2NvbG9yQm94ZXM6b309bixpPW8ucmVkdWNlKChhLHQpPT5hK3Qud2VpZ2h0LDApO2lmKCFlKXJldHVybiBuLmNvbG9yQm94ZXMubWFwKGE9Pntjb25zdHtzcmdiOnQsd2VpZ2h0OnJ9PWE7cmV0dXJue3ZhbHVlOnQscGVyY2VudGFnZTpyL2l9fSk7Y29uc3QgbD1bXTtmb3IobGV0IGE9by5sZW5ndGgsdD0wO3Q8YTt0Kyspe2NvbnN0e3NyZ2I6cix3ZWlnaHQ6c309b1t0XTtsLnB1c2goe3ZhbHVlOltyPj4xNiYyNTUscj4+OCYyNTUsciYyNTVdLHBlcmNlbnRhZ2U6cy9pfSl9bGV0IGM7aWYoZT09PSJidWZmZXIiKXtjPW5ldyBVaW50OENsYW1wZWRBcnJheShsLmxlbmd0aCo0KTtmb3IobGV0IGE9bC5sZW5ndGgsdD0wO3Q8YTt0Kyspe2NvbnN0IHI9dCo0LHM9bFt0XS52YWx1ZTtjW3JdPXNbMF0sY1tyKzFdPXNbMV0sY1tyKzJdPXNbMl0sY1tyKzNdPTI1NX19ZWxzZSBpZihlPT09ImhleCIpe2M9W107Zm9yKGxldCBhPWwubGVuZ3RoLHQ9MDt0PGE7dCsrKXtjb25zdHt2YWx1ZTpyLHBlcmNlbnRhZ2U6c309bFt0XSx1PXJbMF0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSxkPXJbMV0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSxoPXJbMl0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKTtjLnB1c2goe3ZhbHVlOmAjJHt1fSR7ZH0ke2h9YCxwZXJjZW50YWdlOnN9KX19ZWxzZSBjPWw7cmV0dXJuIGN9ZnVuY3Rpb24gRihuLGUsbyl7dmFyIHUsZCxoLGI7Y29uc3R7Z2V0Q29udGV4dDJkOmkscHJldmlvdXNTYW1wbGU6bCxza2lwVHJhbnNwYXJlbnQ6Y309byx7c3RhdHNNb2RlOmEsY29sb3JTYW1wbGVzOnQsY29sb3JTYW1wbGVzQ2FjaGU6cn09bjtsZXQgcztpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpcz1uZXcgVWludDhDbGFtcGVkQXJyYXkoZS5idWZmZXIpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXM9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGUpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSlpZihBcnJheS5pc0FycmF5KGVbMF0pKXtjb25zdCBwPVtdO2ZvcihsZXQgZj1lLmxlbmd0aCxnPTA7ZzxmO2crKylwLnB1c2goKHU9ZVtnXVswXSkhPW51bGw/dTowLChkPWVbZ11bMV0pIT1udWxsP2Q6MCwoaD1lW2ddWzJdKSE9bnVsbD9oOjAsKGI9ZVtnXVszXSkhPW51bGw/YjoyNTUpO3M9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHApfWVsc2Ugcz1uZXcgVWludDhDbGFtcGVkQXJyYXkoZSk7ZWxzZSBpZih0eXBlb2YgZT09InN0cmluZyIpe2NvbnN0IHA9aT09bnVsbD92b2lkIDA6aSgpO2lmKCFwKXJldHVybjtjb25zdCBmPXAuY2FudmFzO3JldHVybiBoZShlKS50aGVuKGc9PihwLmNsZWFyUmVjdCgwLDAsZi53aWR0aCxmLmhlaWdodCksZi53aWR0aD1nLndpZHRoLGYuaGVpZ2h0PWcuaGVpZ2h0LHAuZHJhd0ltYWdlKGcsMCwwLGYud2lkdGgsZi5oZWlnaHQpLEYobixwLmdldEltYWdlRGF0YSgwLDAsZi53aWR0aCxmLmhlaWdodCkuZGF0YSxvKSkpfWVsc2V7Y29uc3QgcD1pPT1udWxsP3ZvaWQgMDppKCk7aWYoIXApcmV0dXJuO2NvbnN0IGY9cC5jYW52YXM7cmV0dXJuIHAuY2xlYXJSZWN0KDAsMCxmLndpZHRoLGYuaGVpZ2h0KSxmLndpZHRoPXR5cGVvZiBlLndpZHRoPT0ibnVtYmVyIj9lLndpZHRoOmUud2lkdGguYmFzZVZhbC52YWx1ZSxmLmhlaWdodD10eXBlb2YgZS5oZWlnaHQ9PSJudW1iZXIiP2UuaGVpZ2h0OmUuaGVpZ2h0LmJhc2VWYWwudmFsdWUscC5kcmF3SW1hZ2UoZSwwLDAsZi53aWR0aCxmLmhlaWdodCksRihuLHAuZ2V0SW1hZ2VEYXRhKDAsMCxmLndpZHRoLGYuaGVpZ2h0KS5kYXRhLG8pfWZvcihsZXQgcD1zLmxlbmd0aCxmPTA7ZjxwO2YrPTQpe2NvbnN0IGc9c1tmXSxDPXNbZisxXSx5PXNbZisyXSx3PXNbZiszXTtpZihjJiZ3PT09MHx8YT09PSJkaWZmIiYmbCYmZz09PWxbZl0mJkM9PT1sW2YrMV0mJnk9PT1sW2YrMl0mJnc9PT1sW2YrM10pY29udGludWU7Y29uc3QgbT1nPDwxNnxDPDw4fHksUz13KjFlOCttLEk9UyUzMjc2ODtsZXQgVD1yLmdldChJKTtUfHwoVD1uZXcgTWFwLHIuc2V0KEksVCkpO2xldCBFPVQuZ2V0KFMpO2lmKEUhPT12b2lkIDApe3RbRV0uY291bnQrKztjb250aW51ZX1FPXQucHVzaCh7YWxwaGE6dyxzcmdiOm0sb2tsYWI6SChtKSxjb3VudDoxfSktMSxULnNldChTLEUpfXJldHVybiBzfWZ1bmN0aW9uIEoobixlKXtjb25zdHtjb2xvclNhbXBsZXM6b309ZSx7c3RhcnQ6aSxlbmQ6bH09bjtuLmxlbmd0aD1sLWksbi53ZWlnaHQ9MDtjb25zdCBjPVswLDAsMF07Zm9yKGxldCB0PWk7dDxsO3QrKyl7Y29uc3Qgcj1vW3RdO2NbMF0rPXIub2tsYWJbMF0qci5jb3VudCxjWzFdKz1yLm9rbGFiWzFdKnIuY291bnQsY1syXSs9ci5va2xhYlsyXSpyLmNvdW50LG4ud2VpZ2h0Kz1yLmNvdW50fW4ub2tsYWI9W2NbMF0vbi53ZWlnaHQsY1sxXS9uLndlaWdodCxjWzJdL24ud2VpZ2h0XTtjb25zdCBhPVswLDAsMF07Zm9yKGxldCB0PWk7dDxsO3QrKyl7Y29uc3Qgcj1vW3RdO2FbMF0rPUEoci5va2xhYlswXS1uLm9rbGFiWzBdLDIpKnIuY291bnQsYVsxXSs9QShyLm9rbGFiWzFdLW4ub2tsYWJbMV0sMikqci5jb3VudCxhWzJdKz1BKHIub2tsYWJbMl0tbi5va2xhYlsyXSwyKSpyLmNvdW50fW4uc29ydD11ZShhWzBdLGFbMV0sYVsyXSksbi5zY29yZT1NYXRoLm1heChhWzBdLGFbMV0sYVsyXSl9ZnVuY3Rpb24gUShuLGUpe2NvbnN0IG89Wih7c3RhcnQ6MCxlbmQ6MCxsZW5ndGg6MCxzY29yZTowLHdlaWdodDowLHNvcnQ6ImxhYiIsc29ydGVkOm51bGwsc3JnYjowLG9rbGFiOlswLDAsMF19LG4pO3JldHVybiBKKG8sZSksb31mdW5jdGlvbiB3ZShuKXtjb25zdHtjb2xvckJveGVzOmV9PW4sbz1bXSxpPW5ldyBNYXA7Zm9yKGxldCBhPS0xLHQ9ZS5sZW5ndGgscj0wO3I8dDtyKyspe2NvbnN0e3NyZ2I6c309ZVtyXTtpZihzPT09YSl7aS5zZXQociwhMCk7Y29udGludWV9YT1zfWMoe21pbjpbLTY1NTM1LC02NTUzNSwtNjU1MzVdLG1heDpbNjU1MzUsNjU1MzUsNjU1MzVdfSk7ZnVuY3Rpb24gbChhKXtjb25zdCB0PXttaW46WzY1NTM1LDY1NTM1LDY1NTM1XSxtYXg6Wy02NTUzNSwtNjU1MzUsLTY1NTM1XX07bGV0IHI9MDtjb25zdCBzPVtdO2ZvcihsZXQgcD1lLmxlbmd0aCxmPTA7ZjxwO2YrKyl7Y29uc3R7b2tsYWI6Z309ZVtmXTtpLmhhcyhmKXx8Z1swXTxhLm1pblswXXx8Z1sxXTxhLm1pblsxXXx8Z1syXTxhLm1pblsyXXx8Z1swXT5hLm1heFswXXx8Z1sxXT5hLm1heFsxXXx8Z1syXT5hLm1heFsyXXx8KGdbMF08dC5taW5bMF0mJih0Lm1pblswXT1nWzBdKSxnWzFdPHQubWluWzFdJiYodC5taW5bMV09Z1sxXSksZ1syXTx0Lm1pblsyXSYmKHQubWluWzJdPWdbMl0pLGdbMF0+dC5tYXhbMF0mJih0Lm1heFswXT1nWzBdKSxnWzFdPnQubWF4WzFdJiYodC5tYXhbMV09Z1sxXSksZ1syXT50Lm1heFsyXSYmKHQubWF4WzJdPWdbMl0pLHNbcisrXT17b2tsYWI6Zyxjb2xvckJveEluZGV4OmZ9KX1sZXQgdT0wO2lmKCFyKXJldHVybntjb2xvckJveEluZGV4Oi0xLGxvbmdlc3Q6dX07Y29uc3QgZD10Lm1heFswXS10Lm1pblswXSxoPXQubWF4WzFdLXQubWluWzFdLGI9dC5tYXhbMl0tdC5taW5bMl07cmV0dXJuIGQ+PWgmJmQ+PWI/dT0wOmI+PWQmJmI+PWg/dT0yOmg+PWQmJmg+PWImJih1PTEpLHtjb2xvckJveEluZGV4OnMuc29ydCgocCxmKT0+cC5va2xhYlt1XS1mLm9rbGFiW3VdKVtyPj4xXS5jb2xvckJveEluZGV4LGxvbmdlc3Q6dX19ZnVuY3Rpb24gYyhhKXtjb25zdHtjb2xvckJveEluZGV4OnQsbG9uZ2VzdDpyfT1sKGEpO2lmKHQ8MClyZXR1cm4tMTtjb25zdHtva2xhYjpzfT1lW3RdLHU9e2xvbmdlc3Q6cixva2xhYjpzLGNvbG9yQm94SW5kZXg6dH0sZD1vLnB1c2godSktMTtpLnNldCh0LCEwKTtjb25zdCBoPXttYXg6Wy4uLmEubWF4XSxtaW46Wy4uLmEubWluXX0sYj17bWF4OlsuLi5hLm1heF0sbWluOlsuLi5hLm1pbl19O2gubWF4W3JdPXNbcl0sYi5taW5bcl09TWF0aC5taW4oc1tyXSsxLDY1NTM1KTtjb25zdCBwPWMoaCk7bGV0IGY9LTE7cmV0dXJuIGIubWluW3JdPD1iLm1heFtyXSYmKGY9YyhiKSksdS5sZWZ0PXAsdS5yaWdodD1mLGR9cmV0dXJuIG99ZnVuY3Rpb24gYmUobixlPXt9KXtjb25zdHttYXhDb2xvcnM6byxjb2xvclNhbXBsZXM6aX09bjtpZighaS5sZW5ndGgpcmV0dXJuO2NvbnN0e21heENvbG9yczpsPW8sY2xlYXJTYW1wbGVzOmM9ITB9PWU7bGV0IGE9USh7ZW5kOmkubGVuZ3RofSxuKSx0PTE7Y29uc3Qgcj1bYV07ZnVuY3Rpb24gcygpe2xldCBkPS0xLGg9LTE7aWYodD09PWwpcmV0dXJuLTE7Zm9yKGxldCBiPTA7Yjx0O2IrKyl7Y29uc3QgcD1yW2JdO3AubGVuZ3RoPj0yJiZwLnNjb3JlPmgmJihkPWIsaD1wLnNjb3JlKX1yZXR1cm4gZH1mdW5jdGlvbiB1KGQsaCl7Y29uc3QgYj1RKHtzdGFydDpoKzEsZW5kOmQuZW5kLHNvcnRlZDpkLnNvcnRlZH0sbik7ZC5lbmQtPWIubGVuZ3RoLEooZCxuKSxyLnB1c2goYiksdCsrfWZvcig7YSYmYS5sZW5ndGg+MTspe2NvbnN0e3N0YXJ0OmQsZW5kOmgsc29ydDpiLHNvcnRlZDpwfT1hO2lmKGIhPT1wKXtjb25zdCB3PWkuc2xpY2UoZCxoKS5zb3J0KGRlKGIpKTtmb3IobGV0IG09dy5sZW5ndGgsUz0wO1M8bTtTKyspaVtkK1NdPXdbU107YS5zb3J0ZWQ9Yn1jb25zdCBmPWEud2VpZ2h0KzE+PjE7bGV0IGc9ZCxDPTA7Zm9yKGxldCB3PWgtMjtnPHcmJihDKz1pW2ddLmNvdW50LCEoQz5mKSk7ZysrKTt1KGEsZyk7Y29uc3QgeT1zKCk7YT15Pj0wP3JbeV06bnVsbH1mb3IobGV0IGQ9ci5sZW5ndGgsaD0wO2g8ZDtoKyspcltoXS5zcmdiPWZlKHJbaF0ub2tsYWIpO24uY29sb3JCb3hlcz1yLnNvcnQoKGQsaCk9PmQuc3JnYi1oLnNyZ2IpLG4uY29sb3JCb3hlc0luZGV4VHJlZT13ZShuKSxjJiYobi5jb2xvclNhbXBsZXM9W10sbi5jb2xvclNhbXBsZXNDYWNoZS5jbGVhcigpKSxuLmZpbmRlckNhY2hlLmNsZWFyKCl9ZnVuY3Rpb24geGUobixlLG8pe2NvbnN0e2NvbG9yQm94ZXM6aX09bjtpZighZSlyZXR1cm47bGV0IGw7aWYodHlwZW9mIG89PSJudW1iZXIiKWw9bztlbHNlIGlmKHR5cGVvZiBvPT0ic3RyaW5nIil7Y29uc3Qgcj1vLnJlcGxhY2UoL14jLywiIikscz1bYCR7clswXX0ke3JbMV19YCxgJHtyWzJdfSR7clszXX1gLGAke3JbNF19JHtyWzVdfWBdLm1hcCh1PT5wYXJzZUludCh1LDE2KSk7bD1zWzBdPDwxNnxzWzFdPDw4fHNbMl19ZWxzZSBpZihBcnJheS5pc0FycmF5KG8pKWw9b1swXTw8MTZ8b1sxXTw8OHxvWzJdO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0Iik7Y29uc3QgYz1lKGwpO2lmKGM9PT12b2lkIDApcmV0dXJuO2NvbnN0IGE9aVtjXTtpZighYSlyZXR1cm47Y29uc3R7c3JnYjp0fT1hO2lmKHR5cGVvZiBvPT0ic3RyaW5nIil7Y29uc3Qgcj0odD4+MTYmMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpLHM9KHQ+PjgmMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpLHU9KHQmMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpO3JldHVybnt2YWx1ZTpgIyR7cn0ke3N9JHt1fWAsaW5kZXg6Y319ZWxzZSBpZih0eXBlb2Ygbz09Im9iamVjdCImJkFycmF5LmlzQXJyYXkobykpcmV0dXJue3ZhbHVlOlt0Pj4xNiYyNTUsdD4+OCYyNTUsdCYyNTVdLGluZGV4OmN9O3JldHVybnt2YWx1ZTp0LGluZGV4OmN9fWZ1bmN0aW9uIFNlKG4pe24uY29sb3JTYW1wbGVzPVtdLG4uY29sb3JTYW1wbGVzQ2FjaGUuY2xlYXIoKSxuLmNvbG9yQm94ZXM9W10sbi5jb2xvckJveGVzSW5kZXhUcmVlPVtdLG4uZmluZGVyQ2FjaGUuY2xlYXIoKX1mdW5jdGlvbiBDZShuKXtjb25zdCBlPWdlKG4pLHtzdGF0c01vZGU6byxzYW1wbGVzOmksc2tpcFRyYW5zcGFyZW50Omx9PWUsYz1mdW5jdGlvbigpe2xldCBzO3JldHVybigpPT4oIXMmJkImJihzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIix7d2lsbFJlYWRGcmVxdWVudGx5OiEwfSkpLHMpfSgpO2xldCBhPW51bGwsdD1udWxsO2NvbnN0IHI9e2NvbnRleHQ6ZSxhZGRTYW1wbGU6cz0+e2UuY29sb3JTYW1wbGVzLmxlbmd0aD09PTAmJihhPW51bGwpO2NvbnN0IHU9RihlLHMse2dldENvbnRleHQyZDpjLHByZXZpb3VzU2FtcGxlOmEsc2tpcFRyYW5zcGFyZW50Omx9KTtyZXR1cm4odSBpbnN0YW5jZW9mIFByb21pc2U/dTpQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT51KSkudGhlbihkPT57ZCYmbz09PSJkaWZmIiYmKGE9ZCl9KSx1fSxnZW5lcmF0ZShzPXt9KXtjb25zdHtjbGVhclNhbXBsZXM6dT0hMH09cztyZXR1cm4gdSYmKGE9bnVsbCksYmUoZSxzKSx0aGlzfSxnZXRDb2xvcnM6cz0+bWUoZSxzKSxmaW5kTmVhcmVzdENvbG9yOnM9Pih0fHwodD1ZKGUpKSx4ZShlLHQscykpLHJlc2V0OigpPT5TZShlKX07cmV0dXJuIGkubGVuZ3RoJiYoaS5mb3JFYWNoKHM9PnIuYWRkU2FtcGxlKHMpKSxlLnNhbXBsZXM9W10pLHJ9Y29uc3QgeWU9Ilttb2Rlcm4tZ2lmXSIsSWU9IkdJRiIsa2U9WyI4N2EiLCI4OWEiXSxlZT00NCx0ZT0zMyxUZT0yNTUsQWU9MTEsRWU9MjU0LG5lPTI0OSxyZT00LEJlPTEsX2U9MSxNZT01OSxvZT0oLi4ubik9PmNvbnNvbGUud2Fybih5ZSwuLi5uKTtmdW5jdGlvbiB2ZShuKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KG4ucmVkdWNlKChvLGkpPT5vK2kuYnl0ZUxlbmd0aCwwKSk7cmV0dXJuIG4ucmVkdWNlKChvLGkpPT4oZS5zZXQoaSxvKSxvK2kuYnl0ZUxlbmd0aCksMCksZX1mdW5jdGlvbiBhZShuLGUsbyl7bGV0IGk7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KG4pKWk9bi5idWZmZXI7ZWxzZSBpZihuIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpaT1uO2Vsc2V7Y29uc3QgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSx7d2lkdGg6YyxoZWlnaHQ6YX09b3x8e30sdD1sLmdldENvbnRleHQoIjJkIik7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGNhbnZhcyBjb250ZXh0MmQiKTtsLndpZHRoPWMhPW51bGw/Yzp0eXBlb2Ygbi53aWR0aD09Im51bWJlciI/bi53aWR0aDpuLndpZHRoLmJhc2VWYWwudmFsdWUsbC5oZWlnaHQ9YSE9bnVsbD9hOnR5cGVvZiBuLmhlaWdodD09Im51bWJlciI/bi5oZWlnaHQ6bi5oZWlnaHQuYmFzZVZhbC52YWx1ZSx0LmRyYXdJbWFnZShuLDAsMCxsLndpZHRoLGwuaGVpZ2h0KSxpPXQuZ2V0SW1hZ2VEYXRhKDAsMCxsLndpZHRoLGwuaGVpZ2h0KS5kYXRhLmJ1ZmZlcn1zd2l0Y2goZSl7Y2FzZSJ1aW50OEFycmF5IjpyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaSk7Y2FzZSJ1aW50OENsYW1wZWRBcnJheSI6cmV0dXJuIG5ldyBVaW50OENsYW1wZWRBcnJheShpKTtjYXNlImRhdGFWaWV3IjpyZXR1cm4gbmV3IERhdGFWaWV3KGkpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0Iil9fWZ1bmN0aW9uIE5lKG4sZSl7dmFyIHA7Y29uc3R7dG9wOm89MCxsZWZ0Omk9MCx3aWR0aDpsLGhlaWdodDpjLHJhd1dpZHRoOmEscmF0ZTp0PTQsY2FsbGJhY2s6cn09ZSxzPW5ldyBVaW50OENsYW1wZWRBcnJheShsKmMqdCksdT1pKnQsZD1vKnQsaD1sKnQsYj1hKnQ7Zm9yKGxldCBmPTA7ZjxjO2YrKylmb3IobGV0IGc9MDtnPGg7ZysrKXtjb25zdCBDPShkK2YpKmIrKHUrZyk7c1tmKmgrZ109KHA9cj09bnVsbD92b2lkIDA6cihDKSkhPW51bGw/cDpuW0NdfXJldHVybiBzfWZ1bmN0aW9uIFVlKG4pe2NvbnN0IGU9YWUobiwiZGF0YVZpZXciKTtsZXQgbz0wO2NvbnN0IGk9KCk9PmUuZ2V0VWludDgobysrKSxsPWM9PkFycmF5LmZyb20oe2xlbmd0aDpjfSkubWFwKGkpO3JldHVybntnZXRDdXJzb3I6KCk9Pm8sc2V0Q3Vyc29yOmM9Pm89YyxyZWFkQnl0ZTppLHJlYWRCeXRlczpsLHJlYWRTdHJpbmc6Yz0+U3RyaW5nLmZyb21DaGFyQ29kZSguLi5sKGMpKSxyZWFkVW5zaWduZWQ6KCk9PltlLmdldFVpbnQxNihvLCEwKSxvKz0yXVswXSxyZWFkQml0czooKT0+ZS5nZXRVaW50OChvKyspLnRvU3RyaW5nKDIpLnBhZFN0YXJ0KDgsIjAiKS5zcGxpdCgiIikubWFwKE51bWJlcikscmVhZENvbG9yVGFibGU6Yz0+QXJyYXkuZnJvbSh7bGVuZ3RoOmN9LCgpPT5BcnJheS5mcm9tKGwoMykpKSxyZWFkU3ViQmxvY2s6KCk9Pntjb25zdCBjPVtdO2Zvcig7Oyl7Y29uc3QgYT1pKCk7aWYoYT09PTAmJmUuZ2V0VWludDgobykhPT0wKWJyZWFrO2MucHVzaChhKX1yZXR1cm4gY319fWZ1bmN0aW9uIE9lKG4pe2NvbnN0IGU9e30se2dldEN1cnNvcjpvLHNldEN1cnNvcjppLHJlYWRCeXRlOmwscmVhZFN0cmluZzpjLHJlYWRVbnNpZ25lZDphLHJlYWRCaXRzOnQscmVhZENvbG9yVGFibGU6cixyZWFkU3ViQmxvY2s6c309VWUobiksdT0oKT0+KHtpbmRleDowLGRlbGF5OjEwMCxkaXNwb3NhbDowfSksZD1jKDMpLGg9YygzKTtpZihkIT09SWV8fCFrZS5pbmNsdWRlcyhoKSl0aHJvdyBuZXcgRXJyb3IoIlRoaXMgaXMgbm90IGEgODdhLzg5YSBHSUYgZGF0YS4iKTtlLnZlcnNpb249aCxlLndpZHRoPWEoKSxlLmhlaWdodD1hKCk7Y29uc3QgYj10KCk7ZS5nbG9iYWxDb2xvclRhYmxlPSEhYlswXSxlLmNvbG9yUmVzb2x1VGlvbj1wYXJzZUludChiLnNsaWNlKDEsNCkuam9pbigiIiksMikrMSxlLmNvbG9yVGFibGVTb3J0ZWQ9ISFiWzRdO2NvbnN0IHA9cGFyc2VJbnQoYi5zbGljZSg1LDgpLmpvaW4oIiIpLDIpO2UuY29sb3JUYWJsZVNpemU9cD9NYXRoLnBvdygyLHArMSk6MCxlLmJhY2tncm91bmRDb2xvckluZGV4PWwoKSxlLnBpeGVsQXNwZWN0UmF0aW89bCgpLGUuZ2xvYmFsQ29sb3JUYWJsZSYmKGUuY29sb3JUYWJsZVNpemU/ZS5jb2xvclRhYmxlPXIoZS5jb2xvclRhYmxlU2l6ZSk6cygpKSxlLmZyYW1lcz1bXTtsZXQgZj11KCk7Y29uc3QgZz1bXSxDPVtdO2Zvcig7Oyl7Y29uc3QgeT1sKCk7aWYoZy5wdXNoKHkpLHk9PT1lZSl7Zi5sZWZ0PWEoKSxmLnRvcD1hKCksZi53aWR0aD1hKCksZi5oZWlnaHQ9YSgpO2NvbnN0IHc9dCgpO2YubG9jYWxDb2xvclRhYmxlPSEhd1swXSxmLmludGVybGFjZWQ9ISF3WzFdLGYuY29sb3JUYWJsZVNvcnRlZD0hIXdbMl0sZi5yZXNlcnZlZD1wYXJzZUludCh3LnNsaWNlKDMsNSkuam9pbigiIiksMik7Y29uc3QgbT1wYXJzZUludCh3LnNsaWNlKDUsOCkuam9pbigiIiksMik7Zm9yKGYuY29sb3JUYWJsZVNpemU9bT9NYXRoLnBvdygyLG0rMSk6MCxmLmxvY2FsQ29sb3JUYWJsZSYmKGYuY29sb3JUYWJsZT1yKGYuY29sb3JUYWJsZVNpemUpKSxmLmx6d01pbkNvZGVTaXplPWwoKSxmLmltYWdlRGF0YVBvc2l0aW9ucz1bXTs7KXtjb25zdCBTPWwoKTtpZihTPT09MClicmVhaztjb25zdCBJPW8oKTtmLmltYWdlRGF0YVBvc2l0aW9ucy5wdXNoKFtJLFNdKSxpKEkrUyl9ZS5mcmFtZXMucHVzaChmKSxmPXUoKSxmLmluZGV4PWUuZnJhbWVzLmxlbmd0aDtjb250aW51ZX1pZih5PT09dGUpe2NvbnN0IHc9bCgpO2lmKEMucHVzaCh3KSx3PT09VGUpe2lmKGwoKSE9PUFlKWNvbnRpbnVlO2NvbnN0IG09e2lkZW50aWZpZXI6Yyg4KSxjb2RlOmMoMyksZGF0YTpbXX07YCR7bS5pZGVudGlmaWVyfSR7bS5jb2RlfWA9PSJORVRTQ0FQRTIuMCImJmwoKT09PTMmJihlLmxvb3BlZD0hIWwoKSxlLmxvb3BDb3VudD1hKCkpLG0uZGF0YT1zKCksZi5hcHBsaWNhdGlvbj1tO2NvbnRpbnVlfWlmKHc9PT1FZSl7Zi5jb21tZW50PXMoKS5tYXAobT0+U3RyaW5nLmZyb21DaGFyQ29kZShtKSkuam9pbigiIik7Y29udGludWV9aWYodz09PW5lKXtpZihsKCkhPT1yZSljb250aW51ZTtjb25zdCBtPXQoKSxTPXtyZXNlcnZlZDpwYXJzZUludChtLnNsaWNlKDAsMykuam9pbigiIiksMiksZGlzcG9zYWw6cGFyc2VJbnQobS5zbGljZSgzLDYpLmpvaW4oIiIpLDIpLHVzZXJJbnB1dDohIW1bNl0sdHJhbnNwYXJlbnQ6ISFtWzddLGRlbGF5VGltZTphKCksdHJhbnNwYXJlbnRJbmRleDpsKCl9O3MoKSxmLmdyYXBoaWNDb250cm9sPVMsZi5kaXNwb3NhbD1TLmRpc3Bvc2FsLGYuZGVsYXk9KFMuZGVsYXlUaW1lfHwxMCkqMTA7Y29udGludWV9aWYodz09PUJlKXtpZihsKCkhPT1fZSljb250aW51ZTtmLnBsYWluVGV4dD17bGVmdDphKCksdG9wOmEoKSx3aWR0aDphKCksaGVpZ2h0OmEoKSxjZWxsV2lkdGg6bCgpLGNlbGxIZWlnaHQ6bCgpLGNvbG9ySW5kZXg6bCgpLGJhY2tncm91bmRDb2xvckluZGV4OmwoKSxkYXRhOnMoKX07Y29udGludWV9b2UoYFVua25vd24gZXh0ZW5zaW9uIGJsb2NrOiAweCR7dy50b1N0cmluZygxNil9YCxnLnNsaWNlKDAsZy5sZW5ndGgtMSkubWFwKG09PmAweCR7bS50b1N0cmluZygxNil9YCksQy5zbGljZSgwLEMubGVuZ3RoLTEpLm1hcChtPT5gMHgke20udG9TdHJpbmcoMTYpfWApKTtjb250aW51ZX1pZih5PT09TWUpYnJlYWs7b2UoYFVua25vd24gYmxvY2s6IDB4JHt5LnRvU3RyaW5nKDE2KX1gLGcuc2xpY2UoMCxnLmxlbmd0aC0xKS5tYXAodz0+YDB4JHt3LnRvU3RyaW5nKDE2KX1gKSxDLnNsaWNlKDAsQy5sZW5ndGgtMSkubWFwKHc9PmAweCR7dy50b1N0cmluZygxNil9YCkpfXJldHVybiBlfWZ1bmN0aW9uIFBlKG4sZSxvKXtjb25zdCBjPW87bGV0IGEsdCxyLHMsdSxkLGg7Y29uc3QgYj1uZXcgQXJyYXkobykscD1uZXcgQXJyYXkoNDA5NiksZj1uZXcgQXJyYXkoNDA5NiksZz1uZXcgQXJyYXkoNDA5NisxKSxDPW4seT0xPDxDLHc9eSsxO2ZvcihhPXkrMix1PS0xLHI9QysxLHQ9KDE8PHIpLTEsZD0wO2Q8eTtkKyspcFtkXT0wLGZbZF09ZDtsZXQgbSxTLEksVCxFLFA7Zm9yKG09Uz1JPVQ9RT1QPTAsaD0wO2g8Yzspe2lmKFQ9PT0wKXtpZihTPHIpe20rPWVbUF08PFMsUys9OCxQKys7Y29udGludWV9aWYoZD1tJnQsbT4+PXIsUy09cixkPmF8fGQ9PT13KWJyZWFrO2lmKGQ9PT15KXtyPUMrMSx0PSgxPDxyKS0xLGE9eSsyLHU9LTE7Y29udGludWV9aWYodT09PS0xKXtnW1QrK109ZltkXSx1PWQsST1kO2NvbnRpbnVlfWZvcihzPWQsZD09PWEmJihnW1QrK109SSxkPXUpO2Q+eTspZ1tUKytdPWZbZF0sZD1wW2RdO0k9ZltkXSYyNTUsZ1tUKytdPUksYTw0MDk2JiYocFthXT11LGZbYV09SSxhKyssIShhJnQpJiZhPDQwOTYmJihyKyssdCs9YSkpLHU9c31ULS0sYltFKytdPWdbVF0saCsrfWZvcihoPUU7aDxjO2grKyliW2hdPTA7cmV0dXJuIGJ9ZnVuY3Rpb24gJGUobixlKXtjb25zdCBvPW5ldyBBcnJheShuLmxlbmd0aCksaT1uLmxlbmd0aC9lLGw9WzAsNCwyLDFdLGM9WzgsOCw0LDJdO2xldCBhPTA7Zm9yKGxldCB0PTA7dDw0O3QrKylmb3IobGV0IHI9bFt0XTtyPGk7cis9Y1t0XSlvLnNwbGljZS5hcHBseShvLFtyKmUsZV0uY29uY2F0KG4uc2xpY2UoYSplLChhKzEpKmUpKSksYSsrO3JldHVybiBvfWZ1bmN0aW9uIERlKG4pe2NvbnN0IGU9bmV3IE1hcCx7d29ya2VyVXJsOm99PW47bGV0e3dvcmtlck51bWJlcjppPTF9PW47Y29uc3QgbD1bLi4ubmV3IEFycmF5KG8/aTowKV0ubWFwKCgpPT57dHJ5e2NvbnN0IHI9bmV3IFdvcmtlcihvKTtyZXR1cm4gci5vbm1lc3NhZ2U9YyxyfWNhdGNoKHIpe3JldHVybiBudWxsfX0pLmZpbHRlcihCb29sZWFuKTtpPWwubGVuZ3RoO2Z1bmN0aW9uIGMocil7dmFyIGQ7Y29uc3R7aWQ6cyxkYXRhOnV9PXIuZGF0YTsoZD1lLmdldChzKSk9PW51bGx8fGQodSksZS5kZWxldGUocyl9Y29uc3QgYT1mdW5jdGlvbigpe2xldCByPTA7cmV0dXJuIHM9PmxbKHMhPW51bGw/czpyKyspJWldfSgpO3JldHVybntjYWxsOmZ1bmN0aW9uKCl7bGV0IHI9MDtyZXR1cm4ocyx1LGQsaCk9Pm5ldyBQcm9taXNlKGI9Pntjb25zdCBwPWEoaCk7aWYoIXApcmV0dXJuIGIodm9pZCAwKTtlLnNldChyLGIpLHAucG9zdE1lc3NhZ2Uoe2lkOnIrKyx0eXBlOnMsZGF0YTp1fSx7dHJhbnNmZXI6ZH0pfSl9KCl9fWZ1bmN0aW9uIFhlKG4sZSl7Y29uc3Qgbz1hZShuLCJ1aW50OEFycmF5Iik7aWYoZSE9bnVsbCYmZS53b3JrZXJVcmwpcmV0dXJuIERlKHt3b3JrZXJVcmw6ZS53b3JrZXJVcmx9KS5jYWxsKCJmcmFtZXM6ZGVjb2RlIixvLFtvLmJ1ZmZlcl0pO2NvbnN0e2dpZjppPU9lKG4pLHJhbmdlOmx9PWUhPW51bGw/ZTp7fSx7d2lkdGg6YyxoZWlnaHQ6YSxjb2xvclRhYmxlOnQsZnJhbWVzOnJ9PWkscz1sP3Iuc2xpY2UobFswXSxsWzFdKzEpOnIsdT1uZXcgVWludDhDbGFtcGVkQXJyYXkoYyphKjQpO2xldCBkO3JldHVybiBzLm1hcChoPT57dmFyIGxlO2NvbnN0e2xlZnQ6Yix0b3A6cCx3aWR0aDpmLGhlaWdodDpnLGludGVybGFjZWQ6Qyxsb2NhbENvbG9yVGFibGU6eSxjb2xvclRhYmxlOncsbHp3TWluQ29kZVNpemU6bSxpbWFnZURhdGFQb3NpdGlvbnM6UyxncmFwaGljQ29udHJvbDpJLGRpc3Bvc2FsOlQsZGVsYXk6RX09aCxQPXArZyx7dHJhbnNwYXJlbnQ6S2UsdHJhbnNwYXJlbnRJbmRleDpWZX09SSE9bnVsbD9JOnt9LFc9eT93OnQsamU9S2U/VmU6LTEsWmU9dmUoUy5tYXAoKFtNLFVdKT0+by5zdWJhcnJheShNLE0rVSkpKTtsZXQgSz1QZShtLFplLGYqZyk7aWYoQyYmKEs9JGUoSyxmKSksKGQ9PW51bGw/dm9pZCAwOmQuZGlzcG9zYWwpIT09MSl7Y29uc3R7bGVmdDpNPTAsdG9wOlU9MCx3aWR0aDpWPWMsaGVpZ2h0Ok89YX09ZCE9bnVsbD9kOnt9LFg9VStPO2ZvcihsZXQgJD1VOyQ8WDskKyspe2NvbnN0IGo9JCpjK007Zm9yKGxldCBEPTA7RDxWO0QrKyl7Y29uc3Qgdj0oaitEKSo0O3Vbdl09dVt2KzFdPXVbdisyXT11W3YrM109MH19fWZvcihsZXQgTT1wO008UDtNKyspe2NvbnN0IFU9TSpjK2IsVj0oTS1wKSpmO2ZvcihsZXQgTz0wO088ZjtPKyspe2NvbnN0IFg9S1tWK09dO2lmKFg9PT1qZSljb250aW51ZTtjb25zdFskLGosRF09KGxlPVc9PW51bGw/dm9pZCAwOldbWF0pIT1udWxsP2xlOlswLDAsMF0sdj0oVStPKSo0O3Vbdl09JCx1W3YrMV09aix1W3YrMl09RCx1W3YrM109MjU1fX1yZXR1cm4gVCE9PTMmJihkPWgpLHt3aWR0aDpjLGhlaWdodDphLGRlbGF5OkUsaW1hZ2VEYXRhOnUuc2xpY2UoMCl9fSl9ZnVuY3Rpb24gTGUobixlLG8pe2NvbnN0e3dyaXRlQnl0ZTppLGdldEN1cnNvcjpsLGNhbGN1bGF0ZURpc3RhbmNlOmN9PW87aShuKTtsZXQgYT1sKCk7aSgwKTtjb25zdCB0PTE8PG4scj10LTEscz10KzE7bGV0IHU9cysxLGQ9bisxLGg9MCxiPTA7ZnVuY3Rpb24gcChTKXtmb3IoO2g+PVM7KWkoYiYyNTUpLGI+Pj04LGgtPTgsYyhhKT09PTI1NiYmKGkoMjU1LGEpLGE9bCgpLGkoMCkpfWZ1bmN0aW9uIGYoUyl7Ynw9Uzw8aCxoKz1kLHAoOCl9bGV0IGc9ZVswXSZyLEM9e30seSx3LG07Zih0KTtmb3IobGV0IFM9ZS5sZW5ndGgsST0xO0k8UzsrK0kpaWYobT1lW0ldJnIseT1nPDw4fG0sdz1DW3ldLHc9PT12b2lkIDApe2ZvcihifD1nPDxoLGgrPWQ7aD49ODspaShiJjI1NSksYj4+PTgsaC09OCxjKGEpPT09MjU2JiYoaSgyNTUsYSksYT1sKCksaSgwKSk7dT09PTQwOTY/KGYodCksdT1zKzEsZD1uKzEsQz17fSk6KHU+PTE8PGQmJisrZCxDW3ldPXUrKyksZz1tfWVsc2UgZz13O2YoZyksZihzKSxwKDEpLGMoYSk9PT0xP2koMCxhKTooaShjKGEpLTEsYSksaSgwKSl9ZnVuY3Rpb24gUmUobj17fSl7Y29uc3R7Y2h1bmtTaXplOmU9NDA5Nn09bjtsZXQgbz1bbmV3IFVpbnQ4QXJyYXkoZSldLGk9MCxsPTA7Y29uc3QgYz0odCxyKT0+e3I/b1tyWzBdXVtyWzFdXT10OihsPj1lJiYob1srK2ldPW5ldyBVaW50OEFycmF5KGUpLGw9MCksb1tpXVtsKytdPXQpfSxhPXQ9PnQuZm9yRWFjaChyPT5jKHIpKTtyZXR1cm57Z2V0Q3Vyc29yOigpPT5baSxsXSxzZXRDdXJzb3I6dD0+e2k9dFswXSxsPXRbMV19LGNhbGN1bGF0ZURpc3RhbmNlOnQ9PmkqZStsLSh0WzBdKmUrdFsxXSksd3JpdGVCeXRlOmMsd3JpdGVCeXRlczphLHdyaXRlU3RyaW5nOnQ9PnQuc3BsaXQoIiIpLmZvckVhY2goKHIscyk9PmModC5jaGFyQ29kZUF0KHMpKSksd3JpdGVVbnNpZ25lZDp0PT5hKFt0JjI1NSx0Pj44JjI1NV0pLGZsdXNoOigpPT57b1tpXT1vW2ldLnNsaWNlKDAsbCk7Y29uc3QgdD1uZXcgVWludDhBcnJheShvLnJlZHVjZSgocyx1KT0+cyt1LmJ5dGVMZW5ndGgsMCkpO2xldCByPTA7cmV0dXJuIG8uZm9yRWFjaChzPT57dC5zZXQocyxyKSxyKz1zLmJ5dGVMZW5ndGh9KSxvPVtuZXcgVWludDhBcnJheShlKV0saT0wLGw9MCx0fX19ZnVuY3Rpb24gemUobil7dmFyIEMseSx3O2NvbnN0IGU9UmUoKSx7d3JpdGVCeXRlOm8sd3JpdGVCeXRlczppLHdyaXRlVW5zaWduZWQ6bCxmbHVzaDpjfT1lLHtsZWZ0OmE9MCx0b3A6dD0wLHdpZHRoOnI9MCxoZWlnaHQ6cz0wLGRlbGF5OnU9MTAwLGNvbG9yVGFibGU6ZH09bjtsZXR7ZGlzcG9zYWw6aD0wfT1uO2NvbnN0IGI9KEM9bi5ncmFwaGljQ29udHJvbCk9PW51bGw/dm9pZCAwOkMudHJhbnNwYXJlbnQ7bGV0IHA9KHc9KHk9bi5ncmFwaGljQ29udHJvbCk9PW51bGw/dm9pZCAwOnkudHJhbnNwYXJlbnRJbmRleCkhPW51bGw/dzoyNTU7aWYoYTwwfHxhPjY1NTM1KXRocm93IG5ldyBFcnJvcigiTGVmdCBpbnZhbGlkLiIpO2lmKHQ8MHx8dD42NTUzNSl0aHJvdyBuZXcgRXJyb3IoIlRvcCBpbnZhbGlkLiIpO2lmKHI8PTB8fHI+NjU1MzUpdGhyb3cgbmV3IEVycm9yKCJXaWR0aCBpbnZhbGlkLiIpO2lmKHM8PTB8fHM+NjU1MzUpdGhyb3cgbmV3IEVycm9yKCJIZWlnaHQgaW52YWxpZC4iKTtsZXQgZj04LGc9ZD9kLmxlbmd0aDowO2lmKGcpe2lmKGc8Mnx8Zz4yNTZ8fGcmZy0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2xvciB0YWJsZSBsZW5ndGgsIG11c3QgYmUgcG93ZXIgb2YgMiBhbmQgMiAuLiAyNTYuIik7Zm9yKDtnPj49MTspKytmfXJldHVybiBvKHRlKSxvKG5lKSxvKHJlKSxiP2h8fChoPTIpOnA9MCxvKHBhcnNlSW50KGAwMDAke051bWJlcihoJjcpLnRvU3RyaW5nKDIpLnBhZFN0YXJ0KDMsIjAiKX0wJHtiPzE6MH1gLDIpKSxsKHUvMTApLG8ocCksbygwKSxvKGVlKSxsKGEpLGwodCksbChyKSxsKHMpLGQhPW51bGwmJmQubGVuZ3RoPyhvKHBhcnNlSW50KGAxMDAwMCR7KGYtMSkudG9TdHJpbmcoMikucGFkU3RhcnQoMywiMCIpfWAsMikpLGkoZC5mbGF0KCkpKTpvKDApLExlKGYsbi5pbWFnZURhdGEsZSksYygpfWZ1bmN0aW9uIEZlKG4pe2NvbnN0e2ZyYW1lczplLHBhbGV0dGU6byx0cmFuc3BhcmVudEluZGV4Oml9PW4sbD1ZKG8pO3JldHVybiBlLm1hcCgoe2ltYWdlRGF0YTpjfSk9PntsZXQgYT0hMTtjb25zdCB0PW5ldyBVaW50OENsYW1wZWRBcnJheShjLmxlbmd0aC80KTtmb3IobGV0IHI9Yy5sZW5ndGgscz0wO3M8cjtzKz00KWNbcyszXT09PTA/KHRbcy80XT1pLGE9ITApOnRbcy80XT1sKGNbc108PDE2fGNbcysxXTw8OHxjW3MrMl0pO3JldHVybntpbWFnZURhdGE6dCx0cmFuc3BhcmVudDphfX0pfWZ1bmN0aW9uIFdlKG4pe2NvbnN0e2ZyYW1lczplLHRyYW5zcGFyZW50SW5kZXg6b309bjtsZXQgaTtjb25zdCBsPWUubGVuZ3RoO3JldHVybiBlLm1hcCgoYyxhKT0+e2NvbnN0e3dpZHRoOnQsaGVpZ2h0OnIsdHJhbnNwYXJlbnQ6cyxpbWFnZURhdGE6dX09YztsZXQgZD0wLGg9MCxiPXQtMSxwPXItMSxmO2lmKHMpe2Zvcig7aDxwOyl7bGV0IHc9ITA7Zm9yKGxldCBtPTA7bTx0O20rKylpZih1W3QqaCttXSE9PW8pe3c9ITE7YnJlYWt9aWYoIXcpYnJlYWs7aCsrfWZvcig7cD5oOyl7bGV0IHc9ITA7Zm9yKGxldCBtPTA7bTx0O20rKylpZih1W3QqcCttXSE9PW8pe3c9ITE7YnJlYWt9aWYoIXcpYnJlYWs7cC0tfWZvcig7ZDxiOyl7bGV0IHc9ITA7Zm9yKGxldCBtPWg7bTxwO20rKylpZih1W3QqbStkXSE9PW8pe3c9ITE7YnJlYWt9aWYoIXcpYnJlYWs7ZCsrfWZvcig7Yj5kOyl7bGV0IHc9ITA7Zm9yKGxldCBtPWg7bTxwO20rKylpZih1W3QqbStiXSE9PW8pe3c9ITE7YnJlYWt9aWYoIXcpYnJlYWs7Yi0tfX1lbHNle2lmKGkpe2Zvcig7aDxwOyl7bGV0IHc9ITA7Zm9yKGxldCBtPTA7bTx0O20rKyl7Y29uc3QgUz10KmgrbTtpZih1W1NdIT09aVtTXSl7dz0hMTticmVha319aWYoIXcpYnJlYWs7aCsrfWZvcig7cD5oOyl7bGV0IHc9ITA7Zm9yKGxldCBtPTA7bTx0O20rKyl7Y29uc3QgUz10KnArbTtpZih1W1NdIT09aVtTXSl7dz0hMTticmVha319aWYoIXcpYnJlYWs7cC0tfWlmKGg9PT1wKWQ9YjtlbHNle2Zvcig7ZDxiOyl7bGV0IHc9ITA7Zm9yKGxldCBtPWg7bTw9cDttKyspe2NvbnN0IFM9bSp0K2Q7aWYodVtTXSE9PWlbU10pe3c9ITE7YnJlYWt9fWlmKCF3KWJyZWFrO2QrK31mb3IoO2I+ZDspe2xldCB3PSEwO2ZvcihsZXQgbT1oO208PXA7bSsrKXtjb25zdCBTPW0qdCtiO2lmKHVbU10hPT1pW1NdKXt3PSExO2JyZWFrfX1pZighdylicmVhaztiLS19fX1mPWksaT11fWNvbnN0IGc9YisxLWQsQz1wKzEtaCx5PU5lKHUse2xlZnQ6ZCx0b3A6aCx3aWR0aDpnLGhlaWdodDpDLHJhd1dpZHRoOnQscmF0ZToxLGNhbGxiYWNrOnc9PntpZighcyYmZiYmdVt3XT09PWZbd10pcmV0dXJuIG99fSk7cmV0dXJue2xlZnQ6ZCx0b3A6aCx3aWR0aDpnLGhlaWdodDpDLGRpc3Bvc2FsOnMmJmEhPT1sLTE/MjoxLGltYWdlRGF0YTp5fX0pfWNvbnN0IE49Q2Uoe3NraXBUcmFuc3BhcmVudDohMX0pO3NlbGYub25tZXNzYWdlPW49Pntjb25zdHtpZDplLHR5cGU6byxkYXRhOml9PW4uZGF0YTtpZihvPT09InBhbGV0dGU6YWRkU2FtcGxlIiYmTilyZXR1cm4gTi5hZGRTYW1wbGUoaSksc2VsZi5wb3N0TWVzc2FnZSh7aWQ6ZSx0eXBlOm8sZGF0YTohMH0pO2lmKG89PT0icGFsZXR0ZTpnZW5lcmF0ZSImJk4pe04uZ2VuZXJhdGUoaSk7Y29uc3QgbD1aKHt9LE4uY29udGV4dCk7cmV0dXJuIE4ucmVzZXQoKSxzZWxmLnBvc3RNZXNzYWdlKHtpZDplLHR5cGU6byxkYXRhOmx9KX1pZihvPT09ImZyYW1lczppbmRleCIpe2NvbnN0IGw9RmUoaSk7cmV0dXJuIHNlbGYucG9zdE1lc3NhZ2Uoe2lkOmUsdHlwZTpvLGRhdGE6bH0sbC5tYXAoYz0+Yy5pbWFnZURhdGEuYnVmZmVyKSl9aWYobz09PSJmcmFtZXM6Y3JvcCIpe2NvbnN0IGw9V2UoaSk7cmV0dXJuIHNlbGYucG9zdE1lc3NhZ2Uoe2lkOmUsdHlwZTpvLGRhdGE6bH0sbC5tYXAoYz0+Yy5pbWFnZURhdGEuYnVmZmVyKSl9aWYobz09PSJmcmFtZTplbmNvZGUiKXtjb25zdCBsPXplKGkpO3JldHVybiBzZWxmLnBvc3RNZXNzYWdlKHtpZDplLHR5cGU6byxkYXRhOmx9LFtsLmJ1ZmZlcl0pfWlmKG89PT0iZnJhbWVzOmRlY29kZSIpe2NvbnN0IGw9WGUoaSk7cmV0dXJuIHNlbGYucG9zdE1lc3NhZ2Uoe2lkOmUsdHlwZTpvLGRhdGE6bH0sbC5tYXAoYz0+Yy5pbWFnZURhdGEuYnVmZmVyKSl9fX0pKCk7Cg==", it = (e) => z(void 0, null, function* () {
|
|
2008
|
+
const Zn = "data:application/javascript;base64,dmFyIEdlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgc2U9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczt2YXIgSGU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxxZT1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO3ZhciBBPU1hdGgucG93LGllPShCLHgsayk9PnggaW4gQj9HZShCLHgse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmt9KTpCW3hdPWssWj0oQix4KT0+e2Zvcih2YXIgayBpbiB4fHwoeD17fSkpSGUuY2FsbCh4LGspJiZpZShCLGsseFtrXSk7aWYoc2UpZm9yKHZhciBrIG9mIHNlKHgpKXFlLmNhbGwoeCxrKSYmaWUoQixrLHhba10pO3JldHVybiBCfTsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Y29uc3QgQj10eXBlb2Ygd2luZG93PCJ1Iix4PTY1NTM2LTEsaz14KngsY2U9NTEyLTEsTD1bMCwyMCw0MCw2MCw4MCw5OSwxMTksMTM5LDE1OSwxNzksMTk5LDIxOSwyNDEsMjY0LDI4OCwzMTMsMzQwLDM2NywzOTYsNDI3LDQ1OCw0OTEsNTI2LDU2Miw1OTksNjM3LDY3Nyw3MTgsNzYxLDgwNSw4NTEsODk4LDk0Nyw5OTcsMTA0OCwxMTAxLDExNTYsMTIxMiwxMjcwLDEzMzAsMTM5MSwxNDUzLDE1MTcsMTU4MywxNjUxLDE3MjAsMTc5MCwxODYzLDE5MzcsMjAxMywyMDkwLDIxNzAsMjI1MCwyMzMzLDI0MTgsMjUwNCwyNTkyLDI2ODEsMjc3MywyODY2LDI5NjEsMzA1OCwzMTU3LDMyNTgsMzM2MCwzNDY0LDM1NzAsMzY3OCwzNzg4LDM5MDAsNDAxNCw0MTI5LDQyNDcsNDM2Niw0NDg4LDQ2MTEsNDczNiw0ODY0LDQ5OTMsNTEyNCw1MjU3LDUzOTIsNTUzMCw1NjY5LDU4MTAsNTk1Myw2MDk5LDYyNDYsNjM5NSw2NTQ3LDY3MDAsNjg1Niw3MDE0LDcxNzQsNzMzNSw3NTAwLDc2NjYsNzgzNCw4MDA0LDgxNzcsODM1Miw4NTI4LDg3MDgsODg4OSw5MDcyLDkyNTgsOTQ0NSw5NjM1LDk4MjgsMTAwMjIsMTAyMTksMTA0MTcsMTA2MTksMTA4MjIsMTEwMjgsMTEyMzUsMTE0NDYsMTE2NTgsMTE4NzMsMTIwOTAsMTIzMDksMTI1MzAsMTI3NTQsMTI5ODAsMTMyMDksMTM0NDAsMTM2NzMsMTM5MDksMTQxNDYsMTQzODcsMTQ2MjksMTQ4NzQsMTUxMjIsMTUzNzEsMTU2MjMsMTU4NzgsMTYxMzUsMTYzOTQsMTY2NTYsMTY5MjAsMTcxODcsMTc0NTYsMTc3MjcsMTgwMDEsMTgyNzcsMTg1NTYsMTg4MzcsMTkxMjEsMTk0MDcsMTk2OTYsMTk5ODcsMjAyODEsMjA1NzcsMjA4NzYsMjExNzcsMjE0ODEsMjE3ODcsMjIwOTYsMjI0MDcsMjI3MjEsMjMwMzgsMjMzNTcsMjM2NzgsMjQwMDIsMjQzMjksMjQ2NTgsMjQ5OTAsMjUzMjUsMjU2NjIsMjYwMDEsMjYzNDQsMjY2ODgsMjcwMzYsMjczODYsMjc3MzksMjgwOTQsMjg0NTIsMjg4MTMsMjkxNzYsMjk1NDIsMjk5MTEsMzAyODIsMzA2NTYsMzEwMzMsMzE0MTIsMzE3OTQsMzIxNzksMzI1NjcsMzI5NTcsMzMzNTAsMzM3NDUsMzQxNDMsMzQ1NDQsMzQ5NDgsMzUzNTUsMzU3NjQsMzYxNzYsMzY1OTEsMzcwMDgsMzc0MjksMzc4NTIsMzgyNzgsMzg3MDYsMzkxMzgsMzk1NzIsNDAwMDksNDA0NDksNDA4OTEsNDEzMzcsNDE3ODUsNDIyMzYsNDI2OTAsNDMxNDcsNDM2MDYsNDQwNjksNDQ1MzQsNDUwMDIsNDU0NzMsNDU5NDcsNDY0MjMsNDY5MDMsNDczODUsNDc4NzEsNDgzNTksNDg4NTAsNDkzNDQsNDk4NDEsNTAzNDEsNTA4NDQsNTEzNDksNTE4NTgsNTIzNjksNTI4ODQsNTM0MDEsNTM5MjEsNTQ0NDUsNTQ5NzEsNTU1MDAsNTYwMzIsNTY1NjcsNTcxMDUsNTc2NDYsNTgxOTAsNTg3MzcsNTkyODcsNTk4NDAsNjAzOTYsNjA5NTUsNjE1MTcsNjIwODIsNjI2NTAsNjMyMjEsNjM3OTUsNjQzNzIsNjQ5NTIsNjU1MzVdLEc9WzAsNiwxMywxOCwyMiwyNSwyOCwzMSwzNCwzNiwzOCw0MCw0Miw0NCw0Niw0OCw1MCw1MSw1Myw1NCw1Niw1Nyw1OSw2MCw2MSw2Miw2NCw2NSw2Niw2Nyw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Niw4Nyw4OCw4OSw5MCw5MSw5MSw5Miw5Myw5NCw5NSw5NSw5Niw5Nyw5OCw5OCw5OSwxMDAsMTAxLDEwMSwxMDIsMTAzLDEwMywxMDQsMTA1LDEwNiwxMDYsMTA3LDEwOCwxMDgsMTA5LDExMCwxMTAsMTExLDExMSwxMTIsMTEzLDExMywxMTQsMTE1LDExNSwxMTYsMTE2LDExNywxMTgsMTE4LDExOSwxMTksMTIwLDEyMSwxMjEsMTIyLDEyMiwxMjMsMTIzLDEyNCwxMjUsMTI1LDEyNiwxMjYsMTI3LDEyNywxMjgsMTI4LDEyOSwxMjksMTMwLDEzMCwxMzEsMTMyLDEzMiwxMzMsMTMzLDEzNCwxMzQsMTM1LDEzNSwxMzYsMTM2LDEzNywxMzcsMTM4LDEzOCwxMzksMTM5LDE0MCwxNDAsMTQwLDE0MSwxNDEsMTQyLDE0MiwxNDMsMTQzLDE0NCwxNDQsMTQ1LDE0NSwxNDYsMTQ2LDE0NywxNDcsMTQ3LDE0OCwxNDgsMTQ5LDE0OSwxNTAsMTUwLDE1MSwxNTEsMTUxLDE1MiwxNTIsMTUzLDE1MywxNTQsMTU0LDE1NCwxNTUsMTU1LDE1NiwxNTYsMTU2LDE1NywxNTcsMTU4LDE1OCwxNTksMTU5LDE1OSwxNjAsMTYwLDE2MSwxNjEsMTYxLDE2MiwxNjIsMTYzLDE2MywxNjMsMTY0LDE2NCwxNjUsMTY1LDE2NSwxNjYsMTY2LDE2NiwxNjcsMTY3LDE2OCwxNjgsMTY4LDE2OSwxNjksMTY5LDE3MCwxNzAsMTcxLDE3MSwxNzEsMTcyLDE3MiwxNzIsMTczLDE3MywxNzQsMTc0LDE3NCwxNzUsMTc1LDE3NSwxNzYsMTc2LDE3NiwxNzcsMTc3LDE3NywxNzgsMTc4LDE3OSwxNzksMTc5LDE4MCwxODAsMTgwLDE4MSwxODEsMTgxLDE4MiwxODIsMTgyLDE4MywxODMsMTgzLDE4NCwxODQsMTg0LDE4NSwxODUsMTg1LDE4NiwxODYsMTg2LDE4NywxODcsMTg3LDE4OCwxODgsMTg4LDE4OSwxODksMTg5LDE5MCwxOTAsMTkwLDE5MSwxOTEsMTkxLDE5MiwxOTIsMTkyLDE5MywxOTMsMTkzLDE5MywxOTQsMTk0LDE5NCwxOTUsMTk1LDE5NSwxOTYsMTk2LDE5NiwxOTcsMTk3LDE5NywxOTgsMTk4LDE5OCwxOTgsMTk5LDE5OSwxOTksMjAwLDIwMCwyMDAsMjAxLDIwMSwyMDEsMjAxLDIwMiwyMDIsMjAyLDIwMywyMDMsMjAzLDIwNCwyMDQsMjA0LDIwNCwyMDUsMjA1LDIwNSwyMDYsMjA2LDIwNiwyMDYsMjA3LDIwNywyMDcsMjA4LDIwOCwyMDgsMjA4LDIwOSwyMDksMjA5LDIxMCwyMTAsMjEwLDIxMCwyMTEsMjExLDIxMSwyMTIsMjEyLDIxMiwyMTIsMjEzLDIxMywyMTMsMjE0LDIxNCwyMTQsMjE0LDIxNSwyMTUsMjE1LDIxNSwyMTYsMjE2LDIxNiwyMTcsMjE3LDIxNywyMTcsMjE4LDIxOCwyMTgsMjE4LDIxOSwyMTksMjE5LDIyMCwyMjAsMjIwLDIyMCwyMjEsMjIxLDIyMSwyMjEsMjIyLDIyMiwyMjIsMjIyLDIyMywyMjMsMjIzLDIyNCwyMjQsMjI0LDIyNCwyMjUsMjI1LDIyNSwyMjUsMjI2LDIyNiwyMjYsMjI2LDIyNywyMjcsMjI3LDIyNywyMjgsMjI4LDIyOCwyMjgsMjI5LDIyOSwyMjksMjI5LDIzMCwyMzAsMjMwLDIzMCwyMzEsMjMxLDIzMSwyMzEsMjMyLDIzMiwyMzIsMjMyLDIzMywyMzMsMjMzLDIzMywyMzQsMjM0LDIzNCwyMzQsMjM1LDIzNSwyMzUsMjM1LDIzNiwyMzYsMjM2LDIzNiwyMzcsMjM3LDIzNywyMzcsMjM4LDIzOCwyMzgsMjM4LDIzOSwyMzksMjM5LDIzOSwyMzksMjQwLDI0MCwyNDAsMjQwLDI0MSwyNDEsMjQxLDI0MSwyNDIsMjQyLDI0MiwyNDIsMjQzLDI0MywyNDMsMjQzLDI0MywyNDQsMjQ0LDI0NCwyNDQsMjQ1LDI0NSwyNDUsMjQ1LDI0NiwyNDYsMjQ2LDI0NiwyNDYsMjQ3LDI0NywyNDcsMjQ3LDI0OCwyNDgsMjQ4LDI0OCwyNDksMjQ5LDI0OSwyNDksMjQ5LDI1MCwyNTAsMjUwLDI1MCwyNTEsMjUxLDI1MSwyNTEsMjUxLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1NCwyNTQsMjU0LDI1NCwyNTUsMjU1LDI1NV07ZnVuY3Rpb24gUihuKXtsZXQgZTtpZihuPD0wKXJldHVybiAwO2lmKG4+PXgpcmV0dXJuIHg7ZT1uKihuKihuKy0xNDQxMDcpL3grMTMyMTE0KS94KzE0Mzc5O2ZvcihsZXQgbz0wO288MjtvKyspe2NvbnN0IGk9ZSplKmUsbD1uKygyKmkray8yKS9rO2U9KGUqKDIqbisoaStrLzIpL2spK2wvMikvbH1yZXR1cm4gZX1mdW5jdGlvbiBfKG4sZSl7cmV0dXJuKG5eZSk8MD8obi1lLzIpL2U6KG4rZS8yKS9lfWZ1bmN0aW9uIEgobil7Y29uc3QgZT1MW24+PjE2JjI1NV0sbz1MW24+PjgmMjU1XSxpPUxbbiYyNTVdLGw9KDI3MDE1KmUrMzUxNDkqbyszMzcyKmkreC8yKS94LGM9KDEzODg3KmUrNDQ2MTAqbys3MDM4KmkreC8yKS94LGE9KDU3ODcqZSsxODQ2MipvKzQxMjg2KmkreC8yKS94LHQ9UihsKSxyPVIoYykscz1SKGEpO3JldHVybltfKDEzNzkyKnQrNTIwMTAqci0yNjcqcyx4KSxfKDEyOTYyOCp0LTE1OTE1OCpyKzI5NTMwKnMseCksXygxNjk4KnQrNTEyOTkqci01Mjk5NypzLHgpXX1mdW5jdGlvbiB6KG4pe2lmKG48PTApcmV0dXJuIDA7aWYobj49eClyZXR1cm4gMjU1O3tjb25zdCBlPW4qY2Usbz1+fihlL3gpLGk9ZSV4LGw9R1tvXSxjPUdbbysxXTtyZXR1cm4oaSooYy1sKSt4LzIpL3grbH19ZnVuY3Rpb24gZmUobil7Y29uc3QgZT1uWzBdK18oMjU5NzQqblsxXSx4KStfKDE0MTQzKm5bMl0seCksbz1uWzBdK18oLTY5MTgqblsxXSx4KStfKC00MTg1Km5bMl0seCksaT1uWzBdK18oLTU4NjQqblsxXSx4KStfKC04NDYzOCpuWzJdLHgpLGw9QShlLDIpKmUvayxjPUEobywyKSpvL2ssYT1BKGksMikqaS9rLHQ9eigoMjY3MTY5KmwrLTIxNjc3MSpjKzE1MTM3KmEreC8yKS94KSxyPXooKC04MzEyNypsKzE3MTAzMCpjKy0yMjM2OCphK3gvMikveCkscz16KCgtMjc1KmwrLTQ2MDk5KmMrMTExOTA5KmEreC8yKS94KTtyZXR1cm4gdDw8MTZ8cjw8OHxzfWZ1bmN0aW9uIGRlKG4pe2NvbnN0IGU9e2w6MCxhOjEsYjoyfSxvPW5bMF0saT1uWzFdLGw9blsyXSxjPWVbb10sYT1lW2ldLHQ9ZVtsXTtyZXR1cm4ocixzKT0+ci5va2xhYltjXS1zLm9rbGFiW2NdfHxyLm9rbGFiW2FdLXMub2tsYWJbYV18fHIub2tsYWJbdF0tcy5va2xhYlt0XX1mdW5jdGlvbiB1ZShuLGUsbyl7cmV0dXJuIG4+PWU/ZT49bz8ibGFiIjpuPj1vPyJsYmEiOiJibGEiOm4+PW8/ImFsYiI6ZT49bz8iYWJsIjoiYmFsIn1mdW5jdGlvbiBoZShuKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e2NvbnN0IG89bmV3IEltYWdlO28uZGVjb2Rpbmc9InN5bmMiLG8ubG9hZGluZz0iZWFnZXIiLG8uY3Jvc3NPcmlnaW49ImFub255bW91cyIsby5vbmxvYWQ9KCk9PmUobyksby5vbmVycm9yPSgpPT5lKG8pLG8uc3JjPW59KX1mdW5jdGlvbiBxKG4pe3JldHVybiBuJiZ0eXBlb2Ygbj09Im9iamVjdCImJiJfX0NPTlRFWFRfXyJpbiBufWZ1bmN0aW9uIGdlKG4pe3JldHVybiBxKG4pP246cGUobil9ZnVuY3Rpb24gcGUobj17fSl7Y29uc3R7bWF4Q29sb3JzOmU9MjU2LHN0YXRzTW9kZTpvPSJmdWxsIixzYW1wbGVzOmk9W10sc2tpcFRyYW5zcGFyZW50Omw9ITB9PW47cmV0dXJue19fQ09OVEVYVF9fOiEwLHNhbXBsZXM6aSxtYXhDb2xvcnM6ZSxzdGF0c01vZGU6byxza2lwVHJhbnNwYXJlbnQ6bCxjb2xvclNhbXBsZXM6W10sY29sb3JTYW1wbGVzQ2FjaGU6bmV3IE1hcCxjb2xvckJveGVzOltdLGNvbG9yQm94ZXNJbmRleFRyZWU6W10sZmluZGVyQ2FjaGU6bmV3IE1hcH19ZnVuY3Rpb24gWShuKXtjb25zdCBlPXEobik/bjpuLmNvbnRleHQse2NvbG9yQm94ZXNJbmRleFRyZWU6byxmaW5kZXJDYWNoZTppfT1lO2Z1bmN0aW9uIGwoYSx0LHIpe2NvbnN0e2xlZnQ6cyxyaWdodDp1LGxvbmdlc3Q6ZCxva2xhYjpoLGNvbG9yQm94SW5kZXg6Yn09b1thXSxwPU1hdGgubWluKEEodFswXS1oWzBdLDIpK0EodFsxXS1oWzFdLDIpK0EodFsyXS1oWzJdLDIpLDQyOTQ5NjcyOTUtMSk7cDxyLmRpc3QmJihyLmNvbG9yQm94SW5kZXg9YixyLmRpc3Q9cCk7bGV0IGYsZztpZihzIT09LTF8fHUhPT0tMSl7Y29uc3QgQz10W2RdLWhbZF07Qzw9MD8oZj1zLGc9dSk6KGY9dSxnPXMpLGYhPT0tMSYmbChmLHQsciksZyE9PS0xJiZBKEMsMik8ci5kaXN0JiZsKGcsdCxyKX19ZnVuY3Rpb24gYyhhKXtjb25zdCB0PXtkaXN0Ok51bWJlci5NQVhfU0FGRV9JTlRFR0VSLGNvbG9yQm94SW5kZXg6LTF9O3JldHVybiBsKDAsYSx0KSx0LmNvbG9yQm94SW5kZXh9cmV0dXJuIGE9Pntjb25zdCB0PWElMzI3Njg7bGV0IHI9aS5nZXQodCk7cnx8KHI9bmV3IE1hcCxpLnNldCh0LHIpKTtsZXQgcz1yLmdldChhKTtyZXR1cm4gcyE9PXZvaWQgMHx8KHM9YyhIKGEpKSxyLnNldChhLHMpKSxzfX1mdW5jdGlvbiBtZShuLGUpe2NvbnN0e2NvbG9yQm94ZXM6b309bixpPW8ucmVkdWNlKChhLHQpPT5hK3Qud2VpZ2h0LDApO2lmKCFlKXJldHVybiBuLmNvbG9yQm94ZXMubWFwKGE9Pntjb25zdHtzcmdiOnQsd2VpZ2h0OnJ9PWE7cmV0dXJue3ZhbHVlOnQscGVyY2VudGFnZTpyL2l9fSk7Y29uc3QgbD1bXTtmb3IobGV0IGE9by5sZW5ndGgsdD0wO3Q8YTt0Kyspe2NvbnN0e3NyZ2I6cix3ZWlnaHQ6c309b1t0XTtsLnB1c2goe3ZhbHVlOltyPj4xNiYyNTUscj4+OCYyNTUsciYyNTVdLHBlcmNlbnRhZ2U6cy9pfSl9bGV0IGM7aWYoZT09PSJidWZmZXIiKXtjPW5ldyBVaW50OENsYW1wZWRBcnJheShsLmxlbmd0aCo0KTtmb3IobGV0IGE9bC5sZW5ndGgsdD0wO3Q8YTt0Kyspe2NvbnN0IHI9dCo0LHM9bFt0XS52YWx1ZTtjW3JdPXNbMF0sY1tyKzFdPXNbMV0sY1tyKzJdPXNbMl0sY1tyKzNdPTI1NX19ZWxzZSBpZihlPT09ImhleCIpe2M9W107Zm9yKGxldCBhPWwubGVuZ3RoLHQ9MDt0PGE7dCsrKXtjb25zdHt2YWx1ZTpyLHBlcmNlbnRhZ2U6c309bFt0XSx1PXJbMF0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSxkPXJbMV0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSxoPXJbMl0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKTtjLnB1c2goe3ZhbHVlOmAjJHt1fSR7ZH0ke2h9YCxwZXJjZW50YWdlOnN9KX19ZWxzZSBjPWw7cmV0dXJuIGN9ZnVuY3Rpb24gRihuLGUsbyl7dmFyIHUsZCxoLGI7Y29uc3R7Z2V0Q29udGV4dDJkOmkscHJldmlvdXNTYW1wbGU6bCxza2lwVHJhbnNwYXJlbnQ6Y309byx7c3RhdHNNb2RlOmEsY29sb3JTYW1wbGVzOnQsY29sb3JTYW1wbGVzQ2FjaGU6cn09bjtsZXQgcztpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpcz1uZXcgVWludDhDbGFtcGVkQXJyYXkoZS5idWZmZXIpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXM9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGUpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSlpZihBcnJheS5pc0FycmF5KGVbMF0pKXtjb25zdCBwPVtdO2ZvcihsZXQgZj1lLmxlbmd0aCxnPTA7ZzxmO2crKylwLnB1c2goKHU9ZVtnXVswXSkhPW51bGw/dTowLChkPWVbZ11bMV0pIT1udWxsP2Q6MCwoaD1lW2ddWzJdKSE9bnVsbD9oOjAsKGI9ZVtnXVszXSkhPW51bGw/YjoyNTUpO3M9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHApfWVsc2Ugcz1uZXcgVWludDhDbGFtcGVkQXJyYXkoZSk7ZWxzZSBpZih0eXBlb2YgZT09InN0cmluZyIpe2NvbnN0IHA9aT09bnVsbD92b2lkIDA6aSgpO2lmKCFwKXJldHVybjtjb25zdCBmPXAuY2FudmFzO3JldHVybiBoZShlKS50aGVuKGc9PihwLmNsZWFyUmVjdCgwLDAsZi53aWR0aCxmLmhlaWdodCksZi53aWR0aD1nLndpZHRoLGYuaGVpZ2h0PWcuaGVpZ2h0LHAuZHJhd0ltYWdlKGcsMCwwLGYud2lkdGgsZi5oZWlnaHQpLEYobixwLmdldEltYWdlRGF0YSgwLDAsZi53aWR0aCxmLmhlaWdodCkuZGF0YSxvKSkpfWVsc2V7Y29uc3QgcD1pPT1udWxsP3ZvaWQgMDppKCk7aWYoIXApcmV0dXJuO2NvbnN0IGY9cC5jYW52YXM7cmV0dXJuIHAuY2xlYXJSZWN0KDAsMCxmLndpZHRoLGYuaGVpZ2h0KSxmLndpZHRoPXR5cGVvZiBlLndpZHRoPT0ibnVtYmVyIj9lLndpZHRoOmUud2lkdGguYmFzZVZhbC52YWx1ZSxmLmhlaWdodD10eXBlb2YgZS5oZWlnaHQ9PSJudW1iZXIiP2UuaGVpZ2h0OmUuaGVpZ2h0LmJhc2VWYWwudmFsdWUscC5kcmF3SW1hZ2UoZSwwLDAsZi53aWR0aCxmLmhlaWdodCksRihuLHAuZ2V0SW1hZ2VEYXRhKDAsMCxmLndpZHRoLGYuaGVpZ2h0KS5kYXRhLG8pfWZvcihsZXQgcD1zLmxlbmd0aCxmPTA7ZjxwO2YrPTQpe2NvbnN0IGc9c1tmXSxDPXNbZisxXSx5PXNbZisyXSx3PXNbZiszXTtpZihjJiZ3PT09MHx8YT09PSJkaWZmIiYmbCYmZz09PWxbZl0mJkM9PT1sW2YrMV0mJnk9PT1sW2YrMl0mJnc9PT1sW2YrM10pY29udGludWU7Y29uc3QgbT1nPDwxNnxDPDw4fHksUz13KjFlOCttLEk9UyUzMjc2ODtsZXQgVD1yLmdldChJKTtUfHwoVD1uZXcgTWFwLHIuc2V0KEksVCkpO2xldCBFPVQuZ2V0KFMpO2lmKEUhPT12b2lkIDApe3RbRV0uY291bnQrKztjb250aW51ZX1FPXQucHVzaCh7YWxwaGE6dyxzcmdiOm0sb2tsYWI6SChtKSxjb3VudDoxfSktMSxULnNldChTLEUpfXJldHVybiBzfWZ1bmN0aW9uIEoobixlKXtjb25zdHtjb2xvclNhbXBsZXM6b309ZSx7c3RhcnQ6aSxlbmQ6bH09bjtuLmxlbmd0aD1sLWksbi53ZWlnaHQ9MDtjb25zdCBjPVswLDAsMF07Zm9yKGxldCB0PWk7dDxsO3QrKyl7Y29uc3Qgcj1vW3RdO2NbMF0rPXIub2tsYWJbMF0qci5jb3VudCxjWzFdKz1yLm9rbGFiWzFdKnIuY291bnQsY1syXSs9ci5va2xhYlsyXSpyLmNvdW50LG4ud2VpZ2h0Kz1yLmNvdW50fW4ub2tsYWI9W2NbMF0vbi53ZWlnaHQsY1sxXS9uLndlaWdodCxjWzJdL24ud2VpZ2h0XTtjb25zdCBhPVswLDAsMF07Zm9yKGxldCB0PWk7dDxsO3QrKyl7Y29uc3Qgcj1vW3RdO2FbMF0rPUEoci5va2xhYlswXS1uLm9rbGFiWzBdLDIpKnIuY291bnQsYVsxXSs9QShyLm9rbGFiWzFdLW4ub2tsYWJbMV0sMikqci5jb3VudCxhWzJdKz1BKHIub2tsYWJbMl0tbi5va2xhYlsyXSwyKSpyLmNvdW50fW4uc29ydD11ZShhWzBdLGFbMV0sYVsyXSksbi5zY29yZT1NYXRoLm1heChhWzBdLGFbMV0sYVsyXSl9ZnVuY3Rpb24gUShuLGUpe2NvbnN0IG89Wih7c3RhcnQ6MCxlbmQ6MCxsZW5ndGg6MCxzY29yZTowLHdlaWdodDowLHNvcnQ6ImxhYiIsc29ydGVkOm51bGwsc3JnYjowLG9rbGFiOlswLDAsMF19LG4pO3JldHVybiBKKG8sZSksb31mdW5jdGlvbiB3ZShuKXtjb25zdHtjb2xvckJveGVzOmV9PW4sbz1bXSxpPW5ldyBNYXA7Zm9yKGxldCBhPS0xLHQ9ZS5sZW5ndGgscj0wO3I8dDtyKyspe2NvbnN0e3NyZ2I6c309ZVtyXTtpZihzPT09YSl7aS5zZXQociwhMCk7Y29udGludWV9YT1zfWMoe21pbjpbLTY1NTM1LC02NTUzNSwtNjU1MzVdLG1heDpbNjU1MzUsNjU1MzUsNjU1MzVdfSk7ZnVuY3Rpb24gbChhKXtjb25zdCB0PXttaW46WzY1NTM1LDY1NTM1LDY1NTM1XSxtYXg6Wy02NTUzNSwtNjU1MzUsLTY1NTM1XX07bGV0IHI9MDtjb25zdCBzPVtdO2ZvcihsZXQgcD1lLmxlbmd0aCxmPTA7ZjxwO2YrKyl7Y29uc3R7b2tsYWI6Z309ZVtmXTtpLmhhcyhmKXx8Z1swXTxhLm1pblswXXx8Z1sxXTxhLm1pblsxXXx8Z1syXTxhLm1pblsyXXx8Z1swXT5hLm1heFswXXx8Z1sxXT5hLm1heFsxXXx8Z1syXT5hLm1heFsyXXx8KGdbMF08dC5taW5bMF0mJih0Lm1pblswXT1nWzBdKSxnWzFdPHQubWluWzFdJiYodC5taW5bMV09Z1sxXSksZ1syXTx0Lm1pblsyXSYmKHQubWluWzJdPWdbMl0pLGdbMF0+dC5tYXhbMF0mJih0Lm1heFswXT1nWzBdKSxnWzFdPnQubWF4WzFdJiYodC5tYXhbMV09Z1sxXSksZ1syXT50Lm1heFsyXSYmKHQubWF4WzJdPWdbMl0pLHNbcisrXT17b2tsYWI6Zyxjb2xvckJveEluZGV4OmZ9KX1sZXQgdT0wO2lmKCFyKXJldHVybntjb2xvckJveEluZGV4Oi0xLGxvbmdlc3Q6dX07Y29uc3QgZD10Lm1heFswXS10Lm1pblswXSxoPXQubWF4WzFdLXQubWluWzFdLGI9dC5tYXhbMl0tdC5taW5bMl07cmV0dXJuIGQ+PWgmJmQ+PWI/dT0wOmI+PWQmJmI+PWg/dT0yOmg+PWQmJmg+PWImJih1PTEpLHtjb2xvckJveEluZGV4OnMuc29ydCgocCxmKT0+cC5va2xhYlt1XS1mLm9rbGFiW3VdKVtyPj4xXS5jb2xvckJveEluZGV4LGxvbmdlc3Q6dX19ZnVuY3Rpb24gYyhhKXtjb25zdHtjb2xvckJveEluZGV4OnQsbG9uZ2VzdDpyfT1sKGEpO2lmKHQ8MClyZXR1cm4tMTtjb25zdHtva2xhYjpzfT1lW3RdLHU9e2xvbmdlc3Q6cixva2xhYjpzLGNvbG9yQm94SW5kZXg6dH0sZD1vLnB1c2godSktMTtpLnNldCh0LCEwKTtjb25zdCBoPXttYXg6Wy4uLmEubWF4XSxtaW46Wy4uLmEubWluXX0sYj17bWF4OlsuLi5hLm1heF0sbWluOlsuLi5hLm1pbl19O2gubWF4W3JdPXNbcl0sYi5taW5bcl09TWF0aC5taW4oc1tyXSsxLDY1NTM1KTtjb25zdCBwPWMoaCk7bGV0IGY9LTE7cmV0dXJuIGIubWluW3JdPD1iLm1heFtyXSYmKGY9YyhiKSksdS5sZWZ0PXAsdS5yaWdodD1mLGR9cmV0dXJuIG99ZnVuY3Rpb24gYmUobixlPXt9KXtjb25zdHttYXhDb2xvcnM6byxjb2xvclNhbXBsZXM6aX09bjtpZighaS5sZW5ndGgpcmV0dXJuO2NvbnN0e21heENvbG9yczpsPW8sY2xlYXJTYW1wbGVzOmM9ITB9PWU7bGV0IGE9USh7ZW5kOmkubGVuZ3RofSxuKSx0PTE7Y29uc3Qgcj1bYV07ZnVuY3Rpb24gcygpe2xldCBkPS0xLGg9LTE7aWYodD09PWwpcmV0dXJuLTE7Zm9yKGxldCBiPTA7Yjx0O2IrKyl7Y29uc3QgcD1yW2JdO3AubGVuZ3RoPj0yJiZwLnNjb3JlPmgmJihkPWIsaD1wLnNjb3JlKX1yZXR1cm4gZH1mdW5jdGlvbiB1KGQsaCl7Y29uc3QgYj1RKHtzdGFydDpoKzEsZW5kOmQuZW5kLHNvcnRlZDpkLnNvcnRlZH0sbik7ZC5lbmQtPWIubGVuZ3RoLEooZCxuKSxyLnB1c2goYiksdCsrfWZvcig7YSYmYS5sZW5ndGg+MTspe2NvbnN0e3N0YXJ0OmQsZW5kOmgsc29ydDpiLHNvcnRlZDpwfT1hO2lmKGIhPT1wKXtjb25zdCB3PWkuc2xpY2UoZCxoKS5zb3J0KGRlKGIpKTtmb3IobGV0IG09dy5sZW5ndGgsUz0wO1M8bTtTKyspaVtkK1NdPXdbU107YS5zb3J0ZWQ9Yn1jb25zdCBmPWEud2VpZ2h0KzE+PjE7bGV0IGc9ZCxDPTA7Zm9yKGxldCB3PWgtMjtnPHcmJihDKz1pW2ddLmNvdW50LCEoQz5mKSk7ZysrKTt1KGEsZyk7Y29uc3QgeT1zKCk7YT15Pj0wP3JbeV06bnVsbH1mb3IobGV0IGQ9ci5sZW5ndGgsaD0wO2g8ZDtoKyspcltoXS5zcmdiPWZlKHJbaF0ub2tsYWIpO24uY29sb3JCb3hlcz1yLnNvcnQoKGQsaCk9PmQuc3JnYi1oLnNyZ2IpLG4uY29sb3JCb3hlc0luZGV4VHJlZT13ZShuKSxjJiYobi5jb2xvclNhbXBsZXM9W10sbi5jb2xvclNhbXBsZXNDYWNoZS5jbGVhcigpKSxuLmZpbmRlckNhY2hlLmNsZWFyKCl9ZnVuY3Rpb24geGUobixlLG8pe2NvbnN0e2NvbG9yQm94ZXM6aX09bjtpZighZSlyZXR1cm47bGV0IGw7aWYodHlwZW9mIG89PSJudW1iZXIiKWw9bztlbHNlIGlmKHR5cGVvZiBvPT0ic3RyaW5nIil7Y29uc3Qgcj1vLnJlcGxhY2UoL14jLywiIikscz1bYCR7clswXX0ke3JbMV19YCxgJHtyWzJdfSR7clszXX1gLGAke3JbNF19JHtyWzVdfWBdLm1hcCh1PT5wYXJzZUludCh1LDE2KSk7bD1zWzBdPDwxNnxzWzFdPDw4fHNbMl19ZWxzZSBpZihBcnJheS5pc0FycmF5KG8pKWw9b1swXTw8MTZ8b1sxXTw8OHxvWzJdO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0Iik7Y29uc3QgYz1lKGwpO2lmKGM9PT12b2lkIDApcmV0dXJuO2NvbnN0IGE9aVtjXTtpZighYSlyZXR1cm47Y29uc3R7c3JnYjp0fT1hO2lmKHR5cGVvZiBvPT0ic3RyaW5nIil7Y29uc3Qgcj0odD4+MTYmMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpLHM9KHQ+PjgmMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpLHU9KHQmMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpO3JldHVybnt2YWx1ZTpgIyR7cn0ke3N9JHt1fWAsaW5kZXg6Y319ZWxzZSBpZih0eXBlb2Ygbz09Im9iamVjdCImJkFycmF5LmlzQXJyYXkobykpcmV0dXJue3ZhbHVlOlt0Pj4xNiYyNTUsdD4+OCYyNTUsdCYyNTVdLGluZGV4OmN9O3JldHVybnt2YWx1ZTp0LGluZGV4OmN9fWZ1bmN0aW9uIFNlKG4pe24uY29sb3JTYW1wbGVzPVtdLG4uY29sb3JTYW1wbGVzQ2FjaGUuY2xlYXIoKSxuLmNvbG9yQm94ZXM9W10sbi5jb2xvckJveGVzSW5kZXhUcmVlPVtdLG4uZmluZGVyQ2FjaGUuY2xlYXIoKX1mdW5jdGlvbiBDZShuKXtjb25zdCBlPWdlKG4pLHtzdGF0c01vZGU6byxzYW1wbGVzOmksc2tpcFRyYW5zcGFyZW50Omx9PWUsYz1mdW5jdGlvbigpe2xldCBzO3JldHVybigpPT4oIXMmJkImJihzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIix7d2lsbFJlYWRGcmVxdWVudGx5OiEwfSkpLHMpfSgpO2xldCBhPW51bGwsdD1udWxsO2NvbnN0IHI9e2NvbnRleHQ6ZSxhZGRTYW1wbGU6cz0+e2UuY29sb3JTYW1wbGVzLmxlbmd0aD09PTAmJihhPW51bGwpO2NvbnN0IHU9RihlLHMse2dldENvbnRleHQyZDpjLHByZXZpb3VzU2FtcGxlOmEsc2tpcFRyYW5zcGFyZW50Omx9KTtyZXR1cm4odSBpbnN0YW5jZW9mIFByb21pc2U/dTpQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT51KSkudGhlbihkPT57ZCYmbz09PSJkaWZmIiYmKGE9ZCl9KSx1fSxnZW5lcmF0ZShzPXt9KXtjb25zdHtjbGVhclNhbXBsZXM6dT0hMH09cztyZXR1cm4gdSYmKGE9bnVsbCksYmUoZSxzKSx0aGlzfSxnZXRDb2xvcnM6cz0+bWUoZSxzKSxmaW5kTmVhcmVzdENvbG9yOnM9Pih0fHwodD1ZKGUpKSx4ZShlLHQscykpLHJlc2V0OigpPT5TZShlKX07cmV0dXJuIGkubGVuZ3RoJiYoaS5mb3JFYWNoKHM9PnIuYWRkU2FtcGxlKHMpKSxlLnNhbXBsZXM9W10pLHJ9Y29uc3QgeWU9Ilttb2Rlcm4tZ2lmXSIsSWU9IkdJRiIsa2U9WyI4N2EiLCI4OWEiXSxlZT00NCx0ZT0zMyxUZT0yNTUsQWU9MTEsRWU9MjU0LG5lPTI0OSxyZT00LEJlPTEsX2U9MSxNZT01OSxvZT0oLi4ubik9PmNvbnNvbGUud2Fybih5ZSwuLi5uKTtmdW5jdGlvbiB2ZShuKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KG4ucmVkdWNlKChvLGkpPT5vK2kuYnl0ZUxlbmd0aCwwKSk7cmV0dXJuIG4ucmVkdWNlKChvLGkpPT4oZS5zZXQoaSxvKSxvK2kuYnl0ZUxlbmd0aCksMCksZX1mdW5jdGlvbiBhZShuLGUsbyl7bGV0IGk7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KG4pKWk9bi5idWZmZXI7ZWxzZSBpZihuIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpaT1uO2Vsc2V7Y29uc3QgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSx7d2lkdGg6YyxoZWlnaHQ6YX09b3x8e30sdD1sLmdldENvbnRleHQoIjJkIik7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGNhbnZhcyBjb250ZXh0MmQiKTtsLndpZHRoPWMhPW51bGw/Yzp0eXBlb2Ygbi53aWR0aD09Im51bWJlciI/bi53aWR0aDpuLndpZHRoLmJhc2VWYWwudmFsdWUsbC5oZWlnaHQ9YSE9bnVsbD9hOnR5cGVvZiBuLmhlaWdodD09Im51bWJlciI/bi5oZWlnaHQ6bi5oZWlnaHQuYmFzZVZhbC52YWx1ZSx0LmRyYXdJbWFnZShuLDAsMCxsLndpZHRoLGwuaGVpZ2h0KSxpPXQuZ2V0SW1hZ2VEYXRhKDAsMCxsLndpZHRoLGwuaGVpZ2h0KS5kYXRhLmJ1ZmZlcn1zd2l0Y2goZSl7Y2FzZSJ1aW50OEFycmF5IjpyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaSk7Y2FzZSJ1aW50OENsYW1wZWRBcnJheSI6cmV0dXJuIG5ldyBVaW50OENsYW1wZWRBcnJheShpKTtjYXNlImRhdGFWaWV3IjpyZXR1cm4gbmV3IERhdGFWaWV3KGkpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0Iil9fWZ1bmN0aW9uIE5lKG4sZSl7dmFyIHA7Y29uc3R7dG9wOm89MCxsZWZ0Omk9MCx3aWR0aDpsLGhlaWdodDpjLHJhd1dpZHRoOmEscmF0ZTp0PTQsY2FsbGJhY2s6cn09ZSxzPW5ldyBVaW50OENsYW1wZWRBcnJheShsKmMqdCksdT1pKnQsZD1vKnQsaD1sKnQsYj1hKnQ7Zm9yKGxldCBmPTA7ZjxjO2YrKylmb3IobGV0IGc9MDtnPGg7ZysrKXtjb25zdCBDPShkK2YpKmIrKHUrZyk7c1tmKmgrZ109KHA9cj09bnVsbD92b2lkIDA6cihDKSkhPW51bGw/cDpuW0NdfXJldHVybiBzfWZ1bmN0aW9uIFVlKG4pe2NvbnN0IGU9YWUobiwiZGF0YVZpZXciKTtsZXQgbz0wO2NvbnN0IGk9KCk9PmUuZ2V0VWludDgobysrKSxsPWM9PkFycmF5LmZyb20oe2xlbmd0aDpjfSkubWFwKGkpO3JldHVybntnZXRDdXJzb3I6KCk9Pm8sc2V0Q3Vyc29yOmM9Pm89YyxyZWFkQnl0ZTppLHJlYWRCeXRlczpsLHJlYWRTdHJpbmc6Yz0+U3RyaW5nLmZyb21DaGFyQ29kZSguLi5sKGMpKSxyZWFkVW5zaWduZWQ6KCk9PltlLmdldFVpbnQxNihvLCEwKSxvKz0yXVswXSxyZWFkQml0czooKT0+ZS5nZXRVaW50OChvKyspLnRvU3RyaW5nKDIpLnBhZFN0YXJ0KDgsIjAiKS5zcGxpdCgiIikubWFwKE51bWJlcikscmVhZENvbG9yVGFibGU6Yz0+QXJyYXkuZnJvbSh7bGVuZ3RoOmN9LCgpPT5BcnJheS5mcm9tKGwoMykpKSxyZWFkU3ViQmxvY2s6KCk9Pntjb25zdCBjPVtdO2Zvcig7Oyl7Y29uc3QgYT1pKCk7aWYoYT09PTAmJmUuZ2V0VWludDgobykhPT0wKWJyZWFrO2MucHVzaChhKX1yZXR1cm4gY319fWZ1bmN0aW9uIE9lKG4pe2NvbnN0IGU9e30se2dldEN1cnNvcjpvLHNldEN1cnNvcjppLHJlYWRCeXRlOmwscmVhZFN0cmluZzpjLHJlYWRVbnNpZ25lZDphLHJlYWRCaXRzOnQscmVhZENvbG9yVGFibGU6cixyZWFkU3ViQmxvY2s6c309VWUobiksdT0oKT0+KHtpbmRleDowLGRlbGF5OjEwMCxkaXNwb3NhbDowfSksZD1jKDMpLGg9YygzKTtpZihkIT09SWV8fCFrZS5pbmNsdWRlcyhoKSl0aHJvdyBuZXcgRXJyb3IoIlRoaXMgaXMgbm90IGEgODdhLzg5YSBHSUYgZGF0YS4iKTtlLnZlcnNpb249aCxlLndpZHRoPWEoKSxlLmhlaWdodD1hKCk7Y29uc3QgYj10KCk7ZS5nbG9iYWxDb2xvclRhYmxlPSEhYlswXSxlLmNvbG9yUmVzb2x1VGlvbj1wYXJzZUludChiLnNsaWNlKDEsNCkuam9pbigiIiksMikrMSxlLmNvbG9yVGFibGVTb3J0ZWQ9ISFiWzRdO2NvbnN0IHA9cGFyc2VJbnQoYi5zbGljZSg1LDgpLmpvaW4oIiIpLDIpO2UuY29sb3JUYWJsZVNpemU9cD9NYXRoLnBvdygyLHArMSk6MCxlLmJhY2tncm91bmRDb2xvckluZGV4PWwoKSxlLnBpeGVsQXNwZWN0UmF0aW89bCgpLGUuZ2xvYmFsQ29sb3JUYWJsZSYmKGUuY29sb3JUYWJsZVNpemU/ZS5jb2xvclRhYmxlPXIoZS5jb2xvclRhYmxlU2l6ZSk6cygpKSxlLmZyYW1lcz1bXTtsZXQgZj11KCk7Y29uc3QgZz1bXSxDPVtdO2Zvcig7Oyl7Y29uc3QgeT1sKCk7aWYoZy5wdXNoKHkpLHk9PT1lZSl7Zi5sZWZ0PWEoKSxmLnRvcD1hKCksZi53aWR0aD1hKCksZi5oZWlnaHQ9YSgpO2NvbnN0IHc9dCgpO2YubG9jYWxDb2xvclRhYmxlPSEhd1swXSxmLmludGVybGFjZWQ9ISF3WzFdLGYuY29sb3JUYWJsZVNvcnRlZD0hIXdbMl0sZi5yZXNlcnZlZD1wYXJzZUludCh3LnNsaWNlKDMsNSkuam9pbigiIiksMik7Y29uc3QgbT1wYXJzZUludCh3LnNsaWNlKDUsOCkuam9pbigiIiksMik7Zm9yKGYuY29sb3JUYWJsZVNpemU9bT9NYXRoLnBvdygyLG0rMSk6MCxmLmxvY2FsQ29sb3JUYWJsZSYmKGYuY29sb3JUYWJsZT1yKGYuY29sb3JUYWJsZVNpemUpKSxmLmx6d01pbkNvZGVTaXplPWwoKSxmLmltYWdlRGF0YVBvc2l0aW9ucz1bXTs7KXtjb25zdCBTPWwoKTtpZihTPT09MClicmVhaztjb25zdCBJPW8oKTtmLmltYWdlRGF0YVBvc2l0aW9ucy5wdXNoKFtJLFNdKSxpKEkrUyl9ZS5mcmFtZXMucHVzaChmKSxmPXUoKSxmLmluZGV4PWUuZnJhbWVzLmxlbmd0aDtjb250aW51ZX1pZih5PT09dGUpe2NvbnN0IHc9bCgpO2lmKEMucHVzaCh3KSx3PT09VGUpe2lmKGwoKSE9PUFlKWNvbnRpbnVlO2NvbnN0IG09e2lkZW50aWZpZXI6Yyg4KSxjb2RlOmMoMyksZGF0YTpbXX07YCR7bS5pZGVudGlmaWVyfSR7bS5jb2RlfWA9PSJORVRTQ0FQRTIuMCImJmwoKT09PTMmJihlLmxvb3BlZD0hIWwoKSxlLmxvb3BDb3VudD1hKCkpLG0uZGF0YT1zKCksZi5hcHBsaWNhdGlvbj1tO2NvbnRpbnVlfWlmKHc9PT1FZSl7Zi5jb21tZW50PXMoKS5tYXAobT0+U3RyaW5nLmZyb21DaGFyQ29kZShtKSkuam9pbigiIik7Y29udGludWV9aWYodz09PW5lKXtpZihsKCkhPT1yZSljb250aW51ZTtjb25zdCBtPXQoKSxTPXtyZXNlcnZlZDpwYXJzZUludChtLnNsaWNlKDAsMykuam9pbigiIiksMiksZGlzcG9zYWw6cGFyc2VJbnQobS5zbGljZSgzLDYpLmpvaW4oIiIpLDIpLHVzZXJJbnB1dDohIW1bNl0sdHJhbnNwYXJlbnQ6ISFtWzddLGRlbGF5VGltZTphKCksdHJhbnNwYXJlbnRJbmRleDpsKCl9O3MoKSxmLmdyYXBoaWNDb250cm9sPVMsZi5kaXNwb3NhbD1TLmRpc3Bvc2FsLGYuZGVsYXk9KFMuZGVsYXlUaW1lfHwxMCkqMTA7Y29udGludWV9aWYodz09PUJlKXtpZihsKCkhPT1fZSljb250aW51ZTtmLnBsYWluVGV4dD17bGVmdDphKCksdG9wOmEoKSx3aWR0aDphKCksaGVpZ2h0OmEoKSxjZWxsV2lkdGg6bCgpLGNlbGxIZWlnaHQ6bCgpLGNvbG9ySW5kZXg6bCgpLGJhY2tncm91bmRDb2xvckluZGV4OmwoKSxkYXRhOnMoKX07Y29udGludWV9b2UoYFVua25vd24gZXh0ZW5zaW9uIGJsb2NrOiAweCR7dy50b1N0cmluZygxNil9YCxnLnNsaWNlKDAsZy5sZW5ndGgtMSkubWFwKG09PmAweCR7bS50b1N0cmluZygxNil9YCksQy5zbGljZSgwLEMubGVuZ3RoLTEpLm1hcChtPT5gMHgke20udG9TdHJpbmcoMTYpfWApKTtjb250aW51ZX1pZih5PT09TWUpYnJlYWs7b2UoYFVua25vd24gYmxvY2s6IDB4JHt5LnRvU3RyaW5nKDE2KX1gLGcuc2xpY2UoMCxnLmxlbmd0aC0xKS5tYXAodz0+YDB4JHt3LnRvU3RyaW5nKDE2KX1gKSxDLnNsaWNlKDAsQy5sZW5ndGgtMSkubWFwKHc9PmAweCR7dy50b1N0cmluZygxNil9YCkpfXJldHVybiBlfWZ1bmN0aW9uIFBlKG4sZSxvKXtjb25zdCBjPW87bGV0IGEsdCxyLHMsdSxkLGg7Y29uc3QgYj1uZXcgQXJyYXkobykscD1uZXcgQXJyYXkoNDA5NiksZj1uZXcgQXJyYXkoNDA5NiksZz1uZXcgQXJyYXkoNDA5NisxKSxDPW4seT0xPDxDLHc9eSsxO2ZvcihhPXkrMix1PS0xLHI9QysxLHQ9KDE8PHIpLTEsZD0wO2Q8eTtkKyspcFtkXT0wLGZbZF09ZDtsZXQgbSxTLEksVCxFLFA7Zm9yKG09Uz1JPVQ9RT1QPTAsaD0wO2g8Yzspe2lmKFQ9PT0wKXtpZihTPHIpe20rPWVbUF08PFMsUys9OCxQKys7Y29udGludWV9aWYoZD1tJnQsbT4+PXIsUy09cixkPmF8fGQ9PT13KWJyZWFrO2lmKGQ9PT15KXtyPUMrMSx0PSgxPDxyKS0xLGE9eSsyLHU9LTE7Y29udGludWV9aWYodT09PS0xKXtnW1QrK109ZltkXSx1PWQsST1kO2NvbnRpbnVlfWZvcihzPWQsZD09PWEmJihnW1QrK109SSxkPXUpO2Q+eTspZ1tUKytdPWZbZF0sZD1wW2RdO0k9ZltkXSYyNTUsZ1tUKytdPUksYTw0MDk2JiYocFthXT11LGZbYV09SSxhKyssIShhJnQpJiZhPDQwOTYmJihyKyssdCs9YSkpLHU9c31ULS0sYltFKytdPWdbVF0saCsrfWZvcihoPUU7aDxjO2grKyliW2hdPTA7cmV0dXJuIGJ9ZnVuY3Rpb24gJGUobixlKXtjb25zdCBvPW5ldyBBcnJheShuLmxlbmd0aCksaT1uLmxlbmd0aC9lLGw9WzAsNCwyLDFdLGM9WzgsOCw0LDJdO2xldCBhPTA7Zm9yKGxldCB0PTA7dDw0O3QrKylmb3IobGV0IHI9bFt0XTtyPGk7cis9Y1t0XSlvLnNwbGljZS5hcHBseShvLFtyKmUsZV0uY29uY2F0KG4uc2xpY2UoYSplLChhKzEpKmUpKSksYSsrO3JldHVybiBvfWZ1bmN0aW9uIERlKG4pe2NvbnN0IGU9bmV3IE1hcCx7d29ya2VyVXJsOm99PW47bGV0e3dvcmtlck51bWJlcjppPTF9PW47Y29uc3QgbD1bLi4ubmV3IEFycmF5KG8/aTowKV0ubWFwKCgpPT57dHJ5e2NvbnN0IHI9bmV3IFdvcmtlcihvKTtyZXR1cm4gci5vbm1lc3NhZ2U9YyxyfWNhdGNoKHIpe3JldHVybiBudWxsfX0pLmZpbHRlcihCb29sZWFuKTtpPWwubGVuZ3RoO2Z1bmN0aW9uIGMocil7dmFyIGQ7Y29uc3R7aWQ6cyxkYXRhOnV9PXIuZGF0YTsoZD1lLmdldChzKSk9PW51bGx8fGQodSksZS5kZWxldGUocyl9Y29uc3QgYT1mdW5jdGlvbigpe2xldCByPTA7cmV0dXJuIHM9PmxbKHMhPW51bGw/czpyKyspJWldfSgpO3JldHVybntjYWxsOmZ1bmN0aW9uKCl7bGV0IHI9MDtyZXR1cm4ocyx1LGQsaCk9Pm5ldyBQcm9taXNlKGI9Pntjb25zdCBwPWEoaCk7aWYoIXApcmV0dXJuIGIodm9pZCAwKTtlLnNldChyLGIpLHAucG9zdE1lc3NhZ2Uoe2lkOnIrKyx0eXBlOnMsZGF0YTp1fSx7dHJhbnNmZXI6ZH0pfSl9KCl9fWZ1bmN0aW9uIFhlKG4sZSl7Y29uc3Qgbz1hZShuLCJ1aW50OEFycmF5Iik7aWYoZSE9bnVsbCYmZS53b3JrZXJVcmwpcmV0dXJuIERlKHt3b3JrZXJVcmw6ZS53b3JrZXJVcmx9KS5jYWxsKCJmcmFtZXM6ZGVjb2RlIixvLFtvLmJ1ZmZlcl0pO2NvbnN0e2dpZjppPU9lKG4pLHJhbmdlOmx9PWUhPW51bGw/ZTp7fSx7d2lkdGg6YyxoZWlnaHQ6YSxjb2xvclRhYmxlOnQsZnJhbWVzOnJ9PWkscz1sP3Iuc2xpY2UobFswXSxsWzFdKzEpOnIsdT1uZXcgVWludDhDbGFtcGVkQXJyYXkoYyphKjQpO2xldCBkO3JldHVybiBzLm1hcChoPT57dmFyIGxlO2NvbnN0e2xlZnQ6Yix0b3A6cCx3aWR0aDpmLGhlaWdodDpnLGludGVybGFjZWQ6Qyxsb2NhbENvbG9yVGFibGU6eSxjb2xvclRhYmxlOncsbHp3TWluQ29kZVNpemU6bSxpbWFnZURhdGFQb3NpdGlvbnM6UyxncmFwaGljQ29udHJvbDpJLGRpc3Bvc2FsOlQsZGVsYXk6RX09aCxQPXArZyx7dHJhbnNwYXJlbnQ6S2UsdHJhbnNwYXJlbnRJbmRleDpWZX09SSE9bnVsbD9JOnt9LFc9eT93OnQsamU9S2U/VmU6LTEsWmU9dmUoUy5tYXAoKFtNLFVdKT0+by5zdWJhcnJheShNLE0rVSkpKTtsZXQgSz1QZShtLFplLGYqZyk7aWYoQyYmKEs9JGUoSyxmKSksKGQ9PW51bGw/dm9pZCAwOmQuZGlzcG9zYWwpIT09MSl7Y29uc3R7bGVmdDpNPTAsdG9wOlU9MCx3aWR0aDpWPWMsaGVpZ2h0Ok89YX09ZCE9bnVsbD9kOnt9LFg9VStPO2ZvcihsZXQgJD1VOyQ8WDskKyspe2NvbnN0IGo9JCpjK007Zm9yKGxldCBEPTA7RDxWO0QrKyl7Y29uc3Qgdj0oaitEKSo0O3Vbdl09dVt2KzFdPXVbdisyXT11W3YrM109MH19fWZvcihsZXQgTT1wO008UDtNKyspe2NvbnN0IFU9TSpjK2IsVj0oTS1wKSpmO2ZvcihsZXQgTz0wO088ZjtPKyspe2NvbnN0IFg9S1tWK09dO2lmKFg9PT1qZSljb250aW51ZTtjb25zdFskLGosRF09KGxlPVc9PW51bGw/dm9pZCAwOldbWF0pIT1udWxsP2xlOlswLDAsMF0sdj0oVStPKSo0O3Vbdl09JCx1W3YrMV09aix1W3YrMl09RCx1W3YrM109MjU1fX1yZXR1cm4gVCE9PTMmJihkPWgpLHt3aWR0aDpjLGhlaWdodDphLGRlbGF5OkUsaW1hZ2VEYXRhOnUuc2xpY2UoMCl9fSl9ZnVuY3Rpb24gTGUobixlLG8pe2NvbnN0e3dyaXRlQnl0ZTppLGdldEN1cnNvcjpsLGNhbGN1bGF0ZURpc3RhbmNlOmN9PW87aShuKTtsZXQgYT1sKCk7aSgwKTtjb25zdCB0PTE8PG4scj10LTEscz10KzE7bGV0IHU9cysxLGQ9bisxLGg9MCxiPTA7ZnVuY3Rpb24gcChTKXtmb3IoO2g+PVM7KWkoYiYyNTUpLGI+Pj04LGgtPTgsYyhhKT09PTI1NiYmKGkoMjU1LGEpLGE9bCgpLGkoMCkpfWZ1bmN0aW9uIGYoUyl7Ynw9Uzw8aCxoKz1kLHAoOCl9bGV0IGc9ZVswXSZyLEM9e30seSx3LG07Zih0KTtmb3IobGV0IFM9ZS5sZW5ndGgsST0xO0k8UzsrK0kpaWYobT1lW0ldJnIseT1nPDw4fG0sdz1DW3ldLHc9PT12b2lkIDApe2ZvcihifD1nPDxoLGgrPWQ7aD49ODspaShiJjI1NSksYj4+PTgsaC09OCxjKGEpPT09MjU2JiYoaSgyNTUsYSksYT1sKCksaSgwKSk7dT09PTQwOTY/KGYodCksdT1zKzEsZD1uKzEsQz17fSk6KHU+PTE8PGQmJisrZCxDW3ldPXUrKyksZz1tfWVsc2UgZz13O2YoZyksZihzKSxwKDEpLGMoYSk9PT0xP2koMCxhKTooaShjKGEpLTEsYSksaSgwKSl9ZnVuY3Rpb24gUmUobj17fSl7Y29uc3R7Y2h1bmtTaXplOmU9NDA5Nn09bjtsZXQgbz1bbmV3IFVpbnQ4QXJyYXkoZSldLGk9MCxsPTA7Y29uc3QgYz0odCxyKT0+e3I/b1tyWzBdXVtyWzFdXT10OihsPj1lJiYob1srK2ldPW5ldyBVaW50OEFycmF5KGUpLGw9MCksb1tpXVtsKytdPXQpfSxhPXQ9PnQuZm9yRWFjaChyPT5jKHIpKTtyZXR1cm57Z2V0Q3Vyc29yOigpPT5baSxsXSxzZXRDdXJzb3I6dD0+e2k9dFswXSxsPXRbMV19LGNhbGN1bGF0ZURpc3RhbmNlOnQ9PmkqZStsLSh0WzBdKmUrdFsxXSksd3JpdGVCeXRlOmMsd3JpdGVCeXRlczphLHdyaXRlU3RyaW5nOnQ9PnQuc3BsaXQoIiIpLmZvckVhY2goKHIscyk9PmModC5jaGFyQ29kZUF0KHMpKSksd3JpdGVVbnNpZ25lZDp0PT5hKFt0JjI1NSx0Pj44JjI1NV0pLGZsdXNoOigpPT57b1tpXT1vW2ldLnNsaWNlKDAsbCk7Y29uc3QgdD1uZXcgVWludDhBcnJheShvLnJlZHVjZSgocyx1KT0+cyt1LmJ5dGVMZW5ndGgsMCkpO2xldCByPTA7cmV0dXJuIG8uZm9yRWFjaChzPT57dC5zZXQocyxyKSxyKz1zLmJ5dGVMZW5ndGh9KSxvPVtuZXcgVWludDhBcnJheShlKV0saT0wLGw9MCx0fX19ZnVuY3Rpb24gemUobil7dmFyIEMseSx3O2NvbnN0IGU9UmUoKSx7d3JpdGVCeXRlOm8sd3JpdGVCeXRlczppLHdyaXRlVW5zaWduZWQ6bCxmbHVzaDpjfT1lLHtsZWZ0OmE9MCx0b3A6dD0wLHdpZHRoOnI9MCxoZWlnaHQ6cz0wLGRlbGF5OnU9MTAwLGNvbG9yVGFibGU6ZH09bjtsZXR7ZGlzcG9zYWw6aD0wfT1uO2NvbnN0IGI9KEM9bi5ncmFwaGljQ29udHJvbCk9PW51bGw/dm9pZCAwOkMudHJhbnNwYXJlbnQ7bGV0IHA9KHc9KHk9bi5ncmFwaGljQ29udHJvbCk9PW51bGw/dm9pZCAwOnkudHJhbnNwYXJlbnRJbmRleCkhPW51bGw/dzoyNTU7aWYoYTwwfHxhPjY1NTM1KXRocm93IG5ldyBFcnJvcigiTGVmdCBpbnZhbGlkLiIpO2lmKHQ8MHx8dD42NTUzNSl0aHJvdyBuZXcgRXJyb3IoIlRvcCBpbnZhbGlkLiIpO2lmKHI8PTB8fHI+NjU1MzUpdGhyb3cgbmV3IEVycm9yKCJXaWR0aCBpbnZhbGlkLiIpO2lmKHM8PTB8fHM+NjU1MzUpdGhyb3cgbmV3IEVycm9yKCJIZWlnaHQgaW52YWxpZC4iKTtsZXQgZj04LGc9ZD9kLmxlbmd0aDowO2lmKGcpe2lmKGc8Mnx8Zz4yNTZ8fGcmZy0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2xvciB0YWJsZSBsZW5ndGgsIG11c3QgYmUgcG93ZXIgb2YgMiBhbmQgMiAuLiAyNTYuIik7Zm9yKDtnPj49MTspKytmfXJldHVybiBvKHRlKSxvKG5lKSxvKHJlKSxiP2h8fChoPTIpOnA9MCxvKHBhcnNlSW50KGAwMDAke051bWJlcihoJjcpLnRvU3RyaW5nKDIpLnBhZFN0YXJ0KDMsIjAiKX0wJHtiPzE6MH1gLDIpKSxsKHUvMTApLG8ocCksbygwKSxvKGVlKSxsKGEpLGwodCksbChyKSxsKHMpLGQhPW51bGwmJmQubGVuZ3RoPyhvKHBhcnNlSW50KGAxMDAwMCR7KGYtMSkudG9TdHJpbmcoMikucGFkU3RhcnQoMywiMCIpfWAsMikpLGkoZC5mbGF0KCkpKTpvKDApLExlKGYsbi5pbWFnZURhdGEsZSksYygpfWZ1bmN0aW9uIEZlKG4pe2NvbnN0e2ZyYW1lczplLHBhbGV0dGU6byx0cmFuc3BhcmVudEluZGV4Oml9PW4sbD1ZKG8pO3JldHVybiBlLm1hcCgoe2ltYWdlRGF0YTpjfSk9PntsZXQgYT0hMTtjb25zdCB0PW5ldyBVaW50OENsYW1wZWRBcnJheShjLmxlbmd0aC80KTtmb3IobGV0IHI9Yy5sZW5ndGgscz0wO3M8cjtzKz00KWNbcyszXT09PTA/KHRbcy80XT1pLGE9ITApOnRbcy80XT1sKGNbc108PDE2fGNbcysxXTw8OHxjW3MrMl0pO3JldHVybntpbWFnZURhdGE6dCx0cmFuc3BhcmVudDphfX0pfWZ1bmN0aW9uIFdlKG4pe2NvbnN0e2ZyYW1lczplLHRyYW5zcGFyZW50SW5kZXg6b309bjtsZXQgaTtjb25zdCBsPWUubGVuZ3RoO3JldHVybiBlLm1hcCgoYyxhKT0+e2NvbnN0e3dpZHRoOnQsaGVpZ2h0OnIsdHJhbnNwYXJlbnQ6cyxpbWFnZURhdGE6dX09YztsZXQgZD0wLGg9MCxiPXQtMSxwPXItMSxmO2lmKHMpe2Zvcig7aDxwOyl7bGV0IHc9ITA7Zm9yKGxldCBtPTA7bTx0O20rKylpZih1W3QqaCttXSE9PW8pe3c9ITE7YnJlYWt9aWYoIXcpYnJlYWs7aCsrfWZvcig7cD5oOyl7bGV0IHc9ITA7Zm9yKGxldCBtPTA7bTx0O20rKylpZih1W3QqcCttXSE9PW8pe3c9ITE7YnJlYWt9aWYoIXcpYnJlYWs7cC0tfWZvcig7ZDxiOyl7bGV0IHc9ITA7Zm9yKGxldCBtPWg7bTxwO20rKylpZih1W3QqbStkXSE9PW8pe3c9ITE7YnJlYWt9aWYoIXcpYnJlYWs7ZCsrfWZvcig7Yj5kOyl7bGV0IHc9ITA7Zm9yKGxldCBtPWg7bTxwO20rKylpZih1W3QqbStiXSE9PW8pe3c9ITE7YnJlYWt9aWYoIXcpYnJlYWs7Yi0tfX1lbHNle2lmKGkpe2Zvcig7aDxwOyl7bGV0IHc9ITA7Zm9yKGxldCBtPTA7bTx0O20rKyl7Y29uc3QgUz10KmgrbTtpZih1W1NdIT09aVtTXSl7dz0hMTticmVha319aWYoIXcpYnJlYWs7aCsrfWZvcig7cD5oOyl7bGV0IHc9ITA7Zm9yKGxldCBtPTA7bTx0O20rKyl7Y29uc3QgUz10KnArbTtpZih1W1NdIT09aVtTXSl7dz0hMTticmVha319aWYoIXcpYnJlYWs7cC0tfWlmKGg9PT1wKWQ9YjtlbHNle2Zvcig7ZDxiOyl7bGV0IHc9ITA7Zm9yKGxldCBtPWg7bTw9cDttKyspe2NvbnN0IFM9bSp0K2Q7aWYodVtTXSE9PWlbU10pe3c9ITE7YnJlYWt9fWlmKCF3KWJyZWFrO2QrK31mb3IoO2I+ZDspe2xldCB3PSEwO2ZvcihsZXQgbT1oO208PXA7bSsrKXtjb25zdCBTPW0qdCtiO2lmKHVbU10hPT1pW1NdKXt3PSExO2JyZWFrfX1pZighdylicmVhaztiLS19fX1mPWksaT11fWNvbnN0IGc9YisxLWQsQz1wKzEtaCx5PU5lKHUse2xlZnQ6ZCx0b3A6aCx3aWR0aDpnLGhlaWdodDpDLHJhd1dpZHRoOnQscmF0ZToxLGNhbGxiYWNrOnc9PntpZighcyYmZiYmdVt3XT09PWZbd10pcmV0dXJuIG99fSk7cmV0dXJue2xlZnQ6ZCx0b3A6aCx3aWR0aDpnLGhlaWdodDpDLGRpc3Bvc2FsOnMmJmEhPT1sLTE/MjoxLGltYWdlRGF0YTp5fX0pfWNvbnN0IE49Q2Uoe3NraXBUcmFuc3BhcmVudDohMX0pO3NlbGYub25tZXNzYWdlPW49Pntjb25zdHtpZDplLHR5cGU6byxkYXRhOml9PW4uZGF0YTtpZihvPT09InBhbGV0dGU6YWRkU2FtcGxlIiYmTilyZXR1cm4gTi5hZGRTYW1wbGUoaSksc2VsZi5wb3N0TWVzc2FnZSh7aWQ6ZSx0eXBlOm8sZGF0YTohMH0pO2lmKG89PT0icGFsZXR0ZTpnZW5lcmF0ZSImJk4pe04uZ2VuZXJhdGUoaSk7Y29uc3QgbD1aKHt9LE4uY29udGV4dCk7cmV0dXJuIE4ucmVzZXQoKSxzZWxmLnBvc3RNZXNzYWdlKHtpZDplLHR5cGU6byxkYXRhOmx9KX1pZihvPT09ImZyYW1lczppbmRleCIpe2NvbnN0IGw9RmUoaSk7cmV0dXJuIHNlbGYucG9zdE1lc3NhZ2Uoe2lkOmUsdHlwZTpvLGRhdGE6bH0sbC5tYXAoYz0+Yy5pbWFnZURhdGEuYnVmZmVyKSl9aWYobz09PSJmcmFtZXM6Y3JvcCIpe2NvbnN0IGw9V2UoaSk7cmV0dXJuIHNlbGYucG9zdE1lc3NhZ2Uoe2lkOmUsdHlwZTpvLGRhdGE6bH0sbC5tYXAoYz0+Yy5pbWFnZURhdGEuYnVmZmVyKSl9aWYobz09PSJmcmFtZTplbmNvZGUiKXtjb25zdCBsPXplKGkpO3JldHVybiBzZWxmLnBvc3RNZXNzYWdlKHtpZDplLHR5cGU6byxkYXRhOmx9LFtsLmJ1ZmZlcl0pfWlmKG89PT0iZnJhbWVzOmRlY29kZSIpe2NvbnN0IGw9WGUoaSk7cmV0dXJuIHNlbGYucG9zdE1lc3NhZ2Uoe2lkOmUsdHlwZTpvLGRhdGE6bH0sbC5tYXAoYz0+Yy5pbWFnZURhdGEuYnVmZmVyKSl9fX0pKCk7Cg==", ct = (e) => z(void 0, null, function* () {
|
|
2009
2009
|
const {
|
|
2010
2010
|
perFrameTime: t = 1e3 / 24,
|
|
2011
2011
|
gif: l,
|
|
@@ -2022,8 +2022,8 @@ const gn = "data:application/javascript;base64,dmFyIEdlPU9iamVjdC5kZWZpbmVQcm9wZ
|
|
|
2022
2022
|
delay: t
|
|
2023
2023
|
});
|
|
2024
2024
|
});
|
|
2025
|
-
const n = yield
|
|
2026
|
-
workerUrl:
|
|
2025
|
+
const n = yield xn({
|
|
2026
|
+
workerUrl: Zn,
|
|
2027
2027
|
width: i.width || 200,
|
|
2028
2028
|
height: i.height || 200,
|
|
2029
2029
|
maxColors: 255,
|
|
@@ -2044,7 +2044,7 @@ function wn(e) {
|
|
|
2044
2044
|
case "day":
|
|
2045
2045
|
s = 60 * 60 * 24 * s;
|
|
2046
2046
|
}
|
|
2047
|
-
const { day: c, hour: i, minute: a, second: n } =
|
|
2047
|
+
const { day: c, hour: i, minute: a, second: n } = qe(s), o = [
|
|
2048
2048
|
{
|
|
2049
2049
|
unit: "days",
|
|
2050
2050
|
value: c
|
|
@@ -2076,7 +2076,7 @@ function wn(e) {
|
|
|
2076
2076
|
display: "flex",
|
|
2077
2077
|
alignItems: "center",
|
|
2078
2078
|
justifyContent: "center",
|
|
2079
|
-
paddingBottom:
|
|
2079
|
+
paddingBottom: 15
|
|
2080
2080
|
}
|
|
2081
2081
|
},
|
|
2082
2082
|
o.map((r, d) => /* @__PURE__ */ b.createElement(
|
|
@@ -2170,7 +2170,7 @@ function wn(e) {
|
|
|
2170
2170
|
const te = {
|
|
2171
2171
|
MARKETING_SHOPWINDOW: "marketing-shopwindow",
|
|
2172
2172
|
MARKETING_COUNTDOWN: "marketing-countdown"
|
|
2173
|
-
}, {
|
|
2173
|
+
}, { Image: gn, Raw: Tn, Spacer: Nn, ContentEditableBlock: Wn, HtmlDomNode: Ie } = ye, ue = {
|
|
2174
2174
|
attributes: {
|
|
2175
2175
|
color: "#ffffff",
|
|
2176
2176
|
"padding-top": "20px",
|
|
@@ -2186,7 +2186,7 @@ const te = {
|
|
|
2186
2186
|
remainingTime: 24,
|
|
2187
2187
|
unit: "hour"
|
|
2188
2188
|
}
|
|
2189
|
-
},
|
|
2189
|
+
}, Ke = Ee({
|
|
2190
2190
|
get name() {
|
|
2191
2191
|
return N("Countdown");
|
|
2192
2192
|
},
|
|
@@ -2232,76 +2232,84 @@ const te = {
|
|
|
2232
2232
|
};
|
|
2233
2233
|
return Q(t, e);
|
|
2234
2234
|
},
|
|
2235
|
-
category:
|
|
2235
|
+
category: ze.UNKNOWN_CONTENT,
|
|
2236
2236
|
render(e) {
|
|
2237
2237
|
const { node: t, mode: l } = e, { attributes: s, children: c } = t;
|
|
2238
2238
|
if (l === "testing") {
|
|
2239
|
-
const i =
|
|
2239
|
+
const i = Mt.renderToString(
|
|
2240
2240
|
/* @__PURE__ */ b.createElement(wn, { attributes: t.attributes, data: t.data })
|
|
2241
2241
|
);
|
|
2242
2242
|
return /* @__PURE__ */ b.createElement(
|
|
2243
|
-
|
|
2243
|
+
Ie,
|
|
2244
2244
|
{
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2245
|
+
tagName: "div",
|
|
2246
|
+
style: {
|
|
2247
|
+
backgroundColor: s["background-color"],
|
|
2248
|
+
paddingBottom: s["padding-bottom"],
|
|
2249
|
+
paddingTop: s["padding-top"],
|
|
2250
|
+
paddingLeft: s["padding-left"],
|
|
2251
|
+
paddingRight: s["padding-right"],
|
|
2252
|
+
fontSize: "0px",
|
|
2253
|
+
lineHeight: 1
|
|
2254
|
+
}
|
|
2250
2255
|
},
|
|
2251
|
-
/* @__PURE__ */ b.createElement(
|
|
2256
|
+
/* @__PURE__ */ b.createElement(
|
|
2257
|
+
Ie,
|
|
2258
|
+
{
|
|
2259
|
+
tagName: "div",
|
|
2260
|
+
style: {
|
|
2261
|
+
width: "100%",
|
|
2262
|
+
textAlign: "center",
|
|
2263
|
+
display: "table"
|
|
2264
|
+
}
|
|
2265
|
+
},
|
|
2266
|
+
c.map((a, n) => ut.isTextElement(a) ? /* @__PURE__ */ b.createElement(Wn, { key: n, node: a }) : null),
|
|
2267
|
+
/* @__PURE__ */ b.createElement(Nn, { height: "20px" }),
|
|
2268
|
+
/* @__PURE__ */ b.createElement(Tn, null, i)
|
|
2269
|
+
)
|
|
2252
2270
|
);
|
|
2253
2271
|
}
|
|
2254
2272
|
return /* @__PURE__ */ b.createElement(
|
|
2255
|
-
|
|
2256
|
-
{
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
"background-color": s["background-color"]
|
|
2262
|
-
},
|
|
2263
|
-
/* @__PURE__ */ b.createElement(Ie, null, /* @__PURE__ */ b.createElement(
|
|
2264
|
-
Tn,
|
|
2265
|
-
E(K({
|
|
2266
|
-
idx: e.idx
|
|
2267
|
-
}, e.node.attributes), {
|
|
2268
|
-
children: t.children
|
|
2269
|
-
})
|
|
2270
|
-
))
|
|
2273
|
+
gn,
|
|
2274
|
+
E(K({
|
|
2275
|
+
idx: e.idx
|
|
2276
|
+
}, e.node.attributes), {
|
|
2277
|
+
children: t.children
|
|
2278
|
+
})
|
|
2271
2279
|
);
|
|
2272
2280
|
}
|
|
2273
|
-
}),
|
|
2274
|
-
|
|
2281
|
+
}), Yn = ({ nodePath: e }) => /* @__PURE__ */ b.createElement(Qe, null, /* @__PURE__ */ b.createElement(
|
|
2282
|
+
Ue,
|
|
2275
2283
|
{
|
|
2276
2284
|
desktop: /* @__PURE__ */ b.createElement(
|
|
2277
|
-
|
|
2285
|
+
ke,
|
|
2278
2286
|
{
|
|
2279
|
-
mode:
|
|
2287
|
+
mode: v.DESKTOP,
|
|
2280
2288
|
nodePath: e
|
|
2281
2289
|
}
|
|
2282
2290
|
),
|
|
2283
2291
|
mobile: /* @__PURE__ */ b.createElement(
|
|
2284
|
-
|
|
2292
|
+
ke,
|
|
2285
2293
|
{
|
|
2286
|
-
mode:
|
|
2294
|
+
mode: v.MOBILE,
|
|
2287
2295
|
nodePath: e
|
|
2288
2296
|
}
|
|
2289
2297
|
)
|
|
2290
2298
|
}
|
|
2291
2299
|
));
|
|
2292
|
-
function
|
|
2300
|
+
function ke({
|
|
2293
2301
|
nodePath: e,
|
|
2294
2302
|
mode: t
|
|
2295
2303
|
}) {
|
|
2296
|
-
const l =
|
|
2297
|
-
r.current || (r.current = ee(i)),
|
|
2298
|
-
|
|
2304
|
+
const l = ht(), { onUpload: s } = Be(), { setFieldValue: c } = Je(), { selectedNode: i } = $e(), { setLock: a } = _e(), [n, o] = ve(!1), r = b.useRef();
|
|
2305
|
+
r.current || (r.current = ee(i)), Pe(() => {
|
|
2306
|
+
Oe(r.current, i) ? a(!1) : a(!0);
|
|
2299
2307
|
}, [i, a]);
|
|
2300
2308
|
const d = () => z(this, null, function* () {
|
|
2301
2309
|
if (i)
|
|
2302
2310
|
try {
|
|
2303
2311
|
o(!0);
|
|
2304
|
-
const p =
|
|
2312
|
+
const p = xt.toDOMNode(l, i), u = [], y = i.data;
|
|
2305
2313
|
let M = y.remainingTime;
|
|
2306
2314
|
switch (y.unit) {
|
|
2307
2315
|
case "minute":
|
|
@@ -2315,9 +2323,9 @@ function fe({
|
|
|
2315
2323
|
}
|
|
2316
2324
|
const m = 60 * 2;
|
|
2317
2325
|
for (let x = 0; x < m; x++) {
|
|
2318
|
-
const { day: Z, hour:
|
|
2326
|
+
const { day: Z, hour: g, minute: L, second: G } = qe(
|
|
2319
2327
|
M -= 1
|
|
2320
|
-
), k = yield
|
|
2328
|
+
), k = yield St(p, {
|
|
2321
2329
|
wrapper(se) {
|
|
2322
2330
|
const D = document.createElement("table");
|
|
2323
2331
|
return D.style.width = "100%", D.border = "0", D.cellPadding = "0", D.cellSpacing = "0", D.role = "presentation", D.style.verticalAlign = "top", D.appendChild(se), D;
|
|
@@ -2330,7 +2338,7 @@ function fe({
|
|
|
2330
2338
|
},
|
|
2331
2339
|
{
|
|
2332
2340
|
selector: ".hrs",
|
|
2333
|
-
innerText:
|
|
2341
|
+
innerText: g
|
|
2334
2342
|
},
|
|
2335
2343
|
{
|
|
2336
2344
|
selector: ".mins",
|
|
@@ -2341,36 +2349,36 @@ function fe({
|
|
|
2341
2349
|
innerText: G
|
|
2342
2350
|
}
|
|
2343
2351
|
]
|
|
2344
|
-
}), le = yield
|
|
2352
|
+
}), le = yield Wt(k);
|
|
2345
2353
|
u.push(le);
|
|
2346
2354
|
}
|
|
2347
|
-
const h = yield
|
|
2355
|
+
const h = yield ct({
|
|
2348
2356
|
images: u,
|
|
2349
2357
|
perFrameTime: 1e3
|
|
2350
|
-
}),
|
|
2358
|
+
}), w = yield s == null ? void 0 : s(new File([h], "countdown.gif"));
|
|
2351
2359
|
c(
|
|
2352
2360
|
e,
|
|
2353
|
-
t ===
|
|
2354
|
-
|
|
2361
|
+
t === v.DESKTOP ? "attributes.src" : "mobileAttributes.src",
|
|
2362
|
+
w
|
|
2355
2363
|
);
|
|
2356
2364
|
const W = ee(i);
|
|
2357
2365
|
O(
|
|
2358
2366
|
W,
|
|
2359
|
-
t ===
|
|
2360
|
-
|
|
2367
|
+
t === v.DESKTOP ? "attributes.src" : "mobileAttributes.src",
|
|
2368
|
+
w
|
|
2361
2369
|
), r.current = W;
|
|
2362
2370
|
} catch (p) {
|
|
2363
|
-
console.error(p),
|
|
2371
|
+
console.error(p), Ae.error(String(p));
|
|
2364
2372
|
} finally {
|
|
2365
2373
|
o(!1);
|
|
2366
2374
|
}
|
|
2367
2375
|
});
|
|
2368
|
-
return i ? /* @__PURE__ */ b.createElement(
|
|
2376
|
+
return i ? /* @__PURE__ */ b.createElement(Fe, { defaultActiveKey: ["0", "1", "2", "3"] }, /* @__PURE__ */ b.createElement(
|
|
2369
2377
|
C.Item,
|
|
2370
2378
|
{
|
|
2371
2379
|
name: "0",
|
|
2372
2380
|
header: N("Image"),
|
|
2373
|
-
extra: /* @__PURE__ */ b.createElement(
|
|
2381
|
+
extra: /* @__PURE__ */ b.createElement(Re, { loading: n, type: "primary", onClick: d }, N("Save as gif"))
|
|
2374
2382
|
},
|
|
2375
2383
|
/* @__PURE__ */ b.createElement(
|
|
2376
2384
|
S,
|
|
@@ -2480,12 +2488,12 @@ function fe({
|
|
|
2480
2488
|
)
|
|
2481
2489
|
)) : null;
|
|
2482
2490
|
}
|
|
2483
|
-
class
|
|
2491
|
+
class On extends Ve {
|
|
2484
2492
|
generateElement() {
|
|
2485
|
-
he.registerBlocks([
|
|
2493
|
+
he.registerBlocks([Ke]), O(He, Ke.type, Yn);
|
|
2486
2494
|
}
|
|
2487
2495
|
}
|
|
2488
|
-
const { Image:
|
|
2496
|
+
const { Image: Ln } = ye, Xe = {
|
|
2489
2497
|
attributes: {
|
|
2490
2498
|
align: "center",
|
|
2491
2499
|
border: "0",
|
|
@@ -2513,7 +2521,7 @@ const { Image: Gn } = ye, Xe = {
|
|
|
2513
2521
|
}
|
|
2514
2522
|
]
|
|
2515
2523
|
}
|
|
2516
|
-
},
|
|
2524
|
+
}, fe = Ee({
|
|
2517
2525
|
get name() {
|
|
2518
2526
|
return N("Shopwindow");
|
|
2519
2527
|
},
|
|
@@ -2531,21 +2539,21 @@ const { Image: Gn } = ye, Xe = {
|
|
|
2531
2539
|
};
|
|
2532
2540
|
return Q(t, e);
|
|
2533
2541
|
},
|
|
2534
|
-
category:
|
|
2542
|
+
category: ze.IMAGE,
|
|
2535
2543
|
render(e) {
|
|
2536
2544
|
const { node: t } = e, o = t.attributes, {
|
|
2537
2545
|
"border-enabled": l,
|
|
2538
2546
|
"border-width": s,
|
|
2539
2547
|
"border-style": c,
|
|
2540
2548
|
"border-color": i
|
|
2541
|
-
} = o, a =
|
|
2549
|
+
} = o, a = ge(o, [
|
|
2542
2550
|
"border-enabled",
|
|
2543
2551
|
"border-width",
|
|
2544
2552
|
"border-style",
|
|
2545
2553
|
"border-color"
|
|
2546
2554
|
]), n = l ? `${s || "1px"} ${c || "solid"} ${i || "#AAAAAA"}` : "";
|
|
2547
2555
|
return /* @__PURE__ */ b.createElement(
|
|
2548
|
-
|
|
2556
|
+
Ln,
|
|
2549
2557
|
E(K({
|
|
2550
2558
|
idx: e.idx
|
|
2551
2559
|
}, a), {
|
|
@@ -2555,74 +2563,74 @@ const { Image: Gn } = ye, Xe = {
|
|
|
2555
2563
|
})
|
|
2556
2564
|
);
|
|
2557
2565
|
}
|
|
2558
|
-
}),
|
|
2566
|
+
}), Gn = {
|
|
2559
2567
|
formatter(e) {
|
|
2560
2568
|
return !!e;
|
|
2561
2569
|
},
|
|
2562
2570
|
normalize(e) {
|
|
2563
2571
|
return e ? "true" : void 0;
|
|
2564
2572
|
}
|
|
2565
|
-
},
|
|
2566
|
-
|
|
2573
|
+
}, Sn = ({ nodePath: e }) => /* @__PURE__ */ b.createElement(Qe, null, /* @__PURE__ */ b.createElement(
|
|
2574
|
+
Ue,
|
|
2567
2575
|
{
|
|
2568
2576
|
desktop: /* @__PURE__ */ b.createElement(
|
|
2569
|
-
|
|
2577
|
+
Ce,
|
|
2570
2578
|
{
|
|
2571
|
-
mode:
|
|
2579
|
+
mode: v.DESKTOP,
|
|
2572
2580
|
nodePath: e
|
|
2573
2581
|
}
|
|
2574
2582
|
),
|
|
2575
2583
|
mobile: /* @__PURE__ */ b.createElement(
|
|
2576
|
-
|
|
2584
|
+
Ce,
|
|
2577
2585
|
{
|
|
2578
|
-
mode:
|
|
2586
|
+
mode: v.MOBILE,
|
|
2579
2587
|
nodePath: e
|
|
2580
2588
|
}
|
|
2581
2589
|
)
|
|
2582
2590
|
}
|
|
2583
2591
|
));
|
|
2584
|
-
function
|
|
2592
|
+
function Ce({
|
|
2585
2593
|
nodePath: e,
|
|
2586
2594
|
mode: t
|
|
2587
2595
|
}) {
|
|
2588
|
-
const { onUpload: l } =
|
|
2589
|
-
o.current || (o.current = ee(c)),
|
|
2596
|
+
const { onUpload: l } = Be(), { setFieldValue: s } = Je(), { selectedNode: c } = $e(), { setLock: i } = _e(), [a, n] = ve(!1), o = b.useRef();
|
|
2597
|
+
o.current || (o.current = ee(c)), Pe(() => {
|
|
2590
2598
|
var d;
|
|
2591
|
-
|
|
2599
|
+
Oe((d = o.current) == null ? void 0 : d.data.list, c == null ? void 0 : c.data.list) ? i(!1) : i(!0);
|
|
2592
2600
|
}, [c, i]);
|
|
2593
2601
|
const r = () => z(this, null, function* () {
|
|
2594
2602
|
if (c)
|
|
2595
2603
|
try {
|
|
2596
2604
|
n(!0);
|
|
2597
2605
|
const d = yield Promise.all(
|
|
2598
|
-
c.data.list.filter((M) => M.src).map((M) =>
|
|
2599
|
-
), p = yield
|
|
2606
|
+
c.data.list.filter((M) => M.src).map((M) => yt(M.src))
|
|
2607
|
+
), p = yield ct({
|
|
2600
2608
|
images: d,
|
|
2601
2609
|
perFrameTime: 1e3
|
|
2602
2610
|
}), u = yield l == null ? void 0 : l(new File([p], "shopwindow.gif"));
|
|
2603
2611
|
s(
|
|
2604
2612
|
e,
|
|
2605
|
-
t ===
|
|
2613
|
+
t === v.DESKTOP ? "attributes.src" : "mobileAttributes.src",
|
|
2606
2614
|
u
|
|
2607
2615
|
);
|
|
2608
2616
|
const y = ee(c);
|
|
2609
2617
|
O(
|
|
2610
2618
|
y,
|
|
2611
|
-
t ===
|
|
2619
|
+
t === v.DESKTOP ? "attributes.src" : "mobileAttributes.src",
|
|
2612
2620
|
u
|
|
2613
2621
|
), o.current = y;
|
|
2614
2622
|
} catch (d) {
|
|
2615
|
-
console.error(d),
|
|
2623
|
+
console.error(d), Ae.error(String(d));
|
|
2616
2624
|
} finally {
|
|
2617
2625
|
n(!1);
|
|
2618
2626
|
}
|
|
2619
2627
|
});
|
|
2620
|
-
return c ? /* @__PURE__ */ b.createElement(
|
|
2628
|
+
return c ? /* @__PURE__ */ b.createElement(Fe, { defaultActiveKey: ["0", "1", "2", "3"] }, /* @__PURE__ */ b.createElement(
|
|
2621
2629
|
C.Item,
|
|
2622
2630
|
{
|
|
2623
2631
|
name: "3",
|
|
2624
2632
|
header: N("Image"),
|
|
2625
|
-
extra: /* @__PURE__ */ b.createElement(
|
|
2633
|
+
extra: /* @__PURE__ */ b.createElement(Re, { loading: a, type: "primary", onClick: r }, N("Save as gif"))
|
|
2626
2634
|
},
|
|
2627
2635
|
/* @__PURE__ */ b.createElement(
|
|
2628
2636
|
Y.EditPanelTabsField,
|
|
@@ -2631,7 +2639,7 @@ function Ee({
|
|
|
2631
2639
|
tabPosition: "top",
|
|
2632
2640
|
name: "data.list",
|
|
2633
2641
|
label: "",
|
|
2634
|
-
renderItem: (d, p) => /* @__PURE__ */ b.createElement(
|
|
2642
|
+
renderItem: (d, p) => /* @__PURE__ */ b.createElement(Dn, { index: p, path: e }),
|
|
2635
2643
|
renderHeader: (d, p) => d.content || N("Image") + " " + (p + 1)
|
|
2636
2644
|
}
|
|
2637
2645
|
)
|
|
@@ -2659,7 +2667,7 @@ function Ee({
|
|
|
2659
2667
|
path: e,
|
|
2660
2668
|
name: "fluid-on-mobile",
|
|
2661
2669
|
label: N("Full width on mobile"),
|
|
2662
|
-
formItem:
|
|
2670
|
+
formItem: Gn
|
|
2663
2671
|
}
|
|
2664
2672
|
)), /* @__PURE__ */ b.createElement(C.Item, { name: "0", header: N("Dimension") }, /* @__PURE__ */ b.createElement(
|
|
2665
2673
|
S,
|
|
@@ -2706,19 +2714,19 @@ function Ee({
|
|
|
2706
2714
|
}
|
|
2707
2715
|
))) : null;
|
|
2708
2716
|
}
|
|
2709
|
-
function
|
|
2717
|
+
function Dn({ index: e, path: t }) {
|
|
2710
2718
|
return /* @__PURE__ */ b.createElement("div", { style: { paddingTop: 20 } }, /* @__PURE__ */ b.createElement(Y.ImageUrl, { path: t, name: `data.list.[${e}].src` }));
|
|
2711
2719
|
}
|
|
2712
|
-
class vn extends
|
|
2720
|
+
class vn extends Ve {
|
|
2713
2721
|
generateElement() {
|
|
2714
|
-
he.registerBlocks([
|
|
2722
|
+
he.registerBlocks([fe]), O(He, fe.type, Sn);
|
|
2715
2723
|
}
|
|
2716
2724
|
}
|
|
2717
2725
|
export {
|
|
2718
|
-
|
|
2719
|
-
|
|
2720
|
-
|
|
2726
|
+
On as Countdown,
|
|
2727
|
+
Ke as MarketingCountdown,
|
|
2728
|
+
fe as MarketingShopwindow,
|
|
2721
2729
|
te as MarketingType,
|
|
2722
|
-
|
|
2730
|
+
jn as Responsive,
|
|
2723
2731
|
vn as Shopwindow
|
|
2724
2732
|
};
|