前端vue-puzzle-vcode验证码使用
vue
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
项目地址:https://gitcode.com/gh_mirrors/vu/vue
免费下载资源
·
属性:
属性 | 描述 | 类型 | 默认值 |
show | 是否显示验证码弹框 | Boolean | false |
canvasWidth | 主图区域的宽度 | Number | 310 |
canvasHeight | 主图区域的高度 | Number | 160 |
imgs | 自定义图片 | Array | null |
successText | 验证成功时的提示文字 | String | 验证通过! |
failText | 验证失败时的提示文字 | String | 验证失败,请重试 |
sliderText | 下方滑动条里的文字 | String | 拖动滑块完成拼图 |
事件:
事件名 | 描述 | 返回值 |
success | 验证通过时会触发 | 偏差值px,移动的距离px(需修改源码) |
fail | 主图区域的宽度 | 偏差值px |
close | 用户点击遮罩层的回调 | null |
reset(需修改源码) | 用户点击刷新按钮和失败后重新刷新的回调 | 偏差值px |
1、安装vue-puzzle-vcode
npm i -S vue-puzzle-vcode
2、实现代码
<template>
<div>
<Vcode :show="isShow" @success="success" @close="close" />
<el-button @click="submit">登录</el-button>
</div>
</template>
<script>
import Vcode from "vue-puzzle-vcode";
export default {
data() {
return {
isShow: true // 验证码模态框是否出现
};
},
components: {
Vcode
},
methods: {
submit() {
this.isShow = true;
},
// 用户通过了验证
success(msg) {
this.isShow = false; // 通过验证后,需要手动隐藏模态框
},
// 用户点击遮罩层,应该关闭模态框
close() {
this.isShow = false;
}
}
};
</script>
效果:
前端和后端一起结合调取接口的时候,框架原本的success和fail和close已经不满足我们使用,所以我们要修改框架的源码我们加一个reset事件和成功之后多返回一个移动的距离px~
修改后的源码main.js:
!function(t, e) {
true ? module.exports = e() : undefined
}(this, (function() {
return function() {
"use strict";
var t = {
358: function(t, e, n) {
var i = n(81)
, s = n.n(i)
, a = n(645)
, o = n.n(a)()(s());
o.push([t.id, ".vue-puzzle-vcode {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n background-color: rgba(0, 0, 0, 0.3);\n z-index: 999;\n opacity: 0;\n pointer-events: none;\n -webkit-transition: opacity 200ms;\n transition: opacity 200ms;\n}\n.vue-puzzle-vcode.show_ {\n opacity: 1;\n pointer-events: auto;\n}\n.vue-auth-box_ {\n position: absolute;\n top: 40%;\n left: 50%;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n padding: 20px;\n background: #fff;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n border-radius: 3px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\n}\n.vue-auth-box_ .auth-body_ {\n position: relative;\n overflow: hidden;\n border-radius: 3px;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n background-color: rgba(0, 0, 0, 0.8);\n z-index: 20;\n opacity: 1;\n -webkit-transition: opacity 200ms;\n transition: opacity 200ms;\n display: -webkit-box;\n display: -webkit-flex;\n display: flex;\n -webkit-box-align: center;\n -webkit-align-items: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n justify-content: center;\n}\n.vue-auth-box_ .auth-body_ .loading-box_.hide_ {\n opacity: 0;\n pointer-events: none;\n}\n.vue-auth-box_ .auth-body_ .loading-box_.hide_ .loading-gif_ span {\n -webkit-animation-play-state: paused;\n animation-play-state: paused;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ {\n -webkit-box-flex: 0;\n -webkit-flex: none;\n flex: none;\n height: 5px;\n line-height: 0;\n}\n@-webkit-keyframes load {\n0% {\n opacity: 1;\n -webkit-transform: scale(1.3);\n transform: scale(1.3);\n}\n100% {\n opacity: 0.2;\n -webkit-transform: scale(0.3);\n transform: scale(0.3);\n}\n}\n@keyframes load {\n0% {\n opacity: 1;\n -webkit-transform: scale(1.3);\n transform: scale(1.3);\n}\n100% {\n opacity: 0.2;\n -webkit-transform: scale(0.3);\n transform: scale(0.3);\n}\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span {\n display: inline-block;\n width: 5px;\n height: 100%;\n margin-left: 2px;\n border-radius: 50%;\n background-color: #888;\n -webkit-animation: load 1.04s ease infinite;\n animation: load 1.04s ease infinite;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(1) {\n margin-left: 0;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(2) {\n -webkit-animation-delay: 0.13s;\n animation-delay: 0.13s;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(3) {\n -webkit-animation-delay: 0.26s;\n animation-delay: 0.26s;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(4) {\n -webkit-animation-delay: 0.39s;\n animation-delay: 0.39s;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(5) {\n -webkit-animation-delay: 0.52s;\n animation-delay: 0.52s;\n}\n.vue-auth-box_ .auth-body_ .info-box_ {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 24px;\n line-height: 24px;\n text-align: center;\n overflow: hidden;\n font-size: 13px;\n background-color: #83ce3f;\n opacity: 0;\n -webkit-transform: translateY(24px);\n transform: translateY(24px);\n -webkit-transition: all 200ms;\n transition: all 200ms;\n color: #fff;\n z-index: 10;\n}\n.vue-auth-box_ .auth-body_ .info-box_.show {\n opacity: 0.95;\n -webkit-transform: translateY(0);\n transform: translateY(0);\n}\n.vue-auth-box_ .auth-body_ .info-box_.fail {\n background-color: #ce594b;\n}\n.vue-auth-box_ .auth-body_ .auth-canvas2_ {\n position: absolute;\n top: 0;\n left: 0;\n width: 60px;\n height: 100%;\n z-index: 2;\n}\n.vue-auth-box_ .auth-body_ .auth-canvas3_ {\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0;\n -webkit-transition: opacity 600ms;\n transition: opacity 600ms;\n z-index: 3;\n}\n.vue-auth-box_ .auth-body_ .auth-canvas3_.show {\n opacity: 1;\n}\n.vue-auth-box_ .auth-body_ .flash_ {\n position: absolute;\n top: 0;\n left: 0;\n width: 30px;\n height: 100%;\n background-color: rgba(255, 255, 255, 0.1);\n z-index: 3;\n}\n.vue-auth-box_ .auth-body_ .flash_.show {\n -webkit-transition: -webkit-transform 600ms;\n transition: -webkit-transform 600ms;\n transition: transform 600ms;\n transition: transform 600ms, -webkit-transform 600ms;\n}\n.vue-auth-box_ .auth-body_ .reset_ {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 35px;\n height: auto;\n z-index: 12;\n cursor: pointer;\n -webkit-transition: -webkit-transform 200ms;\n transition: -webkit-transform 200ms;\n transition: transform 200ms;\n transition: transform 200ms, -webkit-transform 200ms;\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n}\n.vue-auth-box_ .auth-body_ .reset_:hover {\n -webkit-transform: rotate(-90deg);\n transform: rotate(-90deg);\n}\n.vue-auth-box_ .auth-control_ .range-box {\n position: relative;\n width: 100%;\n background-color: #eef1f8;\n margin-top: 20px;\n border-radius: 3px;\n box-shadow: 0 0 8px rgba(240, 240, 240, 0.6) inset;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-text {\n position: absolute;\n top: 50%;\n left: 50%;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n font-size: 14px;\n color: #b7bcd1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-align: center;\n width: 100%;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider {\n position: absolute;\n height: 100%;\n width: 50px;\n background-color: rgba(106, 160, 255, 0.8);\n border-radius: 3px;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn {\n position: absolute;\n display: -webkit-box;\n display: -webkit-flex;\n display: flex;\n -webkit-box-align: center;\n -webkit-align-items: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n justify-content: center;\n right: 0;\n width: 50px;\n height: 100%;\n background-color: #fff;\n border-radius: 3px;\n box-shadow: 0 0 4px #ccc;\n cursor: pointer;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn > div {\n width: 0;\n height: 40%;\n -webkit-transition: all 200ms;\n transition: all 200ms;\n border: solid 1px #6aa0ff;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn > div:nth-child(2) {\n margin: 0 4px;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn:hover > div:first-child,\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn.isDown > div:first-child {\n border: solid 4px transparent;\n height: 0;\n border-right-color: #6aa0ff;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn:hover > div:nth-child(2),\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn.isDown > div:nth-child(2) {\n border-width: 3px;\n height: 0;\n border-radius: 3px;\n margin: 0 6px;\n border-right-color: #6aa0ff;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn:hover > div:nth-child(3),\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn.isDown > div:nth-child(3) {\n border: solid 4px transparent;\n height: 0;\n border-left-color: #6aa0ff;\n}\n.vue-puzzle-overflow {\n overflow: hidden !important;\n}\n", ""]),
e.Z = o
},
645: function(t) {
t.exports = function(t) {
var e = [];
return e.toString = function() {
return this.map((function(e) {
var n = ""
, i = void 0 !== e[5];
return e[4] && (n += "@supports (".concat(e[4], ") {")),
e[2] && (n += "@media ".concat(e[2], " {")),
i && (n += "@layer".concat(e[5].length > 0 ? " ".concat(e[5]) : "", " {")),
n += t(e),
i && (n += "}"),
e[2] && (n += "}"),
e[4] && (n += "}"),
n
}
)).join("")
}
,
e.i = function(t, n, i, s, a) {
"string" == typeof t && (t = [[null, t, void 0]]);
var o = {};
if (i)
for (var r = 0; r < this.length; r++) {
var h = this[r][0];
null != h && (o[h] = !0)
}
for (var l = 0; l < t.length; l++) {
var c = [].concat(t[l]);
i && o[c[0]] || (void 0 !== a && (void 0 === c[5] || (c[1] = "@layer".concat(c[5].length > 0 ? " ".concat(c[5]) : "", " {").concat(c[1], "}")),
c[5] = a),
n && (c[2] ? (c[1] = "@media ".concat(c[2], " {").concat(c[1], "}"),
c[2] = n) : c[2] = n),
s && (c[4] ? (c[1] = "@supports (".concat(c[4], ") {").concat(c[1], "}"),
c[4] = s) : c[4] = "".concat(s)),
e.push(c))
}
}
,
e
}
},
81: function(t) {
t.exports = function(t) {
return t[1]
}
},
379: function(t) {
var e = [];
function n(t) {
for (var n = -1, i = 0; i < e.length; i++)
if (e[i].identifier === t) {
n = i;
break
}
return n
}
function i(t, i) {
for (var a = {}, o = [], r = 0; r < t.length; r++) {
var h = t[r]
, l = i.base ? h[0] + i.base : h[0]
, c = a[l] || 0
, d = "".concat(l, " ").concat(c);
a[l] = c + 1;
var u = n(d)
, p = {
css: h[1],
media: h[2],
sourceMap: h[3],
supports: h[4],
layer: h[5]
};
if (-1 !== u)
e[u].references++,
e[u].updater(p);
else {
var f = s(p, i);
i.byIndex = r,
e.splice(r, 0, {
identifier: d,
updater: f,
references: 1
})
}
o.push(d)
}
return o
}
function s(t, e) {
var n = e.domAPI(e);
return n.update(t),
function(e) {
if (e) {
if (e.css === t.css && e.media === t.media && e.sourceMap === t.sourceMap && e.supports === t.supports && e.layer === t.layer)
return;
n.update(t = e)
} else
n.remove()
}
}
t.exports = function(t, s) {
var a = i(t = t || [], s = s || {});
return function(t) {
t = t || [];
for (var o = 0; o < a.length; o++) {
var r = n(a[o]);
e[r].references--
}
for (var h = i(t, s), l = 0; l < a.length; l++) {
var c = n(a[l]);
0 === e[c].references && (e[c].updater(),
e.splice(c, 1))
}
a = h
}
}
},
569: function(t) {
var e = {};
t.exports = function(t, n) {
var i = function(t) {
if (void 0 === e[t]) {
var n = document.querySelector(t);
if (window.HTMLIFrameElement && n instanceof window.HTMLIFrameElement)
try {
n = n.contentDocument.head
} catch (t) {
n = null
}
e[t] = n
}
return e[t]
}(t);
if (!i)
throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
i.appendChild(n)
}
},
216: function(t) {
t.exports = function(t) {
var e = document.createElement("style");
return t.setAttributes(e, t.attributes),
t.insert(e, t.options),
e
}
},
565: function(t, e, n) {
t.exports = function(t) {
var e = n.nc;
e && t.setAttribute("nonce", e)
}
},
795: function(t) {
t.exports = function(t) {
var e = t.insertStyleElement(t);
return {
update: function(n) {
!function(t, e, n) {
var i = "";
n.supports && (i += "@supports (".concat(n.supports, ") {")),
n.media && (i += "@media ".concat(n.media, " {"));
var s = void 0 !== n.layer;
s && (i += "@layer".concat(n.layer.length > 0 ? " ".concat(n.layer) : "", " {")),
i += n.css,
s && (i += "}"),
n.media && (i += "}"),
n.supports && (i += "}");
var a = n.sourceMap;
a && "undefined" != typeof btoa && (i += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a)))), " */")),
e.styleTagTransform(i, t, e.options)
}(e, t, n)
},
remove: function() {
!function(t) {
if (null === t.parentNode)
return !1;
t.parentNode.removeChild(t)
}(e)
}
}
}
},
589: function(t) {
t.exports = function(t, e) {
if (e.styleSheet)
e.styleSheet.cssText = t;
else {
for (; e.firstChild; )
e.removeChild(e.firstChild);
e.appendChild(document.createTextNode(t))
}
}
}
}
, e = {};
function n(i) {
var s = e[i];
if (void 0 !== s)
return s.exports;
var a = e[i] = {
id: i,
exports: {}
};
return t[i](a, a.exports, n),
a.exports
}
n.n = function(t) {
var e = t && t.__esModule ? function() {
return t.default
}
: function() {
return t
}
;
return n.d(e, {
a: e
}),
e
}
,
n.d = function(t, e) {
for (var i in e)
n.o(e, i) && !n.o(t, i) && Object.defineProperty(t, i, {
enumerable: !0,
get: e[i]
})
}
,
n.o = function(t, e) {
return Object.prototype.hasOwnProperty.call(t, e)
}
,
n.r = function(t) {
"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, {
value: "Module"
}),
Object.defineProperty(t, "__esModule", {
value: !0
})
}
;
var i = {};
return function() {
n.r(i),
n.d(i, {
default: function() {
return x
}
});
var t = function() {
var t = this
, e = t.$createElement
, n = t._self._c || e;
return n("div", {
class: ["vue-puzzle-vcode", {
show_: t.show
}],
on: {
mousedown: t.onCloseMouseDown,
mouseup: t.onCloseMouseUp,
touchstart: t.onCloseMouseDown,
touchend: t.onCloseMouseUp
}
}, [n("div", {
staticClass: "vue-auth-box_",
on: {
mousedown: function(t) {
t.stopPropagation()
},
touchstart: function(t) {
t.stopPropagation()
}
}
}, [n("div", {
staticClass: "auth-body_",
style: "height: " + t.canvasHeight + "px"
}, [n("canvas", {
ref: "canvas1",
style: "width:" + t.canvasWidth + "px;height:" + t.canvasHeight + "px",
attrs: {
width: t.canvasWidth,
height: t.canvasHeight
}
}), t._v(" "), n("canvas", {
ref: "canvas3",
class: ["auth-canvas3_", {
show: t.isSuccess
}],
style: "width:" + t.canvasWidth + "px;height:" + t.canvasHeight + "px",
attrs: {
width: t.canvasWidth,
height: t.canvasHeight
}
}), t._v(" "), n("canvas", {
ref: "canvas2",
staticClass: "auth-canvas2_",
style: "width:" + t.puzzleBaseSize + "px;height:" + t.canvasHeight + "px;transform:translateX(" + (t.styleWidth - t.sliderBaseSize - (t.puzzleBaseSize - t.sliderBaseSize) * ((t.styleWidth - t.sliderBaseSize) / (t.canvasWidth - t.sliderBaseSize))) + "px)",
attrs: {
width: t.puzzleBaseSize,
height: t.canvasHeight
}
}), t._v(" "), n("div", {
class: ["loading-box_", {
hide_: !t.loading
}]
}, [t._m(0)]), t._v(" "), n("div", {
class: ["info-box_", {
show: t.infoBoxShow
}, {
fail: t.infoBoxFail
}]
}, [t._v("\n " + t._s(t.infoText) + "\n ")]), t._v(" "), n("div", {
class: ["flash_", {
show: t.isSuccess
}],
style: "transform: translateX(" + (t.isSuccess ? t.canvasWidth + .578 * t.canvasHeight + "px" : "-" + .578 * t.canvasHeight + "px") + ") skew(-30deg, 0);"
}), t._v(" "), n("img", {
staticClass: "reset_",
attrs: {
src: t.resetSvg
},
on: {
click: t.reset
}
})]), t._v(" "), n("div", {
staticClass: "auth-control_"
}, [n("div", {
staticClass: "range-box",
style: "height:" + t.sliderBaseSize + "px"
}, [n("div", {
staticClass: "range-text"
}, [t._v(t._s(t.sliderText))]), t._v(" "), n("div", {
ref: "range-slider",
staticClass: "range-slider",
style: "width:" + t.styleWidth + "px"
}, [n("div", {
class: ["range-btn", {
isDown: t.mouseDown
}],
style: "width:" + t.sliderBaseSize + "px",
on: {
mousedown: function(e) {
return t.onRangeMouseDown(e)
},
touchstart: function(e) {
return t.onRangeMouseDown(e)
}
}
}, [n("div"), t._v(" "), n("div"), t._v(" "), n("div")])])])])])])
};
t._withStripped = !0;
var e = {
props: {
canvasWidth: {
type: Number,
default: 310
},
canvasHeight: {
type: Number,
default: 160
},
show: {
type: Boolean,
default: !1
},
puzzleScale: {
type: Number,
default: 1
},
sliderSize: {
type: Number,
default: 50
},
range: {
type: Number,
default: 10
},
imgs: {
type: Array
},
successText: {
type: String,
default: "验证通过!"
},
failText: {
type: String,
default: "验证失败,请重试"
},
sliderText: {
type: String,
default: "拖动滑块完成拼图"
}
},
data: ()=>({
mouseDown: !1,
startWidth: 50,
startX: 0,
newX: 0,
pinX: 0,
pinY: 0,
loading: !1,
isCanSlide: !1,
error: !1,
infoBoxShow: !1,
infoText: "",
infoBoxFail: !1,
timer1: null,
closeDown: !1,
isSuccess: !1,
imgIndex: -1,
isSubmting: !1,
resetSvg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAELklEQVRYR+2YW2wUZRTH//9vtlCoF9IoIklT3PqgPGi326hoetuaGEhIr9SgCYkkgt2WGOQVCca+GavWdr0GjD4YhG3RB3hply1LQA1tEQIxEXapGI2pEkys9LIzx2ylYWfY6e5sF0oi+7hzzvl+3/9855xvhrjNf7zN+XAHcL4Z+n8o6JWTeYt++W25S596AIZy6TB+n3yo+Nchlk8vmIIVowdXU9c3Q1gDSilBlQwjgBAYFGDvdF58/4milqvZwDpOcXWsb5Uh8hmBqkwXFMhlCN8aX5LXNbRy/T+Z+iXsHAFWRXs3QGQPyLucLDJrK5DgUXdTsxPfjAEro8E3Ce50EtxsKxPTwCPH3U2jTmJkBJgWTnAMxDeGMEoa0xQ+LJQnCD4HYFkCyAC3RdwN3U7gMkpxRTTYrMD91sCJIgCxV5R6O1Jcfy7VwonqLoj9/CqB2kF341qncGkBvRe+ureAWpRgoalCBecMFzcdK24YymZRJz5zprgq1tsJwXYL3CVZGvdGHmwZc7JQtra2gE+f712ep2QUYP714DJhaJrXLqXZQszlZwtYdSHoB9ljVk/ePVrSZFL0ZkAlxzQBVseCT8WhZhRThtFB8plk9Zi/qCi8cv0fNxvKFrDy4oF11NXXIFy2EII4iBcG3Y03VLZT8OqRd5aFPduvOEpxRayvXolxAKB2g6NgEhobBlc1HHYKY7WvHf5wtVAPgegIlbbZ9seUZ7AyFnwewi9pGoUyDmhrB931kfnC1ZwOeKlLP8GZJi6QLSFP2yep4toXSbT3ZQAfX3O6omt8Nhd9r/aHQAUMOQywYBZo5uZD2ThQ2rbPCjlnH6yI9rUryE5DU75ctJaake46Be4DuDjF8dFBNA94/AdtiySVxIlpMlTS8td801o70vMigM9huTda2lhcKHVHPO2HZv/P6LIwX7hk/+qzPSvUJGMkrg8AQYTkroRdXMlE+HH/twsG6BsOdJHYZlaO/lBZ6weOiiSXqs3Gqj0TeAxx+T75DIpgwjC0onD51pQD4JaluPrkR/cpFT9DcoVp84LOgTL/DjtBbglgou+puHwB8lEznPxJw1XSX77VtgizBvQNBw4RMqB7xt4Lc3c8lQKJaQHoO4R8ydz0/7MWoCXk8c85MrMC9J3qaafw/WtQlwXST+F3BnAeYB4obgJ1BJIuG+YtiKAjVOZ/Pd1ZdwzoG+4uBtSPpjaRbhXLcwF3hzytb2TilgVgT5BkYybBrTYC+Rvg5nRpdTRJrIs8+VPXPQXj2i4ItxC4O2NQQUQnN4U9rRcz9nH64p4ceM2lziX5Y4s3KHCdUHwE77ecMkMEp6BwhIa2Z6DslZRvfulgHafYLuCas58WLp2aLCFUga70qxOFU6dPFL2W1feYeaU43Y5z/TxnCuYabMEuC043ckdBp4pZ7f8FE5psOI1g6fwAAAAASUVORK5CYII="
}),
mounted() {
document.body.appendChild(this.$el),
document.addEventListener("mousemove", this.onRangeMouseMove, !1),
document.addEventListener("mouseup", this.onRangeMouseUp, !1),
document.addEventListener("touchmove", this.onRangeMouseMove, {
passive: !1
}),
document.addEventListener("touchend", this.onRangeMouseUp, !1),
this.show && (document.body.classList.add("vue-puzzle-overflow"),
this.reset())
},
beforeDestroy() {
clearTimeout(this.timer1),
document.body.removeChild(this.$el),
document.removeEventListener("mousemove", this.onRangeMouseMove, !1),
document.removeEventListener("mouseup", this.onRangeMouseUp, !1),
document.removeEventListener("touchmove", this.onRangeMouseMove, {
passive: !1
}),
document.removeEventListener("touchend", this.onRangeMouseUp, !1)
},
watch: {
show(t) {
t ? (document.body.classList.add("vue-puzzle-overflow"),
this.reset()) : (this.isSubmting = !1,
this.isSuccess = !1,
this.infoBoxShow = !1,
document.body.classList.remove("vue-puzzle-overflow"))
}
},
computed: {
styleWidth() {
const t = this.startWidth + this.newX - this.startX;
return t < this.sliderBaseSize ? this.sliderBaseSize : t > this.canvasWidth ? this.canvasWidth : t
},
puzzleBaseSize() {
return Math.round(52.5 * Math.max(Math.min(this.puzzleScale, 2), .2) + 6)
},
sliderBaseSize() {
return Math.max(Math.min(Math.round(this.sliderSize), Math.round(.5 * this.canvasWidth)), 10)
}
},
methods: {
onClose() {
this.mouseDown || this.isSubmting || (clearTimeout(this.timer1),
this.$emit("close"))
},
onCloseMouseDown() {
this.closeDown = !0
},
onCloseMouseUp() {
this.closeDown && this.onClose(),
this.closeDown = !1
},
onRangeMouseDown(t) {
this.isCanSlide && (this.mouseDown = !0,
this.startWidth = this.$refs["range-slider"].clientWidth,
this.newX = t.clientX || t.changedTouches[0].clientX,
this.startX = t.clientX || t.changedTouches[0].clientX)
},
onRangeMouseMove(t) {
this.mouseDown && (t.preventDefault(),
this.newX = t.clientX || t.changedTouches[0].clientX)
},
onRangeMouseUp() {
this.mouseDown && (this.mouseDown = !1,
this.submit())
},
init(t) {
if (this.loading && !t)
return;
this.loading = !0,
this.isCanSlide = !1;
const e = this.$refs.canvas1
, n = this.$refs.canvas2
, i = this.$refs.canvas3
, s = e.getContext("2d")
, a = n.getContext("2d")
, o = i.getContext("2d")
, r = navigator.userAgent.indexOf("Firefox") >= 0 && navigator.userAgent.indexOf("Windows") >= 0
, h = document.createElement("img");
if (s.fillStyle = "rgba(255,255,255,1)",
o.fillStyle = "rgba(255,255,255,1)",
s.clearRect(0, 0, this.canvasWidth, this.canvasHeight),
a.clearRect(0, 0, this.canvasWidth, this.canvasHeight),
this.pinX = this.getRandom(this.puzzleBaseSize, this.canvasWidth - this.puzzleBaseSize - 20),
this.pinY = this.getRandom(20, this.canvasHeight - this.puzzleBaseSize - 20),
h.crossOrigin = "anonymous",
h.onload = ()=>{
const [t,e,n,i] = this.makeImgSize(h);
s.save(),
this.paintBrick(s),
s.closePath(),
r ? (s.clip(),
s.save(),
s.shadowOffsetX = 0,
s.shadowOffsetY = 0,
s.shadowColor = "#000",
s.shadowBlur = 3,
s.fill(),
s.restore()) : (s.shadowOffsetX = 0,
s.shadowOffsetY = 0,
s.shadowColor = "#000",
s.shadowBlur = 3,
s.fill(),
s.clip()),
s.drawImage(h, t, e, n, i),
o.fillRect(0, 0, this.canvasWidth, this.canvasHeight),
o.drawImage(h, t, e, n, i),
s.globalCompositeOperation = "source-atop",
this.paintBrick(s),
s.arc(this.pinX + Math.ceil(this.puzzleBaseSize / 2), this.pinY + Math.ceil(this.puzzleBaseSize / 2), 1.2 * this.puzzleBaseSize, 0, 2 * Math.PI, !0),
s.closePath(),
s.shadowColor = "rgba(255, 255, 255, .8)",
s.shadowOffsetX = -1,
s.shadowOffsetY = -1,
s.shadowBlur = Math.min(Math.ceil(8 * this.puzzleScale), 12),
s.fillStyle = "#ffffaa",
s.fill();
const l = s.getImageData(this.pinX - 3, this.pinY - 20, this.pinX + this.puzzleBaseSize + 5, this.pinY + this.puzzleBaseSize + 5);
a.putImageData(l, 0, this.pinY - 20),
s.restore(),
s.clearRect(0, 0, this.canvasWidth, this.canvasHeight),
s.save(),
this.paintBrick(s),
s.globalAlpha = .8,
s.fillStyle = "#ffffff",
s.fill(),
s.restore(),
s.save(),
s.globalCompositeOperation = "source-atop",
this.paintBrick(s),
s.arc(this.pinX + Math.ceil(this.puzzleBaseSize / 2), this.pinY + Math.ceil(this.puzzleBaseSize / 2), 1.2 * this.puzzleBaseSize, 0, 2 * Math.PI, !0),
s.shadowColor = "#000",
s.shadowOffsetX = 2,
s.shadowOffsetY = 2,
s.shadowBlur = 16,
s.fill(),
s.restore(),
s.save(),
s.globalCompositeOperation = "destination-over",
s.drawImage(h, t, e, n, i),
s.restore(),
this.loading = !1,
this.isCanSlide = !0
}
,
h.onerror = ()=>{
this.init(!0)
}
,
!t && this.imgs && this.imgs.length) {
let t = this.getRandom(0, this.imgs.length - 1);
t === this.imgIndex && (t === this.imgs.length - 1 ? t = 0 : t++),
this.imgIndex = t,
h.src = this.imgs[t]
} else
h.src = this.makeImgWithCanvas()
},
getRandom: (t,e)=>Math.ceil(Math.random() * (e - t) + t),
makeImgSize(t) {
const e = t.width / t.height;
let n = 0
, i = 0
, s = 0
, a = 0;
return e > this.canvasWidth / this.canvasHeight ? (a = this.canvasHeight,
s = e * a,
i = 0,
n = (this.canvasWidth - s) / 2) : (s = this.canvasWidth,
a = s / e,
n = 0,
i = (this.canvasHeight - a) / 2),
[n, i, s, a]
},
paintBrick(t) {
const e = Math.ceil(15 * this.puzzleScale);
t.beginPath(),
t.moveTo(this.pinX, this.pinY),
t.lineTo(this.pinX + e, this.pinY),
t.arcTo(this.pinX + e, this.pinY - e / 2, this.pinX + e + e / 2, this.pinY - e / 2, e / 2),
t.arcTo(this.pinX + e + e, this.pinY - e / 2, this.pinX + e + e, this.pinY, e / 2),
t.lineTo(this.pinX + e + e + e, this.pinY),
t.lineTo(this.pinX + e + e + e, this.pinY + e),
t.arcTo(this.pinX + e + e + e + e / 2, this.pinY + e, this.pinX + e + e + e + e / 2, this.pinY + e + e / 2, e / 2),
t.arcTo(this.pinX + e + e + e + e / 2, this.pinY + e + e, this.pinX + e + e + e, this.pinY + e + e, e / 2),
t.lineTo(this.pinX + e + e + e, this.pinY + e + e + e),
t.lineTo(this.pinX, this.pinY + e + e + e),
t.lineTo(this.pinX, this.pinY + e + e),
t.arcTo(this.pinX + e / 2, this.pinY + e + e, this.pinX + e / 2, this.pinY + e + e / 2, e / 2),
t.arcTo(this.pinX + e / 2, this.pinY + e, this.pinX, this.pinY + e, e / 2),
t.lineTo(this.pinX, this.pinY)
},
makeImgWithCanvas() {
const t = document.createElement("canvas")
, e = t.getContext("2d");
t.width = this.canvasWidth,
t.height = this.canvasHeight,
e.fillStyle = `rgb(${this.getRandom(100, 255)},${this.getRandom(100, 255)},${this.getRandom(100, 255)})`,
e.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
for (let n = 0; n < 12; n++)
if (e.fillStyle = `rgb(${this.getRandom(100, 255)},${this.getRandom(100, 255)},${this.getRandom(100, 255)})`,
e.strokeStyle = `rgb(${this.getRandom(100, 255)},${this.getRandom(100, 255)},${this.getRandom(100, 255)})`,
this.getRandom(0, 2) > 1)
e.save(),
e.rotate(this.getRandom(-90, 90) * Math.PI / 180),
e.fillRect(this.getRandom(-20, t.width - 20), this.getRandom(-20, t.height - 20), this.getRandom(10, t.width / 2 + 10), this.getRandom(10, t.height / 2 + 10)),
e.restore();
else {
e.beginPath();
const n = this.getRandom(-Math.PI, Math.PI);
e.arc(this.getRandom(0, t.width), this.getRandom(0, t.height), this.getRandom(10, t.height / 2 + 10), n, n + 1.5 * Math.PI),
e.closePath(),
e.fill()
}
return t.toDataURL("image/png")
},
submit() {
this.isSubmting = !0;
const t = Math.abs(this.pinX - (this.styleWidth - this.sliderBaseSize) + (this.puzzleBaseSize - this.sliderBaseSize) * ((this.styleWidth - this.sliderBaseSize) / (this.canvasWidth - this.sliderBaseSize)) - 3);
t < this.range ? (this.infoText = this.successText,
this.infoBoxFail = !1,
this.infoBoxShow = !0,
this.isCanSlide = !1,
this.isSuccess = !0,
clearTimeout(this.timer1),
this.timer1 = setTimeout((()=>{
this.isSubmting = !1,
this.$emit("success", t, this.pinX)
}
), 800)) : (this.infoText = this.failText,
this.infoBoxFail = !0,
this.infoBoxShow = !0,
this.isCanSlide = !1,
this.$emit("fail", t),
clearTimeout(this.timer1),
this.timer1 = setTimeout((()=>{
this.isSubmting = !1,
this.reset()
}
), 800))
},
resetState() {
this.infoBoxFail = !1,
this.infoBoxShow = !1,
this.isCanSlide = !1,
this.isSuccess = !1,
this.startWidth = this.sliderBaseSize,
this.startX = 0,
this.newX = 0
},
reset() {
this.$emit("reset", t),
this.isSubmting || (this.resetState(),
this.init())
}
}
}
, s = n(379)
, a = n.n(s)
, o = n(795)
, r = n.n(o)
, h = n(569)
, l = n.n(h)
, c = n(565)
, d = n.n(c)
, u = n(216)
, p = n.n(u)
, f = n(589)
, g = n.n(f)
, v = n(358)
, b = {};
b.styleTagTransform = g(),
b.setAttributes = d(),
b.insert = l().bind(null, "head"),
b.domAPI = r(),
b.insertStyleElement = p(),
a()(v.Z, b),
v.Z && v.Z.locals && v.Z.locals;
var m = function(t, e, n, i, s, a, o, r) {
var h, l = "function" == typeof t ? t.options : t;
if (e && (l.render = e,
l.staticRenderFns = [function() {
var t = this
, e = t.$createElement
, n = t._self._c || e;
return n("div", {
staticClass: "loading-gif_"
}, [n("span"), t._v(" "), n("span"), t._v(" "), n("span"), t._v(" "), n("span"), t._v(" "), n("span")])
}
],
l._compiled = !0),
h)
if (l.functional) {
l._injectStyles = h;
var c = l.render;
l.render = function(t, e) {
return h.call(e),
c(t, e)
}
} else {
var d = l.beforeCreate;
l.beforeCreate = d ? [].concat(d, h) : [h]
}
return {
exports: t,
options: l
}
}(e, t);
m.options.__file = "src/app.vue";
var x = m.exports
}(),
i
}()
}
));
//# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVlLXB1enpsZS12Y29kZS9kaXN0L21haW4uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnVlLXB1enpsZS12Y29kZS9kaXN0L21haW4uanM/MTA2OSJdLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24odCxlKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSxlKTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzW1widnVlLXB1enpsZS12Y29kZVwiXT1lKCk6dFtcInZ1ZS1wdXp6bGUtdmNvZGVcIl09ZSgpfSh0aGlzLChmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciB0PXszNTg6ZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oODEpLHM9bi5uKGkpLGE9big2NDUpLG89bi5uKGEpKCkocygpKTtvLnB1c2goW3QuaWQsXCIudnVlLXB1enpsZS12Y29kZSB7XFxuICBwb3NpdGlvbjogZml4ZWQ7XFxuICB0b3A6IDA7XFxuICBsZWZ0OiAwO1xcbiAgYm90dG9tOiAwO1xcbiAgcmlnaHQ6IDA7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMyk7XFxuICB6LWluZGV4OiA5OTk7XFxuICBvcGFjaXR5OiAwO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXM7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zO1xcbn1cXG4udnVlLXB1enpsZS12Y29kZS5zaG93XyB7XFxuICBvcGFjaXR5OiAxO1xcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxufVxcbi52dWUtYXV0aC1ib3hfIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogNDAlO1xcbiAgbGVmdDogNTAlO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcXG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxuICBwYWRkaW5nOiAyMHB4O1xcbiAgYmFja2dyb3VuZDogI2ZmZjtcXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxuICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjMpO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMDtcXG4gIGxlZnQ6IDA7XFxuICBib3R0b206IDA7XFxuICByaWdodDogMDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44KTtcXG4gIHotaW5kZXg6IDIwO1xcbiAgb3BhY2l0eTogMTtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcztcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXM7XFxuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICAtd2Via2l0LWJveC1hbGlnbjogY2VudGVyO1xcbiAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgLXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xcbiAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWJvZHlfIC5sb2FkaW5nLWJveF8uaGlkZV8ge1xcbiAgb3BhY2l0eTogMDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfLmhpZGVfIC5sb2FkaW5nLWdpZl8gc3BhbiB7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1wbGF5LXN0YXRlOiBwYXVzZWQ7XFxuICAgICAgICAgIGFuaW1hdGlvbi1wbGF5LXN0YXRlOiBwYXVzZWQ7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWJvZHlfIC5sb2FkaW5nLWJveF8gLmxvYWRpbmctZ2lmXyB7XFxuICAtd2Via2l0LWJveC1mbGV4OiAwO1xcbiAgLXdlYmtpdC1mbGV4OiBub25lO1xcbiAgICAgICAgICBmbGV4OiBub25lO1xcbiAgaGVpZ2h0OiA1cHg7XFxuICBsaW5lLWhlaWdodDogMDtcXG59XFxuQC13ZWJraXQta2V5ZnJhbWVzIGxvYWQge1xcbjAlIHtcXG4gICAgb3BhY2l0eTogMTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMyk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjMpO1xcbn1cXG4xMDAlIHtcXG4gICAgb3BhY2l0eTogMC4yO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4zKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMyk7XFxufVxcbn1cXG5Aa2V5ZnJhbWVzIGxvYWQge1xcbjAlIHtcXG4gICAgb3BhY2l0eTogMTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMyk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjMpO1xcbn1cXG4xMDAlIHtcXG4gICAgb3BhY2l0eTogMC4yO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4zKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMyk7XFxufVxcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfIC5sb2FkaW5nLWdpZl8gc3BhbiB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogNXB4O1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgbWFyZ2luLWxlZnQ6IDJweDtcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICM4ODg7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbG9hZCAxLjA0cyBlYXNlIGluZmluaXRlO1xcbiAgICAgICAgICBhbmltYXRpb246IGxvYWQgMS4wNHMgZWFzZSBpbmZpbml0ZTtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtYm9keV8gLmxvYWRpbmctYm94XyAubG9hZGluZy1naWZfIHNwYW46bnRoLWNoaWxkKDEpIHtcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfIC5sb2FkaW5nLWdpZl8gc3BhbjpudGgtY2hpbGQoMikge1xcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuMTNzO1xcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuMTNzO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfIC5sb2FkaW5nLWdpZl8gc3BhbjpudGgtY2hpbGQoMykge1xcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuMjZzO1xcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuMjZzO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfIC5sb2FkaW5nLWdpZl8gc3BhbjpudGgtY2hpbGQoNCkge1xcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuMzlzO1xcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuMzlzO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfIC5sb2FkaW5nLWdpZl8gc3BhbjpudGgtY2hpbGQoNSkge1xcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuNTJzO1xcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuNTJzO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAuaW5mby1ib3hfIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJvdHRvbTogMDtcXG4gIGxlZnQ6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMjRweDtcXG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIGZvbnQtc2l6ZTogMTNweDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICM4M2NlM2Y7XFxuICBvcGFjaXR5OiAwO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMjRweCk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyNHB4KTtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDIwMG1zO1xcbiAgdHJhbnNpdGlvbjogYWxsIDIwMG1zO1xcbiAgY29sb3I6ICNmZmY7XFxuICB6LWluZGV4OiAxMDtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtYm9keV8gLmluZm8tYm94Xy5zaG93IHtcXG4gIG9wYWNpdHk6IDAuOTU7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAuaW5mby1ib3hfLmZhaWwge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NlNTk0YjtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtYm9keV8gLmF1dGgtY2FudmFzMl8ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgbGVmdDogMDtcXG4gIHdpZHRoOiA2MHB4O1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgei1pbmRleDogMjtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtYm9keV8gLmF1dGgtY2FudmFzM18ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgbGVmdDogMDtcXG4gIG9wYWNpdHk6IDA7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgNjAwbXM7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDYwMG1zO1xcbiAgei1pbmRleDogMztcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtYm9keV8gLmF1dGgtY2FudmFzM18uc2hvdyB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAuZmxhc2hfIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMDtcXG4gIGxlZnQ6IDA7XFxuICB3aWR0aDogMzBweDtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTtcXG4gIHotaW5kZXg6IDM7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWJvZHlfIC5mbGFzaF8uc2hvdyB7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDYwMG1zO1xcbiAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gNjAwbXM7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gNjAwbXM7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gNjAwbXMsIC13ZWJraXQtdHJhbnNmb3JtIDYwMG1zO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAucmVzZXRfIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMnB4O1xcbiAgcmlnaHQ6IDJweDtcXG4gIHdpZHRoOiAzNXB4O1xcbiAgaGVpZ2h0OiBhdXRvO1xcbiAgei1pbmRleDogMTI7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDIwMG1zO1xcbiAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMjAwbXM7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMjAwbXM7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMjAwbXMsIC13ZWJraXQtdHJhbnNmb3JtIDIwMG1zO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWJvZHlfIC5yZXNldF86aG92ZXIge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1jb250cm9sXyAucmFuZ2UtYm94IHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZjFmODtcXG4gIG1hcmdpbi10b3A6IDIwcHg7XFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxuICBib3gtc2hhZG93OiAwIDAgOHB4IHJnYmEoMjQwLCAyNDAsIDI0MCwgMC42KSBpbnNldDtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtY29udHJvbF8gLnJhbmdlLWJveCAucmFuZ2UtdGV4dCB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDUwJTtcXG4gIGxlZnQ6IDUwJTtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbiAgZm9udC1zaXplOiAxNHB4O1xcbiAgY29sb3I6ICNiN2JjZDE7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgd2lkdGg6IDEwMCU7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWNvbnRyb2xfIC5yYW5nZS1ib3ggLnJhbmdlLXNsaWRlciB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICB3aWR0aDogNTBweDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTA2LCAxNjAsIDI1NSwgMC44KTtcXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtY29udHJvbF8gLnJhbmdlLWJveCAucmFuZ2Utc2xpZGVyIC5yYW5nZS1idG4ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XFxuICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcXG4gIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIC13ZWJraXQtYm94LXBhY2s6IGNlbnRlcjtcXG4gIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgcmlnaHQ6IDA7XFxuICB3aWR0aDogNTBweDtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxuICBib3gtc2hhZG93OiAwIDAgNHB4ICNjY2M7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWNvbnRyb2xfIC5yYW5nZS1ib3ggLnJhbmdlLXNsaWRlciAucmFuZ2UtYnRuID4gZGl2IHtcXG4gIHdpZHRoOiAwO1xcbiAgaGVpZ2h0OiA0MCU7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAyMDBtcztcXG4gIHRyYW5zaXRpb246IGFsbCAyMDBtcztcXG4gIGJvcmRlcjogc29saWQgMXB4ICM2YWEwZmY7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWNvbnRyb2xfIC5yYW5nZS1ib3ggLnJhbmdlLXNsaWRlciAucmFuZ2UtYnRuID4gZGl2Om50aC1jaGlsZCgyKSB7XFxuICBtYXJnaW46IDAgNHB4O1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1jb250cm9sXyAucmFuZ2UtYm94IC5yYW5nZS1zbGlkZXIgLnJhbmdlLWJ0bjpob3ZlciA+IGRpdjpmaXJzdC1jaGlsZCxcXG4udnVlLWF1dGgtYm94XyAuYXV0aC1jb250cm9sXyAucmFuZ2UtYm94IC5yYW5nZS1zbGlkZXIgLnJhbmdlLWJ0bi5pc0Rvd24gPiBkaXY6Zmlyc3QtY2hpbGQge1xcbiAgYm9yZGVyOiBzb2xpZCA0cHggdHJhbnNwYXJlbnQ7XFxuICBoZWlnaHQ6IDA7XFxuICBib3JkZXItcmlnaHQtY29sb3I6ICM2YWEwZmY7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWNvbnRyb2xfIC5yYW5nZS1ib3ggLnJhbmdlLXNsaWRlciAucmFuZ2UtYnRuOmhvdmVyID4gZGl2Om50aC1jaGlsZCgyKSxcXG4udnVlLWF1dGgtYm94XyAuYXV0aC1jb250cm9sXyAucmFuZ2UtYm94IC5yYW5nZS1zbGlkZXIgLnJhbmdlLWJ0bi5pc0Rvd24gPiBkaXY6bnRoLWNoaWxkKDIpIHtcXG4gIGJvcmRlci13aWR0aDogM3B4O1xcbiAgaGVpZ2h0OiAwO1xcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcbiAgbWFyZ2luOiAwIDZweDtcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzZhYTBmZjtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtY29udHJvbF8gLnJhbmdlLWJveCAucmFuZ2Utc2xpZGVyIC5yYW5nZS1idG46aG92ZXIgPiBkaXY6bnRoLWNoaWxkKDMpLFxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWNvbnRyb2xfIC5yYW5nZS1ib3ggLnJhbmdlLXNsaWRlciAucmFuZ2UtYnRuLmlzRG93biA+IGRpdjpudGgtY2hpbGQoMykge1xcbiAgYm9yZGVyOiBzb2xpZCA0cHggdHJhbnNwYXJlbnQ7XFxuICBoZWlnaHQ6IDA7XFxuICBib3JkZXItbGVmdC1jb2xvcjogIzZhYTBmZjtcXG59XFxuLnZ1ZS1wdXp6bGUtb3ZlcmZsb3cge1xcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xcbn1cXG5cIixcIlwiXSksZS5aPW99LDY0NTpmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBuPVwiXCIsaT12b2lkIDAhPT1lWzVdO3JldHVybiBlWzRdJiYobis9XCJAc3VwcG9ydHMgKFwiLmNvbmNhdChlWzRdLFwiKSB7XCIpKSxlWzJdJiYobis9XCJAbWVkaWEgXCIuY29uY2F0KGVbMl0sXCIge1wiKSksaSYmKG4rPVwiQGxheWVyXCIuY29uY2F0KGVbNV0ubGVuZ3RoPjA/XCIgXCIuY29uY2F0KGVbNV0pOlwiXCIsXCIge1wiKSksbis9dChlKSxpJiYobis9XCJ9XCIpLGVbMl0mJihuKz1cIn1cIiksZVs0XSYmKG4rPVwifVwiKSxufSkpLmpvaW4oXCJcIil9LGUuaT1mdW5jdGlvbih0LG4saSxzLGEpe1wic3RyaW5nXCI9PXR5cGVvZiB0JiYodD1bW251bGwsdCx2b2lkIDBdXSk7dmFyIG89e307aWYoaSlmb3IodmFyIHI9MDtyPHRoaXMubGVuZ3RoO3IrKyl7dmFyIGg9dGhpc1tyXVswXTtudWxsIT1oJiYob1toXT0hMCl9Zm9yKHZhciBsPTA7bDx0Lmxlbmd0aDtsKyspe3ZhciBjPVtdLmNvbmNhdCh0W2xdKTtpJiZvW2NbMF1dfHwodm9pZCAwIT09YSYmKHZvaWQgMD09PWNbNV18fChjWzFdPVwiQGxheWVyXCIuY29uY2F0KGNbNV0ubGVuZ3RoPjA/XCIgXCIuY29uY2F0KGNbNV0pOlwiXCIsXCIge1wiKS5jb25jYXQoY1sxXSxcIn1cIikpLGNbNV09YSksbiYmKGNbMl0/KGNbMV09XCJAbWVkaWEgXCIuY29uY2F0KGNbMl0sXCIge1wiKS5jb25jYXQoY1sxXSxcIn1cIiksY1syXT1uKTpjWzJdPW4pLHMmJihjWzRdPyhjWzFdPVwiQHN1cHBvcnRzIChcIi5jb25jYXQoY1s0XSxcIikge1wiKS5jb25jYXQoY1sxXSxcIn1cIiksY1s0XT1zKTpjWzRdPVwiXCIuY29uY2F0KHMpKSxlLnB1c2goYykpfX0sZX19LDgxOmZ1bmN0aW9uKHQpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdFsxXX19LDM3OTpmdW5jdGlvbih0KXt2YXIgZT1bXTtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgbj0tMSxpPTA7aTxlLmxlbmd0aDtpKyspaWYoZVtpXS5pZGVudGlmaWVyPT09dCl7bj1pO2JyZWFrfXJldHVybiBufWZ1bmN0aW9uIGkodCxpKXtmb3IodmFyIGE9e30sbz1bXSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBoPXRbcl0sbD1pLmJhc2U/aFswXStpLmJhc2U6aFswXSxjPWFbbF18fDAsZD1cIlwiLmNvbmNhdChsLFwiIFwiKS5jb25jYXQoYyk7YVtsXT1jKzE7dmFyIHU9bihkKSxwPXtjc3M6aFsxXSxtZWRpYTpoWzJdLHNvdXJjZU1hcDpoWzNdLHN1cHBvcnRzOmhbNF0sbGF5ZXI6aFs1XX07aWYoLTEhPT11KWVbdV0ucmVmZXJlbmNlcysrLGVbdV0udXBkYXRlcihwKTtlbHNle3ZhciBmPXMocCxpKTtpLmJ5SW5kZXg9cixlLnNwbGljZShyLDAse2lkZW50aWZpZXI6ZCx1cGRhdGVyOmYscmVmZXJlbmNlczoxfSl9by5wdXNoKGQpfXJldHVybiBvfWZ1bmN0aW9uIHModCxlKXt2YXIgbj1lLmRvbUFQSShlKTtyZXR1cm4gbi51cGRhdGUodCksZnVuY3Rpb24oZSl7aWYoZSl7aWYoZS5jc3M9PT10LmNzcyYmZS5tZWRpYT09PXQubWVkaWEmJmUuc291cmNlTWFwPT09dC5zb3VyY2VNYXAmJmUuc3VwcG9ydHM9PT10LnN1cHBvcnRzJiZlLmxheWVyPT09dC5sYXllcilyZXR1cm47bi51cGRhdGUodD1lKX1lbHNlIG4ucmVtb3ZlKCl9fXQuZXhwb3J0cz1mdW5jdGlvbih0LHMpe3ZhciBhPWkodD10fHxbXSxzPXN8fHt9KTtyZXR1cm4gZnVuY3Rpb24odCl7dD10fHxbXTtmb3IodmFyIG89MDtvPGEubGVuZ3RoO28rKyl7dmFyIHI9bihhW29dKTtlW3JdLnJlZmVyZW5jZXMtLX1mb3IodmFyIGg9aSh0LHMpLGw9MDtsPGEubGVuZ3RoO2wrKyl7dmFyIGM9bihhW2xdKTswPT09ZVtjXS5yZWZlcmVuY2VzJiYoZVtjXS51cGRhdGVyKCksZS5zcGxpY2UoYywxKSl9YT1ofX19LDU2OTpmdW5jdGlvbih0KXt2YXIgZT17fTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXt2YXIgaT1mdW5jdGlvbih0KXtpZih2b2lkIDA9PT1lW3RdKXt2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpO2lmKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCYmbiBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCl0cnl7bj1uLmNvbnRlbnREb2N1bWVudC5oZWFkfWNhdGNoKHQpe249bnVsbH1lW3RdPW59cmV0dXJuIGVbdF19KHQpO2lmKCFpKXRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7aS5hcHBlbmRDaGlsZChuKX19LDIxNjpmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO3JldHVybiB0LnNldEF0dHJpYnV0ZXMoZSx0LmF0dHJpYnV0ZXMpLHQuaW5zZXJ0KGUsdC5vcHRpb25zKSxlfX0sNTY1OmZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9bi5uYztlJiZ0LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsZSl9fSw3OTU6ZnVuY3Rpb24odCl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5zZXJ0U3R5bGVFbGVtZW50KHQpO3JldHVybnt1cGRhdGU6ZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1cIlwiO24uc3VwcG9ydHMmJihpKz1cIkBzdXBwb3J0cyAoXCIuY29uY2F0KG4uc3VwcG9ydHMsXCIpIHtcIikpLG4ubWVkaWEmJihpKz1cIkBtZWRpYSBcIi5jb25jYXQobi5tZWRpYSxcIiB7XCIpKTt2YXIgcz12b2lkIDAhPT1uLmxheWVyO3MmJihpKz1cIkBsYXllclwiLmNvbmNhdChuLmxheWVyLmxlbmd0aD4wP1wiIFwiLmNvbmNhdChuLmxheWVyKTpcIlwiLFwiIHtcIikpLGkrPW4uY3NzLHMmJihpKz1cIn1cIiksbi5tZWRpYSYmKGkrPVwifVwiKSxuLnN1cHBvcnRzJiYoaSs9XCJ9XCIpO3ZhciBhPW4uc291cmNlTWFwO2EmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBidG9hJiYoaSs9XCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShhKSkpKSxcIiAqL1wiKSksZS5zdHlsZVRhZ1RyYW5zZm9ybShpLHQsZS5vcHRpb25zKX0oZSx0LG4pfSxyZW1vdmU6ZnVuY3Rpb24oKXshZnVuY3Rpb24odCl7aWYobnVsbD09PXQucGFyZW50Tm9kZSlyZXR1cm4hMTt0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9KGUpfX19fSw1ODk6ZnVuY3Rpb24odCl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoZS5zdHlsZVNoZWV0KWUuc3R5bGVTaGVldC5jc3NUZXh0PXQ7ZWxzZXtmb3IoO2UuZmlyc3RDaGlsZDspZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodCkpfX19fSxlPXt9O2Z1bmN0aW9uIG4oaSl7dmFyIHM9ZVtpXTtpZih2b2lkIDAhPT1zKXJldHVybiBzLmV4cG9ydHM7dmFyIGE9ZVtpXT17aWQ6aSxleHBvcnRzOnt9fTtyZXR1cm4gdFtpXShhLGEuZXhwb3J0cyxuKSxhLmV4cG9ydHN9bi5uPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiBuLmQoZSx7YTplfSksZX0sbi5kPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpIGluIGUpbi5vKGUsaSkmJiFuLm8odCxpKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSx7ZW51bWVyYWJsZTohMCxnZXQ6ZVtpXX0pfSxuLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LG4ucj1mdW5jdGlvbih0KXtcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfTt2YXIgaT17fTtyZXR1cm4gZnVuY3Rpb24oKXtuLnIoaSksbi5kKGkse2RlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm4geH19KTt2YXIgdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10LiRjcmVhdGVFbGVtZW50LG49dC5fc2VsZi5fY3x8ZTtyZXR1cm4gbihcImRpdlwiLHtjbGFzczpbXCJ2dWUtcHV6emxlLXZjb2RlXCIse3Nob3dfOnQuc2hvd31dLG9uOnttb3VzZWRvd246dC5vbkNsb3NlTW91c2VEb3duLG1vdXNldXA6dC5vbkNsb3NlTW91c2VVcCx0b3VjaHN0YXJ0OnQub25DbG9zZU1vdXNlRG93bix0b3VjaGVuZDp0Lm9uQ2xvc2VNb3VzZVVwfX0sW24oXCJkaXZcIix7c3RhdGljQ2xhc3M6XCJ2dWUtYXV0aC1ib3hfXCIsb246e21vdXNlZG93bjpmdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpfSx0b3VjaHN0YXJ0OmZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9fX0sW24oXCJkaXZcIix7c3RhdGljQ2xhc3M6XCJhdXRoLWJvZHlfXCIsc3R5bGU6XCJoZWlnaHQ6IFwiK3QuY2FudmFzSGVpZ2h0K1wicHhcIn0sW24oXCJjYW52YXNcIix7cmVmOlwiY2FudmFzMVwiLHN0eWxlOlwid2lkdGg6XCIrdC5jYW52YXNXaWR0aCtcInB4O2hlaWdodDpcIit0LmNhbnZhc0hlaWdodCtcInB4XCIsYXR0cnM6e3dpZHRoOnQuY2FudmFzV2lkdGgsaGVpZ2h0OnQuY2FudmFzSGVpZ2h0fX0pLHQuX3YoXCIgXCIpLG4oXCJjYW52YXNcIix7cmVmOlwiY2FudmFzM1wiLGNsYXNzOltcImF1dGgtY2FudmFzM19cIix7c2hvdzp0LmlzU3VjY2Vzc31dLHN0eWxlOlwid2lkdGg6XCIrdC5jYW52YXNXaWR0aCtcInB4O2hlaWdodDpcIit0LmNhbnZhc0hlaWdodCtcInB4XCIsYXR0cnM6e3dpZHRoOnQuY2FudmFzV2lkdGgsaGVpZ2h0OnQuY2FudmFzSGVpZ2h0fX0pLHQuX3YoXCIgXCIpLG4oXCJjYW52YXNcIix7cmVmOlwiY2FudmFzMlwiLHN0YXRpY0NsYXNzOlwiYXV0aC1jYW52YXMyX1wiLHN0eWxlOlwid2lkdGg6XCIrdC5wdXp6bGVCYXNlU2l6ZStcInB4O2hlaWdodDpcIit0LmNhbnZhc0hlaWdodCtcInB4O3RyYW5zZm9ybTp0cmFuc2xhdGVYKFwiKyh0LnN0eWxlV2lkdGgtdC5zbGlkZXJCYXNlU2l6ZS0odC5wdXp6bGVCYXNlU2l6ZS10LnNsaWRlckJhc2VTaXplKSooKHQuc3R5bGVXaWR0aC10LnNsaWRlckJhc2VTaXplKS8odC5jYW52YXNXaWR0aC10LnNsaWRlckJhc2VTaXplKSkpK1wicHgpXCIsYXR0cnM6e3dpZHRoOnQucHV6emxlQmFzZVNpemUsaGVpZ2h0OnQuY2FudmFzSGVpZ2h0fX0pLHQuX3YoXCIgXCIpLG4oXCJkaXZcIix7Y2xhc3M6W1wibG9hZGluZy1ib3hfXCIse2hpZGVfOiF0LmxvYWRpbmd9XX0sW3QuX20oMCldKSx0Ll92KFwiIFwiKSxuKFwiZGl2XCIse2NsYXNzOltcImluZm8tYm94X1wiLHtzaG93OnQuaW5mb0JveFNob3d9LHtmYWlsOnQuaW5mb0JveEZhaWx9XX0sW3QuX3YoXCJcXG4gICAgICAgIFwiK3QuX3ModC5pbmZvVGV4dCkrXCJcXG4gICAgICBcIildKSx0Ll92KFwiIFwiKSxuKFwiZGl2XCIse2NsYXNzOltcImZsYXNoX1wiLHtzaG93OnQuaXNTdWNjZXNzfV0sc3R5bGU6XCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoXCIrKHQuaXNTdWNjZXNzP3QuY2FudmFzV2lkdGgrLjU3OCp0LmNhbnZhc0hlaWdodCtcInB4XCI6XCItXCIrLjU3OCp0LmNhbnZhc0hlaWdodCtcInB4XCIpK1wiKSBza2V3KC0zMGRlZywgMCk7XCJ9KSx0Ll92KFwiIFwiKSxuKFwiaW1nXCIse3N0YXRpY0NsYXNzOlwicmVzZXRfXCIsYXR0cnM6e3NyYzp0LnJlc2V0U3ZnfSxvbjp7Y2xpY2s6dC5yZXNldH19KV0pLHQuX3YoXCIgXCIpLG4oXCJkaXZcIix7c3RhdGljQ2xhc3M6XCJhdXRoLWNvbnRyb2xfXCJ9LFtuKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwicmFuZ2UtYm94XCIsc3R5bGU6XCJoZWlnaHQ6XCIrdC5zbGlkZXJCYXNlU2l6ZStcInB4XCJ9LFtuKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwicmFuZ2UtdGV4dFwifSxbdC5fdih0Ll9zKHQuc2xpZGVyVGV4dCkpXSksdC5fdihcIiBcIiksbihcImRpdlwiLHtyZWY6XCJyYW5nZS1zbGlkZXJcIixzdGF0aWNDbGFzczpcInJhbmdlLXNsaWRlclwiLHN0eWxlOlwid2lkdGg6XCIrdC5zdHlsZVdpZHRoK1wicHhcIn0sW24oXCJkaXZcIix7Y2xhc3M6W1wicmFuZ2UtYnRuXCIse2lzRG93bjp0Lm1vdXNlRG93bn1dLHN0eWxlOlwid2lkdGg6XCIrdC5zbGlkZXJCYXNlU2l6ZStcInB4XCIsb246e21vdXNlZG93bjpmdW5jdGlvbihlKXtyZXR1cm4gdC5vblJhbmdlTW91c2VEb3duKGUpfSx0b3VjaHN0YXJ0OmZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uUmFuZ2VNb3VzZURvd24oZSl9fX0sW24oXCJkaXZcIiksdC5fdihcIiBcIiksbihcImRpdlwiKSx0Ll92KFwiIFwiKSxuKFwiZGl2XCIpXSldKV0pXSldKV0pfTt0Ll93aXRoU3RyaXBwZWQ9ITA7dmFyIGU9e3Byb3BzOntjYW52YXNXaWR0aDp7dHlwZTpOdW1iZXIsZGVmYXVsdDozMTB9LGNhbnZhc0hlaWdodDp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxNjB9LHNob3c6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxwdXp6bGVTY2FsZTp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxfSxzbGlkZXJTaXplOnt0eXBlOk51bWJlcixkZWZhdWx0OjUwfSxyYW5nZTp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxMH0saW1nczp7dHlwZTpBcnJheX0sc3VjY2Vzc1RleHQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6XCLpqozor4HpgJrov4fvvIFcIn0sZmFpbFRleHQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6XCLpqozor4HlpLHotKXvvIzor7fph43or5VcIn0sc2xpZGVyVGV4dDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpcIuaLluWKqOa7keWdl+WujOaIkOaLvOWbvlwifX0sZGF0YTooKT0+KHttb3VzZURvd246ITEsc3RhcnRXaWR0aDo1MCxzdGFydFg6MCxuZXdYOjAscGluWDowLHBpblk6MCxsb2FkaW5nOiExLGlzQ2FuU2xpZGU6ITEsZXJyb3I6ITEsaW5mb0JveFNob3c6ITEsaW5mb1RleHQ6XCJcIixpbmZvQm94RmFpbDohMSx0aW1lcjE6bnVsbCxjbG9zZURvd246ITEsaXNTdWNjZXNzOiExLGltZ0luZGV4Oi0xLGlzU3VibXRpbmc6ITEscmVzZXRTdmc6XCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNnQUFBQW9DQVlBQUFDTS9yaHRBQUFFTGtsRVFWUllSKzJZVzJ3VVpSVEgvLzl2dGxDb0Y5SW9Ja2xUM1BxZ1BHaTMyNmhvZXR1YUdFaElyOVNnQ1lra2d0MldHT1FWQ2NhK0dhdldkcjBHakQ0WWhHM1JCM2hwbHkxTFFBMXRFUUl4RVhhcEdJMnBFa3lzOUxJengyeWxZV2ZZNmU1c0Ywb2krN2h6enZsKzMvOTg1NXh2aHJqTmY3ek4rWEFIY0w0WituOG82SldUZVl0KytXMjVTNTk2QUlaeTZUQituM3lvK05jaGxrOHZtSUlWb3dkWFU5YzNRMWdEU2lsQmxRd2pnQkFZRkdEdmRGNTgvNG1pbHF2WndEcE9jWFdzYjVVaDhobUJxa3dYRk1obENOOGFYNUxYTmJSeS9UK1oraVhzSEFGV1JYczNRR1FQeUx1Y0xESnJLNURnVVhkVHN4UGZqQUVybzhFM0NlNTBFdHhzS3hQVHdDUEgzVTJqVG1Ka0JKZ1dUbkFNeERlR01Fb2EweFErTEpRbkNENEhZRmtDeUFDM1Jkd04zVTdnTWtweFJUVFlyTUQ5MXNDSklnQ3hWNVI2TzFKY2Z5N1Z3b25xTG9qOS9DcUIya0YzNDFxbmNHa0J2UmUrdXJlQVdwUmdvYWxDQmVjTUZ6Y2RLMjRZeW1aUkp6NXpwcmdxMXRzSndYWUwzQ1ZaR3ZkR0htd1pjN0pRdHJhMmdFK2Y3MTJlcDJRVVlQNzE0REpoYUpyWExxWFpRc3psWnd0WWRTSG9COWxqVmsvZVBWclNaRkwwWmtBbHh6UUJWc2VDVDhXaFpoUlRodEZCOHBsazlaaS9xQ2k4Y3YwZk54dktGckR5NG9GMTFOWFhJRnkyRUlJNGlCY0czWTAzVkxaVDhPcVJkNWFGUGR1dk9FcHhSYXl2WG9seEFLQjJnNk5nRWhvYkJsYzFISFlLWTdXdkhmNXd0VkFQZ2VnSWxiYlo5c2VVWjdBeUZud2V3aTlwR29VeURtaHJCOTMxa2ZuQzFad09lS2xMUDhHWkppNlFMU0ZQMnllcDR0b1hTYlQzWlFBZlgzTzZvbXQ4TmhkOXIvYUhRQVVNT1F5d1lCWm81dVpEMlRoUTJyYlBDamxuSDZ5STlyVXJ5RTVEVTc1Y3RKYWFrZTQ2QmU0RHVEakY4ZEZCTkE5NC9BZHRpeVNWeElscE1sVFM4dGQ4MDFvNzB2TWlnTTlodVRkYTJsaGNLSFZIUE8ySFp2L1A2TEl3WDdoay8rcXpQU3ZVSkdNa3JnOEFRWVRrcm9SZFhNbEUrSEgvdHdzRzZCc09kSkhZWmxhTy9sQlo2d2VPaWlTWHFzM0dxajBUZUF4eCtUNzVESXBnd2pDMG9uRDUxcFFENEphbHVQcmtSL2NwRlQ5RGNvVnA4NExPZ1RML0RqdEJiZ2xnb3UrcHVId0I4bEV6blB4SncxWFNYNzdWdGdpekJ2UU5CdzRSTXFCN3h0NExjM2M4bFFLSmFRSG9PNFI4eWR6MC83TVdvQ1hrOGM4NU1yTUM5SjNxYWFmdy9XdFFsd1hTVCtGM0JuQWVZQjRvYmdKMUJKSXVHK1l0aUtBalZPWi9QZDFaZHd6b0crNHVCdFNQcGphUmJoWExjd0YzaHp5dGIyVGlsZ1ZnVDVCa1l5YkJyVFlDK1J2ZzVuUnBkVFJKcklzOCtWUFhQUVhqMmk0SXR4QzRPMk5RUVVRbk40VTlyUmN6OW5INjRwNGNlTTJsemlYNVk0czNLSENkVUh3RTc3ZWNNa01FcDZCd2hJYTJaNkRzbFpSdmZ1bGdIYWZZTHVDYXM1OFdMcDJhTENGVWdhNzBxeE9GVTZkUEZMMlcxZmVZZWFVNDNZNXovVHhuQ3VZYWJNRXVDMDQzY2tkQnA0cFo3ZjhGRTVwc09JMWc2ZndBQUFBQVNVVk9SSzVDWUlJPVwifSksbW91bnRlZCgpe2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy4kZWwpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLm9uUmFuZ2VNb3VzZU1vdmUsITEpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5vblJhbmdlTW91c2VVcCwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMub25SYW5nZU1vdXNlTW92ZSx7cGFzc2l2ZTohMX0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLHRoaXMub25SYW5nZU1vdXNlVXAsITEpLHRoaXMuc2hvdyYmKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChcInZ1ZS1wdXp6bGUtb3ZlcmZsb3dcIiksdGhpcy5yZXNldCgpKX0sYmVmb3JlRGVzdHJveSgpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVyMSksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLiRlbCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMub25SYW5nZU1vdXNlTW92ZSwhMSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIix0aGlzLm9uUmFuZ2VNb3VzZVVwLCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsdGhpcy5vblJhbmdlTW91c2VNb3ZlLHtwYXNzaXZlOiExfSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5vblJhbmdlTW91c2VVcCwhMSl9LHdhdGNoOntzaG93KHQpe3Q/KGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChcInZ1ZS1wdXp6bGUtb3ZlcmZsb3dcIiksdGhpcy5yZXNldCgpKToodGhpcy5pc1N1Ym10aW5nPSExLHRoaXMuaXNTdWNjZXNzPSExLHRoaXMuaW5mb0JveFNob3c9ITEsZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKFwidnVlLXB1enpsZS1vdmVyZmxvd1wiKSl9fSxjb21wdXRlZDp7c3R5bGVXaWR0aCgpe2NvbnN0IHQ9dGhpcy5zdGFydFdpZHRoK3RoaXMubmV3WC10aGlzLnN0YXJ0WDtyZXR1cm4gdDx0aGlzLnNsaWRlckJhc2VTaXplP3RoaXMuc2xpZGVyQmFzZVNpemU6dD50aGlzLmNhbnZhc1dpZHRoP3RoaXMuY2FudmFzV2lkdGg6dH0scHV6emxlQmFzZVNpemUoKXtyZXR1cm4gTWF0aC5yb3VuZCg1Mi41Kk1hdGgubWF4KE1hdGgubWluKHRoaXMucHV6emxlU2NhbGUsMiksLjIpKzYpfSxzbGlkZXJCYXNlU2l6ZSgpe3JldHVybiBNYXRoLm1heChNYXRoLm1pbihNYXRoLnJvdW5kKHRoaXMuc2xpZGVyU2l6ZSksTWF0aC5yb3VuZCguNSp0aGlzLmNhbnZhc1dpZHRoKSksMTApfX0sbWV0aG9kczp7b25DbG9zZSgpe3RoaXMubW91c2VEb3dufHx0aGlzLmlzU3VibXRpbmd8fChjbGVhclRpbWVvdXQodGhpcy50aW1lcjEpLHRoaXMuJGVtaXQoXCJjbG9zZVwiKSl9LG9uQ2xvc2VNb3VzZURvd24oKXt0aGlzLmNsb3NlRG93bj0hMH0sb25DbG9zZU1vdXNlVXAoKXt0aGlzLmNsb3NlRG93biYmdGhpcy5vbkNsb3NlKCksdGhpcy5jbG9zZURvd249ITF9LG9uUmFuZ2VNb3VzZURvd24odCl7dGhpcy5pc0NhblNsaWRlJiYodGhpcy5tb3VzZURvd249ITAsdGhpcy5zdGFydFdpZHRoPXRoaXMuJHJlZnNbXCJyYW5nZS1zbGlkZXJcIl0uY2xpZW50V2lkdGgsdGhpcy5uZXdYPXQuY2xpZW50WHx8dC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYLHRoaXMuc3RhcnRYPXQuY2xpZW50WHx8dC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYKX0sb25SYW5nZU1vdXNlTW92ZSh0KXt0aGlzLm1vdXNlRG93biYmKHQucHJldmVudERlZmF1bHQoKSx0aGlzLm5ld1g9dC5jbGllbnRYfHx0LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgpfSxvblJhbmdlTW91c2VVcCgpe3RoaXMubW91c2VEb3duJiYodGhpcy5tb3VzZURvd249ITEsdGhpcy5zdWJtaXQoKSl9LGluaXQodCl7aWYodGhpcy5sb2FkaW5nJiYhdClyZXR1cm47dGhpcy5sb2FkaW5nPSEwLHRoaXMuaXNDYW5TbGlkZT0hMTtjb25zdCBlPXRoaXMuJHJlZnMuY2FudmFzMSxuPXRoaXMuJHJlZnMuY2FudmFzMixpPXRoaXMuJHJlZnMuY2FudmFzMyxzPWUuZ2V0Q29udGV4dChcIjJkXCIpLGE9bi5nZXRDb250ZXh0KFwiMmRcIiksbz1pLmdldENvbnRleHQoXCIyZFwiKSxyPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIkZpcmVmb3hcIik+PTAmJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIldpbmRvd3NcIik+PTAsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO2lmKHMuZmlsbFN0eWxlPVwicmdiYSgyNTUsMjU1LDI1NSwxKVwiLG8uZmlsbFN0eWxlPVwicmdiYSgyNTUsMjU1LDI1NSwxKVwiLHMuY2xlYXJSZWN0KDAsMCx0aGlzLmNhbnZhc1dpZHRoLHRoaXMuY2FudmFzSGVpZ2h0KSxhLmNsZWFyUmVjdCgwLDAsdGhpcy5jYW52YXNXaWR0aCx0aGlzLmNhbnZhc0hlaWdodCksdGhpcy5waW5YPXRoaXMuZ2V0UmFuZG9tKHRoaXMucHV6emxlQmFzZVNpemUsdGhpcy5jYW52YXNXaWR0aC10aGlzLnB1enpsZUJhc2VTaXplLTIwKSx0aGlzLnBpblk9dGhpcy5nZXRSYW5kb20oMjAsdGhpcy5jYW52YXNIZWlnaHQtdGhpcy5wdXp6bGVCYXNlU2l6ZS0yMCksaC5jcm9zc09yaWdpbj1cImFub255bW91c1wiLGgub25sb2FkPSgpPT57Y29uc3RbdCxlLG4saV09dGhpcy5tYWtlSW1nU2l6ZShoKTtzLnNhdmUoKSx0aGlzLnBhaW50QnJpY2socykscy5jbG9zZVBhdGgoKSxyPyhzLmNsaXAoKSxzLnNhdmUoKSxzLnNoYWRvd09mZnNldFg9MCxzLnNoYWRvd09mZnNldFk9MCxzLnNoYWRvd0NvbG9yPVwiIzAwMFwiLHMuc2hhZG93Qmx1cj0zLHMuZmlsbCgpLHMucmVzdG9yZSgpKToocy5zaGFkb3dPZmZzZXRYPTAscy5zaGFkb3dPZmZzZXRZPTAscy5zaGFkb3dDb2xvcj1cIiMwMDBcIixzLnNoYWRvd0JsdXI9MyxzLmZpbGwoKSxzLmNsaXAoKSkscy5kcmF3SW1hZ2UoaCx0LGUsbixpKSxvLmZpbGxSZWN0KDAsMCx0aGlzLmNhbnZhc1dpZHRoLHRoaXMuY2FudmFzSGVpZ2h0KSxvLmRyYXdJbWFnZShoLHQsZSxuLGkpLHMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPVwic291cmNlLWF0b3BcIix0aGlzLnBhaW50QnJpY2socykscy5hcmModGhpcy5waW5YK01hdGguY2VpbCh0aGlzLnB1enpsZUJhc2VTaXplLzIpLHRoaXMucGluWStNYXRoLmNlaWwodGhpcy5wdXp6bGVCYXNlU2l6ZS8yKSwxLjIqdGhpcy5wdXp6bGVCYXNlU2l6ZSwwLDIqTWF0aC5QSSwhMCkscy5jbG9zZVBhdGgoKSxzLnNoYWRvd0NvbG9yPVwicmdiYSgyNTUsIDI1NSwgMjU1LCAuOClcIixzLnNoYWRvd09mZnNldFg9LTEscy5zaGFkb3dPZmZzZXRZPS0xLHMuc2hhZG93Qmx1cj1NYXRoLm1pbihNYXRoLmNlaWwoOCp0aGlzLnB1enpsZVNjYWxlKSwxMikscy5maWxsU3R5bGU9XCIjZmZmZmFhXCIscy5maWxsKCk7Y29uc3QgbD1zLmdldEltYWdlRGF0YSh0aGlzLnBpblgtMyx0aGlzLnBpblktMjAsdGhpcy5waW5YK3RoaXMucHV6emxlQmFzZVNpemUrNSx0aGlzLnBpblkrdGhpcy5wdXp6bGVCYXNlU2l6ZSs1KTthLnB1dEltYWdlRGF0YShsLDAsdGhpcy5waW5ZLTIwKSxzLnJlc3RvcmUoKSxzLmNsZWFyUmVjdCgwLDAsdGhpcy5jYW52YXNXaWR0aCx0aGlzLmNhbnZhc0hlaWdodCkscy5zYXZlKCksdGhpcy5wYWludEJyaWNrKHMpLHMuZ2xvYmFsQWxwaGE9Ljgscy5maWxsU3R5bGU9XCIjZmZmZmZmXCIscy5maWxsKCkscy5yZXN0b3JlKCkscy5zYXZlKCkscy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249XCJzb3VyY2UtYXRvcFwiLHRoaXMucGFpbnRCcmljayhzKSxzLmFyYyh0aGlzLnBpblgrTWF0aC5jZWlsKHRoaXMucHV6emxlQmFzZVNpemUvMiksdGhpcy5waW5ZK01hdGguY2VpbCh0aGlzLnB1enpsZUJhc2VTaXplLzIpLDEuMip0aGlzLnB1enpsZUJhc2VTaXplLDAsMipNYXRoLlBJLCEwKSxzLnNoYWRvd0NvbG9yPVwiIzAwMFwiLHMuc2hhZG93T2Zmc2V0WD0yLHMuc2hhZG93T2Zmc2V0WT0yLHMuc2hhZG93Qmx1cj0xNixzLmZpbGwoKSxzLnJlc3RvcmUoKSxzLnNhdmUoKSxzLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1cImRlc3RpbmF0aW9uLW92ZXJcIixzLmRyYXdJbWFnZShoLHQsZSxuLGkpLHMucmVzdG9yZSgpLHRoaXMubG9hZGluZz0hMSx0aGlzLmlzQ2FuU2xpZGU9ITB9LGgub25lcnJvcj0oKT0+e3RoaXMuaW5pdCghMCl9LCF0JiZ0aGlzLmltZ3MmJnRoaXMuaW1ncy5sZW5ndGgpe2xldCB0PXRoaXMuZ2V0UmFuZG9tKDAsdGhpcy5pbWdzLmxlbmd0aC0xKTt0PT09dGhpcy5pbWdJbmRleCYmKHQ9PT10aGlzLmltZ3MubGVuZ3RoLTE/dD0wOnQrKyksdGhpcy5pbWdJbmRleD10LGguc3JjPXRoaXMuaW1nc1t0XX1lbHNlIGguc3JjPXRoaXMubWFrZUltZ1dpdGhDYW52YXMoKX0sZ2V0UmFuZG9tOih0LGUpPT5NYXRoLmNlaWwoTWF0aC5yYW5kb20oKSooZS10KSt0KSxtYWtlSW1nU2l6ZSh0KXtjb25zdCBlPXQud2lkdGgvdC5oZWlnaHQ7bGV0IG49MCxpPTAscz0wLGE9MDtyZXR1cm4gZT50aGlzLmNhbnZhc1dpZHRoL3RoaXMuY2FudmFzSGVpZ2h0PyhhPXRoaXMuY2FudmFzSGVpZ2h0LHM9ZSphLGk9MCxuPSh0aGlzLmNhbnZhc1dpZHRoLXMpLzIpOihzPXRoaXMuY2FudmFzV2lkdGgsYT1zL2Usbj0wLGk9KHRoaXMuY2FudmFzSGVpZ2h0LWEpLzIpLFtuLGkscyxhXX0scGFpbnRCcmljayh0KXtjb25zdCBlPU1hdGguY2VpbCgxNSp0aGlzLnB1enpsZVNjYWxlKTt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHRoaXMucGluWCx0aGlzLnBpblkpLHQubGluZVRvKHRoaXMucGluWCtlLHRoaXMucGluWSksdC5hcmNUbyh0aGlzLnBpblgrZSx0aGlzLnBpblktZS8yLHRoaXMucGluWCtlK2UvMix0aGlzLnBpblktZS8yLGUvMiksdC5hcmNUbyh0aGlzLnBpblgrZStlLHRoaXMucGluWS1lLzIsdGhpcy5waW5YK2UrZSx0aGlzLnBpblksZS8yKSx0LmxpbmVUbyh0aGlzLnBpblgrZStlK2UsdGhpcy5waW5ZKSx0LmxpbmVUbyh0aGlzLnBpblgrZStlK2UsdGhpcy5waW5ZK2UpLHQuYXJjVG8odGhpcy5waW5YK2UrZStlK2UvMix0aGlzLnBpblkrZSx0aGlzLnBpblgrZStlK2UrZS8yLHRoaXMucGluWStlK2UvMixlLzIpLHQuYXJjVG8odGhpcy5waW5YK2UrZStlK2UvMix0aGlzLnBpblkrZStlLHRoaXMucGluWCtlK2UrZSx0aGlzLnBpblkrZStlLGUvMiksdC5saW5lVG8odGhpcy5waW5YK2UrZStlLHRoaXMucGluWStlK2UrZSksdC5saW5lVG8odGhpcy5waW5YLHRoaXMucGluWStlK2UrZSksdC5saW5lVG8odGhpcy5waW5YLHRoaXMucGluWStlK2UpLHQuYXJjVG8odGhpcy5waW5YK2UvMix0aGlzLnBpblkrZStlLHRoaXMucGluWCtlLzIsdGhpcy5waW5ZK2UrZS8yLGUvMiksdC5hcmNUbyh0aGlzLnBpblgrZS8yLHRoaXMucGluWStlLHRoaXMucGluWCx0aGlzLnBpblkrZSxlLzIpLHQubGluZVRvKHRoaXMucGluWCx0aGlzLnBpblkpfSxtYWtlSW1nV2l0aENhbnZhcygpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSxlPXQuZ2V0Q29udGV4dChcIjJkXCIpO3Qud2lkdGg9dGhpcy5jYW52YXNXaWR0aCx0LmhlaWdodD10aGlzLmNhbnZhc0hlaWdodCxlLmZpbGxTdHlsZT1gcmdiKCR7dGhpcy5nZXRSYW5kb20oMTAwLDI1NSl9LCR7dGhpcy5nZXRSYW5kb20oMTAwLDI1NSl9LCR7dGhpcy5nZXRSYW5kb20oMTAwLDI1NSl9KWAsZS5maWxsUmVjdCgwLDAsdGhpcy5jYW52YXNXaWR0aCx0aGlzLmNhbnZhc0hlaWdodCk7Zm9yKGxldCBuPTA7bjwxMjtuKyspaWYoZS5maWxsU3R5bGU9YHJnYigke3RoaXMuZ2V0UmFuZG9tKDEwMCwyNTUpfSwke3RoaXMuZ2V0UmFuZG9tKDEwMCwyNTUpfSwke3RoaXMuZ2V0UmFuZG9tKDEwMCwyNTUpfSlgLGUuc3Ryb2tlU3R5bGU9YHJnYigke3RoaXMuZ2V0UmFuZG9tKDEwMCwyNTUpfSwke3RoaXMuZ2V0UmFuZG9tKDEwMCwyNTUpfSwke3RoaXMuZ2V0UmFuZG9tKDEwMCwyNTUpfSlgLHRoaXMuZ2V0UmFuZG9tKDAsMik+MSllLnNhdmUoKSxlLnJvdGF0ZSh0aGlzLmdldFJhbmRvbSgtOTAsOTApKk1hdGguUEkvMTgwKSxlLmZpbGxSZWN0KHRoaXMuZ2V0UmFuZG9tKC0yMCx0LndpZHRoLTIwKSx0aGlzLmdldFJhbmRvbSgtMjAsdC5oZWlnaHQtMjApLHRoaXMuZ2V0UmFuZG9tKDEwLHQud2lkdGgvMisxMCksdGhpcy5nZXRSYW5kb20oMTAsdC5oZWlnaHQvMisxMCkpLGUucmVzdG9yZSgpO2Vsc2V7ZS5iZWdpblBhdGgoKTtjb25zdCBuPXRoaXMuZ2V0UmFuZG9tKC1NYXRoLlBJLE1hdGguUEkpO2UuYXJjKHRoaXMuZ2V0UmFuZG9tKDAsdC53aWR0aCksdGhpcy5nZXRSYW5kb20oMCx0LmhlaWdodCksdGhpcy5nZXRSYW5kb20oMTAsdC5oZWlnaHQvMisxMCksbixuKzEuNSpNYXRoLlBJKSxlLmNsb3NlUGF0aCgpLGUuZmlsbCgpfXJldHVybiB0LnRvRGF0YVVSTChcImltYWdlL3BuZ1wiKX0sc3VibWl0KCl7dGhpcy5pc1N1Ym10aW5nPSEwO2NvbnN0IHQ9TWF0aC5hYnModGhpcy5waW5YLSh0aGlzLnN0eWxlV2lkdGgtdGhpcy5zbGlkZXJCYXNlU2l6ZSkrKHRoaXMucHV6emxlQmFzZVNpemUtdGhpcy5zbGlkZXJCYXNlU2l6ZSkqKCh0aGlzLnN0eWxlV2lkdGgtdGhpcy5zbGlkZXJCYXNlU2l6ZSkvKHRoaXMuY2FudmFzV2lkdGgtdGhpcy5zbGlkZXJCYXNlU2l6ZSkpLTMpO3Q8dGhpcy5yYW5nZT8odGhpcy5pbmZvVGV4dD10aGlzLnN1Y2Nlc3NUZXh0LHRoaXMuaW5mb0JveEZhaWw9ITEsdGhpcy5pbmZvQm94U2hvdz0hMCx0aGlzLmlzQ2FuU2xpZGU9ITEsdGhpcy5pc1N1Y2Nlc3M9ITAsY2xlYXJUaW1lb3V0KHRoaXMudGltZXIxKSx0aGlzLnRpbWVyMT1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuaXNTdWJtdGluZz0hMSx0aGlzLiRlbWl0KFwic3VjY2Vzc1wiLHQpfSksODAwKSk6KHRoaXMuaW5mb1RleHQ9dGhpcy5mYWlsVGV4dCx0aGlzLmluZm9Cb3hGYWlsPSEwLHRoaXMuaW5mb0JveFNob3c9ITAsdGhpcy5pc0NhblNsaWRlPSExLHRoaXMuJGVtaXQoXCJmYWlsXCIsdCksY2xlYXJUaW1lb3V0KHRoaXMudGltZXIxKSx0aGlzLnRpbWVyMT1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuaXNTdWJtdGluZz0hMSx0aGlzLnJlc2V0KCl9KSw4MDApKX0scmVzZXRTdGF0ZSgpe3RoaXMuaW5mb0JveEZhaWw9ITEsdGhpcy5pbmZvQm94U2hvdz0hMSx0aGlzLmlzQ2FuU2xpZGU9ITEsdGhpcy5pc1N1Y2Nlc3M9ITEsdGhpcy5zdGFydFdpZHRoPXRoaXMuc2xpZGVyQmFzZVNpemUsdGhpcy5zdGFydFg9MCx0aGlzLm5ld1g9MH0scmVzZXQoKXt0aGlzLmlzU3VibXRpbmd8fCh0aGlzLnJlc2V0U3RhdGUoKSx0aGlzLmluaXQoKSl9fX0scz1uKDM3OSksYT1uLm4ocyksbz1uKDc5NSkscj1uLm4obyksaD1uKDU2OSksbD1uLm4oaCksYz1uKDU2NSksZD1uLm4oYyksdT1uKDIxNikscD1uLm4odSksZj1uKDU4OSksZz1uLm4oZiksdj1uKDM1OCksYj17fTtiLnN0eWxlVGFnVHJhbnNmb3JtPWcoKSxiLnNldEF0dHJpYnV0ZXM9ZCgpLGIuaW5zZXJ0PWwoKS5iaW5kKG51bGwsXCJoZWFkXCIpLGIuZG9tQVBJPXIoKSxiLmluc2VydFN0eWxlRWxlbWVudD1wKCksYSgpKHYuWixiKSx2LlomJnYuWi5sb2NhbHMmJnYuWi5sb2NhbHM7dmFyIG09ZnVuY3Rpb24odCxlLG4saSxzLGEsbyxyKXt2YXIgaCxsPVwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dC5vcHRpb25zOnQ7aWYoZSYmKGwucmVuZGVyPWUsbC5zdGF0aWNSZW5kZXJGbnM9W2Z1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQuJGNyZWF0ZUVsZW1lbnQsbj10Ll9zZWxmLl9jfHxlO3JldHVybiBuKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwibG9hZGluZy1naWZfXCJ9LFtuKFwic3BhblwiKSx0Ll92KFwiIFwiKSxuKFwic3BhblwiKSx0Ll92KFwiIFwiKSxuKFwic3BhblwiKSx0Ll92KFwiIFwiKSxuKFwic3BhblwiKSx0Ll92KFwiIFwiKSxuKFwic3BhblwiKV0pfV0sbC5fY29tcGlsZWQ9ITApLGgpaWYobC5mdW5jdGlvbmFsKXtsLl9pbmplY3RTdHlsZXM9aDt2YXIgYz1sLnJlbmRlcjtsLnJlbmRlcj1mdW5jdGlvbih0LGUpe3JldHVybiBoLmNhbGwoZSksYyh0LGUpfX1lbHNle3ZhciBkPWwuYmVmb3JlQ3JlYXRlO2wuYmVmb3JlQ3JlYXRlPWQ/W10uY29uY2F0KGQsaCk6W2hdfXJldHVybntleHBvcnRzOnQsb3B0aW9uczpsfX0oZSx0KTttLm9wdGlvbnMuX19maWxlPVwic3JjL2FwcC52dWVcIjt2YXIgeD1tLmV4cG9ydHN9KCksaX0oKX0pKTsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9
//# sourceURL=webpack-internal:///./node_modules/vue-puzzle-vcode/dist/main.js
在响应式网站下,使用rem的font-size会随之改变,验证码的图片会乱跑,在使用验证码组件的地方加一下css,使用原本初始值的font-size;
.vue-puzzle-vcode {
font-size: initial;
}
GitHub 加速计划 / vu / vue
207.55 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:3 个月前 )
73486cb5
* chore: fix link broken
Signed-off-by: snoppy <michaleli@foxmail.com>
* Update packages/template-compiler/README.md [skip ci]
---------
Signed-off-by: snoppy <michaleli@foxmail.com>
Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 5 个月前
e428d891
Updated Browser Compatibility reference. The previous currently returns HTTP 404. 6 个月前
更多推荐
已为社区贡献7条内容
所有评论(0)