dsh-plugin-usage 0.2.0 → 0.2.2

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.
@@ -975,8 +975,35 @@ const CSS = `
975
975
  }
976
976
  `
977
977
 
978
+ // 0.2+ host transport: POST /api/<channel>/<endpoint>, args as the JSON body,
979
+ // answering { ok, value } | { ok, error } (see src/host/rpc.js). The route is
980
+ // mounted on Connection's shared API channel, so it never needs the plugin's
981
+ // fiber to own `webServer`.
982
+ function callFetch(channel, endpoint, args) {
983
+ const path = '/api/' + String(channel).replace(/^\/+/, '') + '/' + endpoint
984
+ return fetch(path, {
985
+ method: 'POST',
986
+ credentials: 'same-origin',
987
+ headers: { 'content-type': 'application/json' },
988
+ body: JSON.stringify(args === undefined ? null : args),
989
+ }).then((res) => {
990
+ const type = res.headers.get('content-type') || ''
991
+ // Route missing on this host: 404/405 from the shared dispatcher, or the
992
+ // SPA HTML when no transport route matched the path at all.
993
+ if (res.status === 404 || res.status === 405 || type.indexOf('application/json') === -1) {
994
+ const error = new Error('usage Fetch route unavailable (HTTP ' + res.status + ')')
995
+ error.code = 'usage-route-missing'
996
+ throw error
997
+ }
998
+ return res.json().then((body) => {
999
+ if (body && body.ok) return body.value
1000
+ throw new Error((body && body.error && body.error.message) || ('RPC ' + endpoint + ' failed'))
1001
+ })
1002
+ })
1003
+ }
1004
+
978
1005
  // RPC bridge: dynamic-plugin runs provide a `host` global; static (bundle)
979
- // installs provide ctx.get('connection').rpc. Keep one UI source for both.
1006
+ // installs provide ctx.get('connection'). Keep one UI source for both.
980
1007
  function hostCall(method, args) {
981
1008
  // P0-3: prefer the official `remote` service when it exposes the usage API;
982
1009
  // otherwise fall through to the host/connection fallbacks unchanged.
@@ -1015,23 +1042,36 @@ function hostCall(method, args) {
1015
1042
  if (scope === null || typeof scope.get !== 'function') {
1016
1043
  return Promise.reject(new Error('context unavailable'))
1017
1044
  }
1018
- const connection = scope.get('connection')
1019
- if (connection === undefined || connection.rpc === undefined) {
1020
- return Promise.reject(new Error('connection service unavailable'))
1021
- }
1022
1045
  const name = String(method)
1023
1046
  const slash = name.indexOf('/')
1024
1047
  const channel = slash === -1 ? name : name.slice(0, slash)
1025
1048
  const endpoint = slash === -1 ? name : name.slice(slash + 1)
1026
- return connection.rpc.call('/' + channel.replace(/^\/+/, ''), endpoint, args).then((res) => {
1027
- if (res && res.ok) return res.value
1028
- throw new Error((res && res.error && res.error.message) || ('RPC ' + method + ' failed'))
1049
+ // Legacy pre-0.2 transport: a `/usage` prefix RPC channel owned by the host
1050
+ // plugin itself.
1051
+ const callRpc = () => {
1052
+ const connection = scope.get('connection')
1053
+ if (connection === undefined || connection.rpc === undefined) {
1054
+ return Promise.reject(new Error('connection service unavailable'))
1055
+ }
1056
+ return connection.rpc.call('/' + channel.replace(/^\/+/, ''), endpoint, args).then((res) => {
1057
+ if (res && res.ok) return res.value
1058
+ throw new Error((res && res.error && res.error.message) || ('RPC ' + method + ' failed'))
1059
+ })
1060
+ }
1061
+ // Prefer the shared-channel Fetch route; an older host answers "route
1062
+ // missing" and we fall back to the legacy channel it does implement.
1063
+ const fetchUsable = typeof fetch === 'function'
1064
+ && !(typeof location !== 'undefined' && location.protocol === 'file:')
1065
+ if (!fetchUsable) return callRpc()
1066
+ return callFetch(channel, endpoint, args).catch((error) => {
1067
+ if (error && error.code === 'usage-route-missing') return callRpc()
1068
+ throw error
1029
1069
  })
1030
1070
  }
1031
1071
 
1032
1072
  /* ---------------------------------------------------------------------------
1033
- * 设置域定价:官方 ctx.settingsScope(dsh-client-ui-settings)优先,
1034
- * 不可用时回退 usage/prices RPC。绑定只做一次,读写共用同一 scope。
1073
+ * 设置域定价:官方 `ctx.configForms.get('usage')`(dsh-client-ui-settings)优先,
1074
+ * 不可用时回退 usage/prices RPC。绑定只做一次,读写共用同一 form。
1035
1075
  * ------------------------------------------------------------------------- */
1036
1076
  let usageCtx = null
1037
1077
  let _usagePricesScope = null
@@ -1047,9 +1087,12 @@ function getUsagePricesScope() {
1047
1087
  const c = resolveUsageCtx()
1048
1088
  if (!c || typeof c.get !== 'function') return null
1049
1089
  try {
1050
- const binder = c.get('settingsScope')
1051
- if (!binder || typeof binder.bind !== 'function') return null
1052
- _usagePricesScope = binder.bind({ namespace: 'usage.prices' })
1090
+ // 0.2.x: the official config-form surface for this plugin's entry id
1091
+ // (`usage`, the bundle patch row id). `settingsScope` from 0.1.x does not
1092
+ // exist in the shipped client, so probing it only ever returned null.
1093
+ const forms = c.get('configForms')
1094
+ if (!forms || typeof forms.get !== 'function') return null
1095
+ _usagePricesScope = forms.get('usage')
1053
1096
  return _usagePricesScope
1054
1097
  } catch (e) {
1055
1098
  return null
@@ -2447,4 +2490,4 @@ return { inject: ['locale', 'slots'], apply }
2447
2490
  return module.exports;
2448
2491
  }
2449
2492
  });
2450
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9ydWFuYncvcHJvamVjdHMvdXNhZ2Uvc3JjL2NsaWVudC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUb2tlbiDnlKjph4/nu5/orqEg4oCUIHNldHRpbmdzLnNlY3Rpb24gQ2xpZW50IFVJ77yI57qvIEpT77yM5Yqo5oCB5o+S5Lu25rKZ566x77yJXG4vLyDlj6/nlKjlhajlsYDvvJpSZWFjdCAvIGN0eCAvIHN0eWxlcyAvIGhvc3QgLyBjb25zb2xl77yb5rWP6KeI5Zmo5YWo5bGAIERhdGUgLyBJbnRsIOetieOAglxuLy8gQ1NTIOW4uOmHj+WGheiBlOiHqiBzdHlsZXMuanPvvIjliqjmgIHmj5Lku7bmspnnrrHml6AgaW1wb3J077yM5qC35byP6ZqP5pys5paH5Lu25Yqg6L2977yJ44CCXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jb25zdCBDU1MgPSBgXG4vKiA9PT09PT09PT09PT0g5biD5bGAID09PT09PT09PT09PSAqL1xuLnRzZC1zZWN0aW9uIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMTZweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYW5pbWF0aW9uOiB0c2QtZmFkZS1pbiAwLjRzIHZhcigtLWRzLWVhc2UtaW4tb3V0KTtcbn1cbkBrZXlmcmFtZXMgdHNkLWZhZGUtaW4ge1xuICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cbiAgdG8geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IG5vbmU7IH1cbn1cblxuLyogPT09PT09PT09PT09IEhlYWRlciA9PT09PT09PT09PT0gKi9cbi50c2QtaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGdhcDogMTJweDtcbiAgZmxleC13cmFwOiB3cmFwO1xufVxuLnRzZC10aXRsZSB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAyNHB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsZXR0ZXItc3BhY2luZzogLTAuMDJlbTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbn1cbi50c2Qtc3VidGl0bGUge1xuICBtYXJnaW46IDRweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xufVxuLnRzZC1pY29uLWJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgd2lkdGg6IDM0cHg7XG4gIGhlaWdodDogMzRweDtcbiAgcGFkZGluZzogMDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0xKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udDogaW5oZXJpdDtcbn1cbi50c2QtaWNvbi1idG46aG92ZXIge1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpO1xufVxuLnRzZC1zcGlubmluZyBzdmcge1xuICBhbmltYXRpb246IHRzZC1zcGluIDAuOXMgbGluZWFyIGluZmluaXRlO1xufVxuQGtleWZyYW1lcyB0c2Qtc3BpbiB7XG4gIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxufVxuXG4vKiA9PT09PT09PT09PT0g562b6YCJ5qCPID09PT09PT09PT09PSAqL1xuLnRzZC1maWx0ZXJiYXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDhweDtcbiAgZmxleC13cmFwOiB3cmFwO1xufVxuLnRzZC1zZWctd3JhcCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG59XG4udHNkLXNlZyB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBnYXA6IDJweDtcbiAgcGFkZGluZzogNHB4O1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KSAxMiUsIHRyYW5zcGFyZW50KTtcbn1cbi50c2Qtc2VnLWJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBoZWlnaHQ6IDI4cHg7XG4gIHBhZGRpbmc6IDAgMTJweDtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2Qtc2VnLWJ0bjpob3ZlciB7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7XG59XG4udHNkLXNlZy1hY3RpdmUge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctYmFzZSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSk7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYxKTtcbn1cbi50c2Qtc2VnLWN1c3RvbSB7XG4gIG1heC13aWR0aDogMjIwcHg7XG59XG4udHNkLXNlZy1jdXN0b20gLnRzZC1zZWctbGFiZWwge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2Qtc2VnLWN1c3RvbS50c2Qtc2VnLWFjdGl2ZSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5LWludmVydGVkLCAjZmZmKTtcbn1cbi50c2Qtc2VnLWN1c3RvbS50c2Qtc2VnLWFjdGl2ZTpob3ZlciB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1idXR0b24tcHJpbWFyeS1ob3Zlcik7XG59XG5cbi8qID09PT09PT09PT09PSDpgJrnlKjmjInpkq4gPT09PT09PT09PT09ICovXG4udHNkLWJ0biB7XG4gIGhlaWdodDogMzBweDtcbiAgcGFkZGluZzogMCAxNHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTEpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRzZC1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpOyB9XG4udHNkLWJ0bjpkaXNhYmxlZCB7IG9wYWNpdHk6IDAuNTsgY3Vyc29yOiBub3QtYWxsb3dlZDsgfVxuLnRzZC1idG4tcHJpbWFyeSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1idXR0b24tcHJpbWFyeS1maWxsKTtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5LWludmVydGVkLCAjZmZmKTtcbn1cbi50c2QtYnRuLXByaW1hcnk6aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYnV0dG9uLXByaW1hcnktaG92ZXIpOyB9XG4udHNkLWJ0bi1naG9zdCB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9XG4udHNkLWJ0bi1naG9zdDpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7IH1cblxuLyogPT09PT09PT09PT09IOa1ruWxgiBQb3BvdmVyID09PT09PT09PT09PSAqL1xuLnRzZC1wb3BvdmVyLWFuY2hvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG59XG4udHNkLXBvcG92ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogY2FsYygxMDAlICsgNnB4KTtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogNDA7XG4gIHBhZGRpbmc6IDEycHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctb3ZlcmxheSk7XG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYzKTtcbn1cbi50c2QtbW9kZWwtcG9wb3ZlciB7XG4gIHdpZHRoOiAzMjBweDtcbiAgbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gMjRweCk7XG59XG4udHNkLXJhbmdlLXBvcG92ZXIge1xuICB3aWR0aDogMzAwcHg7XG4gIG1heC13aWR0aDogY2FsYygxMDB2dyAtIDI0cHgpO1xufVxuLnRzZC1wb3BvdmVyLXRpdGxlIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBtYXJnaW46IDAgMCAxMHB4O1xufVxuLnRzZC1wb3BvdmVyLXRvb2xzIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG59XG4udHNkLWxpbmstYnRuIHtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWJ1c2luZXNzLXByaW1hcnkpO1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEycHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogMnB4IDRweDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuLnRzZC1saW5rLWJ0bjpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7IH1cbi50c2QtcG9wb3Zlci1hY3Rpb25zIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgZ2FwOiA4cHg7XG4gIG1hcmdpbi10b3A6IDEycHg7XG59XG4udHNkLXBvcG92ZXItbm90ZSB7XG4gIG1hcmdpbjogOHB4IDAgMDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cbi50c2QtcG9wb3Zlci1lbXB0eSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMTBweCAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG59XG5cbi8qID09PT09PT09PT09PSDmqKHlnovkuIvmi4nmkJzntKIgPT09PT09PT09PT09ICovXG4udHNkLXNlbGVjdC1idG4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG4gIG1pbi13aWR0aDogMTIwcHg7XG4gIG1heC13aWR0aDogMjYwcHg7XG4gIGhlaWdodDogMzZweDtcbiAgcGFkZGluZzogMCAxMHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTEpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnRzZC1zZWxlY3QtYnRuOmhvdmVyIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwzKTsgfVxuLnRzZC1zZWxlY3QtaGFzIHsgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLWJyYW5kLXByaW1hcnkpIDQ1JSwgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMikpOyB9XG4udHNkLXNlbGVjdC1sYWJlbCB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBtaW4td2lkdGg6IDA7XG59XG4udHNkLWNoZXZyb24ge1xuICBmbGV4OiBub25lO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gdmFyKC0tZHMtdHJhbnNpdGlvbi1kdXJhdGlvbi1mYXN0KSB2YXIoLS1kcy1lYXNlLWluLW91dCk7XG59XG4udHNkLWNoZXZyb24tb3BlbiB7IHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7IH1cbi50c2Qtc2VhcmNoIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG59XG4udHNkLXNlYXJjaC1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiA4cHg7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi50c2Qtc2VhcmNoIGlucHV0IHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzJweDtcbiAgcGFkZGluZzogMCA4cHggMCAyOHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTEpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3V0bGluZTogbm9uZTtcbn1cbi50c2Qtc2VhcmNoIGlucHV0OmZvY3VzIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtYnVzaW5lc3MtcHJpbWFyeSk7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDJweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWJ1c2luZXNzLXByaW1hcnkpIDE4JSwgdHJhbnNwYXJlbnQpO1xufVxuLnRzZC1tb2RlbC1saXN0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAycHg7XG4gIG1heC1oZWlnaHQ6IDI0MHB4O1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICAtLWRzaC1zY3JvbGxiYXItdGh1bWI6IHZhcigtLWRzdy1hbGlhcy1zY3JvbGxiYXItYmctbDIpO1xuICAtLWRzaC1zY3JvbGxiYXItdGh1bWItaG92ZXI6IHZhcigtLWRzdy1hbGlhcy1zY3JvbGxiYXItaG92ZXItbDIpO1xufVxuLnRzZC1tb2RlbC1pdGVtIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG4gIHBhZGRpbmc6IDVweCA2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIG1pbi13aWR0aDogMDtcbn1cbi50c2QtbW9kZWwtaXRlbTpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7IH1cbi50c2QtbW9kZWwtaXRlbSBpbnB1dCB7IG1hcmdpbjogMDsgYWNjZW50LWNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSk7IH1cbi50c2QtbW9kZWwtbmFtZSB7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1kcy1mb250LWZhbWlseS1jb2RlKTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgbWluLXdpZHRoOiAwO1xufVxuXG4vKiA9PT09PT09PT09PT0g6Ieq5a6a5LmJ5pel5pyf5rWu5bGCID09PT09PT09PT09PSAqL1xuLnRzZC1yYW5nZS1maWVsZHMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDEwcHg7XG59XG4udHNkLWZpZWxkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiA0cHg7XG59XG4udHNkLWZpZWxkLWxhYmVsIHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG59XG4udHNkLWZpZWxkIGlucHV0IHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzJweDtcbiAgcGFkZGluZzogMCA4cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBvdXRsaW5lOiBub25lO1xufVxuLnRzZC1maWVsZCBpbnB1dDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWJ1c2luZXNzLXByaW1hcnkpO1xuICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KSAxOCUsIHRyYW5zcGFyZW50KTtcbn1cbi50c2QtZmllbGQtZXJyb3Ige1xuICBtYXJnaW46IDZweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1wcmltYXJ5KTtcbn1cbi50c2QtZmllbGQtaGludCB7XG4gIG1hcmdpbjogNnB4IDAgMDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cblxuLyogPT09PT09PT09PT09IOaxh+aAu+aMh+agh+WNoSA9PT09PT09PT09PT0gKi9cbi50c2QtY2FyZHMge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE1MHB4LCAxZnIpKTtcbiAgZ2FwOiAxMHB4O1xufVxuLnRzZC1jYXJkIHtcbiAgbWluLXdpZHRoOiAwO1xuICBwYWRkaW5nOiAxNHB4IDE2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMyk7XG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYxKTtcbn1cbi50c2QtY2FyZC1oZWFkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG59XG4udHNkLWNhcmQtaWNvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuLnRzZC1jYXJkLWxhYmVsIHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRzZC1jYXJkLXZhbHVlIHtcbiAgbWFyZ2luLXRvcDogOHB4O1xuICBmb250LXNpemU6IDIwcHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2QtY2FyZC1zdWIge1xuICBtYXJnaW4tdG9wOiA0cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG59XG4udHNkLWNhcmQtbm90ZSB7XG4gIG1hcmdpbi10b3A6IDRweDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLXdhcm4tcHJpbWFyeSk7XG59XG5cbi8qID09PT09PT09PT09PSDljaHniYflpLTpg6jvvIjlm77ooaggLyDooajmoLzlhbHnlKjvvIkgPT09PT09PT09PT09ICovXG4udHNkLWNhcmQtaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBnYXA6IDhweDtcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcbn1cbi50c2QtY2FyZC10aXRsZSB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC1jYXJkLXRhZyB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4vKiA9PT09PT09PT09PT0g5q+P5pel55So6YeP5p+x54q25Zu+ID09PT09PT09PT09PSAqL1xuLnRzZC1jaGFydC1jYXJkIHsgcGFkZGluZzogMTRweCAxNnB4IDEwcHg7IH1cbi50c2QtbGVnZW5kIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAxNHB4O1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG59XG4udHNkLWxlZ2VuZC1pdGVtIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbn1cbi50c2QtbGVnZW5kLWRvdCxcbi50c2QtdG9vbHRpcC1kb3Qge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAxMHB4O1xuICBoZWlnaHQ6IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgZmxleDogbm9uZTtcbn1cbi50c2QtbGVnZW5kLWluIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApOyB9XG4udHNkLWxlZ2VuZC1vdXQgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCk7IH1cbi50c2QtbGVnZW5kLXRvdGFsIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7IH1cblxuLnRzZC1jaGFydCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gIGdhcDogMnB4O1xuICBoZWlnaHQ6IDI0MHB4O1xuICBwYWRkaW5nOiAwIDRweDtcbn1cbi50c2QtY2hhcnQtY29sIHtcbiAgZmxleDogMTtcbiAgbWluLXdpZHRoOiAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSB2YXIoLS1kcy10cmFuc2l0aW9uLWR1cmF0aW9uLWZhc3QpIHZhcigtLWRzLWVhc2UtaW4tb3V0KTtcbn1cbi50c2QtY2hhcnQtY29sOmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWJ1c2luZXNzLXByaW1hcnkpO1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxuLnRzZC1jaGFydDpob3ZlciAudHNkLWNoYXJ0LWNvbCB7IG9wYWNpdHk6IDAuNDsgfVxuLnRzZC1jaGFydDpob3ZlciAudHNkLWNoYXJ0LWNvbDpob3Zlcixcbi50c2QtY2hhcnQ6Zm9jdXMtd2l0aGluIC50c2QtY2hhcnQtY29sOmZvY3VzIHsgb3BhY2l0eTogMTsgfVxuXG4udHNkLWNoYXJ0LXBsb3Qge1xuICBmbGV4OiAxO1xuICB3aWR0aDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwxKSAxcHgsIHRyYW5zcGFyZW50IDFweCk7XG4gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAyNSU7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG59XG4udHNkLWNoYXJ0LXN0YWNrIHtcbiAgd2lkdGg6IDYyJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xufVxuLnRzZC1jaGFydC1zZWcge1xuICB3aWR0aDogMTAwJTtcbn1cbi50c2Qtc2VnLWluIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApO1xufVxuLnRzZC1zZWctb3V0IHtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LXN0YXRpYy1ncmVlbi01MDApO1xuICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDtcbn1cbi50c2QtY2hhcnQtbGFiZWwge1xuICBoZWlnaHQ6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNHB4O1xuICBtYXJnaW4tdG9wOiA2cHg7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4udHNkLWNoYXJ0LWxhYmVsLWhpZGRlbiB7IHZpc2liaWxpdHk6IGhpZGRlbjsgfVxuXG4vKiB0b29sdGlwICovXG4udHNkLXRvb2x0aXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTBweDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB6LWluZGV4OiA2O1xuICBtaW4td2lkdGg6IDE1NnB4O1xuICBwYWRkaW5nOiA4cHggMTBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1vdmVybGF5KTtcbiAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgYm94LXNoYWRvdzogdmFyKC0tZHN3LXNoYWRvdy1sdjMpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi50c2QtdG9vbHRpcC1kYXRlIHtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLXRvb2x0aXAtcm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG4gIG1hcmdpbjogMnB4IDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xufVxuLnRzZC10b29sdGlwLXZhbCB7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBwYWRkaW5nLWxlZnQ6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLXRvb2x0aXAtdG90YWwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIG1hcmdpbi10b3A6IDZweDtcbiAgcGFkZGluZy10b3A6IDZweDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG59XG5cbi8qID09PT09PT09PT09PSDmjInmqKHlnovmmI7nu4booaggPT09PT09PT09PT09ICovXG4udHNkLXRhYmxlLWNhcmQgeyBwYWRkaW5nOiAwOyB9XG4udHNkLXRhYmxlLWNhcmQgLnRzZC1jYXJkLWhlYWRlciB7IHBhZGRpbmc6IDE0cHggMTZweCAwOyB9XG4udHNkLXRhYmxlLXdyYXAge1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICAtLWRzaC1zY3JvbGxiYXItdGh1bWI6IHZhcigtLWRzdy1hbGlhcy1zY3JvbGxiYXItYmctbDIpO1xuICAtLWRzaC1zY3JvbGxiYXItdGh1bWItaG92ZXI6IHZhcigtLWRzdy1hbGlhcy1zY3JvbGxiYXItaG92ZXItbDIpO1xufVxuLnRzZC10YWJsZSB7XG4gIHdpZHRoOiAxMDAlO1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICBmb250LXNpemU6IDEzcHg7XG59XG4udHNkLXRoIHtcbiAgcGFkZGluZzogMTBweCAxMnB4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRzZC10aC1udW0geyB0ZXh0LWFsaWduOiByaWdodDsgfVxuLnRzZC1zb3J0LWJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDJweDtcbiAgcGFkZGluZzogMDtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiBpbmhlcml0O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4udHNkLXNvcnQtYnRuOmhvdmVyIHsgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTsgfVxuLnRzZC1zb3J0LWFjdGl2ZSB7IGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSk7IH1cbi50c2Qtc29ydC1hcnJvdyB7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG59XG4udHNkLXRyOmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTsgfVxuLnRzZC10ZCB7XG4gIHBhZGRpbmc6IDlweCAxMnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2QtdGQtbW9kZWwgeyBtYXgtd2lkdGg6IDI0MHB4OyB9XG4udHNkLW1vZGVsLW1vbm8ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWF4LXdpZHRoOiAyMjBweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1kcy1mb250LWZhbWlseS1jb2RlKTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC1udW0ge1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbn1cbi50c2QtdG90YWwge1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC11bnByaWNlZCB7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG4udHNkLXRkLXJhdGlvIHsgdGV4dC1hbGlnbjogcmlnaHQ7IH1cbi50c2QtcmF0aW8ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgZ2FwOiA4cHg7XG59XG4udHNkLXJhdGlvLWJhciB7XG4gIHdpZHRoOiA2MHB4O1xuICBoZWlnaHQ6IDZweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGZsZXg6IG5vbmU7XG59XG4udHNkLXJhdGlvLWZpbGwge1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCksIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCkgNTUlLCB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTMwMCkpKTtcbn1cbi50c2QtcmF0aW8tcGN0IHtcbiAgbWluLXdpZHRoOiA0MnB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG59XG5cbi8qID09PT09PT09PT09PSDkuInmgIHvvJrnqbogLyDplJnor68gLyDliqDovb0gPT09PT09PT09PT09ICovXG4udHNkLWVtcHR5IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG4gIHBhZGRpbmc6IDQwcHggMTZweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLnRzZC1lbXB0eS1pY29uIHtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIG1hcmdpbi1ib3R0b206IDRweDtcbn1cbi50c2QtZW1wdHktdGl0bGUge1xuICBtYXJnaW46IDA7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbn1cbi50c2QtZW1wdHktZGVzYyB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG59XG4udHNkLWVtcHR5LWJsb2NrIHtcbiAgcGFkZGluZzogMjRweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xufVxuXG4udHNkLWVycm9yIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAxMnB4O1xuICBwYWRkaW5nOiAyMHB4IDE2cHg7XG4gIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1wcmltYXJ5KSA0MCUsIHRyYW5zcGFyZW50KTtcbiAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1zZWNvbmRhcnkpIDMwJSwgdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTMpKTtcbn1cbi50c2QtZXJyb3ItaWNvbiB7XG4gIGZsZXg6IG5vbmU7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtZXJyb3ItcHJpbWFyeSk7XG59XG4udHNkLWVycm9yLXRleHQge1xuICBmbGV4OiAxO1xuICBtaW4td2lkdGg6IDA7XG59XG4udHNkLWVycm9yLXRpdGxlIHtcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLWVycm9yLWRldGFpbCB7XG4gIG1hcmdpbjogMnB4IDAgMDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4udHNkLWFsZXJ0LWJhbm5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTBweDtcbiAgcGFkZGluZzogMTBweCAxNHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWVycm9yLXByaW1hcnkpIDQwJSwgdHJhbnNwYXJlbnQpO1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWVycm9yLXNlY29uZGFyeSkgMzAlLCB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMykpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWVycm9yLXByaW1hcnkpO1xuICBmb250LXNpemU6IDEzcHg7XG59XG5cbi50c2QtbG9hZGluZyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMTZweDtcbn1cbi50c2QtY2FyZC1za2VsZXRvbiB7IG1pbi1oZWlnaHQ6IDg0cHg7IH1cbi50c2Qtc2tlbGV0b24ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctc2tlbGV0b24pO1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIGFuaW1hdGlvbjogdHNkLXB1bHNlIDEuNnMgdmFyKC0tZHMtZWFzZS1pbi1vdXQpIGluZmluaXRlO1xufVxuLnRzZC1za2VsZXRvbi1yb3cge1xuICBoZWlnaHQ6IDE0cHg7XG4gIG1hcmdpbjogMTJweCAwO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctc2tlbGV0b24pO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGFuaW1hdGlvbjogdHNkLXB1bHNlIDEuNnMgdmFyKC0tZHMtZWFzZS1pbi1vdXQpIGluZmluaXRlO1xufVxuQGtleWZyYW1lcyB0c2QtcHVsc2Uge1xuICAwJSwgMTAwJSB7IG9wYWNpdHk6IDE7IH1cbiAgNTAlIHsgb3BhY2l0eTogMC40NTsgfVxufVxuXG4vKiA9PT09PT09PT09PT0g5Yi35paw5pe255qE5YaF5a655oCBID09PT09PT09PT09PSAqL1xuLnRzZC1jb250ZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxNnB4O1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24pIHZhcigtLWRzLWVhc2UtaW4tb3V0KTtcbn1cbi50c2QtY29udGVudFtkYXRhLWJ1c3k9dHJ1ZV0geyBvcGFjaXR5OiAwLjU1OyB9XG5cbi8qID09PT09PT09PT09PSDml6Dpmpznoo0gPT09PT09PT09PT09ICovXG4udHNkLXZpc3VhbGx5LWhpZGRlbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogLTFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcDogcmVjdCgwIDAgMCAwKTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgYm9yZGVyOiAwO1xufVxuLnRzZC1pY29uIHtcbiAgZmxleDogbm9uZTtcbn1cbi50c2Qtc2VnLWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1zZWxlY3QtYnRuOmZvY3VzLXZpc2libGUsXG4udHNkLWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1pY29uLWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1saW5rLWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1zb3J0LWJ0bjpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KTtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cbi8qID09PT09PT09PT09PSDnspLluqbliIfmjaIgPT09PT09PT09PT09ICovXG4udHNkLWNhcmQtYWN0aW9ucyB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDhweDtcbn1cbi50c2QtZ3JhbiB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBnYXA6IDJweDtcbiAgcGFkZGluZzogMnB4O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0xKTtcbn1cbi50c2QtZ3Jhbi1idG4ge1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBsaW5lLWhlaWdodDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICBwYWRkaW5nOiAycHggOHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4udHNkLWdyYW4tYnRuW2RhdGEtYWN0aXZlPVwidHJ1ZVwiXSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0zKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYm94LXNoYWRvdzogdmFyKC0tZHN3LXNoYWRvdy1sdjEpO1xufVxuLnRzZC1ncmFuLWJ0bjpkaXNhYmxlZCB7XG4gIG9wYWNpdHk6IDAuNDtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cbi8qID09PT09PT09PT09PSDmipjnur/lm74gPT09PT09PT09PT09ICovXG4udHNkLWxpbmVjaGFydCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgcGFkZGluZzogNnB4IDEwcHggOHB4O1xufVxuLnRzZC1saW5lY2hhcnQgc3ZnIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IGF1dG87XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtZ3JpZCB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIHN0cm9rZS13aWR0aDogMTtcbiAgc3Ryb2tlLWRhc2hhcnJheTogMyAzO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWF4aXMge1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBzdHJva2Utd2lkdGg6IDE7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaW4ge1xuICBzdHJva2U6IHZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKTtcbiAgc3Ryb2tlLXdpZHRoOiAyO1xuICBmaWxsOiBub25lO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLW91dCB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LXN0YXRpYy1ncmVlbi01MDApO1xuICBzdHJva2Utd2lkdGg6IDI7XG4gIGZpbGw6IG5vbmU7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtdG90YWwge1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBzdHJva2Utd2lkdGg6IDEuNTtcbiAgc3Ryb2tlLWRhc2hhcnJheTogNCAzO1xuICBmaWxsOiBub25lO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWRvdCB7XG4gIGZpbGw6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0yKTtcbiAgc3Ryb2tlOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgc3Ryb2tlLXdpZHRoOiAxO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWhvdmVyIHtcbiAgZmlsbDogdHJhbnNwYXJlbnQ7XG4gIGN1cnNvcjogY3Jvc3NoYWlyO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWN1cnNvciB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMyk7XG4gIHN0cm9rZS13aWR0aDogMTtcbiAgc3Ryb2tlLWRhc2hhcnJheTogMyAzO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1obCB7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWJnLWJhc2UpO1xuICBzdHJva2Utd2lkdGg6IDEuNTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaGwtaW4geyBmaWxsOiB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCk7IH1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1obC1vdXQgeyBmaWxsOiB2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCk7IH1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1obC10b3RhbCB7IGZpbGw6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpOyB9XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtdGV4dCB7XG4gIGZpbGw6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIGZvbnQtc2l6ZTogMTBweDtcbn1cbi8qID09PT09PT09PT09PSDlubTluqbng63lipvlm74gPT09PT09PT09PT09ICovXG4udHNkLWhlYXRtYXAge1xuICBwYWRkaW5nOiA2cHggMTRweCAxNHB4O1xuICBvdmVyZmxvdy14OiBhdXRvO1xufVxuLnRzZC1oZWF0bWFwLWlubmVyIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogNHB4O1xuICBtaW4td2lkdGg6IG1pbi1jb250ZW50O1xufVxuLnRzZC1oZWF0bWFwLW1vbnRocyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIG1hcmdpbi1sZWZ0OiAyNnB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi50c2QtaGVhdG1hcC1tb250aCB7XG4gIGZvbnQtc2l6ZTogOXB4O1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xufVxuLnRzZC1oZWF0bWFwLWJvZHkge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDRweDtcbn1cbi50c2QtaGVhdG1hcC1kYXlzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAycHg7XG4gIHdpZHRoOiAyMnB4O1xuICBmbGV4OiBub25lO1xufVxuLnRzZC1oZWF0bWFwLWRheSB7XG4gIGhlaWdodDogMTBweDtcbiAgZm9udC1zaXplOiA5cHg7XG4gIGxpbmUtaGVpZ2h0OiAxMHB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHBhZGRpbmctcmlnaHQ6IDRweDtcbn1cbi50c2QtaGVhdG1hcC1ncmlkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAycHg7XG59XG4udHNkLWhlYXRtYXAtY29sIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAycHg7XG59XG4udHNkLWhlYXRtYXAtY2VsbCB7XG4gIHdpZHRoOiAxMHB4O1xuICBoZWlnaHQ6IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24tZmFzdCkgdmFyKC0tZHMtZWFzZS1pbi1vdXQpLCBib3gtc2hhZG93IHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24tZmFzdCkgdmFyKC0tZHMtZWFzZS1pbi1vdXQpO1xufVxuLnRzZC1oZWF0bWFwLWNlbGw6aG92ZXIge1xuICBvdXRsaW5lOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIHRyYW5zZm9ybTogc2NhbGUoMS4zNSk7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYyKTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xufVxuLnRzZC1oZWF0bWFwLWxlZ2VuZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNHB4O1xuICBtYXJnaW46IDhweCAxNHB4IDA7XG4gIHBhZGRpbmctdG9wOiA4cHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cbmBcblxuLy8gUlBDIGJyaWRnZTogZHluYW1pYy1wbHVnaW4gcnVucyBwcm92aWRlIGEgYGhvc3RgIGdsb2JhbDsgc3RhdGljIChidW5kbGUpXG4vLyBpbnN0YWxscyBwcm92aWRlIGN0eC5nZXQoJ2Nvbm5lY3Rpb24nKS5ycGMuIEtlZXAgb25lIFVJIHNvdXJjZSBmb3IgYm90aC5cbmZ1bmN0aW9uIGhvc3RDYWxsKG1ldGhvZCwgYXJncykge1xuICAvLyBQMC0zOiBwcmVmZXIgdGhlIG9mZmljaWFsIGByZW1vdGVgIHNlcnZpY2Ugd2hlbiBpdCBleHBvc2VzIHRoZSB1c2FnZSBBUEk7XG4gIC8vIG90aGVyd2lzZSBmYWxsIHRocm91Z2ggdG8gdGhlIGhvc3QvY29ubmVjdGlvbiBmYWxsYmFja3MgdW5jaGFuZ2VkLlxuICBjb25zdCByZW1vdGVTY29wZSA9ICh0eXBlb2YgY3R4ICE9PSAndW5kZWZpbmVkJyAmJiBjdHggJiYgdHlwZW9mIGN0eC5nZXQgPT09ICdmdW5jdGlvbicpXG4gICAgPyBjdHhcbiAgICA6ICh0eXBlb2YgX3VzYWdlQ3R4ICE9PSAndW5kZWZpbmVkJyAmJiBfdXNhZ2VDdHggJiYgdHlwZW9mIF91c2FnZUN0eC5nZXQgPT09ICdmdW5jdGlvbicgPyBfdXNhZ2VDdHggOiBudWxsKVxuICBpZiAocmVtb3RlU2NvcGUgJiYgdHlwZW9mIHJlbW90ZVNjb3BlLmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW1vdGUgPSByZW1vdGVTY29wZS5nZXQoJ3JlbW90ZScpXG4gICAgICBpZiAocmVtb3RlICYmIHJlbW90ZS51c2FnZSkge1xuICAgICAgICBjb25zdCByTmFtZSA9IFN0cmluZyhtZXRob2QpXG4gICAgICAgIGNvbnN0IHJTbGFzaCA9IHJOYW1lLmluZGV4T2YoJy8nKVxuICAgICAgICBjb25zdCByRXAgPSByU2xhc2ggPT09IC0xID8gck5hbWUgOiByTmFtZS5zbGljZShyU2xhc2ggKyAxKVxuICAgICAgICBjb25zdCByQ2FtZWwgPSByRXAucmVwbGFjZSgvLShbYS16XSkvZywgKG0sIGMpID0+IGMudG9VcHBlckNhc2UoKSlcbiAgICAgICAgY29uc3QgZm4gPSAodHlwZW9mIHJlbW90ZS51c2FnZVtyQ2FtZWxdID09PSAnZnVuY3Rpb24nICYmIHJlbW90ZS51c2FnZVtyQ2FtZWxdKVxuICAgICAgICAgIHx8ICh0eXBlb2YgcmVtb3RlLnVzYWdlW3JFcF0gPT09ICdmdW5jdGlvbicgJiYgcmVtb3RlLnVzYWdlW3JFcF0pXG4gICAgICAgIGlmIChmbikge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGZuKGFyZ3MpKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLm9rKSByZXR1cm4gcmVzLnZhbHVlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKHJlcyAmJiByZXMuZXJyb3IgJiYgcmVzLmVycm9yLm1lc3NhZ2UpIHx8ICgnUlBDICcgKyBtZXRob2QgKyAnIGZhaWxlZCcpKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyByZW1vdGUgcHJvYmluZyBmYWlsZWQg4oCUIGZhbGwgdGhyb3VnaCB0byB0aGUgZXhpc3RpbmcgZmFsbGJhY2tzXG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgaG9zdCAhPT0gJ3VuZGVmaW5lZCcgJiYgaG9zdCAmJiB0eXBlb2YgaG9zdC5jYWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShob3N0LmNhbGwobWV0aG9kLCBhcmdzKSlcbiAgfVxuICAvLyBTdGF0aWMgYnVuZGxlIGluc3RhbGxzIGhhdmUgbm8gY3R4L2hvc3QgZ2xvYmFsczogdGhlIGVudHJ5IGFwcGx5KCkgc3RvcmVzXG4gIC8vIHRoZSByZWFsIGNvbnRleHQgaW4gX3VzYWdlQ3R4IChkZWNsYXJlZCBieSB0aGUgYnVpbGQgd3JhcHBlcikuXG4gIGNvbnN0IHNjb3BlID0gKHR5cGVvZiBjdHggIT09ICd1bmRlZmluZWQnICYmIGN0eCAmJiB0eXBlb2YgY3R4LmdldCA9PT0gJ2Z1bmN0aW9uJylcbiAgICA/IGN0eFxuICAgIDogKHR5cGVvZiBfdXNhZ2VDdHggIT09ICd1bmRlZmluZWQnID8gX3VzYWdlQ3R4IDogbnVsbClcbiAgaWYgKHNjb3BlID09PSBudWxsIHx8IHR5cGVvZiBzY29wZS5nZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdjb250ZXh0IHVuYXZhaWxhYmxlJykpXG4gIH1cbiAgY29uc3QgY29ubmVjdGlvbiA9IHNjb3BlLmdldCgnY29ubmVjdGlvbicpXG4gIGlmIChjb25uZWN0aW9uID09PSB1bmRlZmluZWQgfHwgY29ubmVjdGlvbi5ycGMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2Nvbm5lY3Rpb24gc2VydmljZSB1bmF2YWlsYWJsZScpKVxuICB9XG4gIGNvbnN0IG5hbWUgPSBTdHJpbmcobWV0aG9kKVxuICBjb25zdCBzbGFzaCA9IG5hbWUuaW5kZXhPZignLycpXG4gIGNvbnN0IGNoYW5uZWwgPSBzbGFzaCA9PT0gLTEgPyBuYW1lIDogbmFtZS5zbGljZSgwLCBzbGFzaClcbiAgY29uc3QgZW5kcG9pbnQgPSBzbGFzaCA9PT0gLTEgPyBuYW1lIDogbmFtZS5zbGljZShzbGFzaCArIDEpXG4gIHJldHVybiBjb25uZWN0aW9uLnJwYy5jYWxsKCcvJyArIGNoYW5uZWwucmVwbGFjZSgvXlxcLysvLCAnJyksIGVuZHBvaW50LCBhcmdzKS50aGVuKChyZXMpID0+IHtcbiAgICBpZiAocmVzICYmIHJlcy5vaykgcmV0dXJuIHJlcy52YWx1ZVxuICAgIHRocm93IG5ldyBFcnJvcigocmVzICYmIHJlcy5lcnJvciAmJiByZXMuZXJyb3IubWVzc2FnZSkgfHwgKCdSUEMgJyArIG1ldGhvZCArICcgZmFpbGVkJykpXG4gIH0pXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog6K6+572u5Z+f5a6a5Lu377ya5a6Y5pa5IGN0eC5zZXR0aW5nc1Njb3Bl77yIZHNoLWNsaWVudC11aS1zZXR0aW5nc++8ieS8mOWFiO+8jFxuICog5LiN5Y+v55So5pe25Zue6YCAIHVzYWdlL3ByaWNlcyBSUEPjgILnu5Hlrprlj6rlgZrkuIDmrKHvvIzor7vlhpnlhbHnlKjlkIzkuIAgc2NvcGXjgIJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmxldCB1c2FnZUN0eCA9IG51bGxcbmxldCBfdXNhZ2VQcmljZXNTY29wZSA9IG51bGxcblxuZnVuY3Rpb24gcmVzb2x2ZVVzYWdlQ3R4KCkge1xuICBpZiAodXNhZ2VDdHggJiYgdHlwZW9mIHVzYWdlQ3R4LmdldCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVzYWdlQ3R4XG4gIGlmICh0eXBlb2YgX3VzYWdlQ3R4ICE9PSAndW5kZWZpbmVkJyAmJiBfdXNhZ2VDdHggJiYgdHlwZW9mIF91c2FnZUN0eC5nZXQgPT09ICdmdW5jdGlvbicpIHJldHVybiBfdXNhZ2VDdHhcbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0VXNhZ2VQcmljZXNTY29wZSgpIHtcbiAgaWYgKF91c2FnZVByaWNlc1Njb3BlKSByZXR1cm4gX3VzYWdlUHJpY2VzU2NvcGVcbiAgY29uc3QgYyA9IHJlc29sdmVVc2FnZUN0eCgpXG4gIGlmICghYyB8fCB0eXBlb2YgYy5nZXQgIT09ICdmdW5jdGlvbicpIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgY29uc3QgYmluZGVyID0gYy5nZXQoJ3NldHRpbmdzU2NvcGUnKVxuICAgIGlmICghYmluZGVyIHx8IHR5cGVvZiBiaW5kZXIuYmluZCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG51bGxcbiAgICBfdXNhZ2VQcmljZXNTY29wZSA9IGJpbmRlci5iaW5kKHsgbmFtZXNwYWNlOiAndXNhZ2UucHJpY2VzJyB9KVxuICAgIHJldHVybiBfdXNhZ2VQcmljZXNTY29wZVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG4vLyDku7fmoLzlhpnlhaXlj6PvvJpzZXR0aW5ncyBzY29wZSDlj6/nlKjml7blhpkgdXNhZ2UucHJpY2VzIOWRveWQjeepuumXtOWtl+aute+8jFxuLy8g5ZCm5YiZ5Zue6YCAIHVzYWdlL3ByaWNlcyBSUEPvvIjlvZPliY0gVUkg5peg5Lu35qC857yW6L6R5Zmo77yM5L+d55WZ5q2k5YaZ5YWlIHNlYW0g5L6b5ZCO57ut5L2/55So77yJ44CCXG5mdW5jdGlvbiB1c2FnZVNhdmVQcmljZXMobmV4dCkge1xuICBjb25zdCBhcmdzID0ge31cbiAgaWYgKG5leHQgJiYgdHlwZW9mIG5leHQgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKG5leHQucHJpY2VzICE9PSB1bmRlZmluZWQpIGFyZ3MucHJpY2VzID0gbmV4dC5wcmljZXNcbiAgICBpZiAobmV4dC5jdXJyZW5jeSAhPT0gdW5kZWZpbmVkKSBhcmdzLmN1cnJlbmN5ID0gbmV4dC5jdXJyZW5jeVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgc2NvcGUgPSBnZXRVc2FnZVByaWNlc1Njb3BlKClcbiAgICBpZiAoc2NvcGUgJiYgdHlwZW9mIHNjb3BlLnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3Qgam9icyA9IFtdXG4gICAgICBpZiAoYXJncy5wcmljZXMgIT09IHVuZGVmaW5lZCkgam9icy5wdXNoKHNjb3BlLnNldCgncHJpY2VzJywgYXJncy5wcmljZXMpKVxuICAgICAgaWYgKGFyZ3MuY3VycmVuY3kgIT09IHVuZGVmaW5lZCkgam9icy5wdXNoKHNjb3BlLnNldCgnY3VycmVuY3knLCBhcmdzLmN1cnJlbmN5KSlcbiAgICAgIGlmIChqb2JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGpvYnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNuYXAgPSB0eXBlb2Ygc2NvcGUuZ2V0U25hcHNob3QgPT09ICdmdW5jdGlvbicgPyBzY29wZS5nZXRTbmFwc2hvdCgpIDogbnVsbFxuICAgICAgICAgIHJldHVybiBzbmFwICYmIHNuYXAudmFsdWUgPyBzbmFwLnZhbHVlIDogbnVsbFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgUlBDIHdyaXRlIHBhdGhcbiAgfVxuICByZXR1cm4gaG9zdENhbGwoJ3VzYWdlL3ByaWNlcycsIGFyZ3MpXG59XG5cbjtcbmNvbnN0IGggPSBSZWFjdC5jcmVhdGVFbGVtZW50XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5Zu96ZmF5YyW77yaemgvZW4g5a2X5YW4ICsgQ29udGV4dO+8iGxvY2FsZSDmnI3liqHnu48gc2xvdCDms6jlhozms6jlhaUgdO+8jOWtkOe7hOS7tue7jyBDb250ZXh0IOWPlueUqO+8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgTlMgPSAndXNhZ2UnXG5jb25zdCBaSCA9IHtcbiAgbmF2OiAn55So6YeP57uf6K6hJyxcbiAgc3VidGl0bGU6ICfmn6XnnIsgQUkg5qih5Z6L55qE5L2/55So5oOF5Ya15ZKM5oiQ5pys57uf6K6hJyxcbiAgcmVmcmVzaDogJ+WIt+aWsCcsXG4gIHRvZGF5OiAn5LuK5pelJyxcbiAgbGFzdDdkOiAn6L+RN+WkqScsXG4gIGxhc3QzMGQ6ICfov5EzMOWkqScsXG4gIGN1c3RvbTogJ+iHquWumuS5iScsXG4gIGFsbE1vZGVsczogJ+WFqOmDqOaooeWeiycsXG4gIHNlbGVjdGVkTW9kZWxzOiAn5bey6YCJIHtjb3VudH0g5Liq5qih5Z6LJyxcbiAgc2VsZWN0QWxsOiAn5YWo6YCJJyxcbiAgY2xlYXI6ICfmuIXnqbonLFxuICBzZWFyY2hNb2RlbHM6ICfmkJzntKLmqKHlnosnLFxuICBub01hdGNoTW9kZWxzOiAn5peg5Yy56YWN5qih5Z6LJyxcbiAgbW9kZWxGaWx0ZXJIaW50OiAn5Yu+6YCJ5Y2z5pe255Sf5pWI77yM5LuF5YiX5Ye65b2T5YmN6IyD5Zu05YaF5pyJ5pWw5o2u55qE5qih5Z6LJyxcbiAgY3VzdG9tUmFuZ2VUaXRsZTogJ+iHquWumuS5ieaXtumXtOiMg+WbtCcsXG4gIGN1c3RvbVJhbmdlQXJpYTogJ+iHquWumuS5ieaXpeacn+iMg+WbtCcsXG4gIHN0YXJ0VGltZTogJ+W8gOWni+aXtumXtCcsXG4gIGVuZFRpbWU6ICfnu5PmnZ/ml7bpl7QnLFxuICByYW5nZUludmFsaWQ6ICflvIDlp4vml7bpl7TkuI3og73mmZrkuo7nu5PmnZ/ml7bpl7QnLFxuICByYW5nZUhpbnQ6ICfmlK/mjIHpgInmi6nml6XmnJ/vvIzmnIDplb8gMzAg5aSpJyxcbiAgY2FuY2VsOiAn5Y+W5raIJyxcbiAgY29uZmlybTogJ+ehruWumicsXG4gIGRhdGVSYW5nZUdyb3VwOiAn5pel5pyf6IyD5Zu0JyxcbiAgbW9kZWxGaWx0ZXJHcm91cDogJ+aooeWei+etm+mAiScsXG4gIGNoYXJ0VHlwZUdyb3VwOiAn5Zu+6KGo57G75Z6LJyxcbiAgdG90YWxUb2tlbnM6ICfmgLsgVG9rZW4nLFxuICBpbnB1dFRva2VuczogJ+i+k+WFpSBUb2tlbicsXG4gIG91dHB1dFRva2VuczogJ+i+k+WHuiBUb2tlbicsXG4gIGNhbGxzOiAn6LCD55So5qyh5pWwJyxcbiAgY29zdDogJ+aIkOacrCcsXG4gIGFwcHJveElPOiAn4omIIOi+k+WFpSvovpPlh7onLFxuICB1bnByaWNlZE5vdGU6ICd7Y291bnR9IOasoeiwg+eUqOacquWumuS7tycsXG4gIGRhaWx5VHJlbmQ6ICfmr4/ml6XnlKjph4/otovlir8nLFxuICBiYXJWaWV3OiAn5p+x54q25Zu+JyxcbiAgbGluZVZpZXc6ICfmipjnur/lm74nLFxuICBieUhvdXI6ICfmjInlsI/ml7YnLFxuICBieURheTogJ+aMieWkqScsXG4gIGV2ZXJ5TkRheXM6ICfmr48ge259IOWkqScsXG4gIGxlZ2VuZElucHV0OiAn6L6T5YWlJyxcbiAgbGVnZW5kT3V0cHV0OiAn6L6T5Ye6JyxcbiAgbGVnZW5kVG90YWw6ICfmgLsgVG9rZW4nLFxuICB0b29sdGlwVG90YWw6ICflkIjorqEnLFxuICBzdGFydE5EYXlzOiAn6LW3IHtufSDlpKknLFxuICBsaW5lQ2hhcnRBcmlhOiAnVG9rZW4g55So6YeP6LaL5Yq/5oqY57q/5Zu+JyxcbiAgeWVhcmx5SGVhdG1hcDogJ+W5tOW6pueUqOmHj+eDreWKm+WbvicsXG4gIHllYXJEYWlseTogJ3t5ZWFyfSDlubTmr4/ml6UgVG9rZW4g55So6YePJyxcbiAgbW9udGhMYWJlbDogJ3tufeaciCcsXG4gIHdlZWtkYXlNb246ICfkuIAnLFxuICB3ZWVrZGF5V2VkOiAn5LiJJyxcbiAgd2Vla2RheUZyaTogJ+S6lCcsXG4gIGxlc3M6ICflsJEnLFxuICBtb3JlOiAn5aSaJyxcbiAgYnlNb2RlbFRpdGxlOiAn5oyJ5qih5Z6L5piO57uGJyxcbiAgbW9kZWxDb3VudDogJ+WFsSB7bn0g5Liq5qih5Z6LJyxcbiAgbW9kZWxUYWJsZUNhcHRpb246ICfmjInmqKHlnovnlKjph4/mmI7nu4YnLFxuICBjb2xNb2RlbDogJ+aooeWeiycsXG4gIGNvbENhbGxzOiAn6K+35rGC5pWwJyxcbiAgY29sSW5wdXQ6ICfovpPlhaUgVG9rZW4nLFxuICBjb2xPdXRwdXQ6ICfovpPlh7ogVG9rZW4nLFxuICBjb2xUb3RhbDogJ+aAuyBUb2tlbicsXG4gIGNvbENvc3Q6ICfmiJDmnKwnLFxuICBjb2xTaGFyZTogJ+WNoOavlCcsXG4gIHVucHJpY2VkOiAn5pyq5a6a5Lu3JyxcbiAgdW5wcmljZWRSb3dIaW50OiAn6K+l5qih5Z6L5pyq6YWN572u5a6a5Lu377yM5oyJIDAg6K6h5Lu3JyxcbiAgbm9EYXRhOiAn5pqC5peg5pWw5o2uJyxcbiAgZW1wdHlEZXNjOiAn6K+l5pe26Ze05q615YaF5rKh5pyJ6LCD55So6K6w5b2VJyxcbiAgZW1wdHlGaWx0ZXJlZDogJ+W9k+WJjeetm+mAieadoeS7tuS4i+ayoeacieaVsOaNru+8jOivleivleiwg+aVtOaXtumXtOiMg+WbtOaIluaooeWeiycsXG4gIHJlc2V0RmlsdGVyczogJ+mHjee9ruetm+mAiScsXG4gIGxvYWRGYWlsZWQ6ICfmlbDmja7liqDovb3lpLHotKXvvJp7bWVzc2FnZX0nLFxuICBsb2FkRmFpbGVkVGl0bGU6ICfmlbDmja7liqDovb3lpLHotKUnLFxuICByZXRyeTogJ+mHjeivlScsXG4gIGJhckFyaWE6ICd7a2V5fe+8jOi+k+WFpSB7aW59IFRva2Vu77yM6L6T5Ye6IHtvdXR9IFRva2Vu77yM5ZCI6K6hIHt0b3R9IFRva2VuJyxcbiAgaG1UaXRsZTogJ3trZXl977yae3Rva2Vuc30gVG9rZW57Y2FsbHN9JyxcbiAgaG1DYWxsczogJ++8jHtjb3VudH0g5qyh6LCD55SoJyxcbiAgd2QwOiAn5ZGo5pelJyxcbiAgd2QxOiAn5ZGo5LiAJyxcbiAgd2QyOiAn5ZGo5LqMJyxcbiAgd2QzOiAn5ZGo5LiJJyxcbiAgd2Q0OiAn5ZGo5ZubJyxcbiAgd2Q1OiAn5ZGo5LqUJyxcbiAgd2Q2OiAn5ZGo5YWtJyxcbn1cbmNvbnN0IEVOID0ge1xuICBuYXY6ICdVc2FnZSBTdGF0cycsXG4gIHN1YnRpdGxlOiAnVmlldyBBSSBtb2RlbCB1c2FnZSBhbmQgY29zdCBzdGF0aXN0aWNzJyxcbiAgcmVmcmVzaDogJ1JlZnJlc2gnLFxuICB0b2RheTogJ1RvZGF5JyxcbiAgbGFzdDdkOiAnTGFzdCA3IGRheXMnLFxuICBsYXN0MzBkOiAnTGFzdCAzMCBkYXlzJyxcbiAgY3VzdG9tOiAnQ3VzdG9tJyxcbiAgYWxsTW9kZWxzOiAnQWxsIG1vZGVscycsXG4gIHNlbGVjdGVkTW9kZWxzOiAne2NvdW50fSBtb2RlbHMgc2VsZWN0ZWQnLFxuICBzZWxlY3RBbGw6ICdTZWxlY3QgYWxsJyxcbiAgY2xlYXI6ICdDbGVhcicsXG4gIHNlYXJjaE1vZGVsczogJ1NlYXJjaCBtb2RlbHMnLFxuICBub01hdGNoTW9kZWxzOiAnTm8gbWF0Y2hpbmcgbW9kZWxzJyxcbiAgbW9kZWxGaWx0ZXJIaW50OiAnQXBwbGllcyBpbnN0YW50bHk7IGxpc3RzIG9ubHkgbW9kZWxzIHdpdGggZGF0YSBpbiB0aGUgcmFuZ2UnLFxuICBjdXN0b21SYW5nZVRpdGxlOiAnQ3VzdG9tIHRpbWUgcmFuZ2UnLFxuICBjdXN0b21SYW5nZUFyaWE6ICdDdXN0b20gZGF0ZSByYW5nZScsXG4gIHN0YXJ0VGltZTogJ1N0YXJ0JyxcbiAgZW5kVGltZTogJ0VuZCcsXG4gIHJhbmdlSW52YWxpZDogJ1N0YXJ0IG11c3Qgbm90IGJlIGxhdGVyIHRoYW4gZW5kJyxcbiAgcmFuZ2VIaW50OiAnRGF0ZSBvbmx5LCB1cCB0byAzMCBkYXlzJyxcbiAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgY29uZmlybTogJ09LJyxcbiAgZGF0ZVJhbmdlR3JvdXA6ICdEYXRlIHJhbmdlJyxcbiAgbW9kZWxGaWx0ZXJHcm91cDogJ01vZGVsIGZpbHRlcicsXG4gIGNoYXJ0VHlwZUdyb3VwOiAnQ2hhcnQgdHlwZScsXG4gIHRvdGFsVG9rZW5zOiAnVG90YWwgVG9rZW5zJyxcbiAgaW5wdXRUb2tlbnM6ICdJbnB1dCBUb2tlbnMnLFxuICBvdXRwdXRUb2tlbnM6ICdPdXRwdXQgVG9rZW5zJyxcbiAgY2FsbHM6ICdDYWxscycsXG4gIGNvc3Q6ICdDb3N0JyxcbiAgYXBwcm94SU86ICfiiYggaW5wdXQrb3V0cHV0JyxcbiAgdW5wcmljZWROb3RlOiAne2NvdW50fSBjYWxscyB1bnByaWNlZCcsXG4gIGRhaWx5VHJlbmQ6ICdEYWlseSB1c2FnZSB0cmVuZCcsXG4gIGJhclZpZXc6ICdCYXJzJyxcbiAgbGluZVZpZXc6ICdMaW5lJyxcbiAgYnlIb3VyOiAnSG91cmx5JyxcbiAgYnlEYXk6ICdEYWlseScsXG4gIGV2ZXJ5TkRheXM6ICdFdmVyeSB7bn0gZGF5cycsXG4gIGxlZ2VuZElucHV0OiAnSW5wdXQnLFxuICBsZWdlbmRPdXRwdXQ6ICdPdXRwdXQnLFxuICBsZWdlbmRUb3RhbDogJ1RvdGFsJyxcbiAgdG9vbHRpcFRvdGFsOiAnVG90YWwnLFxuICBzdGFydE5EYXlzOiAnZm9yIHtufSBkYXlzJyxcbiAgbGluZUNoYXJ0QXJpYTogJ1Rva2VuIHVzYWdlIHRyZW5kIGxpbmUgY2hhcnQnLFxuICB5ZWFybHlIZWF0bWFwOiAnWWVhcmx5IGhlYXRtYXAnLFxuICB5ZWFyRGFpbHk6ICdEYWlseSB0b2tlbnMgaW4ge3llYXJ9JyxcbiAgbW9udGhMYWJlbDogJ3tufScsXG4gIHdlZWtkYXlNb246ICdNb24nLFxuICB3ZWVrZGF5V2VkOiAnV2VkJyxcbiAgd2Vla2RheUZyaTogJ0ZyaScsXG4gIGxlc3M6ICdMZXNzJyxcbiAgbW9yZTogJ01vcmUnLFxuICBieU1vZGVsVGl0bGU6ICdCeSBtb2RlbCcsXG4gIG1vZGVsQ291bnQ6ICd7bn0gbW9kZWxzJyxcbiAgbW9kZWxUYWJsZUNhcHRpb246ICdUb2tlbiB1c2FnZSBieSBtb2RlbCcsXG4gIGNvbE1vZGVsOiAnTW9kZWwnLFxuICBjb2xDYWxsczogJ0NhbGxzJyxcbiAgY29sSW5wdXQ6ICdJbnB1dCBUb2tlbnMnLFxuICBjb2xPdXRwdXQ6ICdPdXRwdXQgVG9rZW5zJyxcbiAgY29sVG90YWw6ICdUb3RhbCBUb2tlbnMnLFxuICBjb2xDb3N0OiAnQ29zdCcsXG4gIGNvbFNoYXJlOiAnU2hhcmUnLFxuICB1bnByaWNlZDogJ1VucHJpY2VkJyxcbiAgdW5wcmljZWRSb3dIaW50OiAnTm8gcHJpY2luZyBjb25maWd1cmVkOyBjb3VudGVkIGFzIDAnLFxuICBub0RhdGE6ICdObyBkYXRhJyxcbiAgZW1wdHlEZXNjOiAnTm8gY2FsbHMgaW4gdGhpcyBwZXJpb2QnLFxuICBlbXB0eUZpbHRlcmVkOiAnTm8gZGF0YSBmb3IgdGhlIGN1cnJlbnQgZmlsdGVycywgdHJ5IGFkanVzdGluZyB0aGUgcmFuZ2Ugb3IgbW9kZWxzJyxcbiAgcmVzZXRGaWx0ZXJzOiAnUmVzZXQgZmlsdGVycycsXG4gIGxvYWRGYWlsZWQ6ICdGYWlsZWQgdG8gbG9hZCBkYXRhOiB7bWVzc2FnZX0nLFxuICBsb2FkRmFpbGVkVGl0bGU6ICdGYWlsZWQgdG8gbG9hZCBkYXRhJyxcbiAgcmV0cnk6ICdSZXRyeScsXG4gIGJhckFyaWE6ICd7a2V5fSwgaW5wdXQge2lufSB0b2tlbnMsIG91dHB1dCB7b3V0fSB0b2tlbnMsIHRvdGFsIHt0b3R9IHRva2VucycsXG4gIGhtVGl0bGU6ICd7a2V5fToge3Rva2Vuc30gdG9rZW5ze2NhbGxzfScsXG4gIGhtQ2FsbHM6ICcsIHtjb3VudH0gY2FsbHMnLFxuICB3ZDA6ICdTdW4nLFxuICB3ZDE6ICdNb24nLFxuICB3ZDI6ICdUdWUnLFxuICB3ZDM6ICdXZWQnLFxuICB3ZDQ6ICdUaHUnLFxuICB3ZDU6ICdGcmknLFxuICB3ZDY6ICdTYXQnLFxufVxuY29uc3QgVCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQobnVsbClcbmZ1bmN0aW9uIHVzZVQoKSB7XG4gIHJldHVybiBSZWFjdC51c2VDb250ZXh0KFQpXG59XG5mdW5jdGlvbiBmYWxsYmFja1Qoa2V5LCBwYXJhbXMpIHtcbiAgbGV0IHMgPSBaSFtrZXldXG4gIGlmIChzID09PSB1bmRlZmluZWQpIHJldHVybiBrZXlcbiAgaWYgKHBhcmFtcykge1xuICAgIHMgPSBzLnJlcGxhY2UoL1xceyhcXHcrKVxcfS9nLCAobSwgbikgPT4gKHBhcmFtc1tuXSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHBhcmFtc1tuXSkgOiBtKSlcbiAgfVxuICByZXR1cm4gc1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOaVsOWtl+agvOW8j+WMlu+8iOinhOagvOesrCA1IOiKgu+8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gZm9ybWF0VG9rZW5zU2hvcnQobikge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSkgcmV0dXJuICctLSdcbiAgaWYgKG4gPj0gMWU2KSByZXR1cm4gTWF0aC5yb3VuZChuIC8gMWU0KSAvIDEwMCArICdNJyAvLyAxLjIzTVxuICBpZiAobiA+PSAxZTMpIHJldHVybiBNYXRoLnJvdW5kKG4gLyAxZTIpIC8gMTAgKyAnSycgLy8gMTIuM0tcbiAgcmV0dXJuIFN0cmluZyhNYXRoLnJvdW5kKG4pKVxufVxuZnVuY3Rpb24gZm9ybWF0SW50KG4pIHtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSA/IE1hdGgucm91bmQobikudG9Mb2NhbGVTdHJpbmcoKSA6ICctLSdcbn1cbmZ1bmN0aW9uIGZvcm1hdENvc3QobiwgY3VyKSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG4pKSByZXR1cm4gJy0tJ1xuICByZXR1cm4gKGN1ciB8fCAnwqUnKSArIG4udG9GaXhlZCgyKVxufVxuZnVuY3Rpb24gZGF5TGFiZWwoa2V5KSB7XG4gIGNvbnN0IFssIG0sIGRdID0gU3RyaW5nKGtleSB8fCAnJykuc3BsaXQoJy0nKVxuICBpZiAobSA9PT0gdW5kZWZpbmVkIHx8IGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuICctLSdcbiAgcmV0dXJuIG0gKyAnLScgKyBkXG59XG5mdW5jdGlvbiBmbXRQY3QocmF0aW8pIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocmF0aW8pKSByZXR1cm4gJzAlJ1xuICBjb25zdCBwID0gcmF0aW8gKiAxMDBcbiAgaWYgKHAgPj0gOTkuOTUpIHJldHVybiAnMTAwJSdcbiAgcmV0dXJuIHAudG9GaXhlZCgxKSArICclJ1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOaXpeacn+W3peWFt1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gc3RhcnRPZkRheShkKSB7XG4gIGNvbnN0IHggPSBuZXcgRGF0ZShkKVxuICB4LnNldEhvdXJzKDAsIDAsIDAsIDApXG4gIHJldHVybiB4XG59XG5mdW5jdGlvbiBhZGREYXlzKGQsIG4pIHtcbiAgY29uc3QgeCA9IG5ldyBEYXRlKGQpXG4gIHguc2V0RGF0ZSh4LmdldERhdGUoKSArIG4pXG4gIHJldHVybiB4XG59XG5mdW5jdGlvbiBmbXREYXRlSW5wdXQoZCkge1xuICBjb25zdCB5ID0gZC5nZXRGdWxsWWVhcigpXG4gIGNvbnN0IG0gPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKVxuICBjb25zdCBkYXkgPSBTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJylcbiAgcmV0dXJuIHkgKyAnLScgKyBtICsgJy0nICsgZGF5XG59XG5mdW5jdGlvbiBmbXREYXRlU2xhc2gocykge1xuICBjb25zdCBtID0gU3RyaW5nKHMgfHwgJycpLm1hdGNoKC9eKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSkkLylcbiAgaWYgKCFtKSByZXR1cm4gJy0tJ1xuICByZXR1cm4gbVsxXSArICcvJyArIG1bMl0gKyAnLycgKyBtWzNdXG59XG4vLyDpooTorr4gLyDoh6rlrprkuYkg4oaSIHsgZnJvbSwgdG8gfe+8iFVuaXgg5q+r56eS77yJXG4vLyDku4rml6UgPSDlvZPlpKkgMDA6MDAg6Iez5LuK77yb6L+RNy8zMOWkqSA9IOWQq+S7iuWkqeW+gOWJjSBOIOS4quiHqueEtuaXpSAwMDowMCDotbfvvJvoh6rlrprkuYkgPSDotbfml6UgMDA6MDAgfiDmraLml6UgMjM6NTk6NTkuOTk5XG5mdW5jdGlvbiByYW5nZUZvcihwcmVzZXQsIGN1c3RvbSkge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IHRvZGF5ID0gc3RhcnRPZkRheShub3cpXG4gIGlmIChwcmVzZXQgPT09ICd0b2RheScpIHJldHVybiB7IGZyb206IHRvZGF5LmdldFRpbWUoKSwgdG86IG5vdy5nZXRUaW1lKCkgfVxuICBpZiAocHJlc2V0ID09PSAnN2QnKSByZXR1cm4geyBmcm9tOiBhZGREYXlzKHRvZGF5LCAtNikuZ2V0VGltZSgpLCB0bzogbm93LmdldFRpbWUoKSB9XG4gIGlmIChwcmVzZXQgPT09ICczMGQnKSByZXR1cm4geyBmcm9tOiBhZGREYXlzKHRvZGF5LCAtMjkpLmdldFRpbWUoKSwgdG86IG5vdy5nZXRUaW1lKCkgfVxuICBjb25zdCBmcm9tID0gbmV3IERhdGUoY3VzdG9tLmZyb20gKyAnVDAwOjAwOjAwJykuZ2V0VGltZSgpXG4gIGNvbnN0IHRvID0gbmV3IERhdGUoY3VzdG9tLnRvICsgJ1QyMzo1OTo1OS45OTknKS5nZXRUaW1lKClcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoZnJvbSkgfHwgIU51bWJlci5pc0Zpbml0ZSh0bykpIHtcbiAgICByZXR1cm4geyBmcm9tOiB0b2RheS5nZXRUaW1lKCksIHRvOiBub3cuZ2V0VGltZSgpIH1cbiAgfVxuICByZXR1cm4geyBmcm9tLCB0byB9XG59XG5mdW5jdGlvbiB3ZWVrZGF5T2Yoa2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGtleSArICdUMDA6MDA6MDAnKS50b0xvY2FsZURhdGVTdHJpbmcoJ3poLUNOJywgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gJydcbiAgfVxufVxuLyoqIFdlZWtkYXkgZm9yIGEgZGF5L2hvdXIvbWludXRlIGJ1Y2tldCBrZXkgKGBZWVlZLU1NLUREYCBvciBgWVlZWS1NTS1ERCBISDptbWApLiAqL1xuZnVuY3Rpb24gd2Vla2RheU5hbWUoa2V5LCB0KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKFN0cmluZyhrZXkpLnJlcGxhY2UoJyAnLCAnVCcpKVxuICAgIHJldHVybiB0KFsnd2QwJywgJ3dkMScsICd3ZDInLCAnd2QzJywgJ3dkNCcsICd3ZDUnLCAnd2Q2J11bZC5nZXREYXkoKV0gfHwgJ3dkMCcpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gJydcbiAgfVxufVxuLyoqIFgtYXhpcyBsYWJlbCBmb3IgYSBidWNrZXQga2V5IHVuZGVyIGEgZ3JhbnVsYXJpdHkuICovXG5mdW5jdGlvbiB4TGFiZWwoa2V5LCBnKSB7XG4gIGNvbnN0IHMgPSBTdHJpbmcoa2V5KVxuICBjb25zdCBzcCA9IHMuc3BsaXQoJyAnKVxuICBpZiAoZyA9PT0gJ21pbnV0ZScpIHJldHVybiBzcC5sZW5ndGggPiAxID8gc3BbMV0uc2xpY2UoMCwgNSkgOiBzLnNsaWNlKDUpXG4gIGlmIChnID09PSAnaG91cicpIHJldHVybiBzcC5sZW5ndGggPiAxID8gc3BbMV0uc2xpY2UoMCwgMikgKyAnOjAwJyA6IHMuc2xpY2UoNSlcbiAgcmV0dXJuIGRheUxhYmVsKGtleSlcbn1cbi8qKiBGaXhlZCBncmFudWxhcml0eSBwb2xpY3k6IHRvZGF5IGlzIGhvdXJseSwgZXZlcnl0aGluZyBlbHNlIGlzIGRhaWx5LiAqL1xuZnVuY3Rpb24gZWZmR3JhbnVsYXJpdHkocmFuZ2UpIHtcbiAgcmV0dXJuIHJhbmdlID09PSAndG9kYXknID8gJ2hvdXInIDogJ2RheSc7XG59XG4vKiogU3RhYmxlIHN0ZXAgc3RyYXRlZ3kgZm9yIGN1c3RvbSByYW5nZXM6IHRhcmdldCB+MTUtMjUgYnVja2V0cy4gKi9cbmZ1bmN0aW9uIHBpY2tTdGVwRGF5cyhzcGFuTXMpIHtcbiAgY29uc3QgZGF5cyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoKHNwYW5NcyB8fCAwKSAvIDg2NDAwMDAwKSlcbiAgaWYgKGRheXMgPD0gMzEpIHJldHVybiAxXG4gIGlmIChkYXlzIDw9IDYyKSByZXR1cm4gM1xuICBpZiAoZGF5cyA8PSAxNTApIHJldHVybiA1XG4gIHJldHVybiA3XG59XG4vKiogSHVtYW4gbGFiZWwgZm9yIHRoZSBjdXJyZW50IHN0ZXAgcG9saWN5LiAqL1xuZnVuY3Rpb24gc3RlcExhYmVsKHQsIHJhbmdlLCBzdGVwRGF5cykge1xuICBpZiAocmFuZ2UgPT09ICd0b2RheScpIHJldHVybiB0KCdieUhvdXInKVxuICByZXR1cm4gc3RlcERheXMgPiAxID8gdCgnZXZlcnlORGF5cycsIHsgbjogc3RlcERheXMgfSkgOiB0KCdieURheScpXG59XG4vKiogSGVhdG1hcCBjZWxsIGNvbG9yIGJ5IHJlbGF0aXZlIHRva2VuIHZvbHVtZS4gKi9cbmZ1bmN0aW9uIGhlYXRDb2xvcih0b3RhbCwgbWF4KSB7XG4gIGlmICghdG90YWwpIHJldHVybiAndmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKSdcbiAgY29uc3QgciA9IHRvdGFsIC8gbWF4XG4gIGNvbnN0IHBjdCA9IHIgPCAwLjI1ID8gMjIgOiByIDwgMC41ID8gNDUgOiByIDwgMC43NSA/IDcwIDogMTAwXG4gIHJldHVybiAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKSAnICsgcGN0ICsgJyUsIHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0yKSknXG59XG5mdW5jdGlvbiBuaWNlQ2VpbCh2KSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHYpIHx8IHYgPD0gMCkgcmV0dXJuIDFcbiAgY29uc3QgbWFnID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2cxMCh2KSkpXG4gIGNvbnN0IG5vcm0gPSB2IC8gbWFnXG4gIGNvbnN0IG5pY2UgPSBub3JtIDw9IDEgPyAxIDogbm9ybSA8PSAyID8gMiA6IG5vcm0gPD0gNSA/IDUgOiAxMFxuICByZXR1cm4gbmljZSAqIG1hZ1xufVxuZnVuY3Rpb24gZGVmYXVsdEN1c3RvbSgpIHtcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICByZXR1cm4geyBmcm9tOiBmbXREYXRlSW5wdXQoYWRkRGF5cyhub3csIC02KSksIHRvOiBmbXREYXRlSW5wdXQobm93KSB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5YaF6IGUIFNWRyDlm77moIfvvIjml6Dlm77moIflupPvvIzmiYvlhpkgZmVhdGhlciDpo47moLwgc3Ryb2tlIOWbvuagh++8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgSUNPTl9QQVRIUyA9IHtcbiAgbGF5ZXJzOiAnTTEyIDJsOCA0LjUtOCA0LjUtOC00LjVMMTIgMnptMCA4bDggNC41LTggNC41LTgtNC41TDEyIDEwem0wIDhsOCA0LjUtOCA0LjUtOC00LjVMMTIgMTh6JyxcbiAgZG93bjogJ00xMiAzdjEybTAgMGwtNC41LTQuNU0xMiAxNWw0LjUtNC41TTQgMjFoMTYnLFxuICB1cDogJ00xMiAyMVY5bTAgMGwtNC41IDQuNU0xMiA5bDQuNSA0LjVNNCAzaDE2JyxcbiAgYWN0aXZpdHk6ICdNMiAxMmg0bDIuNS04IDUgMTYgMi41LThoNicsXG4gIGNvaW5zOiAnTTMgOWEyIDIgMCAwMTItMmgxNGEyIDIgMCAwMTIgMnY5YTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMlY5em0wIDVoMThNOCA1LjVWNGEyIDIgMCAwMTItMmg0YTIgMiAwIDAxMiAydjEuNScsXG4gIHJlZnJlc2g6ICdNMjEgMTJhOSA5IDAgMTEtMi42NC02LjM2TTIxIDR2NmgtNicsXG4gIGNoZXZyb246ICdNNiA5bDYgNiA2LTYnLFxuICBpbmJveDogJ00yMiAxMmgtNmwtMiAzaC00bC0yLTNIMm0zLjUtNi41TDIgMTJ2NmEyIDIgMCAwMDIgMmgxNmEyIDIgMCAwMDItMnYtNmwtMy41LTYuNUEyIDIgMCAwMDE2Ljc2IDVINy4yNGEyIDIgMCAwMC0xLjc0IDEuNXonLFxuICBhbGVydDogJ00xMiA5djRtMCA0aC4wMU0xMC4zIDMuODZMMS44MiAxOGEyIDIgMCAwMDEuNzEgM2gxNi45NGEyIDIgMCAwMDEuNzEtM0wxMy43IDMuODZhMiAyIDAgMDAtMy40IDB6JyxcbiAgc2VhcmNoOiAnTTIxIDIxbC00LjM1LTQuMzVNMTcgMTAuNWE2LjUgNi41IDAgMTEtMTMgMCA2LjUgNi41IDAgMDExMyAweicsXG59XG5mdW5jdGlvbiBTdmdJY29uKHByb3BzKSB7XG4gIGNvbnN0IHsgbmFtZSwgc2l6ZSwgY2xhc3NOYW1lIH0gPSBwcm9wc1xuICByZXR1cm4gaCgnc3ZnJywge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lIHx8ICd0c2QtaWNvbicsXG4gICAgd2lkdGg6IHNpemUgfHwgMTYsXG4gICAgaGVpZ2h0OiBzaXplIHx8IDE2LFxuICAgIHZpZXdCb3g6ICcwIDAgMjQgMjQnLFxuICAgIGZpbGw6ICdub25lJyxcbiAgICBzdHJva2U6ICdjdXJyZW50Q29sb3InLFxuICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgIHN0cm9rZUxpbmVjYXA6ICdyb3VuZCcsXG4gICAgc3Ryb2tlTGluZWpvaW46ICdyb3VuZCcsXG4gICAgJ2FyaWEtaGlkZGVuJzogdHJ1ZSxcbiAgfSwgaCgncGF0aCcsIHsgZDogSUNPTl9QQVRIU1tuYW1lXSB8fCBJQ09OX1BBVEhTLmFjdGl2aXR5IH0pKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOmAmueUqCBIb29r77ya5aSW6YOo54K55Ye75YWz6ZetXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiB1c2VPdXRzaWRlQ2xpY2sob3BlbiwgcmVmLCBvbkNsb3NlKSB7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaGFuZGxlcihlKSB7XG4gICAgICBpZiAocmVmLmN1cnJlbnQgJiYgIXJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgb25DbG9zZSgpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICB9LCBbb3Blbiwgb25DbG9zZSwgcmVmXSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBIZWFkZXLvvJrmoIfpopggKyDlia/moIfpopggKyDliLfmlrDmjInpkq5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIFN0YXRzSGVhZGVyKHByb3BzKSB7XG4gIGNvbnN0IHsgYnVzeSwgb25SZWZyZXNoIH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWFkZXInIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhZGVyLXRleHQnIH0sXG4gICAgICBoKCdoMicsIHsgY2xhc3NOYW1lOiAndHNkLXRpdGxlJyB9LCB0KCduYXYnKSksXG4gICAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2Qtc3VidGl0bGUnIH0sIHQoJ3N1YnRpdGxlJykpKSxcbiAgICBoKCdidXR0b24nLCB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogJ3RzZC1pY29uLWJ0bicgKyAoYnVzeSA/ICcgdHNkLXNwaW5uaW5nJyA6ICcnKSxcbiAgICAgIG9uQ2xpY2s6IG9uUmVmcmVzaCxcbiAgICAgIHRpdGxlOiB0KCdyZWZyZXNoJyksXG4gICAgICAnYXJpYS1sYWJlbCc6IHQoJ3JlZnJlc2gnKSxcbiAgICB9LCBoKFN2Z0ljb24sIHsgbmFtZTogJ3JlZnJlc2gnIH0pKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDoh6rlrprkuYnml6XmnJ/ojIPlm7Tmta7lsYJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIEN1c3RvbVJhbmdlUG9wb3Zlcihwcm9wcykge1xuICBjb25zdCB7IGN1c3RvbSwgb25BcHBseSwgb25DbG9zZSB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICBjb25zdCBbZnJvbSwgc2V0RnJvbV0gPSBSZWFjdC51c2VTdGF0ZShjdXN0b20uZnJvbSlcbiAgY29uc3QgW3RvLCBzZXRUb10gPSBSZWFjdC51c2VTdGF0ZShjdXN0b20udG8pXG4gIGNvbnN0IGludmFsaWQgPSAhZnJvbSB8fCAhdG8gfHwgZnJvbSA+IHRvXG4gIC8vIFAyLTEx77yaZGlhbG9nIOS7pSBFc2NhcGUg5YWz6ZetXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZnVuY3Rpb24gb25LZXkoZSkge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyB8fCBlLmtleSA9PT0gJ0VzYycpIG9uQ2xvc2UoKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXkpXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSlcbiAgfSwgW29uQ2xvc2VdKVxuICByZXR1cm4gaCgnZGl2Jywge1xuICAgIGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyIHRzZC1yYW5nZS1wb3BvdmVyJyxcbiAgICByb2xlOiAnZGlhbG9nJyxcbiAgICAnYXJpYS1sYWJlbCc6IHQoJ2N1c3RvbVJhbmdlQXJpYScpLFxuICB9LFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXItdGl0bGUnIH0sIHQoJ2N1c3RvbVJhbmdlVGl0bGUnKSksXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcmFuZ2UtZmllbGRzJyB9LFxuICAgICAgaCgnbGFiZWwnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZCcgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWZpZWxkLWxhYmVsJyB9LCB0KCdzdGFydFRpbWUnKSksXG4gICAgICAgIGgoJ2lucHV0Jywge1xuICAgICAgICAgIHR5cGU6ICdkYXRlJywgdmFsdWU6IGZyb20sICdhcmlhLWxhYmVsJzogdCgnc3RhcnRUaW1lJyksXG4gICAgICAgICAgb25DaGFuZ2U6IChlKSA9PiBzZXRGcm9tKGUudGFyZ2V0LnZhbHVlKSxcbiAgICAgICAgfSkpLFxuICAgICAgaCgnbGFiZWwnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZCcgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWZpZWxkLWxhYmVsJyB9LCB0KCdlbmRUaW1lJykpLFxuICAgICAgICBoKCdpbnB1dCcsIHtcbiAgICAgICAgICB0eXBlOiAnZGF0ZScsIHZhbHVlOiB0bywgJ2FyaWEtbGFiZWwnOiB0KCdlbmRUaW1lJyksXG4gICAgICAgICAgb25DaGFuZ2U6IChlKSA9PiBzZXRUbyhlLnRhcmdldC52YWx1ZSksXG4gICAgICAgIH0pKSksXG4gICAgaW52YWxpZFxuICAgICAgPyBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZmllbGQtZXJyb3InLCByb2xlOiAnYWxlcnQnIH0sIHQoJ3JhbmdlSW52YWxpZCcpKVxuICAgICAgOiBudWxsLFxuICAgIGgoJ3AnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZC1oaW50JyB9LCB0KCdyYW5nZUhpbnQnKSksXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcG9wb3Zlci1hY3Rpb25zJyB9LFxuICAgICAgaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3NOYW1lOiAndHNkLWJ0biB0c2QtYnRuLWdob3N0Jywgb25DbGljazogb25DbG9zZSB9LCB0KCdjYW5jZWwnKSksXG4gICAgICBoKCdidXR0b24nLCB7XG4gICAgICAgIHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6ICd0c2QtYnRuIHRzZC1idG4tcHJpbWFyeScsXG4gICAgICAgIGRpc2FibGVkOiBpbnZhbGlkLFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7IGlmICghaW52YWxpZCkgb25BcHBseSh7IGZyb20sIHRvIH0pIH0sXG4gICAgICB9LCB0KCdjb25maXJtJykpKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDmqKHlnovlpJrpgInkuIvmi4lcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIE1vZGVsRHJvcGRvd24ocHJvcHMpIHtcbiAgY29uc3QgeyBvcHRpb25zLCBzZWxlY3RlZCwgb25DaGFuZ2UgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtxdWVyeSwgc2V0UXVlcnldID0gUmVhY3QudXNlU3RhdGUoJycpXG4gIGNvbnN0IGFuY2hvclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaGFuZGxlcihlKSB7XG4gICAgICBpZiAoYW5jaG9yUmVmLmN1cnJlbnQgJiYgIWFuY2hvclJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgc2V0T3BlbihmYWxzZSlcbiAgICB9XG4gICAgZnVuY3Rpb24gb25LZXkoZSkge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyB8fCBlLmtleSA9PT0gJ0VzYycpIHNldE9wZW4oZmFsc2UpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXkpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSlcbiAgICB9XG4gIH0sIFtvcGVuXSlcblxuICAvLyDlj6rliJflh7rlvZPliY3ojIPlm7TmnInmlbDmja7nmoTmqKHlnovvvJvlt7LpgInkvYbmjonlh7rlgJnpgInliJfooajnmoTjgIzooaXlm57jgI3vvIzkv53or4Hlj6/muLLmn5PjgIHlj6/muIXpmaRcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKG9wdGlvbnMgfHwgW10pLm1hcCgobSkgPT4gbS5wcm92aWRlciArICcvJyArIG0ubW9kZWwpKVxuICAgIDsoc2VsZWN0ZWQgfHwgW10pLmZvckVhY2goKG0pID0+IHNldC5hZGQobSkpXG4gICAgY29uc3QgbGlzdCA9IEFycmF5LmZyb20oc2V0KVxuICAgIGxpc3Quc29ydCgpXG4gICAgcmV0dXJuIGxpc3RcbiAgfSwgW29wdGlvbnMsIHNlbGVjdGVkXSlcblxuICBjb25zdCBxID0gcXVlcnkudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgY29uc3QgZmlsdGVyZWQgPSBxID09PSAnJyA/IGNhbmRpZGF0ZXMgOiBjYW5kaWRhdGVzLmZpbHRlcigoYykgPT4gYy50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2YocSkgPj0gMClcbiAgY29uc3QgbGFiZWwgPSBzZWxlY3RlZC5sZW5ndGggPT09IDAgPyB0KCdhbGxNb2RlbHMnKSA6IHQoJ3NlbGVjdGVkTW9kZWxzJywgeyBjb3VudDogc2VsZWN0ZWQubGVuZ3RoIH0pXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXItYW5jaG9yJywgcmVmOiBhbmNob3JSZWYgfSxcbiAgICBoKCdidXR0b24nLCB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogJ3RzZC1zZWxlY3QtYnRuJyArIChzZWxlY3RlZC5sZW5ndGggPiAwID8gJyB0c2Qtc2VsZWN0LWhhcycgOiAnJyksXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7IHNldE9wZW4oKHYpID0+ICF2KTsgc2V0UXVlcnkoJycpIH0sXG4gICAgICAnYXJpYS1leHBhbmRlZCc6IG9wZW4sXG4gICAgICAnYXJpYS1oYXNwb3B1cCc6ICdsaXN0Ym94JyxcbiAgICAgIHRpdGxlOiBsYWJlbCxcbiAgICB9LFxuICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXNlbGVjdC1sYWJlbCcgfSwgbGFiZWwpLFxuICAgICAgaChTdmdJY29uLCB7IG5hbWU6ICdjaGV2cm9uJywgc2l6ZTogMTQsIGNsYXNzTmFtZTogJ3RzZC1jaGV2cm9uJyArIChvcGVuID8gJyB0c2QtY2hldnJvbi1vcGVuJyA6ICcnKSB9KSksXG4gICAgb3BlblxuICAgICAgPyBoKCdkaXYnLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXIgdHNkLW1vZGVsLXBvcG92ZXInLFxuICAgICAgICAgIHJvbGU6ICdsaXN0Ym94JyxcbiAgICAgICAgICAnYXJpYS1sYWJlbCc6IHQoJ21vZGVsRmlsdGVyR3JvdXAnKSxcbiAgICAgICAgICAnYXJpYS1tdWx0aXNlbGVjdGFibGUnOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXItdG9vbHMnIH0sXG4gICAgICAgICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6ICd0c2QtbGluay1idG4nLCBvbkNsaWNrOiAoKSA9PiBvbkNoYW5nZShjYW5kaWRhdGVzLnNsaWNlKCkpIH0sIHQoJ3NlbGVjdEFsbCcpKSxcbiAgICAgICAgICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1saW5rLWJ0bicsIG9uQ2xpY2s6ICgpID0+IG9uQ2hhbmdlKFtdKSB9LCB0KCdjbGVhcicpKSksXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2VhcmNoJyB9LFxuICAgICAgICAgICAgaChTdmdJY29uLCB7IG5hbWU6ICdzZWFyY2gnLCBzaXplOiAxNCwgY2xhc3NOYW1lOiAndHNkLXNlYXJjaC1pY29uJyB9KSxcbiAgICAgICAgICAgIGgoJ2lucHV0Jywge1xuICAgICAgICAgICAgICB0eXBlOiAnc2VhcmNoJywgdmFsdWU6IHF1ZXJ5LCBwbGFjZWhvbGRlcjogdCgnc2VhcmNoTW9kZWxzJyksXG4gICAgICAgICAgICAgICdhcmlhLWxhYmVsJzogdCgnc2VhcmNoTW9kZWxzJyksXG4gICAgICAgICAgICAgIG9uQ2hhbmdlOiAoZSkgPT4gc2V0UXVlcnkoZS50YXJnZXQudmFsdWUpLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLW1vZGVsLWxpc3QnIH0sXG4gICAgICAgICAgICBmaWx0ZXJlZC5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgPyBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtcG9wb3Zlci1lbXB0eScgfSwgdCgnbm9NYXRjaE1vZGVscycpKVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBmaWx0ZXJlZC5tYXAoKGtleSkgPT5cbiAgICAgICAgICAgICAgaCgnbGFiZWwnLCB7IGtleSwgY2xhc3NOYW1lOiAndHNkLW1vZGVsLWl0ZW0nIH0sXG4gICAgICAgICAgICAgICAgaCgnaW5wdXQnLCB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICAgICAgY2hlY2tlZDogc2VsZWN0ZWQuaW5kZXhPZihrZXkpID49IDAsXG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZTogKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHNlbGVjdGVkLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC5pbmRleE9mKGtleSkgPCAwKSBuZXh0LnB1c2goa2V5KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXh0LmluZGV4T2Yoa2V5KVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IDApIG5leHQuc3BsaWNlKGksIDEpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UobmV4dCkgLy8g5Yu+6YCJ5Y2z5pe255Sf5pWIXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1tb2RlbC1uYW1lJywgdGl0bGU6IGtleSB9LCBrZXkpKSkpLFxuICAgICAgICAgIGgoJ3AnLCB7IGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyLW5vdGUnIH0sIHQoJ21vZGVsRmlsdGVySGludCcpKSlcbiAgICAgIDogbnVsbClcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDnrZvpgInmoI/vvJrml6XmnJ/pooTorr7vvIjliIbmrrXmjInpkq7vvIkrIOiHquWumuS5iea1ruWxgiArIOaooeWei+WkmumAiVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gRmlsdGVyQmFyKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICByYW5nZSwgY3VzdG9tLCBtb2RlbHMsIGN1c3RvbU9wZW4sIG1vZGVsT3B0aW9ucyxcbiAgICBvblByZXNldCwgb25DdXN0b21PcGVuLCBvbkN1c3RvbUFwcGx5LCBvbkN1c3RvbUNsb3NlLCBvbk1vZGVsc0NoYW5nZSxcbiAgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3Qgc2VnUmVmID0gUmVhY3QudXNlUmVmKG51bGwpXG4gIHVzZU91dHNpZGVDbGljayhjdXN0b21PcGVuLCBzZWdSZWYsIG9uQ3VzdG9tQ2xvc2UpXG5cbiAgY29uc3QgY3VzdG9tTGFiZWwgPSBmbXREYXRlU2xhc2goY3VzdG9tLmZyb20pICsgJyAtICcgKyBmbXREYXRlU2xhc2goY3VzdG9tLnRvKVxuICBjb25zdCBwcmVzZXRzID0gW1xuICAgIHsga2V5OiAndG9kYXknLCBsYWJlbDogdCgndG9kYXknKSB9LFxuICAgIHsga2V5OiAnN2QnLCBsYWJlbDogdCgnbGFzdDdkJykgfSxcbiAgICB7IGtleTogJzMwZCcsIGxhYmVsOiB0KCdsYXN0MzBkJykgfSxcbiAgICB7IGtleTogJ2N1c3RvbScsIGxhYmVsOiB0KCdjdXN0b20nKSB9LFxuICBdXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWZpbHRlcmJhcicgfSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1zZWctd3JhcCcsIHJlZjogc2VnUmVmIH0sXG4gICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1zZWcnLCByb2xlOiAnZ3JvdXAnLCAnYXJpYS1sYWJlbCc6IHQoJ2RhdGVSYW5nZUdyb3VwJykgfSxcbiAgICAgICAgcHJlc2V0cy5tYXAoKHApID0+IHtcbiAgICAgICAgICBjb25zdCBhY3RpdmUgPSByYW5nZSA9PT0gcC5rZXlcbiAgICAgICAgICBjb25zdCBpc0N1c3RvbSA9IHAua2V5ID09PSAnY3VzdG9tJ1xuICAgICAgICAgIGNvbnN0IGxhYmVsID0gaXNDdXN0b20gJiYgYWN0aXZlID8gY3VzdG9tTGFiZWwgOiBwLmxhYmVsXG4gICAgICAgICAgcmV0dXJuIGgoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgIGtleTogcC5rZXksXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1zZWctYnRuJyArIChhY3RpdmUgPyAnIHRzZC1zZWctYWN0aXZlJyA6ICcnKSArIChpc0N1c3RvbSA/ICcgdHNkLXNlZy1jdXN0b20nIDogJycpLFxuICAgICAgICAgICAgJ2FyaWEtcHJlc3NlZCc6IGFjdGl2ZSxcbiAgICAgICAgICAgIHRpdGxlOiBpc0N1c3RvbSAmJiBhY3RpdmUgPyBjdXN0b21MYWJlbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHsgaWYgKGlzQ3VzdG9tKSBvbkN1c3RvbU9wZW4oIWN1c3RvbU9wZW4pOyBlbHNlIG9uUHJlc2V0KHAua2V5KSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2Qtc2VnLWxhYmVsJyB9LCBsYWJlbCkpXG4gICAgICAgIH0pKSxcbiAgICAgIGN1c3RvbU9wZW4gPyBoKEN1c3RvbVJhbmdlUG9wb3ZlciwgeyBjdXN0b20sIG9uQXBwbHk6IG9uQ3VzdG9tQXBwbHksIG9uQ2xvc2U6IG9uQ3VzdG9tQ2xvc2UgfSkgOiBudWxsKSxcbiAgICBoKE1vZGVsRHJvcGRvd24sIHsgb3B0aW9uczogbW9kZWxPcHRpb25zLCBzZWxlY3RlZDogbW9kZWxzLCBvbkNoYW5nZTogb25Nb2RlbHNDaGFuZ2UgfSkpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5rGH5oC75oyH5qCH5Y2hIMOXNVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gU3VtbWFyeUNhcmRzKHByb3BzKSB7XG4gIGNvbnN0IHsgdG90YWwsIGN1cnJlbmN5LCB1bnByaWNlZENhbGxzIH0gPSBwcm9wc1xuICBjb25zdCB0dCA9IHVzZVQoKVxuICBjb25zdCBkID0gdG90YWwgfHwge31cbiAgY29uc3QgaW5wdXRUb3RhbCA9IChkLmlucHV0VG9rZW5zIHx8IDApICsgKGQuY2FjaGVSZWFkVG9rZW5zIHx8IDApICsgKGQuY2FjaGVXcml0ZVRva2VucyB8fCAwKVxuICBjb25zdCBjYXJkcyA9IFtcbiAgICB7XG4gICAgICBrZXk6ICd0b3RhbCcsIGljb246ICdsYXllcnMnLCBsYWJlbDogdHQoJ3RvdGFsVG9rZW5zJyksXG4gICAgICB2YWx1ZTogZm9ybWF0VG9rZW5zU2hvcnQoZC50b3RhbFRva2VucyksIHRpdGxlOiBmb3JtYXRJbnQoZC50b3RhbFRva2VucyksXG4gICAgICBzdWI6IHR0KCdhcHByb3hJTycpLCBjb2xvcjogJ3ZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KScsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdpbnB1dCcsIGljb246ICdkb3duJywgbGFiZWw6IHR0KCdpbnB1dFRva2VucycpLFxuICAgICAgdmFsdWU6IGZvcm1hdFRva2Vuc1Nob3J0KGlucHV0VG90YWwpLCB0aXRsZTogZm9ybWF0SW50KGlucHV0VG90YWwpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCknLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnb3V0cHV0JywgaWNvbjogJ3VwJywgbGFiZWw6IHR0KCdvdXRwdXRUb2tlbnMnKSxcbiAgICAgIHZhbHVlOiBmb3JtYXRUb2tlbnNTaG9ydChkLm91dHB1dFRva2VucyksIHRpdGxlOiBmb3JtYXRJbnQoZC5vdXRwdXRUb2tlbnMpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCknLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnY2FsbHMnLCBpY29uOiAnYWN0aXZpdHknLCBsYWJlbDogdHQoJ2NhbGxzJyksXG4gICAgICB2YWx1ZTogZm9ybWF0SW50KGQuY2FsbHMpLCB0aXRsZTogZm9ybWF0SW50KGQuY2FsbHMpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCknLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnY29zdCcsIGljb246ICdjb2lucycsIGxhYmVsOiB0dCgnY29zdCcpLFxuICAgICAgdmFsdWU6IGZvcm1hdENvc3QoZC5jb3N0LCBjdXJyZW5jeSksIHRpdGxlOiBmb3JtYXRDb3N0KGQuY29zdCwgY3VycmVuY3kpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCknLFxuICAgIH0sXG4gIF1cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmRzJyB9LFxuICAgIGNhcmRzLm1hcCgoYykgPT5cbiAgICAgIGgoJ2RpdicsIHsga2V5OiBjLmtleSwgY2xhc3NOYW1lOiAndHNkLWNhcmQnIH0sXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtaGVhZCcgfSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1pY29uJywgc3R5bGU6IHsgY29sb3I6IGMuY29sb3IgfSB9LFxuICAgICAgICAgICAgaChTdmdJY29uLCB7IG5hbWU6IGMuaWNvbiwgc2l6ZTogMTQgfSkpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWxhYmVsJyB9LCBjLmxhYmVsKSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdmFsdWUnLCB0aXRsZTogYy50aXRsZSB9LCBjLnZhbHVlKSxcbiAgICAgICAgYy5zdWIgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXN1YicgfSwgYy5zdWIpIDogbnVsbCxcbiAgICAgICAgYy5rZXkgPT09ICdjb3N0JyAmJiB1bnByaWNlZENhbGxzID4gMFxuICAgICAgICAgID8gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1ub3RlJyB9LCB0dCgndW5wcmljZWROb3RlJywgeyBjb3VudDogZm9ybWF0SW50KHVucHJpY2VkQ2FsbHMpIH0pKVxuICAgICAgICAgIDogbnVsbCkpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOavj+aXpeeUqOmHj+afseeKtuWbvu+8iOaJi+WGmSBkaXYg5aCG5Y+g5p+x77ya5LiL5q616L6T5YWl6JOdIC8g5LiK5q616L6T5Ye657u/77yJXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBEYWlseUNoYXJ0KHByb3BzKSB7XG4gIGNvbnN0IHsgZGFpbHksIGdyYW4sIHN0ZXBEYXlzLCBncmFuTGFiZWwgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgY2hhcnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbClcbiAgY29uc3QgW3RpcCwgc2V0VGlwXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpIC8vIHsgcm93LCB4IH1cbiAgY29uc3QgW3ZpZXcsIHNldFZpZXddID0gUmVhY3QudXNlU3RhdGUoJ2JhcicpIC8vIGJhciB8IGxpbmVcbiAgY29uc3Qgcm93cyA9IGRhaWx5IHx8IFtdXG5cbiAgY29uc3QgaW5PZiA9IChyKSA9PiAoci5pbnB1dFRva2VucyB8fCAwKSArIChyLmNhY2hlUmVhZFRva2VucyB8fCAwKSArIChyLmNhY2hlV3JpdGVUb2tlbnMgfHwgMClcbiAgY29uc3Qgb3V0T2YgPSAocikgPT4gci5vdXRwdXRUb2tlbnMgfHwgMFxuICBjb25zdCB0b3RPZiA9IChyKSA9PiByLnRvdGFsVG9rZW5zIHx8IDBcblxuICBpZiAocm93cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZCB0c2QtY2hhcnQtY2FyZCcgfSxcbiAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtaGVhZGVyJyB9LFxuICAgICAgICBoKCdoMycsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdGl0bGUnIH0sIHQoJ2RhaWx5VHJlbmQnKSksXG4gICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRhZycgfSwgdCgnbm9EYXRhJykpKSxcbiAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWVtcHR5LWJsb2NrJyB9LCB0KCdub0RhdGEnKSkpXG4gIH1cblxuICBjb25zdCBtYXggPSBNYXRoLm1heCgxLCAuLi5yb3dzLm1hcCgoZCkgPT4gZC50b3RhbFRva2VucyB8fCAwKSlcbiAgY29uc3QgbGFiZWxFdmVyeSA9IHJvd3MubGVuZ3RoID4gMjggPyA0IDogcm93cy5sZW5ndGggPiAxNCA/IDIgOiAxXG4gIGNvbnN0IGZpcnN0TGFiZWwgPSB4TGFiZWwocm93c1swXS5rZXksIGdyYW4pXG4gIGNvbnN0IGxhc3RMYWJlbCA9IHhMYWJlbChyb3dzW3Jvd3MubGVuZ3RoIC0gMV0ua2V5LCBncmFuKVxuICBjb25zdCByYW5nZUxhYmVsID0gZmlyc3RMYWJlbCArICcgLSAnICsgbGFzdExhYmVsXG5cbiAgZnVuY3Rpb24gc2hvd1RpcChlLCByb3cpIHtcbiAgICBjb25zdCBjaGFydFJlY3QgPSBjaGFydFJlZi5jdXJyZW50ID8gY2hhcnRSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGxcbiAgICBpZiAoIWNoYXJ0UmVjdCkgcmV0dXJuXG4gICAgY29uc3QgZWxSZWN0ID0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgeCA9IE1hdGgubWluKE1hdGgubWF4KGVsUmVjdC5sZWZ0ICsgZWxSZWN0LndpZHRoIC8gMiAtIGNoYXJ0UmVjdC5sZWZ0LCA3MiksIGNoYXJ0UmVjdC53aWR0aCAtIDcyKVxuICAgIHNldFRpcCh7IHJvdywgeCB9KVxuICB9XG5cbiAgY29uc3Qgdmlld1N3aXRjaGVyID0gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtZ3JhbicsIHJvbGU6ICdncm91cCcsICdhcmlhLWxhYmVsJzogdCgnY2hhcnRUeXBlR3JvdXAnKSB9LFxuICAgIGgoJ2J1dHRvbicsIHtcbiAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgY2xhc3NOYW1lOiAndHNkLWdyYW4tYnRuJyxcbiAgICAgICdkYXRhLWFjdGl2ZSc6IHZpZXcgPT09ICdiYXInID8gJ3RydWUnIDogdW5kZWZpbmVkLFxuICAgICAgb25DbGljazogKCkgPT4geyBzZXRUaXAobnVsbCk7IHNldFZpZXcoJ2JhcicpIH0sXG4gICAgfSwgdCgnYmFyVmlldycpKSxcbiAgICBoKCdidXR0b24nLCB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogJ3RzZC1ncmFuLWJ0bicsXG4gICAgICAnZGF0YS1hY3RpdmUnOiB2aWV3ID09PSAnbGluZScgPyAndHJ1ZScgOiB1bmRlZmluZWQsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7IHNldFRpcChudWxsKTsgc2V0VmlldygnbGluZScpIH0sXG4gICAgfSwgdCgnbGluZVZpZXcnKSkpXG5cbiAgY29uc3QgYmFyVGlwID0gdGlwXG4gICAgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwJywgc3R5bGU6IHsgbGVmdDogdGlwLnggKyAncHgnIH0gfSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1kYXRlJyB9LCB0aXAucm93LmtleSArICcgJyArIHdlZWtkYXlOYW1lKHRpcC5yb3cua2V5LCB0KSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCB0c2QtbGVnZW5kLWluJyB9KSxcbiAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbGVnZW5kSW5wdXQnKSksXG4gICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBmb3JtYXRJbnQoaW5PZih0aXAucm93KSkpKSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1yb3cnIH0sXG4gICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZG90IHRzZC1sZWdlbmQtb3V0JyB9KSxcbiAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbGVnZW5kT3V0cHV0JykpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KG91dE9mKHRpcC5yb3cpKSkpLFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXRvdGFsJyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCd0b29sdGlwVG90YWwnKSksXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIGZvcm1hdEludCh0b3RPZih0aXAucm93KSkpKSlcbiAgICA6IG51bGxcblxuICBjb25zdCBib2R5ID0gdmlldyA9PT0gJ2xpbmUnXG4gICAgPyBoKExpbmVDaGFydCwgeyByb3dzLCBncmFuLCBzdGVwRGF5cywgc2hvd1RpcCwgdGlwLCBzZXRUaXAsIGNoYXJ0UmVmIH0pXG4gICAgOiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jaGFydCcsIHJlZjogY2hhcnRSZWYgfSxcbiAgICAgICAgcm93cy5tYXAoKHJvdywgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGluVCA9IGluT2Yocm93KVxuICAgICAgICAgIGNvbnN0IG91dFQgPSBvdXRPZihyb3cpXG4gICAgICAgICAgY29uc3QgdG90VCA9IHRvdE9mKHJvdylcbiAgICAgICAgICBjb25zdCBwY3RJbiA9IChpblQgLyBtYXgpICogMTAwXG4gICAgICAgICAgY29uc3QgcGN0T3V0ID0gKG91dFQgLyBtYXgpICogMTAwXG4gICAgICAgICAgY29uc3Qgc2hvd0xhYmVsID0gaSAlIGxhYmVsRXZlcnkgPT09IDAgfHwgaSA9PT0gcm93cy5sZW5ndGggLSAxXG4gICAgICAgICAgcmV0dXJuIGgoJ2RpdicsIHtcbiAgICAgICAgICAgIGtleTogcm93LmtleSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1jaGFydC1jb2wnLFxuICAgICAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgICAgICBvbk1vdXNlRW50ZXI6IChlKSA9PiBzaG93VGlwKGUsIHJvdyksXG4gICAgICAgICAgICBvbk1vdXNlTGVhdmU6ICgpID0+IHNldFRpcChudWxsKSxcbiAgICAgICAgICAgIG9uRm9jdXM6IChlKSA9PiBzaG93VGlwKGUsIHJvdyksXG4gICAgICAgICAgICBvbkJsdXI6ICgpID0+IHNldFRpcChudWxsKSxcbiAgICAgICAgICAgICdhcmlhLWxhYmVsJzogdCgnYmFyQXJpYScsIHsga2V5OiByb3cua2V5LCBpbjogZm9ybWF0SW50KGluVCksIG91dDogZm9ybWF0SW50KG91dFQpLCB0b3Q6IGZvcm1hdEludCh0b3RUKSB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2hhcnQtcGxvdCcgfSxcbiAgICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2hhcnQtc3RhY2snIH0sXG4gICAgICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2hhcnQtc2VnIHRzZC1zZWctb3V0Jywgc3R5bGU6IHsgaGVpZ2h0OiBwY3RPdXQgKyAnJScgfSB9KSxcbiAgICAgICAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jaGFydC1zZWcgdHNkLXNlZy1pbicsIHN0eWxlOiB7IGhlaWdodDogcGN0SW4gKyAnJScgfSB9KSkpLFxuICAgICAgICAgICAgaCgnc3BhbicsIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndHNkLWNoYXJ0LWxhYmVsJyArIChzaG93TGFiZWwgPyAnJyA6ICcgdHNkLWNoYXJ0LWxhYmVsLWhpZGRlbicpLFxuICAgICAgICAgICAgfSwgeExhYmVsKHJvdy5rZXksIGdyYW4pKSlcbiAgICAgICAgfSksXG4gICAgICAgIGJhclRpcClcblxuICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZCB0c2QtY2hhcnQtY2FyZCcgfSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWhlYWRlcicgfSxcbiAgICAgIGgoJ2gzJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC10aXRsZScgfSwgdCgnZGFpbHlUcmVuZCcpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWFjdGlvbnMnIH0sXG4gICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRhZycgfSwgZ3JhbkxhYmVsICsgJyDCtyAnICsgcmFuZ2VMYWJlbCksXG4gICAgICAgIHZpZXdTd2l0Y2hlcikpLFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZCcgfSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1sZWdlbmQtaXRlbScgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZC1kb3QgdHNkLWxlZ2VuZC1pbicgfSksIHQoJ2xlZ2VuZElucHV0JykpLFxuICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZC1pdGVtJyB9LFxuICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtbGVnZW5kLWRvdCB0c2QtbGVnZW5kLW91dCcgfSksIHQoJ2xlZ2VuZE91dHB1dCcpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1sZWdlbmQtaXRlbScgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZC1kb3QgdHNkLWxlZ2VuZC10b3RhbCcgfSksIHQoJ2xlZ2VuZFRvdGFsJykpKSxcbiAgICBib2R5KVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOaKmOe6v+Wbvu+8iFNWR++8mui+k+WFpSAvIOi+k+WHuiAvIOaAuyBUb2tlbu+8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLyoqIENhdG11bGwtUm9tIC0+IGN1YmljIGJlemllciBzbW9vdGggcGF0aCB0aHJvdWdoIHRoZSBnaXZlbiBwb2ludHMuICovXG5mdW5jdGlvbiBzbW9vdGhQYXRoKHB0cykge1xuICBpZiAoIXB0cyB8fCBwdHMubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIGNvbnN0IGYgPSAodikgPT4gTWF0aC5yb3VuZCh2ICogMTAwKSAvIDEwMFxuICBsZXQgZCA9ICdNICcgKyBmKHB0c1swXS54KSArICcgJyArIGYocHRzWzBdLnkpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IHAwID0gcHRzW2kgLSAxXSB8fCBwdHNbaV1cbiAgICBjb25zdCBwMSA9IHB0c1tpXVxuICAgIGNvbnN0IHAyID0gcHRzW2kgKyAxXVxuICAgIGNvbnN0IHAzID0gcHRzW2kgKyAyXSB8fCBwMlxuICAgIGNvbnN0IGMxeCA9IHAxLnggKyAocDIueCAtIHAwLngpIC8gNlxuICAgIGNvbnN0IGMxeSA9IHAxLnkgKyAocDIueSAtIHAwLnkpIC8gNlxuICAgIGNvbnN0IGMyeCA9IHAyLnggLSAocDMueCAtIHAxLngpIC8gNlxuICAgIGNvbnN0IGMyeSA9IHAyLnkgLSAocDMueSAtIHAxLnkpIC8gNlxuICAgIGQgKz0gJyBDICcgKyBmKGMxeCkgKyAnICcgKyBmKGMxeSkgKyAnLCAnICsgZihjMngpICsgJyAnICsgZihjMnkpICsgJywgJyArIGYocDIueCkgKyAnICcgKyBmKHAyLnkpXG4gIH1cbiAgcmV0dXJuIGRcbn1cblxuZnVuY3Rpb24gTGluZUNoYXJ0KHByb3BzKSB7XG4gIGNvbnN0IHsgcm93cywgZ3Jhbiwgc3RlcERheXMsIHNob3dUaXAsIHRpcCwgc2V0VGlwLCBjaGFydFJlZiB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICBjb25zdCBXID0gNjIwXG4gIGNvbnN0IEggPSAyNDBcbiAgY29uc3QgUEFEID0geyB0OiAxNCwgcjogMTQsIGI6IDI2LCBsOiA0OCB9XG4gIGNvbnN0IGlubmVyVyA9IFcgLSBQQUQubCAtIFBBRC5yXG4gIGNvbnN0IGlubmVySCA9IEggLSBQQUQudCAtIFBBRC5iXG4gIGNvbnN0IG4gPSByb3dzLmxlbmd0aFxuXG4gIGNvbnN0IGluT2YgPSAocikgPT4gKHIuaW5wdXRUb2tlbnMgfHwgMCkgKyAoci5jYWNoZVJlYWRUb2tlbnMgfHwgMCkgKyAoci5jYWNoZVdyaXRlVG9rZW5zIHx8IDApXG4gIGNvbnN0IG91dE9mID0gKHIpID0+IHIub3V0cHV0VG9rZW5zIHx8IDBcbiAgY29uc3QgdG90T2YgPSAocikgPT4gci50b3RhbFRva2VucyB8fCAwXG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KDEsIC4uLnJvd3MubWFwKChkKSA9PiBkLnRvdGFsVG9rZW5zIHx8IDApKVxuICBjb25zdCBuaWNlTWF4ID0gbmljZUNlaWwobWF4KVxuXG4gIGNvbnN0IHggPSAoaSkgPT4gUEFELmwgKyAobiA9PT0gMSA/IGlubmVyVyAvIDIgOiAoaSAvIChuIC0gMSkpICogaW5uZXJXKVxuICBjb25zdCB5ID0gKHYpID0+IFBBRC50ICsgaW5uZXJIIC0gKHYgLyBuaWNlTWF4KSAqIGlubmVySFxuICBjb25zdCBjb2xXID0gaW5uZXJXIC8gblxuXG4gIC8vIEhvdmVyIHN0YXRlOiBwaXhlbCB4IGZvciB0aGUgdG9vbHRpcCwgdmlld0JveCB4IGZvciB0aGUgY3Vyc29yICsgZG90cy5cbiAgZnVuY3Rpb24gc2hvd1RpcExpbmUoZSwgcm93KSB7XG4gICAgY29uc3QgcmVjdCA9IGNoYXJ0UmVmLmN1cnJlbnQgPyBjaGFydFJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbFxuICAgIGlmICghcmVjdCB8fCByZWN0LndpZHRoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCBlbFJlY3QgPSBlLmN1cnJlbnRUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCB4UHggPSBlbFJlY3QubGVmdCArIGVsUmVjdC53aWR0aCAvIDIgLSByZWN0LmxlZnRcbiAgICBjb25zdCBzdmdYID0gKHhQeCAvIHJlY3Qud2lkdGgpICogV1xuICAgIGNvbnN0IHggPSBNYXRoLm1pbihNYXRoLm1heCh4UHgsIDcyKSwgcmVjdC53aWR0aCAtIDcyKVxuICAgIHNldFRpcCh7IHJvdywgeCwgc3ZnWCB9KVxuICB9XG4gIGNvbnN0IHRyb3cgPSB0aXAgPyB0aXAucm93IDogbnVsbFxuICBjb25zdCBjdXJzb3IgPSB0aXBcbiAgICA/IGgoJ2xpbmUnLCB7XG4gICAgICAgIGtleTogJ2N1cnNvcicsXG4gICAgICAgIGNsYXNzTmFtZTogJ3RzZC1saW5lLWN1cnNvcicsXG4gICAgICAgIHgxOiB0aXAuc3ZnWCwgeTE6IFBBRC50LCB4MjogdGlwLnN2Z1gsIHkyOiBIIC0gUEFELmIsXG4gICAgICB9KVxuICAgIDogbnVsbFxuICBjb25zdCBkb3RzID0gdGlwXG4gICAgPyBbXG4gICAgICAgIGgoJ2NpcmNsZScsIHsga2V5OiAnaGwtaW4nLCBjbGFzc05hbWU6ICd0c2QtbGluZS1obCB0c2QtbGluZS1obC1pbicsIGN4OiB0aXAuc3ZnWCwgY3k6IHkoaW5PZih0cm93KSksIHI6IDMuNSB9KSxcbiAgICAgICAgaCgnY2lyY2xlJywgeyBrZXk6ICdobC1vdXQnLCBjbGFzc05hbWU6ICd0c2QtbGluZS1obCB0c2QtbGluZS1obC1vdXQnLCBjeDogdGlwLnN2Z1gsIGN5OiB5KG91dE9mKHRyb3cpKSwgcjogMy41IH0pLFxuICAgICAgICBoKCdjaXJjbGUnLCB7IGtleTogJ2hsLXRvdCcsIGNsYXNzTmFtZTogJ3RzZC1saW5lLWhsIHRzZC1saW5lLWhsLXRvdGFsJywgY3g6IHRpcC5zdmdYLCBjeTogeSh0b3RPZih0cm93KSksIHI6IDMuNSB9KSxcbiAgICAgIF1cbiAgICA6IG51bGxcblxuICBjb25zdCBpblB0cyA9IHNtb290aFBhdGgocm93cy5tYXAoKHIsIGkpID0+ICh7IHg6IHgoaSksIHk6IHkoaW5PZihyKSkgfSkpKVxuICBjb25zdCBvdXRQdHMgPSBzbW9vdGhQYXRoKHJvd3MubWFwKChyLCBpKSA9PiAoeyB4OiB4KGkpLCB5OiB5KG91dE9mKHIpKSB9KSkpXG4gIGNvbnN0IHRvdFB0cyA9IHNtb290aFBhdGgocm93cy5tYXAoKHIsIGkpID0+ICh7IHg6IHgoaSksIHk6IHkodG90T2YocikpIH0pKSlcbiAgY29uc3QgZ3JpZEYgPSBbMCwgMC4yNSwgMC41LCAwLjc1LCAxXVxuICBjb25zdCBsYWJlbEV2ZXJ5ID0gcm93cy5sZW5ndGggPiAyOCA/IDQgOiByb3dzLmxlbmd0aCA+IDE0ID8gMiA6IDFcbiAgY29uc3Qgc2hvd0xhYmVsID0gKGkpID0+IGkgJSBsYWJlbEV2ZXJ5ID09PSAwIHx8IGkgPT09IHJvd3MubGVuZ3RoIC0gMVxuXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1saW5lY2hhcnQnLCByZWY6IGNoYXJ0UmVmIH0sXG4gICAgaCgnc3ZnJywgeyB2aWV3Qm94OiAnMCAwICcgKyBXICsgJyAnICsgSCwgcm9sZTogJ2ltZycsICdhcmlhLWxhYmVsJzogdCgnbGluZUNoYXJ0QXJpYScpIH0sXG4gICAgICAvLyBncmlkICsgYXhpc1xuICAgICAgZ3JpZEYubWFwKChmKSA9PlxuICAgICAgICBoKCdsaW5lJywge1xuICAgICAgICAgIGtleTogJ2cnICsgZixcbiAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtbGluZS1ncmlkJyxcbiAgICAgICAgICB4MTogUEFELmwsIHkxOiB5KGYgKiBuaWNlTWF4KSwgeDI6IFcgLSBQQUQuciwgeTI6IHkoZiAqIG5pY2VNYXgpLFxuICAgICAgICB9KSksXG4gICAgICBoKCdsaW5lJywgeyBjbGFzc05hbWU6ICd0c2QtbGluZS1heGlzJywgeDE6IFBBRC5sLCB5MTogUEFELnQsIHgyOiBQQUQubCwgeTI6IEggLSBQQUQuYiB9KSxcbiAgICAgIGgoJ2xpbmUnLCB7IGNsYXNzTmFtZTogJ3RzZC1saW5lLWF4aXMnLCB4MTogUEFELmwsIHkxOiBIIC0gUEFELmIsIHgyOiBXIC0gUEFELnIsIHkyOiBIIC0gUEFELmIgfSksXG4gICAgICAvLyB5IGxhYmVsc1xuICAgICAgZ3JpZEYubWFwKChmKSA9PlxuICAgICAgICBoKCd0ZXh0Jywge1xuICAgICAgICAgIGtleTogJ3l0JyArIGYsXG4gICAgICAgICAgY2xhc3NOYW1lOiAndHNkLWxpbmUtdGV4dCcsXG4gICAgICAgICAgeDogUEFELmwgLSA2LFxuICAgICAgICAgIHk6IHkoZiAqIG5pY2VNYXgpICsgMyxcbiAgICAgICAgICB0ZXh0QW5jaG9yOiAnZW5kJyxcbiAgICAgICAgfSwgZm9ybWF0VG9rZW5zU2hvcnQoZiAqIG5pY2VNYXgpKSksXG4gICAgICAvLyBzZXJpZXMgKHNtb290aCBjdXJ2ZXMpXG4gICAgICBoKCdwYXRoJywgeyBjbGFzc05hbWU6ICd0c2QtbGluZS10b3RhbCcsIGQ6IHRvdFB0cyB9KSxcbiAgICAgIGgoJ3BhdGgnLCB7IGNsYXNzTmFtZTogJ3RzZC1saW5lLWluJywgZDogaW5QdHMgfSksXG4gICAgICBoKCdwYXRoJywgeyBjbGFzc05hbWU6ICd0c2QtbGluZS1vdXQnLCBkOiBvdXRQdHMgfSksXG4gICAgICBjdXJzb3IsXG4gICAgICBkb3RzLFxuICAgICAgLy8geCBsYWJlbHNcbiAgICAgIHJvd3MubWFwKChyLCBpKSA9PlxuICAgICAgICBzaG93TGFiZWwoaSlcbiAgICAgICAgICA/IGgoJ3RleHQnLCB7XG4gICAgICAgICAgICAgIGtleTogJ3hsJyArIGksXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1saW5lLXRleHQnLFxuICAgICAgICAgICAgICB4OiB4KGkpLFxuICAgICAgICAgICAgICB5OiBIIC0gOCxcbiAgICAgICAgICAgICAgdGV4dEFuY2hvcjogaSA9PT0gMCA/ICdzdGFydCcgOiBpID09PSBuIC0gMSA/ICdlbmQnIDogJ21pZGRsZScsXG4gICAgICAgICAgICB9LCB4TGFiZWwoci5rZXksIGdyYW4pKVxuICAgICAgICAgIDogbnVsbCksXG4gICAgICAvLyBob3ZlciB0YXJnZXRzOiBhIGZ1bGwtaGVpZ2h0IGNvbHVtbiBwZXIgYnVja2V0LCBtYXRjaGluZyB0aGUgYmFyIGNoYXJ0IGZlZWxcbiAgICAgIHJvd3MubWFwKChyLCBpKSA9PlxuICAgICAgICBoKCdyZWN0Jywge1xuICAgICAgICAgIGtleTogJ2gnICsgaSxcbiAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtbGluZS1ob3ZlcicsXG4gICAgICAgICAgeDogeChpKSAtIGNvbFcgLyAyLFxuICAgICAgICAgIHk6IFBBRC50LFxuICAgICAgICAgIHdpZHRoOiBjb2xXLFxuICAgICAgICAgIGhlaWdodDogaW5uZXJILFxuICAgICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICAgIG9uTW91c2VFbnRlcjogKGUpID0+IHNob3dUaXBMaW5lKGUsIHIpLFxuICAgICAgICAgIG9uTW91c2VMZWF2ZTogKCkgPT4gc2V0VGlwKG51bGwpLFxuICAgICAgICAgIG9uRm9jdXM6IChlKSA9PiBzaG93VGlwTGluZShlLCByKSxcbiAgICAgICAgICBvbkJsdXI6ICgpID0+IHNldFRpcChudWxsKSxcbiAgICAgICAgfSkpLFxuICAgICAgLy8gdmlzaWJsZSBkb3RzIG9uIHNwYXJzZSBwb2ludHNcbiAgICAgIHJvd3MubWFwKChyLCBpKSA9PlxuICAgICAgICBpICUgbGFiZWxFdmVyeSA9PT0gMCB8fCBpID09PSBuIC0gMVxuICAgICAgICAgID8gaCgnY2lyY2xlJywge1xuICAgICAgICAgICAgICBrZXk6ICdkJyArIGksXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1saW5lLWRvdCcsXG4gICAgICAgICAgICAgIGN4OiB4KGkpLFxuICAgICAgICAgICAgICBjeTogeSh0b3RPZihyKSksXG4gICAgICAgICAgICAgIHI6IDIuNSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBudWxsKSksXG4gICAgdGlwXG4gICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAnLCBzdHlsZTogeyBsZWZ0OiB0aXAueCArICdweCcgfSB9LFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZGF0ZScgfSwgdGlwLnJvdy5rZXkgKyAoc3RlcERheXMgPiAxID8gJyAnICsgdCgnc3RhcnRORGF5cycsIHsgbjogc3RlcERheXMgfSkgOiAnJykgKyAnICcgKyB3ZWVrZGF5TmFtZSh0aXAucm93LmtleSwgdCkpLFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZG90IHRzZC1sZWdlbmQtaW4nIH0pLFxuICAgICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ2xlZ2VuZElucHV0JykpLFxuICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBmb3JtYXRJbnQoaW5PZih0aXAucm93KSkpKSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXJvdycgfSxcbiAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCB0c2QtbGVnZW5kLW91dCcgfSksXG4gICAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbGVnZW5kT3V0cHV0JykpLFxuICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBmb3JtYXRJbnQob3V0T2YodGlwLnJvdykpKSksXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC10b3RhbCcgfSxcbiAgICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCd0b29sdGlwVG90YWwnKSksXG4gICAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgZm9ybWF0SW50KHRvdE9mKHRpcC5yb3cpKSkpKVxuICAgICAgOiBudWxsKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOW5tOW6pueUqOmHj+eDreWKm+Wbvu+8iEdpdEh1YiDpo47moLzvvIlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIEhlYXRtYXBDYXJkKHByb3BzKSB7XG4gIGNvbnN0IHsgZGF5cyB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICBjb25zdCBbaHRpcCwgc2V0SHRpcF0gPSBSZWFjdC51c2VTdGF0ZShudWxsKSAvLyB7IGNlbGwsIGxlZnQsIHRvcCB9IGluIHZpZXdwb3J0IGNvb3Jkc1xuICBjb25zdCBncmlkID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbGlzdCA9IGRheXMgfHwgW11cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoMSwgLi4ubGlzdC5tYXAoKGQpID0+IGQudG90YWxUb2tlbnMgfHwgMCkpXG4gICAgY29uc3QgZmlyc3QgPSBuZXcgRGF0ZShsaXN0WzBdLmtleSArICdUMDA6MDA6MDAnKVxuICAgIGNvbnN0IG9mZnNldCA9IGZpcnN0LmdldERheSgpIC8vIDAgPSBTdW5kYXlcbiAgICBjb25zdCB3ZWVrcyA9IFtdXG4gICAgbGV0IGN1ciA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvZmZzZXQ7IGkrKykgY3VyLnB1c2gobnVsbClcbiAgICBmb3IgKGNvbnN0IGQgb2YgbGlzdCkge1xuICAgICAgY3VyLnB1c2goZClcbiAgICAgIGlmIChjdXIubGVuZ3RoID09PSA3KSB7XG4gICAgICAgIHdlZWtzLnB1c2goY3VyKVxuICAgICAgICBjdXIgPSBbXVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3VyLmxlbmd0aCA+IDApIHtcbiAgICAgIHdoaWxlIChjdXIubGVuZ3RoIDwgNykgY3VyLnB1c2gobnVsbClcbiAgICAgIHdlZWtzLnB1c2goY3VyKVxuICAgIH1cbiAgICAvLyDmnIjku73moIforrDvvJrmn5DmnIggMSDml6XmiYDlnKjnmoTliJdcbiAgICBjb25zdCBtb250aE1hcmtzID0gW11cbiAgICB3ZWVrcy5mb3JFYWNoKCh3aywgY29sKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2Ygd2spIHtcbiAgICAgICAgaWYgKGMgJiYgYy5rZXkuZW5kc1dpdGgoJy0wMScpKSB7XG4gICAgICAgICAgbW9udGhNYXJrcy5wdXNoKHsgY29sLCBuYW1lOiB0KCdtb250aExhYmVsJywgeyBuOiBOdW1iZXIoYy5rZXkuc2xpY2UoNSwgNykpIH0pIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHsgd2Vla3MsIG1heCwgbW9udGhNYXJrcyB9XG4gIH0sIFtkYXlzXSlcblxuICBpZiAoZ3JpZCA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICBmdW5jdGlvbiBzaG93Q2VsbFRpcChlLCBjKSB7XG4gICAgY29uc3QgZWxSZWN0ID0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgc2V0SHRpcCh7IGNlbGw6IGMsIGxlZnQ6IGVsUmVjdC5sZWZ0ICsgZWxSZWN0LndpZHRoIC8gMiwgdG9wOiBlbFJlY3QudG9wIH0pXG4gIH1cblxuICBjb25zdCBoZWF0VGlwID0gaHRpcFxuICAgID8gaCgnZGl2Jywge1xuICAgICAgICBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcCB0c2QtaGVhdC10aXAnLFxuICAgICAgICBzdHlsZTogeyBwb3NpdGlvbjogJ2ZpeGVkJywgbGVmdDogaHRpcC5sZWZ0ICsgJ3B4JywgdG9wOiBodGlwLnRvcCArICdweCcsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgtNTAlLCAtMTEwJSknIH0sXG4gICAgICB9LFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRhdGUnIH0sIGh0aXAuY2VsbC5rZXkgKyAnICcgKyB3ZWVrZGF5TmFtZShodGlwLmNlbGwua2V5LCB0KSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCcsIHN0eWxlOiB7IGJhY2tncm91bmQ6ICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCknIH0gfSksXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ3RvdGFsVG9rZW5zJykpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KGh0aXAuY2VsbC50b3RhbFRva2VucyB8fCAwKSkpLFxuICAgICAgICBodGlwLmNlbGwuY2FsbHMgPiAwXG4gICAgICAgICAgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXJvdycgfSxcbiAgICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZG90Jywgc3R5bGU6IHsgYmFja2dyb3VuZDogJ3ZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSknIH0gfSksXG4gICAgICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdjYWxscycpKSxcbiAgICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBmb3JtYXRJbnQoaHRpcC5jZWxsLmNhbGxzKSkpXG4gICAgICAgICAgOiBudWxsKVxuICAgIDogbnVsbFxuXG4gIGNvbnN0IGRheU5hbWVzID0gWycnLCB0KCd3ZWVrZGF5TW9uJyksICcnLCB0KCd3ZWVrZGF5V2VkJyksICcnLCB0KCd3ZWVrZGF5RnJpJyksICcnXVxuICBjb25zdCBsZWdlbmRTdGVwcyA9IFswLCAwLjI1LCAwLjUsIDAuNzUsIDFdXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQgdHNkLWhlYXRtYXAtY2FyZCcgfSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWhlYWRlcicgfSxcbiAgICAgIGgoJ2gzJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC10aXRsZScgfSwgdCgneWVhcmx5SGVhdG1hcCcpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRhZycgfSwgdCgneWVhckRhaWx5JywgeyB5ZWFyOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgfSkpKSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwJyB9LFxuICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1pbm5lcicgfSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1tb250aHMnIH0sXG4gICAgICAgICAgZ3JpZC5tb250aE1hcmtzLm1hcCgobSkgPT5cbiAgICAgICAgICAgIGgoJ3NwYW4nLCB7XG4gICAgICAgICAgICAgIGtleTogbS5jb2wsXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLW1vbnRoJyxcbiAgICAgICAgICAgICAgc3R5bGU6IHsgbGVmdDogKG0uY29sICogMTIpICsgJ3B4JyB9LFxuICAgICAgICAgICAgfSwgbS5uYW1lKSkpLFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWJvZHknIH0sXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1kYXlzJyB9LFxuICAgICAgICAgICAgZGF5TmFtZXMubWFwKChuLCBpKSA9PlxuICAgICAgICAgICAgICBoKCdzcGFuJywgeyBrZXk6IGksIGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWRheScgfSwgbikpKSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWdyaWQnIH0sXG4gICAgICAgICAgICBncmlkLndlZWtzLm1hcCgod2ssIGNvbCkgPT5cbiAgICAgICAgICAgICAgaCgnZGl2JywgeyBrZXk6IGNvbCwgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtY29sJyB9LFxuICAgICAgICAgICAgICAgIHdrLm1hcCgoYywgcm93KSA9PlxuICAgICAgICAgICAgICAgICAgY1xuICAgICAgICAgICAgICAgICAgICA/IGgoJ3NwYW4nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGMua2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtY2VsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeyBiYWNrZ3JvdW5kOiBoZWF0Q29sb3IoYy50b3RhbFRva2VucyB8fCAwLCBncmlkLm1heCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0KCdobVRpdGxlJywgeyBrZXk6IGMua2V5LCB0b2tlbnM6IGZvcm1hdEludChjLnRvdGFsVG9rZW5zIHx8IDApLCBjYWxsczogYy5jYWxscyA/IHQoJ2htQ2FsbHMnLCB7IGNvdW50OiBmb3JtYXRJbnQoYy5jYWxscykgfSkgOiAnJyB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VFbnRlcjogKGUpID0+IHNob3dDZWxsVGlwKGUsIGMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlOiAoKSA9PiBzZXRIdGlwKG51bGwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25Gb2N1czogKGUpID0+IHNob3dDZWxsVGlwKGUsIGMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25CbHVyOiAoKSA9PiBzZXRIdGlwKG51bGwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgOiBoKCdzcGFuJywgeyBrZXk6ICdlJyArIGNvbCArICctJyArIHJvdywgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtY2VsbCcsIHN0eWxlOiB7IHZpc2liaWxpdHk6ICdoaWRkZW4nIH0gfSkpKSkpKSksXG4gICAgaGVhdFRpcCxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWxlZ2VuZCcgfSxcbiAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdsZXNzJykpLFxuICAgICAgbGVnZW5kU3RlcHMubWFwKChzKSA9PlxuICAgICAgICBoKCdzcGFuJywge1xuICAgICAgICAgIGtleTogcyxcbiAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1jZWxsJyxcbiAgICAgICAgICBzdHlsZTogeyBiYWNrZ3JvdW5kOiBzID09PSAwID8gJ3ZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3ZlciknIDogaGVhdENvbG9yKE1hdGgubWF4KDEsIHMgKiAxMDApLCAxMDApIH0sXG4gICAgICAgIH0pKSxcbiAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdtb3JlJykpKSkpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5oyJ5qih5Z6L5piO57uG6KGoXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBNb2RlbFRhYmxlKHByb3BzKSB7XG4gIGNvbnN0IHsgcm93cywgY3VycmVuY3kgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgYWxsID0gcm93cyB8fCBbXVxuICBjb25zdCBbc29ydEtleSwgc2V0U29ydEtleV0gPSBSZWFjdC51c2VTdGF0ZSgndG90YWwnKVxuICBjb25zdCBbc29ydERpciwgc2V0U29ydERpcl0gPSBSZWFjdC51c2VTdGF0ZSgnZGVzYycpXG5cbiAgY29uc3QgdmlldyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gYWxsLm1hcCgocikgPT4gKHtcbiAgICBrZXk6IHIua2V5LFxuICAgIGNhbGxzOiByLmNhbGxzIHx8IDAsXG4gICAgaW5wdXQ6IChyLmlucHV0VG9rZW5zIHx8IDApICsgKHIuY2FjaGVSZWFkVG9rZW5zIHx8IDApICsgKHIuY2FjaGVXcml0ZVRva2VucyB8fCAwKSxcbiAgICBvdXRwdXQ6IHIub3V0cHV0VG9rZW5zIHx8IDAsXG4gICAgdG90YWw6IHIudG90YWxUb2tlbnMgfHwgMCxcbiAgICBjb3N0OiByLmNvc3QgfHwgMCxcbiAgICB1bnByaWNlZDogKHIudG90YWxUb2tlbnMgfHwgMCkgPiAwICYmICEoci5jb3N0ID4gMCksXG4gIH0pKSwgW2FsbF0pXG5cbiAgY29uc3Qgc3VtVG90YWwgPSBSZWFjdC51c2VNZW1vKCgpID0+IHZpZXcucmVkdWNlKChzLCByKSA9PiBzICsgci50b3RhbCwgMCksIFt2aWV3XSlcblxuICBjb25zdCBzb3J0ZWQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBsaXN0ID0gdmlldy5zbGljZSgpXG4gICAgY29uc3QgZGlyID0gc29ydERpciA9PT0gJ2FzYycgPyAxIDogLTFcbiAgICBsaXN0LnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGF2ID0gYVtzb3J0S2V5XVxuICAgICAgY29uc3QgYnYgPSBiW3NvcnRLZXldXG4gICAgICBpZiAoYXYgPT09IGJ2KSByZXR1cm4gMFxuICAgICAgcmV0dXJuIChhdiA+IGJ2ID8gMSA6IC0xKSAqIGRpclxuICAgIH0pXG4gICAgcmV0dXJuIGxpc3RcbiAgfSwgW3ZpZXcsIHNvcnRLZXksIHNvcnREaXJdKVxuXG4gIGZ1bmN0aW9uIHRvZ2dsZVNvcnQoa2V5KSB7XG4gICAgaWYgKHNvcnRLZXkgPT09IGtleSkgc2V0U29ydERpcigoZCkgPT4gKGQgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYycpKVxuICAgIGVsc2UgeyBzZXRTb3J0S2V5KGtleSk7IHNldFNvcnREaXIoJ2Rlc2MnKSB9XG4gIH1cblxuICBjb25zdCBjb2xzID0gW1xuICAgIHsga2V5OiAnbW9kZWwnLCBsYWJlbDogdCgnY29sTW9kZWwnKSwgc29ydGFibGU6IGZhbHNlIH0sXG4gICAgeyBrZXk6ICdjYWxscycsIGxhYmVsOiB0KCdjb2xDYWxscycpLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgIHsga2V5OiAnaW5wdXQnLCBsYWJlbDogdCgnY29sSW5wdXQnKSwgc29ydGFibGU6IHRydWUgfSxcbiAgICB7IGtleTogJ291dHB1dCcsIGxhYmVsOiB0KCdjb2xPdXRwdXQnKSwgc29ydGFibGU6IHRydWUgfSxcbiAgICB7IGtleTogJ3RvdGFsJywgbGFiZWw6IHQoJ2NvbFRvdGFsJyksIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICdjb3N0JywgbGFiZWw6IHQoJ2NvbENvc3QnKSwgc29ydGFibGU6IHRydWUgfSxcbiAgICB7IGtleTogJ3JhdGlvJywgbGFiZWw6IHQoJ2NvbFNoYXJlJyksIHNvcnRhYmxlOiBmYWxzZSB9LFxuICBdXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQgdHNkLXRhYmxlLWNhcmQnIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1oZWFkZXInIH0sXG4gICAgICBoKCdoMycsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdGl0bGUnIH0sIHQoJ2J5TW9kZWxUaXRsZScpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRhZycgfSxcbiAgICAgICAgdCgnbW9kZWxDb3VudCcsIHsgbjogdmlldy5sZW5ndGggfSkgKyAnIMK3ICcgKyB0KCdjb2xUb3RhbCcpICsgJyAnICsgZm9ybWF0SW50KHN1bVRvdGFsKSkpLFxuICAgIHZpZXcubGVuZ3RoID09PSAwXG4gICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWVtcHR5LWJsb2NrJyB9LCB0KCdub0RhdGEnKSlcbiAgICAgIDogaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdGFibGUtd3JhcCcgfSxcbiAgICAgICAgICBoKCd0YWJsZScsIHsgY2xhc3NOYW1lOiAndHNkLXRhYmxlJyB9LFxuICAgICAgICAgICAgaCgnY2FwdGlvbicsIHsgY2xhc3NOYW1lOiAndHNkLXZpc3VhbGx5LWhpZGRlbicgfSwgdCgnbW9kZWxUYWJsZUNhcHRpb24nKSksXG4gICAgICAgICAgICBoKCd0aGVhZCcsIG51bGwsXG4gICAgICAgICAgICAgIGgoJ3RyJywgbnVsbCwgY29scy5tYXAoKGMpID0+XG4gICAgICAgICAgICAgICAgaCgndGgnLCB7XG4gICAgICAgICAgICAgICAgICBrZXk6IGMua2V5LFxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndHNkLXRoJyArIChjLmtleSA9PT0gJ21vZGVsJyA/ICcnIDogJyB0c2QtdGgtbnVtJyksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGMuc29ydGFibGVcbiAgICAgICAgICAgICAgICAgICAgPyBoKCdidXR0b24nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1zb3J0LWJ0bicgKyAoc29ydEtleSA9PT0gYy5rZXkgPyAnIHRzZC1zb3J0LWFjdGl2ZScgOiAnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0b2dnbGVTb3J0KGMua2V5KSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYy5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRLZXkgPT09IGMua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXNvcnQtYXJyb3cnIH0sIHNvcnREaXIgPT09ICdhc2MnID8gJ+KGkScgOiAn4oaTJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKVxuICAgICAgICAgICAgICAgICAgICA6IGMubGFiZWwpKSkpLFxuICAgICAgICAgICAgaCgndGJvZHknLCBudWxsLCBzb3J0ZWQubWFwKChyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJhdGlvID0gc3VtVG90YWwgPiAwID8gci50b3RhbCAvIHN1bVRvdGFsIDogMFxuICAgICAgICAgICAgICByZXR1cm4gaCgndHInLCB7IGtleTogci5rZXksIGNsYXNzTmFtZTogJ3RzZC10cicgfSxcbiAgICAgICAgICAgICAgICBoKCd0ZCcsIHsgY2xhc3NOYW1lOiAndHNkLXRkIHRzZC10ZC1tb2RlbCcgfSxcbiAgICAgICAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1tb2RlbC1tb25vJywgdGl0bGU6IHIua2V5IH0sIHIua2V5KSksXG4gICAgICAgICAgICAgICAgaCgndGQnLCB7IGNsYXNzTmFtZTogJ3RzZC10ZCB0c2QtbnVtJyB9LCBmb3JtYXRJbnQoci5jYWxscykpLFxuICAgICAgICAgICAgICAgIGgoJ3RkJywgeyBjbGFzc05hbWU6ICd0c2QtdGQgdHNkLW51bScgfSwgZm9ybWF0SW50KHIuaW5wdXQpKSxcbiAgICAgICAgICAgICAgICBoKCd0ZCcsIHsgY2xhc3NOYW1lOiAndHNkLXRkIHRzZC1udW0nIH0sIGZvcm1hdEludChyLm91dHB1dCkpLFxuICAgICAgICAgICAgICAgIGgoJ3RkJywgeyBjbGFzc05hbWU6ICd0c2QtdGQgdHNkLW51bSB0c2QtdG90YWwnIH0sIGZvcm1hdEludChyLnRvdGFsKSksXG4gICAgICAgICAgICAgICAgaCgndGQnLCB7IGNsYXNzTmFtZTogJ3RzZC10ZCB0c2QtbnVtJyB9LFxuICAgICAgICAgICAgICAgICAgci51bnByaWNlZFxuICAgICAgICAgICAgICAgICAgICA/IGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC11bnByaWNlZCcsIHRpdGxlOiB0KCd1bnByaWNlZFJvd0hpbnQnKSB9LCB0KCd1bnByaWNlZCcpKVxuICAgICAgICAgICAgICAgICAgICA6IGZvcm1hdENvc3Qoci5jb3N0LCBjdXJyZW5jeSkpLFxuICAgICAgICAgICAgICAgIGgoJ3RkJywgeyBjbGFzc05hbWU6ICd0c2QtdGQgdHNkLXRkLXJhdGlvJyB9LFxuICAgICAgICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcmF0aW8nIH0sXG4gICAgICAgICAgICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXJhdGlvLWJhcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1yYXRpby1maWxsJywgc3R5bGU6IHsgd2lkdGg6IHJhdGlvICogMTAwICsgJyUnIH0gfSkpLFxuICAgICAgICAgICAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtcmF0aW8tcGN0JyB9LCBmbXRQY3QocmF0aW8pKSkpKVxuICAgICAgICAgICAgfSkpKSkpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5LiJ5oCB77ya5Yqg6L29IC8g6ZSZ6K+vIC8g56m6XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBMb2FkaW5nU3RhdGUoKSB7XG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWxvYWRpbmcnIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZHMnIH0sXG4gICAgICBbMCwgMSwgMiwgMywgNF0ubWFwKChpKSA9PlxuICAgICAgICBoKCdkaXYnLCB7IGtleTogaSwgY2xhc3NOYW1lOiAndHNkLWNhcmQgdHNkLWNhcmQtc2tlbGV0b24nIH0sXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2tlbGV0b24nLCBzdHlsZTogeyB3aWR0aDogJzQwJScsIGhlaWdodDogMTIgfSB9KSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1za2VsZXRvbicsIHN0eWxlOiB7IHdpZHRoOiAnNzAlJywgaGVpZ2h0OiAyMiwgbWFyZ2luVG9wOiAxMCB9IH0pKSkpLFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQnIH0sXG4gICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1za2VsZXRvbicsIHN0eWxlOiB7IHdpZHRoOiAnMTAwJScsIGhlaWdodDogMzAwIH0gfSkpLFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQnIH0sXG4gICAgICBbMCwgMSwgMiwgMywgNCwgNV0ubWFwKChpKSA9PlxuICAgICAgICBoKCdkaXYnLCB7IGtleTogaSwgY2xhc3NOYW1lOiAndHNkLXNrZWxldG9uLXJvdycsIHN0eWxlOiB7IHdpZHRoOiA5NiAtIGkgKiA4ICsgJyUnIH0gfSkpKSlcbn1cblxuZnVuY3Rpb24gRXJyb3JTdGF0ZShwcm9wcykge1xuICBjb25zdCB7IGVycm9yLCBvblJldHJ5IH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkIHRzZC1lcnJvcicsIHJvbGU6ICdhbGVydCcgfSxcbiAgICBoKFN2Z0ljb24sIHsgbmFtZTogJ2FsZXJ0Jywgc2l6ZTogMjIsIGNsYXNzTmFtZTogJ3RzZC1lcnJvci1pY29uJyB9KSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1lcnJvci10ZXh0JyB9LFxuICAgICAgaCgncCcsIHsgY2xhc3NOYW1lOiAndHNkLWVycm9yLXRpdGxlJyB9LCB0KCdsb2FkRmFpbGVkVGl0bGUnKSksXG4gICAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZXJyb3ItZGV0YWlsJyB9LCBTdHJpbmcoKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHx8IGVycm9yKSkpLFxuICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1idG4gdHNkLWJ0bi1wcmltYXJ5Jywgb25DbGljazogb25SZXRyeSB9LCB0KCdyZXRyeScpKSlcbn1cblxuZnVuY3Rpb24gRW1wdHlTdGF0ZShwcm9wcykge1xuICBjb25zdCB7IGZpbHRlcmVkLCBvblJlc2V0IH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkIHRzZC1lbXB0eScgfSxcbiAgICBoKFN2Z0ljb24sIHsgbmFtZTogJ2luYm94Jywgc2l6ZTogMjgsIGNsYXNzTmFtZTogJ3RzZC1lbXB0eS1pY29uJyB9KSxcbiAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZW1wdHktdGl0bGUnIH0sIHQoJ25vRGF0YScpKSxcbiAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZW1wdHktZGVzYycgfSxcbiAgICAgIGZpbHRlcmVkID8gdCgnZW1wdHlGaWx0ZXJlZCcpIDogdCgnZW1wdHlEZXNjJykpLFxuICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1idG4gdHNkLWJ0bi1naG9zdCcsIG9uQ2xpY2s6IG9uUmVzZXQgfSwgdCgncmVzZXRGaWx0ZXJzJykpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOmhtemdoue6p+eKtuaAgeacuiArIOW4g+WxgFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gU3RhdHNEYXNoYm9hcmQocHJvcHMpIHtcbiAgY29uc3QgdCA9IHByb3BzLnQgfHwgZmFsbGJhY2tUXG4gIGNvbnN0IFtyYW5nZSwgc2V0UmFuZ2VdID0gUmVhY3QudXNlU3RhdGUoJ3RvZGF5JykgLy8gdG9kYXkgfCA3ZCB8IDMwZCB8IGN1c3RvbVxuICBjb25zdCBbY3VzdG9tLCBzZXRDdXN0b21dID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdEN1c3RvbSlcbiAgY29uc3QgW21vZGVscywgc2V0TW9kZWxzXSA9IFJlYWN0LnVzZVN0YXRlKFtdKSAvLyBbXSA9IOWFqOmDqOaooeWei1xuICBjb25zdCBbY3VzdG9tT3Blbiwgc2V0Q3VzdG9tT3Blbl0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3JldHJ5LCBzZXRSZXRyeV0gPSBSZWFjdC51c2VTdGF0ZSgwKVxuICBjb25zdCBbc3RhdHVzLCBzZXRTdGF0dXNdID0gUmVhY3QudXNlU3RhdGUoJ2xvYWRpbmcnKSAvLyBsb2FkaW5nIHwgcmVmcmVzaGluZyB8IHJlYWR5IHwgZXJyb3JcbiAgY29uc3QgW2RhdGEsIHNldERhdGFdID0gUmVhY3QudXNlU3RhdGUobnVsbClcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKVxuICBjb25zdCBbcHJpY2VzLCBzZXRQcmljZXNdID0gUmVhY3QudXNlU3RhdGUoeyBwcmljZXM6IHt9LCBjdXJyZW5jeTogJ8KlJyB9KVxuICAvLyBQMS02IGJhY2tmaWxsIOi9ruivoueKtuaAge+8mnF1ZXJ5S2V5IOWPmOWMluaXtumHjee9ru+8jOS7heWvueWQjOS4gOafpeivouS4sui9ruivolxuICBjb25zdCBxdWVyeUtleVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKVxuICBjb25zdCBiYWNrZmlsbFNlZW5SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGZpbmFsUmVmcmVzaFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSlcblxuICBjb25zdCBlZmYgPSBSZWFjdC51c2VNZW1vKCgpID0+IHJhbmdlRm9yKHJhbmdlLCBjdXN0b20pLCBbcmFuZ2UsIGN1c3RvbV0pXG4gIC8vIEZpeGVkIHN0ZXAgcG9saWN5OiB0b2RheSA9IGhvdXJseTsgN2QvMzBkL2N1c3RvbSA9IGRhaWx5LCBjdXN0b20gdXNlcyBhXG4gIC8vIHN0YWJsZSBzdGVwICgxLzMvNS83IGRheXMpIGNob3NlbiBieSB0aGUgcmFuZ2UgbGVuZ3RoLlxuICBjb25zdCBlZmZHcmFuID0gZWZmR3JhbnVsYXJpdHkocmFuZ2UpXG4gIGNvbnN0IHN0ZXBEYXlzID0gcmFuZ2UgPT09ICdjdXN0b20nID8gcGlja1N0ZXBEYXlzKChlZmYudG8gfHwgMCkgLSAoZWZmLmZyb20gfHwgMCkpIDogMVxuICBjb25zdCBncmFuTGFiZWwgPSBzdGVwTGFiZWwodCwgcmFuZ2UsIHN0ZXBEYXlzKVxuXG4gIC8vIOafpeivoue7n+iuoe+8iOmmlui9vemqqOaetu+8m+WIt+aWsOS/neeVmeaXp+aVsOaNrui9rCByZWZyZXNoaW5n77ybZmlsbCAwIOWhq+WFhSArIOW5tOW6pueDreWKm+Wbvu+8iVxuICAvLyBQMS0277yaYmFja2ZpbGwgcnVubmluZyDml7bmr48gM3Mg6Ieq5Yqo6YeN5p+l77ybZG9uZSDlkI7ooaXkuIDmrKHmlLblsL7mn6Xor6LljbPlgZzjgIJcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgY3VycmVudCA9IHRydWVcbiAgICBsZXQgYmFja2ZpbGxUaW1lciA9IG51bGxcbiAgICBjb25zdCBxdWVyeUtleSA9IGVmZi5mcm9tICsgJ3wnICsgZWZmLnRvICsgJ3wnICsgbW9kZWxzLmpvaW4oJywnKSArICd8JyArIGVmZkdyYW4gKyAnfCcgKyBzdGVwRGF5c1xuICAgIGlmIChxdWVyeUtleVJlZi5jdXJyZW50ICE9PSBxdWVyeUtleSkge1xuICAgICAgcXVlcnlLZXlSZWYuY3VycmVudCA9IHF1ZXJ5S2V5XG4gICAgICBiYWNrZmlsbFNlZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBmaW5hbFJlZnJlc2hSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGlzRmluYWxSdW4gPSBmaW5hbFJlZnJlc2hSZWYuY3VycmVudFxuICAgIGZpbmFsUmVmcmVzaFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzZXRTdGF0dXMoKHMpID0+IChzID09PSAncmVhZHknICYmIGRhdGEgIT09IG51bGwgPyAncmVmcmVzaGluZycgOiAnbG9hZGluZycpKVxuICAgIGhvc3RDYWxsKCd1c2FnZS9xdWVyeScsIHtcbiAgICAgIGZyb206IGVmZi5mcm9tLFxuICAgICAgdG86IGVmZi50byxcbiAgICAgIG1vZGVsczogbW9kZWxzLnNsaWNlKCksXG4gICAgICBmaWxsOiB0cnVlLFxuICAgICAgZ3JhbnVsYXJpdHk6IGVmZkdyYW4sXG4gICAgICBzdGVwRGF5cyxcbiAgICAgIGhlYXRtYXA6IHRydWUsXG4gICAgfSlcbiAgICAgIC50aGVuKChyKSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudCkgcmV0dXJuXG4gICAgICAgIHNldERhdGEocilcbiAgICAgICAgc2V0U3RhdHVzKCdyZWFkeScpXG4gICAgICAgIHNldEVycm9yKG51bGwpXG4gICAgICAgIGNvbnN0IGJzID0gciAmJiByLmJhY2tmaWxsID8gci5iYWNrZmlsbC5zdGF0dXMgOiBudWxsXG4gICAgICAgIGlmIChicyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgYmFja2ZpbGxTZWVuUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgLy8g5ZCM5LiAIGVmZmVjdCDoh7PlpJrmjILkuIDkuKrlrprml7blmajvvJvph43mn6XlpI3nlKggcmV0cnkg6K6h5pWw5Zmo6Kem5Y+RIGVmZmVjdCDph43ot5FcbiAgICAgICAgICBiYWNrZmlsbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCkgc2V0UmV0cnkoKHYpID0+IHYgKyAxKVxuICAgICAgICAgIH0sIDMwMDApXG4gICAgICAgIH0gZWxzZSBpZiAoYnMgPT09ICdkb25lJyAmJiBiYWNrZmlsbFNlZW5SZWYuY3VycmVudCAmJiAhaXNGaW5hbFJ1bikge1xuICAgICAgICAgIC8vIOWbnuWhq+aUtuWwvu+8muaBsOWlveWGjeafpeS4gOasoeaLv+WIsOWujOaVtOaVsOaNruWQjuWBnOatolxuICAgICAgICAgIGZpbmFsUmVmcmVzaFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICAgIHNldFJldHJ5KCh2KSA9PiB2ICsgMSlcbiAgICAgICAgfVxuICAgICAgfSwgKGUpID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgICAgc2V0RXJyb3IoZSlcbiAgICAgICAgc2V0U3RhdHVzKCdlcnJvcicpXG4gICAgICB9KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjdXJyZW50ID0gZmFsc2VcbiAgICAgIGlmIChiYWNrZmlsbFRpbWVyICE9PSBudWxsKSBjbGVhclRpbWVvdXQoYmFja2ZpbGxUaW1lcilcbiAgICB9XG4gIH0sIFtlZmYuZnJvbSwgZWZmLnRvLCBtb2RlbHMsIGVmZkdyYW4sIHN0ZXBEYXlzLCByZXRyeV0pXG5cbiAgLy8g5Lu35qC86KGo77ya6L+b5YWl6aG16Z2i5ouJ5LiA5qyhICsg5q+P5qyh5Yi35paw5ZCM5q2l44CCXG4gIC8vIFAwLTHvvJrkvJjlhYjlrpjmlrkgc2V0dGluZ3Mgc2NvcGXvvIh1c2FnZS5wcmljZXMg5ZG95ZCN56m66Ze077yJ77yM5LiN5Y+v55So5pe25Zue6YCAIFJQQ+OAglxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBjdXJyZW50ID0gdHJ1ZVxuICAgIGxldCBzY29wZURpc3Bvc2UgPSBudWxsXG4gICAgY29uc3QgbG9hZFJwYyA9ICgpID0+IHtcbiAgICAgIGhvc3RDYWxsKCd1c2FnZS9wcmljZXMnKS50aGVuKChwKSA9PiB7XG4gICAgICAgIGlmIChjdXJyZW50ICYmIHAgJiYgcC5wcmljZXMpIHNldFByaWNlcyhwKVxuICAgICAgfSwgKCkgPT4ge30pXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzY29wZSA9IGdldFVzYWdlUHJpY2VzU2NvcGUoKVxuICAgICAgaWYgKHNjb3BlICYmIHR5cGVvZiBzY29wZS5nZXRTbmFwc2hvdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2NvcGUuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGxldCBhZG9wdGVkID0gZmFsc2VcbiAgICAgICAgY29uc3QgYWRvcHQgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgICAgICBjb25zdCBzbmFwID0gc2NvcGUuZ2V0U25hcHNob3QoKVxuICAgICAgICAgIGNvbnN0IHYgPSBzbmFwICYmIHNuYXAudmFsdWVcbiAgICAgICAgICBpZiAoc25hcCAmJiBzbmFwLnN0YXR1cyA9PT0gJ3VuYXZhaWxhYmxlJykgcmV0dXJuXG4gICAgICAgICAgaWYgKHYgJiYgKHYucHJpY2VzIHx8IHYuY3VycmVuY3kpKSB7XG4gICAgICAgICAgICBhZG9wdGVkID0gdHJ1ZVxuICAgICAgICAgICAgc2V0UHJpY2VzKHsgcHJpY2VzOiB2LnByaWNlcyB8fCB7fSwgY3VycmVuY3k6IHYuY3VycmVuY3kgfHwgJ8KlJyB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhZG9wdCgpXG4gICAgICAgIHNjb3BlRGlzcG9zZSA9IHNjb3BlLnN1YnNjcmliZShhZG9wdClcbiAgICAgICAgaWYgKCFhZG9wdGVkKSBsb2FkUnBjKCkgLy8gc2NvcGUg5pyq5bCx57uqL+aXoOWAvO+8muWFiOi1sCBSUEPvvIzorqLpmIXlsLHnu6rlkI4gc2NvcGUg5LyY5YWI6KaG55uWXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkUnBjKClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2FkUnBjKCkgLy8g5o6i5rWLL+e7keWumuW8guW4uO+8muWujOaVtOWbnumAgCBSUEPvvIznu53kuI3mipvlh7pcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGN1cnJlbnQgPSBmYWxzZVxuICAgICAgaWYgKHNjb3BlRGlzcG9zZSkge1xuICAgICAgICB0cnkgeyBzY29wZURpc3Bvc2UoKSB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfSwgW3JldHJ5XSlcblxuICBjb25zdCByZWxvYWQgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiBzZXRSZXRyeSgodikgPT4gdiArIDEpLCBbXSlcblxuICBjb25zdCByZXNldEZpbHRlcnMgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0TW9kZWxzKFtdKVxuICAgIHNldEN1c3RvbShkZWZhdWx0Q3VzdG9tKCkpXG4gICAgc2V0UmFuZ2UoJ3RvZGF5JylcbiAgfSwgW10pXG5cbiAgY29uc3QgYnVzeSA9IHN0YXR1cyA9PT0gJ2xvYWRpbmcnIHx8IHN0YXR1cyA9PT0gJ3JlZnJlc2hpbmcnXG4gIGNvbnN0IHJlYWR5ID0gZGF0YSAhPT0gbnVsbFxuICBjb25zdCBpc0Vycm9yID0gc3RhdHVzID09PSAnZXJyb3InXG4gIGNvbnN0IGlzRW1wdHkgPSByZWFkeSAmJiBkYXRhLmRhaWx5Lmxlbmd0aCA9PT0gMCAmJiBkYXRhLmJ5TW9kZWwubGVuZ3RoID09PSAwXG5cbiAgcmV0dXJuIGgoVC5Qcm92aWRlciwgeyB2YWx1ZTogdCB9LFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXNlY3Rpb24nLCAnYXJpYS1idXN5JzogYnVzeSB8fCB1bmRlZmluZWQgfSxcbiAgICBoKFN0YXRzSGVhZGVyLCB7IGJ1c3ksIG9uUmVmcmVzaDogcmVsb2FkIH0pLFxuICAgIGgoRmlsdGVyQmFyLCB7XG4gICAgICByYW5nZSxcbiAgICAgIGN1c3RvbSxcbiAgICAgIG1vZGVscyxcbiAgICAgIGN1c3RvbU9wZW4sXG4gICAgICBtb2RlbE9wdGlvbnM6IGRhdGEgPyBkYXRhLm1vZGVscyA6IFtdLFxuICAgICAgb25QcmVzZXQ6IChwKSA9PiB7IHNldFJhbmdlKHApOyBzZXRDdXN0b21PcGVuKGZhbHNlKSB9LFxuICAgICAgb25DdXN0b21PcGVuOiAob3BlbikgPT4geyBzZXRSYW5nZSgnY3VzdG9tJyk7IHNldEN1c3RvbU9wZW4ob3BlbikgfSxcbiAgICAgIG9uQ3VzdG9tQXBwbHk6IChjKSA9PiB7IHNldEN1c3RvbShjKTsgc2V0Q3VzdG9tT3BlbihmYWxzZSkgfSxcbiAgICAgIG9uQ3VzdG9tQ2xvc2U6ICgpID0+IHNldEN1c3RvbU9wZW4oZmFsc2UpLFxuICAgICAgb25Nb2RlbHNDaGFuZ2U6IHNldE1vZGVscyxcbiAgICB9KSxcbiAgICBpc0Vycm9yICYmICFyZWFkeVxuICAgICAgPyBoKEVycm9yU3RhdGUsIHsgZXJyb3IsIG9uUmV0cnk6IHJlbG9hZCB9KVxuICAgICAgOiBudWxsLFxuICAgICFyZWFkeSAmJiAhaXNFcnJvclxuICAgICAgPyBoKExvYWRpbmdTdGF0ZSwgbnVsbClcbiAgICAgIDogbnVsbCxcbiAgICByZWFkeSAmJiBpc0Vycm9yXG4gICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWFsZXJ0LWJhbm5lcicsIHJvbGU6ICdhbGVydCcgfSxcbiAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbG9hZEZhaWxlZCcsIHsgbWVzc2FnZTogU3RyaW5nKChlcnJvciAmJiBlcnJvci5tZXNzYWdlKSB8fCBlcnJvcikgfSkpLFxuICAgICAgICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1idG4gdHNkLWJ0bi1naG9zdCcsIG9uQ2xpY2s6IHJlbG9hZCB9LCB0KCdyZXRyeScpKSlcbiAgICAgIDogbnVsbCxcbiAgICByZWFkeSAmJiAhaXNFcnJvciAmJiBpc0VtcHR5XG4gICAgICA/IGgoRW1wdHlTdGF0ZSwgeyBmaWx0ZXJlZDogbW9kZWxzLmxlbmd0aCA+IDAsIG9uUmVzZXQ6IHJlc2V0RmlsdGVycyB9KVxuICAgICAgOiBudWxsLFxuICAgIHJlYWR5ICYmICFpc0Vycm9yICYmICFpc0VtcHR5XG4gICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNvbnRlbnQnLCAnZGF0YS1idXN5JzogYnVzeSA/ICd0cnVlJyA6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgIGgoU3VtbWFyeUNhcmRzLCB7XG4gICAgICAgICAgICB0b3RhbDogZGF0YS50b3RhbCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiBwcmljZXMuY3VycmVuY3kgfHwgJ8KlJyxcbiAgICAgICAgICAgIHVucHJpY2VkQ2FsbHM6IGRhdGEudW5wcmljZWRDYWxscyB8fCAwLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGgoRGFpbHlDaGFydCwge1xuICAgICAgICAgICAgZGFpbHk6IGRhdGEuZGFpbHksXG4gICAgICAgICAgICBncmFuOiBlZmZHcmFuLFxuICAgICAgICAgICAgc3RlcERheXMsXG4gICAgICAgICAgICBncmFuTGFiZWwsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaChIZWF0bWFwQ2FyZCwgeyBkYXlzOiBkYXRhLmhlYXRtYXAgfHwgW10gfSksXG4gICAgICAgICAgaChNb2RlbFRhYmxlLCB7IHJvd3M6IGRhdGEuYnlNb2RlbCwgY3VycmVuY3k6IHByaWNlcy5jdXJyZW5jeSB8fCAnwqUnIH0pKVxuICAgICAgOiBudWxsKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDms6jlhozvvJpzZXR0aW5ncy5zZWN0aW9uIOmhtemdolxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gYXBwbHkoY3R4KSB7XG4gIHVzYWdlQ3R4ID0gY3R4XG4gIF91c2FnZVByaWNlc1Njb3BlID0gbnVsbCAvLyDmr4/mrKHmv4DmtLvph43nu5HvvIzpgb/lhY3lpI3nlKjlt7Lph4rmlL7nmoQgc2NvcGVcbiAgY3R4LmVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzdHlsZXMgIT09ICd1bmRlZmluZWQnICYmIHN0eWxlcyAmJiB0eXBlb2Ygc3R5bGVzLmluc2VydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHN0eWxlcy5pbnNlcnQoQ1NTKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpXG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGx1Z2luJywgJ2RzaC1wbHVnaW4tdXNhZ2UnKVxuICAgICAgZWwudGV4dENvbnRlbnQgPSBDU1NcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZWwpXG4gICAgICByZXR1cm4gKCkgPT4geyBlbC5yZW1vdmUoKSB9XG4gICAgfVxuICB9LCAndXNhZ2U6IHN0eWxlcycpXG4gIGN0eC5lZmZlY3QoKCkgPT4gY3R4LmxvY2FsZS5yZWdpc3RlcihOUywgeyB6aDogWkgsIGVuOiBFTiB9KSwgJ3VzYWdlOiBkaWN0aW9uYXJpZXMnKVxuICBjb25zdCB0MCA9IGN0eC5sb2NhbGUgPyBjdHgubG9jYWxlLmJpbmQoTlMpIDogZmFsbGJhY2tUXG4gIC8vIGNvcmRpcyBjdHggaXMgYSBzdHJpY3QgcHJveHk6IERJUkVDVCBwcm9wZXJ0eSBhY2Nlc3Mgb24gYW4gdW4taW5qZWN0ZWRcbiAgLy8gc2VydmljZSB0aHJvd3MgKFwiY2Fubm90IGdldCBwcm9wZXJ0eSBYIHdpdGhvdXQgaW5qZWN0XCIpLCBzbyBhIGJhcmVcbiAgLy8gYGN0eC5zbG90cyA/PyAuLi5gIHdvdWxkIHRocm93IGFuZCBza2lwIHRoZSBmYWxsYmFjay4gUHJvYmUgdmlhIHRoZSBzYWZlXG4gIC8vIGN0eC5nZXQoKSBmaXJzdDsgZmFsbCBiYWNrIHRvIHRoZSBpbmplY3RlZCBwcm9wZXJ0eSAoYXZhaWxhYmxlIG9uY2VcbiAgLy8gJ3Nsb3RzJyBpcyBkZWNsYXJlZCBpbiB0aGUgaW5qZWN0IGxpc3QgYmVsb3cpLlxuICBsZXQgc2xvdHMgPSBudWxsXG4gIHRyeSB7XG4gICAgc2xvdHMgPSB0eXBlb2YgY3R4LmdldCA9PT0gJ2Z1bmN0aW9uJyA/IGN0eC5nZXQoJ3Nsb3RzJykgOiBudWxsXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzbG90cyA9IG51bGxcbiAgfVxuICBpZiAoIXNsb3RzIHx8IHR5cGVvZiBzbG90cy5pbmplY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGN0eC5zbG90cyAmJiB0eXBlb2YgY3R4LnNsb3RzLmluamVjdCA9PT0gJ2Z1bmN0aW9uJykgc2xvdHMgPSBjdHguc2xvdHNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzbG90cyA9IG51bGxcbiAgICB9XG4gIH1cbiAgaWYgKCFzbG90cyB8fCB0eXBlb2Ygc2xvdHMuaW5qZWN0ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBzbG90cy5yZWdpc3RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUud2FybignW3VzYWdlXSBzZXR0aW5ncy5zZWN0aW9uIHNsb3QgdW5hdmFpbGFibGUnKVxuICAgIHJldHVyblxuICB9XG4gIHNsb3RzLmluamVjdCgnc2V0dGluZ3Muc2VjdGlvbicsICgpID0+IHNsb3RzLnJlZ2lzdGVyKFxuICAgIHsgbmFtZTogJ3NldHRpbmdzLnNlY3Rpb24nLCBpZDogJ3Rva2VuLXN0YXRzJywgb3JkZXI6IDIwLCBsYWJlbDogKCkgPT4gdDAoJ25hdicpLCBsb2NhbGU6IE5TIH0sXG4gICAgKHByb3BzKSA9PiBoKFN0YXRzRGFzaGJvYXJkLCBwcm9wcyksXG4gICkpXG59XG5cbnJldHVybiB7IGluamVjdDogWydsb2NhbGUnLCAnc2xvdHMnXSwgYXBwbHkgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
2493
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC9kc2gtcGx1Z2luLXVzYWdlL3NyYy9jbGllbnQvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVG9rZW4g55So6YeP57uf6K6hIOKAlCBzZXR0aW5ncy5zZWN0aW9uIENsaWVudCBVSe+8iOe6ryBKU++8jOWKqOaAgeaPkuS7tuaymeeuse+8iVxuLy8g5Y+v55So5YWo5bGA77yaUmVhY3QgLyBjdHggLyBzdHlsZXMgLyBob3N0IC8gY29uc29sZe+8m+a1j+iniOWZqOWFqOWxgCBEYXRlIC8gSW50bCDnrYnjgIJcbi8vIENTUyDluLjph4/lhoXogZToh6ogc3R5bGVzLmpz77yI5Yqo5oCB5o+S5Lu25rKZ566x5pegIGltcG9ydO+8jOagt+W8j+maj+acrOaWh+S7tuWKoOi9ve+8ieOAglxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY29uc3QgQ1NTID0gYFxuLyogPT09PT09PT09PT09IOW4g+WxgCA9PT09PT09PT09PT0gKi9cbi50c2Qtc2VjdGlvbiB7XG4gIHdpZHRoOiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDE2cHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGFuaW1hdGlvbjogdHNkLWZhZGUtaW4gMC40cyB2YXIoLS1kcy1lYXNlLWluLW91dCk7XG59XG5Aa2V5ZnJhbWVzIHRzZC1mYWRlLWluIHtcbiAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpOyB9XG4gIHRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiBub25lOyB9XG59XG5cbi8qID09PT09PT09PT09PSBIZWFkZXIgPT09PT09PT09PT09ICovXG4udHNkLWhlYWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBnYXA6IDEycHg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbn1cbi50c2QtdGl0bGUge1xuICBtYXJnaW46IDA7XG4gIGZvbnQtc2l6ZTogMjRweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyZW07XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLXN1YnRpdGxlIHtcbiAgbWFyZ2luOiA0cHggMCAwO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbn1cbi50c2QtaWNvbi1idG4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAzNHB4O1xuICBoZWlnaHQ6IDM0cHg7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQ6IGluaGVyaXQ7XG59XG4udHNkLWljb24tYnRuOmhvdmVyIHtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTtcbn1cbi50c2Qtc3Bpbm5pbmcgc3ZnIHtcbiAgYW5pbWF0aW9uOiB0c2Qtc3BpbiAwLjlzIGxpbmVhciBpbmZpbml0ZTtcbn1cbkBrZXlmcmFtZXMgdHNkLXNwaW4ge1xuICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cbn1cblxuLyogPT09PT09PT09PT09IOetm+mAieagjyA9PT09PT09PT09PT0gKi9cbi50c2QtZmlsdGVyYmFyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbn1cbi50c2Qtc2VnLXdyYXAge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuLnRzZC1zZWcge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgZ2FwOiAycHg7XG4gIHBhZGRpbmc6IDRweDtcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSkgMTIlLCB0cmFuc3BhcmVudCk7XG59XG4udHNkLXNlZy1idG4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgaGVpZ2h0OiAyOHB4O1xuICBwYWRkaW5nOiAwIDEycHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4udHNkLXNlZy1idG46aG92ZXIge1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpO1xufVxuLnRzZC1zZWctYWN0aXZlIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWJhc2UpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWJyYW5kLXByaW1hcnkpO1xuICBmb250LXdlaWdodDogNjAwO1xuICBib3gtc2hhZG93OiB2YXIoLS1kc3ctc2hhZG93LWx2MSk7XG59XG4udHNkLXNlZy1jdXN0b20ge1xuICBtYXgtd2lkdGg6IDIyMHB4O1xufVxuLnRzZC1zZWctY3VzdG9tIC50c2Qtc2VnLWxhYmVsIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4udHNkLXNlZy1jdXN0b20udHNkLXNlZy1hY3RpdmUge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYnJhbmQtcHJpbWFyeSk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeS1pbnZlcnRlZCwgI2ZmZik7XG59XG4udHNkLXNlZy1jdXN0b20udHNkLXNlZy1hY3RpdmU6aG92ZXIge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYnV0dG9uLXByaW1hcnktaG92ZXIpO1xufVxuXG4vKiA9PT09PT09PT09PT0g6YCa55So5oyJ6ZKuID09PT09PT09PT09PSAqL1xuLnRzZC1idG4ge1xuICBoZWlnaHQ6IDMwcHg7XG4gIHBhZGRpbmc6IDAgMTRweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0xKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2QtYnRuOmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKTsgfVxuLnRzZC1idG46ZGlzYWJsZWQgeyBvcGFjaXR5OiAwLjU7IGN1cnNvcjogbm90LWFsbG93ZWQ7IH1cbi50c2QtYnRuLXByaW1hcnkge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYnV0dG9uLXByaW1hcnktZmlsbCk7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeS1pbnZlcnRlZCwgI2ZmZik7XG59XG4udHNkLWJ0bi1wcmltYXJ5OmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJ1dHRvbi1wcmltYXJ5LWhvdmVyKTsgfVxuLnRzZC1idG4tZ2hvc3QgeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfVxuLnRzZC1idG4tZ2hvc3Q6aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpOyB9XG5cbi8qID09PT09PT09PT09PSDmta7lsYIgUG9wb3ZlciA9PT09PT09PT09PT0gKi9cbi50c2QtcG9wb3Zlci1hbmNob3Ige1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuLnRzZC1wb3BvdmVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IGNhbGMoMTAwJSArIDZweCk7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDQwO1xuICBwYWRkaW5nOiAxMnB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLW92ZXJsYXkpO1xuICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICBib3gtc2hhZG93OiB2YXIoLS1kc3ctc2hhZG93LWx2Myk7XG59XG4udHNkLW1vZGVsLXBvcG92ZXIge1xuICB3aWR0aDogMzIwcHg7XG4gIG1heC13aWR0aDogY2FsYygxMDB2dyAtIDI0cHgpO1xufVxuLnRzZC1yYW5nZS1wb3BvdmVyIHtcbiAgd2lkdGg6IDMwMHB4O1xuICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSAyNHB4KTtcbn1cbi50c2QtcG9wb3Zlci10aXRsZSB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgbWFyZ2luOiAwIDAgMTBweDtcbn1cbi50c2QtcG9wb3Zlci10b29scyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xufVxuLnRzZC1saW5rLWJ0biB7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KTtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDJweCA0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cbi50c2QtbGluay1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpOyB9XG4udHNkLXBvcG92ZXItYWN0aW9ucyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gIGdhcDogOHB4O1xuICBtYXJnaW4tdG9wOiAxMnB4O1xufVxuLnRzZC1wb3BvdmVyLW5vdGUge1xuICBtYXJnaW46IDhweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG59XG4udHNkLXBvcG92ZXItZW1wdHkge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDEwcHggMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xufVxuXG4vKiA9PT09PT09PT09PT0g5qih5Z6L5LiL5ouJ5pCc57SiID09PT09PT09PT09PSAqL1xuLnRzZC1zZWxlY3QtYnRuIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xuICBtaW4td2lkdGg6IDEyMHB4O1xuICBtYXgtd2lkdGg6IDI2MHB4O1xuICBoZWlnaHQ6IDM2cHg7XG4gIHBhZGRpbmc6IDAgMTBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0xKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi50c2Qtc2VsZWN0LWJ0bjpob3ZlciB7IGJvcmRlci1jb2xvcjogdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMyk7IH1cbi50c2Qtc2VsZWN0LWhhcyB7IGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KSA0NSUsIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpKTsgfVxuLnRzZC1zZWxlY3QtbGFiZWwge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgbWluLXdpZHRoOiAwO1xufVxuLnRzZC1jaGV2cm9uIHtcbiAgZmxleDogbm9uZTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLWRzLXRyYW5zaXRpb24tZHVyYXRpb24tZmFzdCkgdmFyKC0tZHMtZWFzZS1pbi1vdXQpO1xufVxuLnRzZC1jaGV2cm9uLW9wZW4geyB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOyB9XG4udHNkLXNlYXJjaCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xufVxuLnRzZC1zZWFyY2gtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogOHB4O1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG4udHNkLXNlYXJjaCBpbnB1dCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDMycHg7XG4gIHBhZGRpbmc6IDAgOHB4IDAgMjhweDtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0xKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBmb250OiBpbmhlcml0O1xuICBmb250LXNpemU6IDEzcHg7XG4gIG91dGxpbmU6IG5vbmU7XG59XG4udHNkLXNlYXJjaCBpbnB1dDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWJ1c2luZXNzLXByaW1hcnkpO1xuICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KSAxOCUsIHRyYW5zcGFyZW50KTtcbn1cbi50c2QtbW9kZWwtbGlzdCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMnB4O1xuICBtYXgtaGVpZ2h0OiAyNDBweDtcbiAgb3ZlcmZsb3cteTogYXV0bztcbiAgLS1kc2gtc2Nyb2xsYmFyLXRodW1iOiB2YXIoLS1kc3ctYWxpYXMtc2Nyb2xsYmFyLWJnLWwyKTtcbiAgLS1kc2gtc2Nyb2xsYmFyLXRodW1iLWhvdmVyOiB2YXIoLS1kc3ctYWxpYXMtc2Nyb2xsYmFyLWhvdmVyLWwyKTtcbn1cbi50c2QtbW9kZWwtaXRlbSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogOHB4O1xuICBwYWRkaW5nOiA1cHggNnB4O1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBtaW4td2lkdGg6IDA7XG59XG4udHNkLW1vZGVsLWl0ZW06aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtaW50ZXJhY3RpdmUtYmctaG92ZXIpOyB9XG4udHNkLW1vZGVsLWl0ZW0gaW5wdXQgeyBtYXJnaW46IDA7IGFjY2VudC1jb2xvcjogdmFyKC0tZHN3LWFsaWFzLWJyYW5kLXByaW1hcnkpOyB9XG4udHNkLW1vZGVsLW5hbWUge1xuICBmb250LWZhbWlseTogdmFyKC0tZHMtZm9udC1mYW1pbHktY29kZSk7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG1pbi13aWR0aDogMDtcbn1cblxuLyogPT09PT09PT09PT09IOiHquWumuS5ieaXpeacn+a1ruWxgiA9PT09PT09PT09PT0gKi9cbi50c2QtcmFuZ2UtZmllbGRzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxMHB4O1xufVxuLnRzZC1maWVsZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogNHB4O1xufVxuLnRzZC1maWVsZC1sYWJlbCB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xufVxuLnRzZC1maWVsZCBpbnB1dCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDMycHg7XG4gIHBhZGRpbmc6IDAgOHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTEpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3V0bGluZTogbm9uZTtcbn1cbi50c2QtZmllbGQgaW5wdXQ6Zm9jdXMge1xuICBib3JkZXItY29sb3I6IHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KTtcbiAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtYnVzaW5lc3MtcHJpbWFyeSkgMTglLCB0cmFuc3BhcmVudCk7XG59XG4udHNkLWZpZWxkLWVycm9yIHtcbiAgbWFyZ2luOiA2cHggMCAwO1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtZXJyb3ItcHJpbWFyeSk7XG59XG4udHNkLWZpZWxkLWhpbnQge1xuICBtYXJnaW46IDZweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG59XG5cbi8qID09PT09PT09PT09PSDmsYfmgLvmjIfmoIfljaEgPT09PT09PT09PT09ICovXG4udHNkLWNhcmRzIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgxNTBweCwgMWZyKSk7XG4gIGdhcDogMTBweDtcbn1cbi50c2QtY2FyZCB7XG4gIG1pbi13aWR0aDogMDtcbiAgcGFkZGluZzogMTRweCAxNnB4O1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTMpO1xuICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICBib3gtc2hhZG93OiB2YXIoLS1kc3ctc2hhZG93LWx2MSk7XG59XG4udHNkLWNhcmQtaGVhZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xufVxuLnRzZC1jYXJkLWljb24ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbn1cbi50c2QtY2FyZC1sYWJlbCB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2QtY2FyZC12YWx1ZSB7XG4gIG1hcmdpbi10b3A6IDhweDtcbiAgZm9udC1zaXplOiAyMHB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4udHNkLWNhcmQtc3ViIHtcbiAgbWFyZ2luLXRvcDogNHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xufVxuLnRzZC1jYXJkLW5vdGUge1xuICBtYXJnaW4tdG9wOiA0cHg7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1zdGF0ZS13YXJuLXByaW1hcnkpO1xufVxuXG4vKiA9PT09PT09PT09PT0g5Y2h54mH5aS06YOo77yI5Zu+6KGoIC8g6KGo5qC85YWx55So77yJID09PT09PT09PT09PSAqL1xuLnRzZC1jYXJkLWhlYWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgZ2FwOiA4cHg7XG4gIG1hcmdpbi1ib3R0b206IDEycHg7XG59XG4udHNkLWNhcmQtdGl0bGUge1xuICBtYXJnaW46IDA7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbn1cbi50c2QtY2FyZC10YWcge1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLyogPT09PT09PT09PT09IOavj+aXpeeUqOmHj+afseeKtuWbviA9PT09PT09PT09PT0gKi9cbi50c2QtY2hhcnQtY2FyZCB7IHBhZGRpbmc6IDE0cHggMTZweCAxMHB4OyB9XG4udHNkLWxlZ2VuZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogMTRweDtcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xufVxuLnRzZC1sZWdlbmQtaXRlbSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDZweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG59XG4udHNkLWxlZ2VuZC1kb3QsXG4udHNkLXRvb2x0aXAtZG90IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMTBweDtcbiAgaGVpZ2h0OiAxMHB4O1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGZsZXg6IG5vbmU7XG59XG4udHNkLWxlZ2VuZC1pbiB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKTsgfVxuLnRzZC1sZWdlbmQtb3V0IHsgYmFja2dyb3VuZDogdmFyKC0tZHN3LXN0YXRpYy1ncmVlbi01MDApOyB9XG4udHNkLWxlZ2VuZC10b3RhbCB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpOyB9XG5cbi50c2QtY2hhcnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICBnYXA6IDJweDtcbiAgaGVpZ2h0OiAyNDBweDtcbiAgcGFkZGluZzogMCA0cHg7XG59XG4udHNkLWNoYXJ0LWNvbCB7XG4gIGZsZXg6IDE7XG4gIG1pbi13aWR0aDogMDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgdmFyKC0tZHMtdHJhbnNpdGlvbi1kdXJhdGlvbi1mYXN0KSB2YXIoLS1kcy1lYXNlLWluLW91dCk7XG59XG4udHNkLWNoYXJ0LWNvbDpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1idXNpbmVzcy1wcmltYXJ5KTtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cbi50c2QtY2hhcnQ6aG92ZXIgLnRzZC1jaGFydC1jb2wgeyBvcGFjaXR5OiAwLjQ7IH1cbi50c2QtY2hhcnQ6aG92ZXIgLnRzZC1jaGFydC1jb2w6aG92ZXIsXG4udHNkLWNoYXJ0OmZvY3VzLXdpdGhpbiAudHNkLWNoYXJ0LWNvbDpmb2N1cyB7IG9wYWNpdHk6IDE7IH1cblxuLnRzZC1jaGFydC1wbG90IHtcbiAgZmxleDogMTtcbiAgd2lkdGg6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMSkgMXB4LCB0cmFuc3BhcmVudCAxcHgpO1xuICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMjUlO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xufVxuLnRzZC1jaGFydC1zdGFjayB7XG4gIHdpZHRoOiA2MiU7XG4gIGhlaWdodDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbn1cbi50c2QtY2hhcnQtc2VnIHtcbiAgd2lkdGg6IDEwMCU7XG59XG4udHNkLXNlZy1pbiB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKTtcbn1cbi50c2Qtc2VnLW91dCB7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1zdGF0aWMtZ3JlZW4tNTAwKTtcbiAgYm9yZGVyLXJhZGl1czogM3B4IDNweCAwIDA7XG59XG4udHNkLWNoYXJ0LWxhYmVsIHtcbiAgaGVpZ2h0OiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgbWFyZ2luLXRvcDogNnB4O1xuICBmb250LXNpemU6IDExcHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRzZC1jaGFydC1sYWJlbC1oaWRkZW4geyB2aXNpYmlsaXR5OiBoaWRkZW47IH1cblxuLyogdG9vbHRpcCAqL1xuLnRzZC10b29sdGlwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDEwcHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgei1pbmRleDogNjtcbiAgbWluLXdpZHRoOiAxNTZweDtcbiAgcGFkZGluZzogOHB4IDEwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctb3ZlcmxheSk7XG4gIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYzKTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG4udHNkLXRvb2x0aXAtZGF0ZSB7XG4gIG1hcmdpbi1ib3R0b206IDZweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC10b29sdGlwLXJvdyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xuICBtYXJnaW46IDJweCAwO1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbn1cbi50c2QtdG9vbHRpcC12YWwge1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgcGFkZGluZy1sZWZ0OiAxMnB4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC10b29sdGlwLXRvdGFsIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBtYXJnaW4tdG9wOiA2cHg7XG4gIHBhZGRpbmctdG9wOiA2cHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xufVxuXG4vKiA9PT09PT09PT09PT0g5oyJ5qih5Z6L5piO57uG6KGoID09PT09PT09PT09PSAqL1xuLnRzZC10YWJsZS1jYXJkIHsgcGFkZGluZzogMDsgfVxuLnRzZC10YWJsZS1jYXJkIC50c2QtY2FyZC1oZWFkZXIgeyBwYWRkaW5nOiAxNHB4IDE2cHggMDsgfVxuLnRzZC10YWJsZS13cmFwIHtcbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgLS1kc2gtc2Nyb2xsYmFyLXRodW1iOiB2YXIoLS1kc3ctYWxpYXMtc2Nyb2xsYmFyLWJnLWwyKTtcbiAgLS1kc2gtc2Nyb2xsYmFyLXRodW1iLWhvdmVyOiB2YXIoLS1kc3ctYWxpYXMtc2Nyb2xsYmFyLWhvdmVyLWwyKTtcbn1cbi50c2QtdGFibGUge1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgZm9udC1zaXplOiAxM3B4O1xufVxuLnRzZC10aCB7XG4gIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogNTAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi50c2QtdGgtbnVtIHsgdGV4dC1hbGlnbjogcmlnaHQ7IH1cbi50c2Qtc29ydC1idG4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAycHg7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgZm9udDogaW5oZXJpdDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogaW5oZXJpdDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnRzZC1zb3J0LWJ0bjpob3ZlciB7IGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7IH1cbi50c2Qtc29ydC1hY3RpdmUgeyBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWJyYW5kLXByaW1hcnkpOyB9XG4udHNkLXNvcnQtYXJyb3cge1xuICBmb250LXNpemU6IDEwcHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xufVxuLnRzZC10cjpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7IH1cbi50c2QtdGQge1xuICBwYWRkaW5nOiA5cHggMTJweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDEpO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4udHNkLXRkLW1vZGVsIHsgbWF4LXdpZHRoOiAyNDBweDsgfVxuLnRzZC1tb2RlbC1tb25vIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1heC13aWR0aDogMjIwcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBmb250LWZhbWlseTogdmFyKC0tZHMtZm9udC1mYW1pbHktY29kZSk7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbn1cbi50c2QtbnVtIHtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG59XG4udHNkLXRvdGFsIHtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1wcmltYXJ5KTtcbn1cbi50c2QtdW5wcmljZWQge1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuLnRzZC10ZC1yYXRpbyB7IHRleHQtYWxpZ246IHJpZ2h0OyB9XG4udHNkLXJhdGlvIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gIGdhcDogOHB4O1xufVxuLnRzZC1yYXRpby1iYXIge1xuICB3aWR0aDogNjBweDtcbiAgaGVpZ2h0OiA2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTEpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBmbGV4OiBub25lO1xufVxuLnRzZC1yYXRpby1maWxsIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApIDU1JSwgdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay0zMDApKSk7XG59XG4udHNkLXJhdGlvLXBjdCB7XG4gIG1pbi13aWR0aDogNDJweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xufVxuXG4vKiA9PT09PT09PT09PT0g5LiJ5oCB77ya56m6IC8g6ZSZ6K+vIC8g5Yqg6L29ID09PT09PT09PT09PSAqL1xuLnRzZC1lbXB0eSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xuICBwYWRkaW5nOiA0MHB4IDE2cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi50c2QtZW1wdHktaWNvbiB7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBtYXJnaW4tYm90dG9tOiA0cHg7XG59XG4udHNkLWVtcHR5LXRpdGxlIHtcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6IDE1cHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG59XG4udHNkLWVtcHR5LWRlc2Mge1xuICBtYXJnaW46IDA7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xufVxuLnRzZC1lbXB0eS1ibG9jayB7XG4gIHBhZGRpbmc6IDI0cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXRlcnRpYXJ5KTtcbn1cblxuLnRzZC1lcnJvciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTJweDtcbiAgcGFkZGluZzogMjBweCAxNnB4O1xuICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtZXJyb3ItcHJpbWFyeSkgNDAlLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtZXJyb3Itc2Vjb25kYXJ5KSAzMCUsIHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0zKSk7XG59XG4udHNkLWVycm9yLWljb24ge1xuICBmbGV4OiBub25lO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLXN0YXRlLWVycm9yLXByaW1hcnkpO1xufVxuLnRzZC1lcnJvci10ZXh0IHtcbiAgZmxleDogMTtcbiAgbWluLXdpZHRoOiAwO1xufVxuLnRzZC1lcnJvci10aXRsZSB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXByaW1hcnkpO1xufVxuLnRzZC1lcnJvci1kZXRhaWwge1xuICBtYXJnaW46IDJweCAwIDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnRzZC1hbGVydC1iYW5uZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDEwcHg7XG4gIHBhZGRpbmc6IDEwcHggMTRweDtcbiAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1wcmltYXJ5KSA0MCUsIHRyYW5zcGFyZW50KTtcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1zZWNvbmRhcnkpIDMwJSwgdmFyKC0tZHN3LWFsaWFzLWJnLWxheWVyLTMpKTtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1zdGF0ZS1lcnJvci1wcmltYXJ5KTtcbiAgZm9udC1zaXplOiAxM3B4O1xufVxuXG4udHNkLWxvYWRpbmcge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDE2cHg7XG59XG4udHNkLWNhcmQtc2tlbGV0b24geyBtaW4taGVpZ2h0OiA4NHB4OyB9XG4udHNkLXNrZWxldG9uIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLXNrZWxldG9uKTtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICBhbmltYXRpb246IHRzZC1wdWxzZSAxLjZzIHZhcigtLWRzLWVhc2UtaW4tb3V0KSBpbmZpbml0ZTtcbn1cbi50c2Qtc2tlbGV0b24tcm93IHtcbiAgaGVpZ2h0OiAxNHB4O1xuICBtYXJnaW46IDEycHggMDtcbiAgYmFja2dyb3VuZDogdmFyKC0tZHN3LWFsaWFzLWJnLXNrZWxldG9uKTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBhbmltYXRpb246IHRzZC1wdWxzZSAxLjZzIHZhcigtLWRzLWVhc2UtaW4tb3V0KSBpbmZpbml0ZTtcbn1cbkBrZXlmcmFtZXMgdHNkLXB1bHNlIHtcbiAgMCUsIDEwMCUgeyBvcGFjaXR5OiAxOyB9XG4gIDUwJSB7IG9wYWNpdHk6IDAuNDU7IH1cbn1cblxuLyogPT09PT09PT09PT09IOWIt+aWsOaXtueahOWGheWuueaAgSA9PT09PT09PT09PT0gKi9cbi50c2QtY29udGVudCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMTZweDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSB2YXIoLS1kcy10cmFuc2l0aW9uLWR1cmF0aW9uKSB2YXIoLS1kcy1lYXNlLWluLW91dCk7XG59XG4udHNkLWNvbnRlbnRbZGF0YS1idXN5PXRydWVdIHsgb3BhY2l0eTogMC41NTsgfVxuXG4vKiA9PT09PT09PT09PT0g5peg6Zqc56KNID09PT09PT09PT09PSAqL1xuLnRzZC12aXN1YWxseS1oaWRkZW4ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxcHg7XG4gIGhlaWdodDogMXB4O1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IC0xcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCAwIDAgMCk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGJvcmRlcjogMDtcbn1cbi50c2QtaWNvbiB7XG4gIGZsZXg6IG5vbmU7XG59XG4udHNkLXNlZy1idG46Zm9jdXMtdmlzaWJsZSxcbi50c2Qtc2VsZWN0LWJ0bjpmb2N1cy12aXNpYmxlLFxuLnRzZC1idG46Zm9jdXMtdmlzaWJsZSxcbi50c2QtaWNvbi1idG46Zm9jdXMtdmlzaWJsZSxcbi50c2QtbGluay1idG46Zm9jdXMtdmlzaWJsZSxcbi50c2Qtc29ydC1idG46Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1kc3ctYWxpYXMtc3RhdGUtYnVzaW5lc3MtcHJpbWFyeSk7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XG4vKiA9PT09PT09PT09PT0g57KS5bqm5YiH5o2iID09PT09PT09PT09PSAqL1xuLnRzZC1jYXJkLWFjdGlvbnMge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG59XG4udHNkLWdyYW4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgZ2FwOiAycHg7XG4gIHBhZGRpbmc6IDJweDtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMSk7XG59XG4udHNkLWdyYW4tYnRuIHtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIGZvbnQ6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgbGluZS1oZWlnaHQ6IDE2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgcGFkZGluZzogMnB4IDhweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnRzZC1ncmFuLWJ0bltkYXRhLWFjdGl2ZT1cInRydWVcIl0ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMyk7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtcHJpbWFyeSk7XG4gIGJveC1zaGFkb3c6IHZhcigtLWRzdy1zaGFkb3ctbHYxKTtcbn1cbi50c2QtZ3Jhbi1idG46ZGlzYWJsZWQge1xuICBvcGFjaXR5OiAwLjQ7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG4vKiA9PT09PT09PT09PT0g5oqY57q/5Zu+ID09PT09PT09PT09PSAqL1xuLnRzZC1saW5lY2hhcnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHBhZGRpbmc6IDZweCAxMHB4IDhweDtcbn1cbi50c2QtbGluZWNoYXJ0IHN2ZyB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWdyaWQge1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDIpO1xuICBzdHJva2Utd2lkdGg6IDE7XG4gIHN0cm9rZS1kYXNoYXJyYXk6IDMgMztcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1heGlzIHtcbiAgc3Ryb2tlOiB2YXIoLS1kc3ctYWxpYXMtYm9yZGVyLWwyKTtcbiAgc3Ryb2tlLXdpZHRoOiAxO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWluIHtcbiAgc3Ryb2tlOiB2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCk7XG4gIHN0cm9rZS13aWR0aDogMjtcbiAgZmlsbDogbm9uZTtcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1vdXQge1xuICBzdHJva2U6IHZhcigtLWRzdy1zdGF0aWMtZ3JlZW4tNTAwKTtcbiAgc3Ryb2tlLXdpZHRoOiAyO1xuICBmaWxsOiBub25lO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLXRvdGFsIHtcbiAgc3Ryb2tlOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTtcbiAgc3Ryb2tlLXdpZHRoOiAxLjU7XG4gIHN0cm9rZS1kYXNoYXJyYXk6IDQgMztcbiAgZmlsbDogbm9uZTtcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1kb3Qge1xuICBmaWxsOiB2YXIoLS1kc3ctYWxpYXMtYmctbGF5ZXItMik7XG4gIHN0cm9rZTogdmFyKC0tZHN3LWFsaWFzLWxhYmVsLXNlY29uZGFyeSk7XG4gIHN0cm9rZS13aWR0aDogMTtcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1ob3ZlciB7XG4gIGZpbGw6IHRyYW5zcGFyZW50O1xuICBjdXJzb3I6IGNyb3NzaGFpcjtcbn1cbi50c2QtbGluZWNoYXJ0IC50c2QtbGluZS1jdXJzb3Ige1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1ib3JkZXItbDMpO1xuICBzdHJva2Utd2lkdGg6IDE7XG4gIHN0cm9rZS1kYXNoYXJyYXk6IDMgMztcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaGwge1xuICBzdHJva2U6IHZhcigtLWRzdy1hbGlhcy1iZy1iYXNlKTtcbiAgc3Ryb2tlLXdpZHRoOiAxLjU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLWhsLWluIHsgZmlsbDogdmFyKC0tZHN3LXN0YXRpYy1kZWVwc2Vlay01MDApOyB9XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaGwtb3V0IHsgZmlsbDogdmFyKC0tZHN3LXN0YXRpYy1ncmVlbi01MDApOyB9XG4udHNkLWxpbmVjaGFydCAudHNkLWxpbmUtaGwtdG90YWwgeyBmaWxsOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtc2Vjb25kYXJ5KTsgfVxuLnRzZC1saW5lY2hhcnQgLnRzZC1saW5lLXRleHQge1xuICBmaWxsOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICBmb250LXNpemU6IDEwcHg7XG59XG4vKiA9PT09PT09PT09PT0g5bm05bqm54Ot5Yqb5Zu+ID09PT09PT09PT09PSAqL1xuLnRzZC1oZWF0bWFwIHtcbiAgcGFkZGluZzogNnB4IDE0cHggMTRweDtcbiAgb3ZlcmZsb3cteDogYXV0bztcbn1cbi50c2QtaGVhdG1hcC1pbm5lciB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDRweDtcbiAgbWluLXdpZHRoOiBtaW4tY29udGVudDtcbn1cbi50c2QtaGVhdG1hcC1tb250aHMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBtYXJnaW4tbGVmdDogMjZweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4udHNkLWhlYXRtYXAtbW9udGgge1xuICBmb250LXNpemU6IDlweDtcbiAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gIGNvbG9yOiB2YXIoLS1kc3ctYWxpYXMtbGFiZWwtdGVydGlhcnkpO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbn1cbi50c2QtaGVhdG1hcC1ib2R5IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiA0cHg7XG59XG4udHNkLWhlYXRtYXAtZGF5cyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMnB4O1xuICB3aWR0aDogMjJweDtcbiAgZmxleDogbm9uZTtcbn1cbi50c2QtaGVhdG1hcC1kYXkge1xuICBoZWlnaHQ6IDEwcHg7XG4gIGZvbnQtc2l6ZTogOXB4O1xuICBsaW5lLWhlaWdodDogMTBweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG59XG4udHNkLWhlYXRtYXAtZ3JpZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogMnB4O1xufVxuLnRzZC1oZWF0bWFwLWNvbCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMnB4O1xufVxuLnRzZC1oZWF0bWFwLWNlbGwge1xuICB3aWR0aDogMTBweDtcbiAgaGVpZ2h0OiAxMHB4O1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3Zlcik7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSB2YXIoLS1kcy10cmFuc2l0aW9uLWR1cmF0aW9uLWZhc3QpIHZhcigtLWRzLWVhc2UtaW4tb3V0KSwgYm94LXNoYWRvdyB2YXIoLS1kcy10cmFuc2l0aW9uLWR1cmF0aW9uLWZhc3QpIHZhcigtLWRzLWVhc2UtaW4tb3V0KTtcbn1cbi50c2QtaGVhdG1hcC1jZWxsOmhvdmVyIHtcbiAgb3V0bGluZTogMXB4IHNvbGlkIHZhcigtLWRzdy1hbGlhcy1sYWJlbC1zZWNvbmRhcnkpO1xuICB0cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xuICBib3gtc2hhZG93OiB2YXIoLS1kc3ctc2hhZG93LWx2Mik7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMjtcbn1cbi50c2QtaGVhdG1hcC1sZWdlbmQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDRweDtcbiAgbWFyZ2luOiA4cHggMTRweCAwO1xuICBwYWRkaW5nLXRvcDogOHB4O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tZHN3LWFsaWFzLWJvcmRlci1sMik7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgY29sb3I6IHZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSk7XG59XG5gXG5cbi8vIDAuMisgaG9zdCB0cmFuc3BvcnQ6IFBPU1QgL2FwaS88Y2hhbm5lbD4vPGVuZHBvaW50PiwgYXJncyBhcyB0aGUgSlNPTiBib2R5LFxuLy8gYW5zd2VyaW5nIHsgb2ssIHZhbHVlIH0gfCB7IG9rLCBlcnJvciB9IChzZWUgc3JjL2hvc3QvcnBjLmpzKS4gVGhlIHJvdXRlIGlzXG4vLyBtb3VudGVkIG9uIENvbm5lY3Rpb24ncyBzaGFyZWQgQVBJIGNoYW5uZWwsIHNvIGl0IG5ldmVyIG5lZWRzIHRoZSBwbHVnaW4nc1xuLy8gZmliZXIgdG8gb3duIGB3ZWJTZXJ2ZXJgLlxuZnVuY3Rpb24gY2FsbEZldGNoKGNoYW5uZWwsIGVuZHBvaW50LCBhcmdzKSB7XG4gIGNvbnN0IHBhdGggPSAnL2FwaS8nICsgU3RyaW5nKGNoYW5uZWwpLnJlcGxhY2UoL15cXC8rLywgJycpICsgJy8nICsgZW5kcG9pbnRcbiAgcmV0dXJuIGZldGNoKHBhdGgsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShhcmdzID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJncyksXG4gIH0pLnRoZW4oKHJlcykgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSByZXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpIHx8ICcnXG4gICAgLy8gUm91dGUgbWlzc2luZyBvbiB0aGlzIGhvc3Q6IDQwNC80MDUgZnJvbSB0aGUgc2hhcmVkIGRpc3BhdGNoZXIsIG9yIHRoZVxuICAgIC8vIFNQQSBIVE1MIHdoZW4gbm8gdHJhbnNwb3J0IHJvdXRlIG1hdGNoZWQgdGhlIHBhdGggYXQgYWxsLlxuICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDQgfHwgcmVzLnN0YXR1cyA9PT0gNDA1IHx8IHR5cGUuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpID09PSAtMSkge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ3VzYWdlIEZldGNoIHJvdXRlIHVuYXZhaWxhYmxlIChIVFRQICcgKyByZXMuc3RhdHVzICsgJyknKVxuICAgICAgZXJyb3IuY29kZSA9ICd1c2FnZS1yb3V0ZS1taXNzaW5nJ1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5qc29uKCkudGhlbigoYm9keSkgPT4ge1xuICAgICAgaWYgKGJvZHkgJiYgYm9keS5vaykgcmV0dXJuIGJvZHkudmFsdWVcbiAgICAgIHRocm93IG5ldyBFcnJvcigoYm9keSAmJiBib2R5LmVycm9yICYmIGJvZHkuZXJyb3IubWVzc2FnZSkgfHwgKCdSUEMgJyArIGVuZHBvaW50ICsgJyBmYWlsZWQnKSlcbiAgICB9KVxuICB9KVxufVxuXG4vLyBSUEMgYnJpZGdlOiBkeW5hbWljLXBsdWdpbiBydW5zIHByb3ZpZGUgYSBgaG9zdGAgZ2xvYmFsOyBzdGF0aWMgKGJ1bmRsZSlcbi8vIGluc3RhbGxzIHByb3ZpZGUgY3R4LmdldCgnY29ubmVjdGlvbicpLiBLZWVwIG9uZSBVSSBzb3VyY2UgZm9yIGJvdGguXG5mdW5jdGlvbiBob3N0Q2FsbChtZXRob2QsIGFyZ3MpIHtcbiAgLy8gUDAtMzogcHJlZmVyIHRoZSBvZmZpY2lhbCBgcmVtb3RlYCBzZXJ2aWNlIHdoZW4gaXQgZXhwb3NlcyB0aGUgdXNhZ2UgQVBJO1xuICAvLyBvdGhlcndpc2UgZmFsbCB0aHJvdWdoIHRvIHRoZSBob3N0L2Nvbm5lY3Rpb24gZmFsbGJhY2tzIHVuY2hhbmdlZC5cbiAgY29uc3QgcmVtb3RlU2NvcGUgPSAodHlwZW9mIGN0eCAhPT0gJ3VuZGVmaW5lZCcgJiYgY3R4ICYmIHR5cGVvZiBjdHguZ2V0ID09PSAnZnVuY3Rpb24nKVxuICAgID8gY3R4XG4gICAgOiAodHlwZW9mIF91c2FnZUN0eCAhPT0gJ3VuZGVmaW5lZCcgJiYgX3VzYWdlQ3R4ICYmIHR5cGVvZiBfdXNhZ2VDdHguZ2V0ID09PSAnZnVuY3Rpb24nID8gX3VzYWdlQ3R4IDogbnVsbClcbiAgaWYgKHJlbW90ZVNjb3BlICYmIHR5cGVvZiByZW1vdGVTY29wZS5nZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVtb3RlID0gcmVtb3RlU2NvcGUuZ2V0KCdyZW1vdGUnKVxuICAgICAgaWYgKHJlbW90ZSAmJiByZW1vdGUudXNhZ2UpIHtcbiAgICAgICAgY29uc3Qgck5hbWUgPSBTdHJpbmcobWV0aG9kKVxuICAgICAgICBjb25zdCByU2xhc2ggPSByTmFtZS5pbmRleE9mKCcvJylcbiAgICAgICAgY29uc3QgckVwID0gclNsYXNoID09PSAtMSA/IHJOYW1lIDogck5hbWUuc2xpY2UoclNsYXNoICsgMSlcbiAgICAgICAgY29uc3QgckNhbWVsID0gckVwLnJlcGxhY2UoLy0oW2Etel0pL2csIChtLCBjKSA9PiBjLnRvVXBwZXJDYXNlKCkpXG4gICAgICAgIGNvbnN0IGZuID0gKHR5cGVvZiByZW1vdGUudXNhZ2VbckNhbWVsXSA9PT0gJ2Z1bmN0aW9uJyAmJiByZW1vdGUudXNhZ2VbckNhbWVsXSlcbiAgICAgICAgICB8fCAodHlwZW9mIHJlbW90ZS51c2FnZVtyRXBdID09PSAnZnVuY3Rpb24nICYmIHJlbW90ZS51c2FnZVtyRXBdKVxuICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBmbihhcmdzKSkudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5vaykgcmV0dXJuIHJlcy52YWx1ZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKChyZXMgJiYgcmVzLmVycm9yICYmIHJlcy5lcnJvci5tZXNzYWdlKSB8fCAoJ1JQQyAnICsgbWV0aG9kICsgJyBmYWlsZWQnKSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gcmVtb3RlIHByb2JpbmcgZmFpbGVkIOKAlCBmYWxsIHRocm91Z2ggdG8gdGhlIGV4aXN0aW5nIGZhbGxiYWNrc1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIGhvc3QgIT09ICd1bmRlZmluZWQnICYmIGhvc3QgJiYgdHlwZW9mIGhvc3QuY2FsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaG9zdC5jYWxsKG1ldGhvZCwgYXJncykpXG4gIH1cbiAgLy8gU3RhdGljIGJ1bmRsZSBpbnN0YWxscyBoYXZlIG5vIGN0eC9ob3N0IGdsb2JhbHM6IHRoZSBlbnRyeSBhcHBseSgpIHN0b3Jlc1xuICAvLyB0aGUgcmVhbCBjb250ZXh0IGluIF91c2FnZUN0eCAoZGVjbGFyZWQgYnkgdGhlIGJ1aWxkIHdyYXBwZXIpLlxuICBjb25zdCBzY29wZSA9ICh0eXBlb2YgY3R4ICE9PSAndW5kZWZpbmVkJyAmJiBjdHggJiYgdHlwZW9mIGN0eC5nZXQgPT09ICdmdW5jdGlvbicpXG4gICAgPyBjdHhcbiAgICA6ICh0eXBlb2YgX3VzYWdlQ3R4ICE9PSAndW5kZWZpbmVkJyA/IF91c2FnZUN0eCA6IG51bGwpXG4gIGlmIChzY29wZSA9PT0gbnVsbCB8fCB0eXBlb2Ygc2NvcGUuZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignY29udGV4dCB1bmF2YWlsYWJsZScpKVxuICB9XG4gIGNvbnN0IG5hbWUgPSBTdHJpbmcobWV0aG9kKVxuICBjb25zdCBzbGFzaCA9IG5hbWUuaW5kZXhPZignLycpXG4gIGNvbnN0IGNoYW5uZWwgPSBzbGFzaCA9PT0gLTEgPyBuYW1lIDogbmFtZS5zbGljZSgwLCBzbGFzaClcbiAgY29uc3QgZW5kcG9pbnQgPSBzbGFzaCA9PT0gLTEgPyBuYW1lIDogbmFtZS5zbGljZShzbGFzaCArIDEpXG4gIC8vIExlZ2FjeSBwcmUtMC4yIHRyYW5zcG9ydDogYSBgL3VzYWdlYCBwcmVmaXggUlBDIGNoYW5uZWwgb3duZWQgYnkgdGhlIGhvc3RcbiAgLy8gcGx1Z2luIGl0c2VsZi5cbiAgY29uc3QgY2FsbFJwYyA9ICgpID0+IHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gc2NvcGUuZ2V0KCdjb25uZWN0aW9uJylcbiAgICBpZiAoY29ubmVjdGlvbiA9PT0gdW5kZWZpbmVkIHx8IGNvbm5lY3Rpb24ucnBjID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2Nvbm5lY3Rpb24gc2VydmljZSB1bmF2YWlsYWJsZScpKVxuICAgIH1cbiAgICByZXR1cm4gY29ubmVjdGlvbi5ycGMuY2FsbCgnLycgKyBjaGFubmVsLnJlcGxhY2UoL15cXC8rLywgJycpLCBlbmRwb2ludCwgYXJncykudGhlbigocmVzKSA9PiB7XG4gICAgICBpZiAocmVzICYmIHJlcy5vaykgcmV0dXJuIHJlcy52YWx1ZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKChyZXMgJiYgcmVzLmVycm9yICYmIHJlcy5lcnJvci5tZXNzYWdlKSB8fCAoJ1JQQyAnICsgbWV0aG9kICsgJyBmYWlsZWQnKSlcbiAgICB9KVxuICB9XG4gIC8vIFByZWZlciB0aGUgc2hhcmVkLWNoYW5uZWwgRmV0Y2ggcm91dGU7IGFuIG9sZGVyIGhvc3QgYW5zd2VycyBcInJvdXRlXG4gIC8vIG1pc3NpbmdcIiBhbmQgd2UgZmFsbCBiYWNrIHRvIHRoZSBsZWdhY3kgY2hhbm5lbCBpdCBkb2VzIGltcGxlbWVudC5cbiAgY29uc3QgZmV0Y2hVc2FibGUgPSB0eXBlb2YgZmV0Y2ggPT09ICdmdW5jdGlvbidcbiAgICAmJiAhKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9jYXRpb24ucHJvdG9jb2wgPT09ICdmaWxlOicpXG4gIGlmICghZmV0Y2hVc2FibGUpIHJldHVybiBjYWxsUnBjKClcbiAgcmV0dXJuIGNhbGxGZXRjaChjaGFubmVsLCBlbmRwb2ludCwgYXJncykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yICYmIGVycm9yLmNvZGUgPT09ICd1c2FnZS1yb3V0ZS1taXNzaW5nJykgcmV0dXJuIGNhbGxScGMoKVxuICAgIHRocm93IGVycm9yXG4gIH0pXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog6K6+572u5Z+f5a6a5Lu377ya5a6Y5pa5IGBjdHguY29uZmlnRm9ybXMuZ2V0KCd1c2FnZScpYO+8iGRzaC1jbGllbnQtdWktc2V0dGluZ3PvvInkvJjlhYjvvIxcbiAqIOS4jeWPr+eUqOaXtuWbnumAgCB1c2FnZS9wcmljZXMgUlBD44CC57uR5a6a5Y+q5YGa5LiA5qyh77yM6K+75YaZ5YWx55So5ZCM5LiAIGZvcm3jgIJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmxldCB1c2FnZUN0eCA9IG51bGxcbmxldCBfdXNhZ2VQcmljZXNTY29wZSA9IG51bGxcblxuZnVuY3Rpb24gcmVzb2x2ZVVzYWdlQ3R4KCkge1xuICBpZiAodXNhZ2VDdHggJiYgdHlwZW9mIHVzYWdlQ3R4LmdldCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVzYWdlQ3R4XG4gIGlmICh0eXBlb2YgX3VzYWdlQ3R4ICE9PSAndW5kZWZpbmVkJyAmJiBfdXNhZ2VDdHggJiYgdHlwZW9mIF91c2FnZUN0eC5nZXQgPT09ICdmdW5jdGlvbicpIHJldHVybiBfdXNhZ2VDdHhcbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0VXNhZ2VQcmljZXNTY29wZSgpIHtcbiAgaWYgKF91c2FnZVByaWNlc1Njb3BlKSByZXR1cm4gX3VzYWdlUHJpY2VzU2NvcGVcbiAgY29uc3QgYyA9IHJlc29sdmVVc2FnZUN0eCgpXG4gIGlmICghYyB8fCB0eXBlb2YgYy5nZXQgIT09ICdmdW5jdGlvbicpIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgLy8gMC4yLng6IHRoZSBvZmZpY2lhbCBjb25maWctZm9ybSBzdXJmYWNlIGZvciB0aGlzIHBsdWdpbidzIGVudHJ5IGlkXG4gICAgLy8gKGB1c2FnZWAsIHRoZSBidW5kbGUgcGF0Y2ggcm93IGlkKS4gYHNldHRpbmdzU2NvcGVgIGZyb20gMC4xLnggZG9lcyBub3RcbiAgICAvLyBleGlzdCBpbiB0aGUgc2hpcHBlZCBjbGllbnQsIHNvIHByb2JpbmcgaXQgb25seSBldmVyIHJldHVybmVkIG51bGwuXG4gICAgY29uc3QgZm9ybXMgPSBjLmdldCgnY29uZmlnRm9ybXMnKVxuICAgIGlmICghZm9ybXMgfHwgdHlwZW9mIGZvcm1zLmdldCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG51bGxcbiAgICBfdXNhZ2VQcmljZXNTY29wZSA9IGZvcm1zLmdldCgndXNhZ2UnKVxuICAgIHJldHVybiBfdXNhZ2VQcmljZXNTY29wZVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG4vLyDku7fmoLzlhpnlhaXlj6PvvJpzZXR0aW5ncyBzY29wZSDlj6/nlKjml7blhpkgdXNhZ2UucHJpY2VzIOWRveWQjeepuumXtOWtl+aute+8jFxuLy8g5ZCm5YiZ5Zue6YCAIHVzYWdlL3ByaWNlcyBSUEPvvIjlvZPliY0gVUkg5peg5Lu35qC857yW6L6R5Zmo77yM5L+d55WZ5q2k5YaZ5YWlIHNlYW0g5L6b5ZCO57ut5L2/55So77yJ44CCXG5mdW5jdGlvbiB1c2FnZVNhdmVQcmljZXMobmV4dCkge1xuICBjb25zdCBhcmdzID0ge31cbiAgaWYgKG5leHQgJiYgdHlwZW9mIG5leHQgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKG5leHQucHJpY2VzICE9PSB1bmRlZmluZWQpIGFyZ3MucHJpY2VzID0gbmV4dC5wcmljZXNcbiAgICBpZiAobmV4dC5jdXJyZW5jeSAhPT0gdW5kZWZpbmVkKSBhcmdzLmN1cnJlbmN5ID0gbmV4dC5jdXJyZW5jeVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgc2NvcGUgPSBnZXRVc2FnZVByaWNlc1Njb3BlKClcbiAgICBpZiAoc2NvcGUgJiYgdHlwZW9mIHNjb3BlLnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3Qgam9icyA9IFtdXG4gICAgICBpZiAoYXJncy5wcmljZXMgIT09IHVuZGVmaW5lZCkgam9icy5wdXNoKHNjb3BlLnNldCgncHJpY2VzJywgYXJncy5wcmljZXMpKVxuICAgICAgaWYgKGFyZ3MuY3VycmVuY3kgIT09IHVuZGVmaW5lZCkgam9icy5wdXNoKHNjb3BlLnNldCgnY3VycmVuY3knLCBhcmdzLmN1cnJlbmN5KSlcbiAgICAgIGlmIChqb2JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGpvYnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNuYXAgPSB0eXBlb2Ygc2NvcGUuZ2V0U25hcHNob3QgPT09ICdmdW5jdGlvbicgPyBzY29wZS5nZXRTbmFwc2hvdCgpIDogbnVsbFxuICAgICAgICAgIHJldHVybiBzbmFwICYmIHNuYXAudmFsdWUgPyBzbmFwLnZhbHVlIDogbnVsbFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgUlBDIHdyaXRlIHBhdGhcbiAgfVxuICByZXR1cm4gaG9zdENhbGwoJ3VzYWdlL3ByaWNlcycsIGFyZ3MpXG59XG5cbjtcbmNvbnN0IGggPSBSZWFjdC5jcmVhdGVFbGVtZW50XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5Zu96ZmF5YyW77yaemgvZW4g5a2X5YW4ICsgQ29udGV4dO+8iGxvY2FsZSDmnI3liqHnu48gc2xvdCDms6jlhozms6jlhaUgdO+8jOWtkOe7hOS7tue7jyBDb250ZXh0IOWPlueUqO+8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgTlMgPSAndXNhZ2UnXG5jb25zdCBaSCA9IHtcbiAgbmF2OiAn55So6YeP57uf6K6hJyxcbiAgc3VidGl0bGU6ICfmn6XnnIsgQUkg5qih5Z6L55qE5L2/55So5oOF5Ya15ZKM5oiQ5pys57uf6K6hJyxcbiAgcmVmcmVzaDogJ+WIt+aWsCcsXG4gIHRvZGF5OiAn5LuK5pelJyxcbiAgbGFzdDdkOiAn6L+RN+WkqScsXG4gIGxhc3QzMGQ6ICfov5EzMOWkqScsXG4gIGN1c3RvbTogJ+iHquWumuS5iScsXG4gIGFsbE1vZGVsczogJ+WFqOmDqOaooeWeiycsXG4gIHNlbGVjdGVkTW9kZWxzOiAn5bey6YCJIHtjb3VudH0g5Liq5qih5Z6LJyxcbiAgc2VsZWN0QWxsOiAn5YWo6YCJJyxcbiAgY2xlYXI6ICfmuIXnqbonLFxuICBzZWFyY2hNb2RlbHM6ICfmkJzntKLmqKHlnosnLFxuICBub01hdGNoTW9kZWxzOiAn5peg5Yy56YWN5qih5Z6LJyxcbiAgbW9kZWxGaWx0ZXJIaW50OiAn5Yu+6YCJ5Y2z5pe255Sf5pWI77yM5LuF5YiX5Ye65b2T5YmN6IyD5Zu05YaF5pyJ5pWw5o2u55qE5qih5Z6LJyxcbiAgY3VzdG9tUmFuZ2VUaXRsZTogJ+iHquWumuS5ieaXtumXtOiMg+WbtCcsXG4gIGN1c3RvbVJhbmdlQXJpYTogJ+iHquWumuS5ieaXpeacn+iMg+WbtCcsXG4gIHN0YXJ0VGltZTogJ+W8gOWni+aXtumXtCcsXG4gIGVuZFRpbWU6ICfnu5PmnZ/ml7bpl7QnLFxuICByYW5nZUludmFsaWQ6ICflvIDlp4vml7bpl7TkuI3og73mmZrkuo7nu5PmnZ/ml7bpl7QnLFxuICByYW5nZUhpbnQ6ICfmlK/mjIHpgInmi6nml6XmnJ/vvIzmnIDplb8gMzAg5aSpJyxcbiAgY2FuY2VsOiAn5Y+W5raIJyxcbiAgY29uZmlybTogJ+ehruWumicsXG4gIGRhdGVSYW5nZUdyb3VwOiAn5pel5pyf6IyD5Zu0JyxcbiAgbW9kZWxGaWx0ZXJHcm91cDogJ+aooeWei+etm+mAiScsXG4gIGNoYXJ0VHlwZUdyb3VwOiAn5Zu+6KGo57G75Z6LJyxcbiAgdG90YWxUb2tlbnM6ICfmgLsgVG9rZW4nLFxuICBpbnB1dFRva2VuczogJ+i+k+WFpSBUb2tlbicsXG4gIG91dHB1dFRva2VuczogJ+i+k+WHuiBUb2tlbicsXG4gIGNhbGxzOiAn6LCD55So5qyh5pWwJyxcbiAgY29zdDogJ+aIkOacrCcsXG4gIGFwcHJveElPOiAn4omIIOi+k+WFpSvovpPlh7onLFxuICB1bnByaWNlZE5vdGU6ICd7Y291bnR9IOasoeiwg+eUqOacquWumuS7tycsXG4gIGRhaWx5VHJlbmQ6ICfmr4/ml6XnlKjph4/otovlir8nLFxuICBiYXJWaWV3OiAn5p+x54q25Zu+JyxcbiAgbGluZVZpZXc6ICfmipjnur/lm74nLFxuICBieUhvdXI6ICfmjInlsI/ml7YnLFxuICBieURheTogJ+aMieWkqScsXG4gIGV2ZXJ5TkRheXM6ICfmr48ge259IOWkqScsXG4gIGxlZ2VuZElucHV0OiAn6L6T5YWlJyxcbiAgbGVnZW5kT3V0cHV0OiAn6L6T5Ye6JyxcbiAgbGVnZW5kVG90YWw6ICfmgLsgVG9rZW4nLFxuICB0b29sdGlwVG90YWw6ICflkIjorqEnLFxuICBzdGFydE5EYXlzOiAn6LW3IHtufSDlpKknLFxuICBsaW5lQ2hhcnRBcmlhOiAnVG9rZW4g55So6YeP6LaL5Yq/5oqY57q/5Zu+JyxcbiAgeWVhcmx5SGVhdG1hcDogJ+W5tOW6pueUqOmHj+eDreWKm+WbvicsXG4gIHllYXJEYWlseTogJ3t5ZWFyfSDlubTmr4/ml6UgVG9rZW4g55So6YePJyxcbiAgbW9udGhMYWJlbDogJ3tufeaciCcsXG4gIHdlZWtkYXlNb246ICfkuIAnLFxuICB3ZWVrZGF5V2VkOiAn5LiJJyxcbiAgd2Vla2RheUZyaTogJ+S6lCcsXG4gIGxlc3M6ICflsJEnLFxuICBtb3JlOiAn5aSaJyxcbiAgYnlNb2RlbFRpdGxlOiAn5oyJ5qih5Z6L5piO57uGJyxcbiAgbW9kZWxDb3VudDogJ+WFsSB7bn0g5Liq5qih5Z6LJyxcbiAgbW9kZWxUYWJsZUNhcHRpb246ICfmjInmqKHlnovnlKjph4/mmI7nu4YnLFxuICBjb2xNb2RlbDogJ+aooeWeiycsXG4gIGNvbENhbGxzOiAn6K+35rGC5pWwJyxcbiAgY29sSW5wdXQ6ICfovpPlhaUgVG9rZW4nLFxuICBjb2xPdXRwdXQ6ICfovpPlh7ogVG9rZW4nLFxuICBjb2xUb3RhbDogJ+aAuyBUb2tlbicsXG4gIGNvbENvc3Q6ICfmiJDmnKwnLFxuICBjb2xTaGFyZTogJ+WNoOavlCcsXG4gIHVucHJpY2VkOiAn5pyq5a6a5Lu3JyxcbiAgdW5wcmljZWRSb3dIaW50OiAn6K+l5qih5Z6L5pyq6YWN572u5a6a5Lu377yM5oyJIDAg6K6h5Lu3JyxcbiAgbm9EYXRhOiAn5pqC5peg5pWw5o2uJyxcbiAgZW1wdHlEZXNjOiAn6K+l5pe26Ze05q615YaF5rKh5pyJ6LCD55So6K6w5b2VJyxcbiAgZW1wdHlGaWx0ZXJlZDogJ+W9k+WJjeetm+mAieadoeS7tuS4i+ayoeacieaVsOaNru+8jOivleivleiwg+aVtOaXtumXtOiMg+WbtOaIluaooeWeiycsXG4gIHJlc2V0RmlsdGVyczogJ+mHjee9ruetm+mAiScsXG4gIGxvYWRGYWlsZWQ6ICfmlbDmja7liqDovb3lpLHotKXvvJp7bWVzc2FnZX0nLFxuICBsb2FkRmFpbGVkVGl0bGU6ICfmlbDmja7liqDovb3lpLHotKUnLFxuICByZXRyeTogJ+mHjeivlScsXG4gIGJhckFyaWE6ICd7a2V5fe+8jOi+k+WFpSB7aW59IFRva2Vu77yM6L6T5Ye6IHtvdXR9IFRva2Vu77yM5ZCI6K6hIHt0b3R9IFRva2VuJyxcbiAgaG1UaXRsZTogJ3trZXl977yae3Rva2Vuc30gVG9rZW57Y2FsbHN9JyxcbiAgaG1DYWxsczogJ++8jHtjb3VudH0g5qyh6LCD55SoJyxcbiAgd2QwOiAn5ZGo5pelJyxcbiAgd2QxOiAn5ZGo5LiAJyxcbiAgd2QyOiAn5ZGo5LqMJyxcbiAgd2QzOiAn5ZGo5LiJJyxcbiAgd2Q0OiAn5ZGo5ZubJyxcbiAgd2Q1OiAn5ZGo5LqUJyxcbiAgd2Q2OiAn5ZGo5YWtJyxcbn1cbmNvbnN0IEVOID0ge1xuICBuYXY6ICdVc2FnZSBTdGF0cycsXG4gIHN1YnRpdGxlOiAnVmlldyBBSSBtb2RlbCB1c2FnZSBhbmQgY29zdCBzdGF0aXN0aWNzJyxcbiAgcmVmcmVzaDogJ1JlZnJlc2gnLFxuICB0b2RheTogJ1RvZGF5JyxcbiAgbGFzdDdkOiAnTGFzdCA3IGRheXMnLFxuICBsYXN0MzBkOiAnTGFzdCAzMCBkYXlzJyxcbiAgY3VzdG9tOiAnQ3VzdG9tJyxcbiAgYWxsTW9kZWxzOiAnQWxsIG1vZGVscycsXG4gIHNlbGVjdGVkTW9kZWxzOiAne2NvdW50fSBtb2RlbHMgc2VsZWN0ZWQnLFxuICBzZWxlY3RBbGw6ICdTZWxlY3QgYWxsJyxcbiAgY2xlYXI6ICdDbGVhcicsXG4gIHNlYXJjaE1vZGVsczogJ1NlYXJjaCBtb2RlbHMnLFxuICBub01hdGNoTW9kZWxzOiAnTm8gbWF0Y2hpbmcgbW9kZWxzJyxcbiAgbW9kZWxGaWx0ZXJIaW50OiAnQXBwbGllcyBpbnN0YW50bHk7IGxpc3RzIG9ubHkgbW9kZWxzIHdpdGggZGF0YSBpbiB0aGUgcmFuZ2UnLFxuICBjdXN0b21SYW5nZVRpdGxlOiAnQ3VzdG9tIHRpbWUgcmFuZ2UnLFxuICBjdXN0b21SYW5nZUFyaWE6ICdDdXN0b20gZGF0ZSByYW5nZScsXG4gIHN0YXJ0VGltZTogJ1N0YXJ0JyxcbiAgZW5kVGltZTogJ0VuZCcsXG4gIHJhbmdlSW52YWxpZDogJ1N0YXJ0IG11c3Qgbm90IGJlIGxhdGVyIHRoYW4gZW5kJyxcbiAgcmFuZ2VIaW50OiAnRGF0ZSBvbmx5LCB1cCB0byAzMCBkYXlzJyxcbiAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgY29uZmlybTogJ09LJyxcbiAgZGF0ZVJhbmdlR3JvdXA6ICdEYXRlIHJhbmdlJyxcbiAgbW9kZWxGaWx0ZXJHcm91cDogJ01vZGVsIGZpbHRlcicsXG4gIGNoYXJ0VHlwZUdyb3VwOiAnQ2hhcnQgdHlwZScsXG4gIHRvdGFsVG9rZW5zOiAnVG90YWwgVG9rZW5zJyxcbiAgaW5wdXRUb2tlbnM6ICdJbnB1dCBUb2tlbnMnLFxuICBvdXRwdXRUb2tlbnM6ICdPdXRwdXQgVG9rZW5zJyxcbiAgY2FsbHM6ICdDYWxscycsXG4gIGNvc3Q6ICdDb3N0JyxcbiAgYXBwcm94SU86ICfiiYggaW5wdXQrb3V0cHV0JyxcbiAgdW5wcmljZWROb3RlOiAne2NvdW50fSBjYWxscyB1bnByaWNlZCcsXG4gIGRhaWx5VHJlbmQ6ICdEYWlseSB1c2FnZSB0cmVuZCcsXG4gIGJhclZpZXc6ICdCYXJzJyxcbiAgbGluZVZpZXc6ICdMaW5lJyxcbiAgYnlIb3VyOiAnSG91cmx5JyxcbiAgYnlEYXk6ICdEYWlseScsXG4gIGV2ZXJ5TkRheXM6ICdFdmVyeSB7bn0gZGF5cycsXG4gIGxlZ2VuZElucHV0OiAnSW5wdXQnLFxuICBsZWdlbmRPdXRwdXQ6ICdPdXRwdXQnLFxuICBsZWdlbmRUb3RhbDogJ1RvdGFsJyxcbiAgdG9vbHRpcFRvdGFsOiAnVG90YWwnLFxuICBzdGFydE5EYXlzOiAnZm9yIHtufSBkYXlzJyxcbiAgbGluZUNoYXJ0QXJpYTogJ1Rva2VuIHVzYWdlIHRyZW5kIGxpbmUgY2hhcnQnLFxuICB5ZWFybHlIZWF0bWFwOiAnWWVhcmx5IGhlYXRtYXAnLFxuICB5ZWFyRGFpbHk6ICdEYWlseSB0b2tlbnMgaW4ge3llYXJ9JyxcbiAgbW9udGhMYWJlbDogJ3tufScsXG4gIHdlZWtkYXlNb246ICdNb24nLFxuICB3ZWVrZGF5V2VkOiAnV2VkJyxcbiAgd2Vla2RheUZyaTogJ0ZyaScsXG4gIGxlc3M6ICdMZXNzJyxcbiAgbW9yZTogJ01vcmUnLFxuICBieU1vZGVsVGl0bGU6ICdCeSBtb2RlbCcsXG4gIG1vZGVsQ291bnQ6ICd7bn0gbW9kZWxzJyxcbiAgbW9kZWxUYWJsZUNhcHRpb246ICdUb2tlbiB1c2FnZSBieSBtb2RlbCcsXG4gIGNvbE1vZGVsOiAnTW9kZWwnLFxuICBjb2xDYWxsczogJ0NhbGxzJyxcbiAgY29sSW5wdXQ6ICdJbnB1dCBUb2tlbnMnLFxuICBjb2xPdXRwdXQ6ICdPdXRwdXQgVG9rZW5zJyxcbiAgY29sVG90YWw6ICdUb3RhbCBUb2tlbnMnLFxuICBjb2xDb3N0OiAnQ29zdCcsXG4gIGNvbFNoYXJlOiAnU2hhcmUnLFxuICB1bnByaWNlZDogJ1VucHJpY2VkJyxcbiAgdW5wcmljZWRSb3dIaW50OiAnTm8gcHJpY2luZyBjb25maWd1cmVkOyBjb3VudGVkIGFzIDAnLFxuICBub0RhdGE6ICdObyBkYXRhJyxcbiAgZW1wdHlEZXNjOiAnTm8gY2FsbHMgaW4gdGhpcyBwZXJpb2QnLFxuICBlbXB0eUZpbHRlcmVkOiAnTm8gZGF0YSBmb3IgdGhlIGN1cnJlbnQgZmlsdGVycywgdHJ5IGFkanVzdGluZyB0aGUgcmFuZ2Ugb3IgbW9kZWxzJyxcbiAgcmVzZXRGaWx0ZXJzOiAnUmVzZXQgZmlsdGVycycsXG4gIGxvYWRGYWlsZWQ6ICdGYWlsZWQgdG8gbG9hZCBkYXRhOiB7bWVzc2FnZX0nLFxuICBsb2FkRmFpbGVkVGl0bGU6ICdGYWlsZWQgdG8gbG9hZCBkYXRhJyxcbiAgcmV0cnk6ICdSZXRyeScsXG4gIGJhckFyaWE6ICd7a2V5fSwgaW5wdXQge2lufSB0b2tlbnMsIG91dHB1dCB7b3V0fSB0b2tlbnMsIHRvdGFsIHt0b3R9IHRva2VucycsXG4gIGhtVGl0bGU6ICd7a2V5fToge3Rva2Vuc30gdG9rZW5ze2NhbGxzfScsXG4gIGhtQ2FsbHM6ICcsIHtjb3VudH0gY2FsbHMnLFxuICB3ZDA6ICdTdW4nLFxuICB3ZDE6ICdNb24nLFxuICB3ZDI6ICdUdWUnLFxuICB3ZDM6ICdXZWQnLFxuICB3ZDQ6ICdUaHUnLFxuICB3ZDU6ICdGcmknLFxuICB3ZDY6ICdTYXQnLFxufVxuY29uc3QgVCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQobnVsbClcbmZ1bmN0aW9uIHVzZVQoKSB7XG4gIHJldHVybiBSZWFjdC51c2VDb250ZXh0KFQpXG59XG5mdW5jdGlvbiBmYWxsYmFja1Qoa2V5LCBwYXJhbXMpIHtcbiAgbGV0IHMgPSBaSFtrZXldXG4gIGlmIChzID09PSB1bmRlZmluZWQpIHJldHVybiBrZXlcbiAgaWYgKHBhcmFtcykge1xuICAgIHMgPSBzLnJlcGxhY2UoL1xceyhcXHcrKVxcfS9nLCAobSwgbikgPT4gKHBhcmFtc1tuXSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHBhcmFtc1tuXSkgOiBtKSlcbiAgfVxuICByZXR1cm4gc1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOaVsOWtl+agvOW8j+WMlu+8iOinhOagvOesrCA1IOiKgu+8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gZm9ybWF0VG9rZW5zU2hvcnQobikge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSkgcmV0dXJuICctLSdcbiAgaWYgKG4gPj0gMWU2KSByZXR1cm4gTWF0aC5yb3VuZChuIC8gMWU0KSAvIDEwMCArICdNJyAvLyAxLjIzTVxuICBpZiAobiA+PSAxZTMpIHJldHVybiBNYXRoLnJvdW5kKG4gLyAxZTIpIC8gMTAgKyAnSycgLy8gMTIuM0tcbiAgcmV0dXJuIFN0cmluZyhNYXRoLnJvdW5kKG4pKVxufVxuZnVuY3Rpb24gZm9ybWF0SW50KG4pIHtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSA/IE1hdGgucm91bmQobikudG9Mb2NhbGVTdHJpbmcoKSA6ICctLSdcbn1cbmZ1bmN0aW9uIGZvcm1hdENvc3QobiwgY3VyKSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG4pKSByZXR1cm4gJy0tJ1xuICByZXR1cm4gKGN1ciB8fCAnwqUnKSArIG4udG9GaXhlZCgyKVxufVxuZnVuY3Rpb24gZGF5TGFiZWwoa2V5KSB7XG4gIGNvbnN0IFssIG0sIGRdID0gU3RyaW5nKGtleSB8fCAnJykuc3BsaXQoJy0nKVxuICBpZiAobSA9PT0gdW5kZWZpbmVkIHx8IGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuICctLSdcbiAgcmV0dXJuIG0gKyAnLScgKyBkXG59XG5mdW5jdGlvbiBmbXRQY3QocmF0aW8pIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocmF0aW8pKSByZXR1cm4gJzAlJ1xuICBjb25zdCBwID0gcmF0aW8gKiAxMDBcbiAgaWYgKHAgPj0gOTkuOTUpIHJldHVybiAnMTAwJSdcbiAgcmV0dXJuIHAudG9GaXhlZCgxKSArICclJ1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOaXpeacn+W3peWFt1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gc3RhcnRPZkRheShkKSB7XG4gIGNvbnN0IHggPSBuZXcgRGF0ZShkKVxuICB4LnNldEhvdXJzKDAsIDAsIDAsIDApXG4gIHJldHVybiB4XG59XG5mdW5jdGlvbiBhZGREYXlzKGQsIG4pIHtcbiAgY29uc3QgeCA9IG5ldyBEYXRlKGQpXG4gIHguc2V0RGF0ZSh4LmdldERhdGUoKSArIG4pXG4gIHJldHVybiB4XG59XG5mdW5jdGlvbiBmbXREYXRlSW5wdXQoZCkge1xuICBjb25zdCB5ID0gZC5nZXRGdWxsWWVhcigpXG4gIGNvbnN0IG0gPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKVxuICBjb25zdCBkYXkgPSBTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJylcbiAgcmV0dXJuIHkgKyAnLScgKyBtICsgJy0nICsgZGF5XG59XG5mdW5jdGlvbiBmbXREYXRlU2xhc2gocykge1xuICBjb25zdCBtID0gU3RyaW5nKHMgfHwgJycpLm1hdGNoKC9eKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSkkLylcbiAgaWYgKCFtKSByZXR1cm4gJy0tJ1xuICByZXR1cm4gbVsxXSArICcvJyArIG1bMl0gKyAnLycgKyBtWzNdXG59XG4vLyDpooTorr4gLyDoh6rlrprkuYkg4oaSIHsgZnJvbSwgdG8gfe+8iFVuaXgg5q+r56eS77yJXG4vLyDku4rml6UgPSDlvZPlpKkgMDA6MDAg6Iez5LuK77yb6L+RNy8zMOWkqSA9IOWQq+S7iuWkqeW+gOWJjSBOIOS4quiHqueEtuaXpSAwMDowMCDotbfvvJvoh6rlrprkuYkgPSDotbfml6UgMDA6MDAgfiDmraLml6UgMjM6NTk6NTkuOTk5XG5mdW5jdGlvbiByYW5nZUZvcihwcmVzZXQsIGN1c3RvbSkge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IHRvZGF5ID0gc3RhcnRPZkRheShub3cpXG4gIGlmIChwcmVzZXQgPT09ICd0b2RheScpIHJldHVybiB7IGZyb206IHRvZGF5LmdldFRpbWUoKSwgdG86IG5vdy5nZXRUaW1lKCkgfVxuICBpZiAocHJlc2V0ID09PSAnN2QnKSByZXR1cm4geyBmcm9tOiBhZGREYXlzKHRvZGF5LCAtNikuZ2V0VGltZSgpLCB0bzogbm93LmdldFRpbWUoKSB9XG4gIGlmIChwcmVzZXQgPT09ICczMGQnKSByZXR1cm4geyBmcm9tOiBhZGREYXlzKHRvZGF5LCAtMjkpLmdldFRpbWUoKSwgdG86IG5vdy5nZXRUaW1lKCkgfVxuICBjb25zdCBmcm9tID0gbmV3IERhdGUoY3VzdG9tLmZyb20gKyAnVDAwOjAwOjAwJykuZ2V0VGltZSgpXG4gIGNvbnN0IHRvID0gbmV3IERhdGUoY3VzdG9tLnRvICsgJ1QyMzo1OTo1OS45OTknKS5nZXRUaW1lKClcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoZnJvbSkgfHwgIU51bWJlci5pc0Zpbml0ZSh0bykpIHtcbiAgICByZXR1cm4geyBmcm9tOiB0b2RheS5nZXRUaW1lKCksIHRvOiBub3cuZ2V0VGltZSgpIH1cbiAgfVxuICByZXR1cm4geyBmcm9tLCB0byB9XG59XG5mdW5jdGlvbiB3ZWVrZGF5T2Yoa2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGtleSArICdUMDA6MDA6MDAnKS50b0xvY2FsZURhdGVTdHJpbmcoJ3poLUNOJywgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gJydcbiAgfVxufVxuLyoqIFdlZWtkYXkgZm9yIGEgZGF5L2hvdXIvbWludXRlIGJ1Y2tldCBrZXkgKGBZWVlZLU1NLUREYCBvciBgWVlZWS1NTS1ERCBISDptbWApLiAqL1xuZnVuY3Rpb24gd2Vla2RheU5hbWUoa2V5LCB0KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKFN0cmluZyhrZXkpLnJlcGxhY2UoJyAnLCAnVCcpKVxuICAgIHJldHVybiB0KFsnd2QwJywgJ3dkMScsICd3ZDInLCAnd2QzJywgJ3dkNCcsICd3ZDUnLCAnd2Q2J11bZC5nZXREYXkoKV0gfHwgJ3dkMCcpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gJydcbiAgfVxufVxuLyoqIFgtYXhpcyBsYWJlbCBmb3IgYSBidWNrZXQga2V5IHVuZGVyIGEgZ3JhbnVsYXJpdHkuICovXG5mdW5jdGlvbiB4TGFiZWwoa2V5LCBnKSB7XG4gIGNvbnN0IHMgPSBTdHJpbmcoa2V5KVxuICBjb25zdCBzcCA9IHMuc3BsaXQoJyAnKVxuICBpZiAoZyA9PT0gJ21pbnV0ZScpIHJldHVybiBzcC5sZW5ndGggPiAxID8gc3BbMV0uc2xpY2UoMCwgNSkgOiBzLnNsaWNlKDUpXG4gIGlmIChnID09PSAnaG91cicpIHJldHVybiBzcC5sZW5ndGggPiAxID8gc3BbMV0uc2xpY2UoMCwgMikgKyAnOjAwJyA6IHMuc2xpY2UoNSlcbiAgcmV0dXJuIGRheUxhYmVsKGtleSlcbn1cbi8qKiBGaXhlZCBncmFudWxhcml0eSBwb2xpY3k6IHRvZGF5IGlzIGhvdXJseSwgZXZlcnl0aGluZyBlbHNlIGlzIGRhaWx5LiAqL1xuZnVuY3Rpb24gZWZmR3JhbnVsYXJpdHkocmFuZ2UpIHtcbiAgcmV0dXJuIHJhbmdlID09PSAndG9kYXknID8gJ2hvdXInIDogJ2RheSc7XG59XG4vKiogU3RhYmxlIHN0ZXAgc3RyYXRlZ3kgZm9yIGN1c3RvbSByYW5nZXM6IHRhcmdldCB+MTUtMjUgYnVja2V0cy4gKi9cbmZ1bmN0aW9uIHBpY2tTdGVwRGF5cyhzcGFuTXMpIHtcbiAgY29uc3QgZGF5cyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoKHNwYW5NcyB8fCAwKSAvIDg2NDAwMDAwKSlcbiAgaWYgKGRheXMgPD0gMzEpIHJldHVybiAxXG4gIGlmIChkYXlzIDw9IDYyKSByZXR1cm4gM1xuICBpZiAoZGF5cyA8PSAxNTApIHJldHVybiA1XG4gIHJldHVybiA3XG59XG4vKiogSHVtYW4gbGFiZWwgZm9yIHRoZSBjdXJyZW50IHN0ZXAgcG9saWN5LiAqL1xuZnVuY3Rpb24gc3RlcExhYmVsKHQsIHJhbmdlLCBzdGVwRGF5cykge1xuICBpZiAocmFuZ2UgPT09ICd0b2RheScpIHJldHVybiB0KCdieUhvdXInKVxuICByZXR1cm4gc3RlcERheXMgPiAxID8gdCgnZXZlcnlORGF5cycsIHsgbjogc3RlcERheXMgfSkgOiB0KCdieURheScpXG59XG4vKiogSGVhdG1hcCBjZWxsIGNvbG9yIGJ5IHJlbGF0aXZlIHRva2VuIHZvbHVtZS4gKi9cbmZ1bmN0aW9uIGhlYXRDb2xvcih0b3RhbCwgbWF4KSB7XG4gIGlmICghdG90YWwpIHJldHVybiAndmFyKC0tZHN3LWFsaWFzLWludGVyYWN0aXZlLWJnLWhvdmVyKSdcbiAgY29uc3QgciA9IHRvdGFsIC8gbWF4XG4gIGNvbnN0IHBjdCA9IHIgPCAwLjI1ID8gMjIgOiByIDwgMC41ID8gNDUgOiByIDwgMC43NSA/IDcwIDogMTAwXG4gIHJldHVybiAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWRzdy1zdGF0aWMtZGVlcHNlZWstNTAwKSAnICsgcGN0ICsgJyUsIHZhcigtLWRzdy1hbGlhcy1iZy1sYXllci0yKSknXG59XG5mdW5jdGlvbiBuaWNlQ2VpbCh2KSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHYpIHx8IHYgPD0gMCkgcmV0dXJuIDFcbiAgY29uc3QgbWFnID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2cxMCh2KSkpXG4gIGNvbnN0IG5vcm0gPSB2IC8gbWFnXG4gIGNvbnN0IG5pY2UgPSBub3JtIDw9IDEgPyAxIDogbm9ybSA8PSAyID8gMiA6IG5vcm0gPD0gNSA/IDUgOiAxMFxuICByZXR1cm4gbmljZSAqIG1hZ1xufVxuZnVuY3Rpb24gZGVmYXVsdEN1c3RvbSgpIHtcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICByZXR1cm4geyBmcm9tOiBmbXREYXRlSW5wdXQoYWRkRGF5cyhub3csIC02KSksIHRvOiBmbXREYXRlSW5wdXQobm93KSB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5YaF6IGUIFNWRyDlm77moIfvvIjml6Dlm77moIflupPvvIzmiYvlhpkgZmVhdGhlciDpo47moLwgc3Ryb2tlIOWbvuagh++8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgSUNPTl9QQVRIUyA9IHtcbiAgbGF5ZXJzOiAnTTEyIDJsOCA0LjUtOCA0LjUtOC00LjVMMTIgMnptMCA4bDggNC41LTggNC41LTgtNC41TDEyIDEwem0wIDhsOCA0LjUtOCA0LjUtOC00LjVMMTIgMTh6JyxcbiAgZG93bjogJ00xMiAzdjEybTAgMGwtNC41LTQuNU0xMiAxNWw0LjUtNC41TTQgMjFoMTYnLFxuICB1cDogJ00xMiAyMVY5bTAgMGwtNC41IDQuNU0xMiA5bDQuNSA0LjVNNCAzaDE2JyxcbiAgYWN0aXZpdHk6ICdNMiAxMmg0bDIuNS04IDUgMTYgMi41LThoNicsXG4gIGNvaW5zOiAnTTMgOWEyIDIgMCAwMTItMmgxNGEyIDIgMCAwMTIgMnY5YTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMlY5em0wIDVoMThNOCA1LjVWNGEyIDIgMCAwMTItMmg0YTIgMiAwIDAxMiAydjEuNScsXG4gIHJlZnJlc2g6ICdNMjEgMTJhOSA5IDAgMTEtMi42NC02LjM2TTIxIDR2NmgtNicsXG4gIGNoZXZyb246ICdNNiA5bDYgNiA2LTYnLFxuICBpbmJveDogJ00yMiAxMmgtNmwtMiAzaC00bC0yLTNIMm0zLjUtNi41TDIgMTJ2NmEyIDIgMCAwMDIgMmgxNmEyIDIgMCAwMDItMnYtNmwtMy41LTYuNUEyIDIgMCAwMDE2Ljc2IDVINy4yNGEyIDIgMCAwMC0xLjc0IDEuNXonLFxuICBhbGVydDogJ00xMiA5djRtMCA0aC4wMU0xMC4zIDMuODZMMS44MiAxOGEyIDIgMCAwMDEuNzEgM2gxNi45NGEyIDIgMCAwMDEuNzEtM0wxMy43IDMuODZhMiAyIDAgMDAtMy40IDB6JyxcbiAgc2VhcmNoOiAnTTIxIDIxbC00LjM1LTQuMzVNMTcgMTAuNWE2LjUgNi41IDAgMTEtMTMgMCA2LjUgNi41IDAgMDExMyAweicsXG59XG5mdW5jdGlvbiBTdmdJY29uKHByb3BzKSB7XG4gIGNvbnN0IHsgbmFtZSwgc2l6ZSwgY2xhc3NOYW1lIH0gPSBwcm9wc1xuICByZXR1cm4gaCgnc3ZnJywge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lIHx8ICd0c2QtaWNvbicsXG4gICAgd2lkdGg6IHNpemUgfHwgMTYsXG4gICAgaGVpZ2h0OiBzaXplIHx8IDE2LFxuICAgIHZpZXdCb3g6ICcwIDAgMjQgMjQnLFxuICAgIGZpbGw6ICdub25lJyxcbiAgICBzdHJva2U6ICdjdXJyZW50Q29sb3InLFxuICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgIHN0cm9rZUxpbmVjYXA6ICdyb3VuZCcsXG4gICAgc3Ryb2tlTGluZWpvaW46ICdyb3VuZCcsXG4gICAgJ2FyaWEtaGlkZGVuJzogdHJ1ZSxcbiAgfSwgaCgncGF0aCcsIHsgZDogSUNPTl9QQVRIU1tuYW1lXSB8fCBJQ09OX1BBVEhTLmFjdGl2aXR5IH0pKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOmAmueUqCBIb29r77ya5aSW6YOo54K55Ye75YWz6ZetXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiB1c2VPdXRzaWRlQ2xpY2sob3BlbiwgcmVmLCBvbkNsb3NlKSB7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaGFuZGxlcihlKSB7XG4gICAgICBpZiAocmVmLmN1cnJlbnQgJiYgIXJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgb25DbG9zZSgpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICB9LCBbb3Blbiwgb25DbG9zZSwgcmVmXSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBIZWFkZXLvvJrmoIfpopggKyDlia/moIfpopggKyDliLfmlrDmjInpkq5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIFN0YXRzSGVhZGVyKHByb3BzKSB7XG4gIGNvbnN0IHsgYnVzeSwgb25SZWZyZXNoIH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWFkZXInIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhZGVyLXRleHQnIH0sXG4gICAgICBoKCdoMicsIHsgY2xhc3NOYW1lOiAndHNkLXRpdGxlJyB9LCB0KCduYXYnKSksXG4gICAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2Qtc3VidGl0bGUnIH0sIHQoJ3N1YnRpdGxlJykpKSxcbiAgICBoKCdidXR0b24nLCB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogJ3RzZC1pY29uLWJ0bicgKyAoYnVzeSA/ICcgdHNkLXNwaW5uaW5nJyA6ICcnKSxcbiAgICAgIG9uQ2xpY2s6IG9uUmVmcmVzaCxcbiAgICAgIHRpdGxlOiB0KCdyZWZyZXNoJyksXG4gICAgICAnYXJpYS1sYWJlbCc6IHQoJ3JlZnJlc2gnKSxcbiAgICB9LCBoKFN2Z0ljb24sIHsgbmFtZTogJ3JlZnJlc2gnIH0pKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDoh6rlrprkuYnml6XmnJ/ojIPlm7Tmta7lsYJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIEN1c3RvbVJhbmdlUG9wb3Zlcihwcm9wcykge1xuICBjb25zdCB7IGN1c3RvbSwgb25BcHBseSwgb25DbG9zZSB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICBjb25zdCBbZnJvbSwgc2V0RnJvbV0gPSBSZWFjdC51c2VTdGF0ZShjdXN0b20uZnJvbSlcbiAgY29uc3QgW3RvLCBzZXRUb10gPSBSZWFjdC51c2VTdGF0ZShjdXN0b20udG8pXG4gIGNvbnN0IGludmFsaWQgPSAhZnJvbSB8fCAhdG8gfHwgZnJvbSA+IHRvXG4gIC8vIFAyLTEx77yaZGlhbG9nIOS7pSBFc2NhcGUg5YWz6ZetXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZnVuY3Rpb24gb25LZXkoZSkge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyB8fCBlLmtleSA9PT0gJ0VzYycpIG9uQ2xvc2UoKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXkpXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSlcbiAgfSwgW29uQ2xvc2VdKVxuICByZXR1cm4gaCgnZGl2Jywge1xuICAgIGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyIHRzZC1yYW5nZS1wb3BvdmVyJyxcbiAgICByb2xlOiAnZGlhbG9nJyxcbiAgICAnYXJpYS1sYWJlbCc6IHQoJ2N1c3RvbVJhbmdlQXJpYScpLFxuICB9LFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXItdGl0bGUnIH0sIHQoJ2N1c3RvbVJhbmdlVGl0bGUnKSksXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcmFuZ2UtZmllbGRzJyB9LFxuICAgICAgaCgnbGFiZWwnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZCcgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWZpZWxkLWxhYmVsJyB9LCB0KCdzdGFydFRpbWUnKSksXG4gICAgICAgIGgoJ2lucHV0Jywge1xuICAgICAgICAgIHR5cGU6ICdkYXRlJywgdmFsdWU6IGZyb20sICdhcmlhLWxhYmVsJzogdCgnc3RhcnRUaW1lJyksXG4gICAgICAgICAgb25DaGFuZ2U6IChlKSA9PiBzZXRGcm9tKGUudGFyZ2V0LnZhbHVlKSxcbiAgICAgICAgfSkpLFxuICAgICAgaCgnbGFiZWwnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZCcgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWZpZWxkLWxhYmVsJyB9LCB0KCdlbmRUaW1lJykpLFxuICAgICAgICBoKCdpbnB1dCcsIHtcbiAgICAgICAgICB0eXBlOiAnZGF0ZScsIHZhbHVlOiB0bywgJ2FyaWEtbGFiZWwnOiB0KCdlbmRUaW1lJyksXG4gICAgICAgICAgb25DaGFuZ2U6IChlKSA9PiBzZXRUbyhlLnRhcmdldC52YWx1ZSksXG4gICAgICAgIH0pKSksXG4gICAgaW52YWxpZFxuICAgICAgPyBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZmllbGQtZXJyb3InLCByb2xlOiAnYWxlcnQnIH0sIHQoJ3JhbmdlSW52YWxpZCcpKVxuICAgICAgOiBudWxsLFxuICAgIGgoJ3AnLCB7IGNsYXNzTmFtZTogJ3RzZC1maWVsZC1oaW50JyB9LCB0KCdyYW5nZUhpbnQnKSksXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcG9wb3Zlci1hY3Rpb25zJyB9LFxuICAgICAgaCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3NOYW1lOiAndHNkLWJ0biB0c2QtYnRuLWdob3N0Jywgb25DbGljazogb25DbG9zZSB9LCB0KCdjYW5jZWwnKSksXG4gICAgICBoKCdidXR0b24nLCB7XG4gICAgICAgIHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6ICd0c2QtYnRuIHRzZC1idG4tcHJpbWFyeScsXG4gICAgICAgIGRpc2FibGVkOiBpbnZhbGlkLFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7IGlmICghaW52YWxpZCkgb25BcHBseSh7IGZyb20sIHRvIH0pIH0sXG4gICAgICB9LCB0KCdjb25maXJtJykpKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDmqKHlnovlpJrpgInkuIvmi4lcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIE1vZGVsRHJvcGRvd24ocHJvcHMpIHtcbiAgY29uc3QgeyBvcHRpb25zLCBzZWxlY3RlZCwgb25DaGFuZ2UgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtxdWVyeSwgc2V0UXVlcnldID0gUmVhY3QudXNlU3RhdGUoJycpXG4gIGNvbnN0IGFuY2hvclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgZnVuY3Rpb24gaGFuZGxlcihlKSB7XG4gICAgICBpZiAoYW5jaG9yUmVmLmN1cnJlbnQgJiYgIWFuY2hvclJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgc2V0T3BlbihmYWxzZSlcbiAgICB9XG4gICAgZnVuY3Rpb24gb25LZXkoZSkge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyB8fCBlLmtleSA9PT0gJ0VzYycpIHNldE9wZW4oZmFsc2UpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXkpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSlcbiAgICB9XG4gIH0sIFtvcGVuXSlcblxuICAvLyDlj6rliJflh7rlvZPliY3ojIPlm7TmnInmlbDmja7nmoTmqKHlnovvvJvlt7LpgInkvYbmjonlh7rlgJnpgInliJfooajnmoTjgIzooaXlm57jgI3vvIzkv53or4Hlj6/muLLmn5PjgIHlj6/muIXpmaRcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKG9wdGlvbnMgfHwgW10pLm1hcCgobSkgPT4gbS5wcm92aWRlciArICcvJyArIG0ubW9kZWwpKVxuICAgIDsoc2VsZWN0ZWQgfHwgW10pLmZvckVhY2goKG0pID0+IHNldC5hZGQobSkpXG4gICAgY29uc3QgbGlzdCA9IEFycmF5LmZyb20oc2V0KVxuICAgIGxpc3Quc29ydCgpXG4gICAgcmV0dXJuIGxpc3RcbiAgfSwgW29wdGlvbnMsIHNlbGVjdGVkXSlcblxuICBjb25zdCBxID0gcXVlcnkudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgY29uc3QgZmlsdGVyZWQgPSBxID09PSAnJyA/IGNhbmRpZGF0ZXMgOiBjYW5kaWRhdGVzLmZpbHRlcigoYykgPT4gYy50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2YocSkgPj0gMClcbiAgY29uc3QgbGFiZWwgPSBzZWxlY3RlZC5sZW5ndGggPT09IDAgPyB0KCdhbGxNb2RlbHMnKSA6IHQoJ3NlbGVjdGVkTW9kZWxzJywgeyBjb3VudDogc2VsZWN0ZWQubGVuZ3RoIH0pXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXItYW5jaG9yJywgcmVmOiBhbmNob3JSZWYgfSxcbiAgICBoKCdidXR0b24nLCB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogJ3RzZC1zZWxlY3QtYnRuJyArIChzZWxlY3RlZC5sZW5ndGggPiAwID8gJyB0c2Qtc2VsZWN0LWhhcycgOiAnJyksXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7IHNldE9wZW4oKHYpID0+ICF2KTsgc2V0UXVlcnkoJycpIH0sXG4gICAgICAnYXJpYS1leHBhbmRlZCc6IG9wZW4sXG4gICAgICAnYXJpYS1oYXNwb3B1cCc6ICdsaXN0Ym94JyxcbiAgICAgIHRpdGxlOiBsYWJlbCxcbiAgICB9LFxuICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXNlbGVjdC1sYWJlbCcgfSwgbGFiZWwpLFxuICAgICAgaChTdmdJY29uLCB7IG5hbWU6ICdjaGV2cm9uJywgc2l6ZTogMTQsIGNsYXNzTmFtZTogJ3RzZC1jaGV2cm9uJyArIChvcGVuID8gJyB0c2QtY2hldnJvbi1vcGVuJyA6ICcnKSB9KSksXG4gICAgb3BlblxuICAgICAgPyBoKCdkaXYnLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXIgdHNkLW1vZGVsLXBvcG92ZXInLFxuICAgICAgICAgIHJvbGU6ICdsaXN0Ym94JyxcbiAgICAgICAgICAnYXJpYS1sYWJlbCc6IHQoJ21vZGVsRmlsdGVyR3JvdXAnKSxcbiAgICAgICAgICAnYXJpYS1tdWx0aXNlbGVjdGFibGUnOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXBvcG92ZXItdG9vbHMnIH0sXG4gICAgICAgICAgICBoKCdidXR0b24nLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6ICd0c2QtbGluay1idG4nLCBvbkNsaWNrOiAoKSA9PiBvbkNoYW5nZShjYW5kaWRhdGVzLnNsaWNlKCkpIH0sIHQoJ3NlbGVjdEFsbCcpKSxcbiAgICAgICAgICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1saW5rLWJ0bicsIG9uQ2xpY2s6ICgpID0+IG9uQ2hhbmdlKFtdKSB9LCB0KCdjbGVhcicpKSksXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2VhcmNoJyB9LFxuICAgICAgICAgICAgaChTdmdJY29uLCB7IG5hbWU6ICdzZWFyY2gnLCBzaXplOiAxNCwgY2xhc3NOYW1lOiAndHNkLXNlYXJjaC1pY29uJyB9KSxcbiAgICAgICAgICAgIGgoJ2lucHV0Jywge1xuICAgICAgICAgICAgICB0eXBlOiAnc2VhcmNoJywgdmFsdWU6IHF1ZXJ5LCBwbGFjZWhvbGRlcjogdCgnc2VhcmNoTW9kZWxzJyksXG4gICAgICAgICAgICAgICdhcmlhLWxhYmVsJzogdCgnc2VhcmNoTW9kZWxzJyksXG4gICAgICAgICAgICAgIG9uQ2hhbmdlOiAoZSkgPT4gc2V0UXVlcnkoZS50YXJnZXQudmFsdWUpLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLW1vZGVsLWxpc3QnIH0sXG4gICAgICAgICAgICBmaWx0ZXJlZC5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgPyBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtcG9wb3Zlci1lbXB0eScgfSwgdCgnbm9NYXRjaE1vZGVscycpKVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBmaWx0ZXJlZC5tYXAoKGtleSkgPT5cbiAgICAgICAgICAgICAgaCgnbGFiZWwnLCB7IGtleSwgY2xhc3NOYW1lOiAndHNkLW1vZGVsLWl0ZW0nIH0sXG4gICAgICAgICAgICAgICAgaCgnaW5wdXQnLCB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICAgICAgY2hlY2tlZDogc2VsZWN0ZWQuaW5kZXhPZihrZXkpID49IDAsXG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZTogKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHNlbGVjdGVkLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC5pbmRleE9mKGtleSkgPCAwKSBuZXh0LnB1c2goa2V5KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXh0LmluZGV4T2Yoa2V5KVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IDApIG5leHQuc3BsaWNlKGksIDEpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UobmV4dCkgLy8g5Yu+6YCJ5Y2z5pe255Sf5pWIXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1tb2RlbC1uYW1lJywgdGl0bGU6IGtleSB9LCBrZXkpKSkpLFxuICAgICAgICAgIGgoJ3AnLCB7IGNsYXNzTmFtZTogJ3RzZC1wb3BvdmVyLW5vdGUnIH0sIHQoJ21vZGVsRmlsdGVySGludCcpKSlcbiAgICAgIDogbnVsbClcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDnrZvpgInmoI/vvJrml6XmnJ/pooTorr7vvIjliIbmrrXmjInpkq7vvIkrIOiHquWumuS5iea1ruWxgiArIOaooeWei+WkmumAiVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gRmlsdGVyQmFyKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICByYW5nZSwgY3VzdG9tLCBtb2RlbHMsIGN1c3RvbU9wZW4sIG1vZGVsT3B0aW9ucyxcbiAgICBvblByZXNldCwgb25DdXN0b21PcGVuLCBvbkN1c3RvbUFwcGx5LCBvbkN1c3RvbUNsb3NlLCBvbk1vZGVsc0NoYW5nZSxcbiAgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3Qgc2VnUmVmID0gUmVhY3QudXNlUmVmKG51bGwpXG4gIHVzZU91dHNpZGVDbGljayhjdXN0b21PcGVuLCBzZWdSZWYsIG9uQ3VzdG9tQ2xvc2UpXG5cbiAgY29uc3QgY3VzdG9tTGFiZWwgPSBmbXREYXRlU2xhc2goY3VzdG9tLmZyb20pICsgJyAtICcgKyBmbXREYXRlU2xhc2goY3VzdG9tLnRvKVxuICBjb25zdCBwcmVzZXRzID0gW1xuICAgIHsga2V5OiAndG9kYXknLCBsYWJlbDogdCgndG9kYXknKSB9LFxuICAgIHsga2V5OiAnN2QnLCBsYWJlbDogdCgnbGFzdDdkJykgfSxcbiAgICB7IGtleTogJzMwZCcsIGxhYmVsOiB0KCdsYXN0MzBkJykgfSxcbiAgICB7IGtleTogJ2N1c3RvbScsIGxhYmVsOiB0KCdjdXN0b20nKSB9LFxuICBdXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWZpbHRlcmJhcicgfSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1zZWctd3JhcCcsIHJlZjogc2VnUmVmIH0sXG4gICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1zZWcnLCByb2xlOiAnZ3JvdXAnLCAnYXJpYS1sYWJlbCc6IHQoJ2RhdGVSYW5nZUdyb3VwJykgfSxcbiAgICAgICAgcHJlc2V0cy5tYXAoKHApID0+IHtcbiAgICAgICAgICBjb25zdCBhY3RpdmUgPSByYW5nZSA9PT0gcC5rZXlcbiAgICAgICAgICBjb25zdCBpc0N1c3RvbSA9IHAua2V5ID09PSAnY3VzdG9tJ1xuICAgICAgICAgIGNvbnN0IGxhYmVsID0gaXNDdXN0b20gJiYgYWN0aXZlID8gY3VzdG9tTGFiZWwgOiBwLmxhYmVsXG4gICAgICAgICAgcmV0dXJuIGgoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgIGtleTogcC5rZXksXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1zZWctYnRuJyArIChhY3RpdmUgPyAnIHRzZC1zZWctYWN0aXZlJyA6ICcnKSArIChpc0N1c3RvbSA/ICcgdHNkLXNlZy1jdXN0b20nIDogJycpLFxuICAgICAgICAgICAgJ2FyaWEtcHJlc3NlZCc6IGFjdGl2ZSxcbiAgICAgICAgICAgIHRpdGxlOiBpc0N1c3RvbSAmJiBhY3RpdmUgPyBjdXN0b21MYWJlbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHsgaWYgKGlzQ3VzdG9tKSBvbkN1c3RvbU9wZW4oIWN1c3RvbU9wZW4pOyBlbHNlIG9uUHJlc2V0KHAua2V5KSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2Qtc2VnLWxhYmVsJyB9LCBsYWJlbCkpXG4gICAgICAgIH0pKSxcbiAgICAgIGN1c3RvbU9wZW4gPyBoKEN1c3RvbVJhbmdlUG9wb3ZlciwgeyBjdXN0b20sIG9uQXBwbHk6IG9uQ3VzdG9tQXBwbHksIG9uQ2xvc2U6IG9uQ3VzdG9tQ2xvc2UgfSkgOiBudWxsKSxcbiAgICBoKE1vZGVsRHJvcGRvd24sIHsgb3B0aW9uczogbW9kZWxPcHRpb25zLCBzZWxlY3RlZDogbW9kZWxzLCBvbkNoYW5nZTogb25Nb2RlbHNDaGFuZ2UgfSkpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5rGH5oC75oyH5qCH5Y2hIMOXNVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gU3VtbWFyeUNhcmRzKHByb3BzKSB7XG4gIGNvbnN0IHsgdG90YWwsIGN1cnJlbmN5LCB1bnByaWNlZENhbGxzIH0gPSBwcm9wc1xuICBjb25zdCB0dCA9IHVzZVQoKVxuICBjb25zdCBkID0gdG90YWwgfHwge31cbiAgY29uc3QgaW5wdXRUb3RhbCA9IChkLmlucHV0VG9rZW5zIHx8IDApICsgKGQuY2FjaGVSZWFkVG9rZW5zIHx8IDApICsgKGQuY2FjaGVXcml0ZVRva2VucyB8fCAwKVxuICBjb25zdCBjYXJkcyA9IFtcbiAgICB7XG4gICAgICBrZXk6ICd0b3RhbCcsIGljb246ICdsYXllcnMnLCBsYWJlbDogdHQoJ3RvdGFsVG9rZW5zJyksXG4gICAgICB2YWx1ZTogZm9ybWF0VG9rZW5zU2hvcnQoZC50b3RhbFRva2VucyksIHRpdGxlOiBmb3JtYXRJbnQoZC50b3RhbFRva2VucyksXG4gICAgICBzdWI6IHR0KCdhcHByb3hJTycpLCBjb2xvcjogJ3ZhcigtLWRzdy1hbGlhcy1icmFuZC1wcmltYXJ5KScsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdpbnB1dCcsIGljb246ICdkb3duJywgbGFiZWw6IHR0KCdpbnB1dFRva2VucycpLFxuICAgICAgdmFsdWU6IGZvcm1hdFRva2Vuc1Nob3J0KGlucHV0VG90YWwpLCB0aXRsZTogZm9ybWF0SW50KGlucHV0VG90YWwpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCknLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnb3V0cHV0JywgaWNvbjogJ3VwJywgbGFiZWw6IHR0KCdvdXRwdXRUb2tlbnMnKSxcbiAgICAgIHZhbHVlOiBmb3JtYXRUb2tlbnNTaG9ydChkLm91dHB1dFRva2VucyksIHRpdGxlOiBmb3JtYXRJbnQoZC5vdXRwdXRUb2tlbnMpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCknLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnY2FsbHMnLCBpY29uOiAnYWN0aXZpdHknLCBsYWJlbDogdHQoJ2NhbGxzJyksXG4gICAgICB2YWx1ZTogZm9ybWF0SW50KGQuY2FsbHMpLCB0aXRsZTogZm9ybWF0SW50KGQuY2FsbHMpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCknLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnY29zdCcsIGljb246ICdjb2lucycsIGxhYmVsOiB0dCgnY29zdCcpLFxuICAgICAgdmFsdWU6IGZvcm1hdENvc3QoZC5jb3N0LCBjdXJyZW5jeSksIHRpdGxlOiBmb3JtYXRDb3N0KGQuY29zdCwgY3VycmVuY3kpLFxuICAgICAgY29sb3I6ICd2YXIoLS1kc3ctc3RhdGljLWdyZWVuLTUwMCknLFxuICAgIH0sXG4gIF1cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmRzJyB9LFxuICAgIGNhcmRzLm1hcCgoYykgPT5cbiAgICAgIGgoJ2RpdicsIHsga2V5OiBjLmtleSwgY2xhc3NOYW1lOiAndHNkLWNhcmQnIH0sXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtaGVhZCcgfSxcbiAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1pY29uJywgc3R5bGU6IHsgY29sb3I6IGMuY29sb3IgfSB9LFxuICAgICAgICAgICAgaChTdmdJY29uLCB7IG5hbWU6IGMuaWNvbiwgc2l6ZTogMTQgfSkpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWxhYmVsJyB9LCBjLmxhYmVsKSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdmFsdWUnLCB0aXRsZTogYy50aXRsZSB9LCBjLnZhbHVlKSxcbiAgICAgICAgYy5zdWIgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXN1YicgfSwgYy5zdWIpIDogbnVsbCxcbiAgICAgICAgYy5rZXkgPT09ICdjb3N0JyAmJiB1bnByaWNlZENhbGxzID4gMFxuICAgICAgICAgID8gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1ub3RlJyB9LCB0dCgndW5wcmljZWROb3RlJywgeyBjb3VudDogZm9ybWF0SW50KHVucHJpY2VkQ2FsbHMpIH0pKVxuICAgICAgICAgIDogbnVsbCkpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOavj+aXpeeUqOmHj+afseeKtuWbvu+8iOaJi+WGmSBkaXYg5aCG5Y+g5p+x77ya5LiL5q616L6T5YWl6JOdIC8g5LiK5q616L6T5Ye657u/77yJXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBEYWlseUNoYXJ0KHByb3BzKSB7XG4gIGNvbnN0IHsgZGFpbHksIGdyYW4sIHN0ZXBEYXlzLCBncmFuTGFiZWwgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgY2hhcnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbClcbiAgY29uc3QgW3RpcCwgc2V0VGlwXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpIC8vIHsgcm93LCB4IH1cbiAgY29uc3QgW3ZpZXcsIHNldFZpZXddID0gUmVhY3QudXNlU3RhdGUoJ2JhcicpIC8vIGJhciB8IGxpbmVcbiAgY29uc3Qgcm93cyA9IGRhaWx5IHx8IFtdXG5cbiAgY29uc3QgaW5PZiA9IChyKSA9PiAoci5pbnB1dFRva2VucyB8fCAwKSArIChyLmNhY2hlUmVhZFRva2VucyB8fCAwKSArIChyLmNhY2hlV3JpdGVUb2tlbnMgfHwgMClcbiAgY29uc3Qgb3V0T2YgPSAocikgPT4gci5vdXRwdXRUb2tlbnMgfHwgMFxuICBjb25zdCB0b3RPZiA9IChyKSA9PiByLnRvdGFsVG9rZW5zIHx8IDBcblxuICBpZiAocm93cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZCB0c2QtY2hhcnQtY2FyZCcgfSxcbiAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtaGVhZGVyJyB9LFxuICAgICAgICBoKCdoMycsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdGl0bGUnIH0sIHQoJ2RhaWx5VHJlbmQnKSksXG4gICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRhZycgfSwgdCgnbm9EYXRhJykpKSxcbiAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWVtcHR5LWJsb2NrJyB9LCB0KCdub0RhdGEnKSkpXG4gIH1cblxuICBjb25zdCBtYXggPSBNYXRoLm1heCgxLCAuLi5yb3dzLm1hcCgoZCkgPT4gZC50b3RhbFRva2VucyB8fCAwKSlcbiAgY29uc3QgbGFiZWxFdmVyeSA9IHJvd3MubGVuZ3RoID4gMjggPyA0IDogcm93cy5sZW5ndGggPiAxNCA/IDIgOiAxXG4gIGNvbnN0IGZpcnN0TGFiZWwgPSB4TGFiZWwocm93c1swXS5rZXksIGdyYW4pXG4gIGNvbnN0IGxhc3RMYWJlbCA9IHhMYWJlbChyb3dzW3Jvd3MubGVuZ3RoIC0gMV0ua2V5LCBncmFuKVxuICBjb25zdCByYW5nZUxhYmVsID0gZmlyc3RMYWJlbCArICcgLSAnICsgbGFzdExhYmVsXG5cbiAgZnVuY3Rpb24gc2hvd1RpcChlLCByb3cpIHtcbiAgICBjb25zdCBjaGFydFJlY3QgPSBjaGFydFJlZi5jdXJyZW50ID8gY2hhcnRSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGxcbiAgICBpZiAoIWNoYXJ0UmVjdCkgcmV0dXJuXG4gICAgY29uc3QgZWxSZWN0ID0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgeCA9IE1hdGgubWluKE1hdGgubWF4KGVsUmVjdC5sZWZ0ICsgZWxSZWN0LndpZHRoIC8gMiAtIGNoYXJ0UmVjdC5sZWZ0LCA3MiksIGNoYXJ0UmVjdC53aWR0aCAtIDcyKVxuICAgIHNldFRpcCh7IHJvdywgeCB9KVxuICB9XG5cbiAgY29uc3Qgdmlld1N3aXRjaGVyID0gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtZ3JhbicsIHJvbGU6ICdncm91cCcsICdhcmlhLWxhYmVsJzogdCgnY2hhcnRUeXBlR3JvdXAnKSB9LFxuICAgIGgoJ2J1dHRvbicsIHtcbiAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgY2xhc3NOYW1lOiAndHNkLWdyYW4tYnRuJyxcbiAgICAgICdkYXRhLWFjdGl2ZSc6IHZpZXcgPT09ICdiYXInID8gJ3RydWUnIDogdW5kZWZpbmVkLFxuICAgICAgb25DbGljazogKCkgPT4geyBzZXRUaXAobnVsbCk7IHNldFZpZXcoJ2JhcicpIH0sXG4gICAgfSwgdCgnYmFyVmlldycpKSxcbiAgICBoKCdidXR0b24nLCB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogJ3RzZC1ncmFuLWJ0bicsXG4gICAgICAnZGF0YS1hY3RpdmUnOiB2aWV3ID09PSAnbGluZScgPyAndHJ1ZScgOiB1bmRlZmluZWQsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7IHNldFRpcChudWxsKTsgc2V0VmlldygnbGluZScpIH0sXG4gICAgfSwgdCgnbGluZVZpZXcnKSkpXG5cbiAgY29uc3QgYmFyVGlwID0gdGlwXG4gICAgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwJywgc3R5bGU6IHsgbGVmdDogdGlwLnggKyAncHgnIH0gfSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1kYXRlJyB9LCB0aXAucm93LmtleSArICcgJyArIHdlZWtkYXlOYW1lKHRpcC5yb3cua2V5LCB0KSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCB0c2QtbGVnZW5kLWluJyB9KSxcbiAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbGVnZW5kSW5wdXQnKSksXG4gICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBmb3JtYXRJbnQoaW5PZih0aXAucm93KSkpKSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC1yb3cnIH0sXG4gICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZG90IHRzZC1sZWdlbmQtb3V0JyB9KSxcbiAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbGVnZW5kT3V0cHV0JykpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KG91dE9mKHRpcC5yb3cpKSkpLFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXRvdGFsJyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCd0b29sdGlwVG90YWwnKSksXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIGZvcm1hdEludCh0b3RPZih0aXAucm93KSkpKSlcbiAgICA6IG51bGxcblxuICBjb25zdCBib2R5ID0gdmlldyA9PT0gJ2xpbmUnXG4gICAgPyBoKExpbmVDaGFydCwgeyByb3dzLCBncmFuLCBzdGVwRGF5cywgc2hvd1RpcCwgdGlwLCBzZXRUaXAsIGNoYXJ0UmVmIH0pXG4gICAgOiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jaGFydCcsIHJlZjogY2hhcnRSZWYgfSxcbiAgICAgICAgcm93cy5tYXAoKHJvdywgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGluVCA9IGluT2Yocm93KVxuICAgICAgICAgIGNvbnN0IG91dFQgPSBvdXRPZihyb3cpXG4gICAgICAgICAgY29uc3QgdG90VCA9IHRvdE9mKHJvdylcbiAgICAgICAgICBjb25zdCBwY3RJbiA9IChpblQgLyBtYXgpICogMTAwXG4gICAgICAgICAgY29uc3QgcGN0T3V0ID0gKG91dFQgLyBtYXgpICogMTAwXG4gICAgICAgICAgY29uc3Qgc2hvd0xhYmVsID0gaSAlIGxhYmVsRXZlcnkgPT09IDAgfHwgaSA9PT0gcm93cy5sZW5ndGggLSAxXG4gICAgICAgICAgcmV0dXJuIGgoJ2RpdicsIHtcbiAgICAgICAgICAgIGtleTogcm93LmtleSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1jaGFydC1jb2wnLFxuICAgICAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgICAgICBvbk1vdXNlRW50ZXI6IChlKSA9PiBzaG93VGlwKGUsIHJvdyksXG4gICAgICAgICAgICBvbk1vdXNlTGVhdmU6ICgpID0+IHNldFRpcChudWxsKSxcbiAgICAgICAgICAgIG9uRm9jdXM6IChlKSA9PiBzaG93VGlwKGUsIHJvdyksXG4gICAgICAgICAgICBvbkJsdXI6ICgpID0+IHNldFRpcChudWxsKSxcbiAgICAgICAgICAgICdhcmlhLWxhYmVsJzogdCgnYmFyQXJpYScsIHsga2V5OiByb3cua2V5LCBpbjogZm9ybWF0SW50KGluVCksIG91dDogZm9ybWF0SW50KG91dFQpLCB0b3Q6IGZvcm1hdEludCh0b3RUKSB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2hhcnQtcGxvdCcgfSxcbiAgICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2hhcnQtc3RhY2snIH0sXG4gICAgICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2hhcnQtc2VnIHRzZC1zZWctb3V0Jywgc3R5bGU6IHsgaGVpZ2h0OiBwY3RPdXQgKyAnJScgfSB9KSxcbiAgICAgICAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jaGFydC1zZWcgdHNkLXNlZy1pbicsIHN0eWxlOiB7IGhlaWdodDogcGN0SW4gKyAnJScgfSB9KSkpLFxuICAgICAgICAgICAgaCgnc3BhbicsIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndHNkLWNoYXJ0LWxhYmVsJyArIChzaG93TGFiZWwgPyAnJyA6ICcgdHNkLWNoYXJ0LWxhYmVsLWhpZGRlbicpLFxuICAgICAgICAgICAgfSwgeExhYmVsKHJvdy5rZXksIGdyYW4pKSlcbiAgICAgICAgfSksXG4gICAgICAgIGJhclRpcClcblxuICByZXR1cm4gaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZCB0c2QtY2hhcnQtY2FyZCcgfSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWhlYWRlcicgfSxcbiAgICAgIGgoJ2gzJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC10aXRsZScgfSwgdCgnZGFpbHlUcmVuZCcpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWFjdGlvbnMnIH0sXG4gICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRhZycgfSwgZ3JhbkxhYmVsICsgJyDCtyAnICsgcmFuZ2VMYWJlbCksXG4gICAgICAgIHZpZXdTd2l0Y2hlcikpLFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZCcgfSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1sZWdlbmQtaXRlbScgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZC1kb3QgdHNkLWxlZ2VuZC1pbicgfSksIHQoJ2xlZ2VuZElucHV0JykpLFxuICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZC1pdGVtJyB9LFxuICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtbGVnZW5kLWRvdCB0c2QtbGVnZW5kLW91dCcgfSksIHQoJ2xlZ2VuZE91dHB1dCcpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1sZWdlbmQtaXRlbScgfSxcbiAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLWxlZ2VuZC1kb3QgdHNkLWxlZ2VuZC10b3RhbCcgfSksIHQoJ2xlZ2VuZFRvdGFsJykpKSxcbiAgICBib2R5KVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOaKmOe6v+Wbvu+8iFNWR++8mui+k+WFpSAvIOi+k+WHuiAvIOaAuyBUb2tlbu+8iVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLyoqIENhdG11bGwtUm9tIC0+IGN1YmljIGJlemllciBzbW9vdGggcGF0aCB0aHJvdWdoIHRoZSBnaXZlbiBwb2ludHMuICovXG5mdW5jdGlvbiBzbW9vdGhQYXRoKHB0cykge1xuICBpZiAoIXB0cyB8fCBwdHMubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIGNvbnN0IGYgPSAodikgPT4gTWF0aC5yb3VuZCh2ICogMTAwKSAvIDEwMFxuICBsZXQgZCA9ICdNICcgKyBmKHB0c1swXS54KSArICcgJyArIGYocHRzWzBdLnkpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IHAwID0gcHRzW2kgLSAxXSB8fCBwdHNbaV1cbiAgICBjb25zdCBwMSA9IHB0c1tpXVxuICAgIGNvbnN0IHAyID0gcHRzW2kgKyAxXVxuICAgIGNvbnN0IHAzID0gcHRzW2kgKyAyXSB8fCBwMlxuICAgIGNvbnN0IGMxeCA9IHAxLnggKyAocDIueCAtIHAwLngpIC8gNlxuICAgIGNvbnN0IGMxeSA9IHAxLnkgKyAocDIueSAtIHAwLnkpIC8gNlxuICAgIGNvbnN0IGMyeCA9IHAyLnggLSAocDMueCAtIHAxLngpIC8gNlxuICAgIGNvbnN0IGMyeSA9IHAyLnkgLSAocDMueSAtIHAxLnkpIC8gNlxuICAgIGQgKz0gJyBDICcgKyBmKGMxeCkgKyAnICcgKyBmKGMxeSkgKyAnLCAnICsgZihjMngpICsgJyAnICsgZihjMnkpICsgJywgJyArIGYocDIueCkgKyAnICcgKyBmKHAyLnkpXG4gIH1cbiAgcmV0dXJuIGRcbn1cblxuZnVuY3Rpb24gTGluZUNoYXJ0KHByb3BzKSB7XG4gIGNvbnN0IHsgcm93cywgZ3Jhbiwgc3RlcERheXMsIHNob3dUaXAsIHRpcCwgc2V0VGlwLCBjaGFydFJlZiB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICBjb25zdCBXID0gNjIwXG4gIGNvbnN0IEggPSAyNDBcbiAgY29uc3QgUEFEID0geyB0OiAxNCwgcjogMTQsIGI6IDI2LCBsOiA0OCB9XG4gIGNvbnN0IGlubmVyVyA9IFcgLSBQQUQubCAtIFBBRC5yXG4gIGNvbnN0IGlubmVySCA9IEggLSBQQUQudCAtIFBBRC5iXG4gIGNvbnN0IG4gPSByb3dzLmxlbmd0aFxuXG4gIGNvbnN0IGluT2YgPSAocikgPT4gKHIuaW5wdXRUb2tlbnMgfHwgMCkgKyAoci5jYWNoZVJlYWRUb2tlbnMgfHwgMCkgKyAoci5jYWNoZVdyaXRlVG9rZW5zIHx8IDApXG4gIGNvbnN0IG91dE9mID0gKHIpID0+IHIub3V0cHV0VG9rZW5zIHx8IDBcbiAgY29uc3QgdG90T2YgPSAocikgPT4gci50b3RhbFRva2VucyB8fCAwXG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KDEsIC4uLnJvd3MubWFwKChkKSA9PiBkLnRvdGFsVG9rZW5zIHx8IDApKVxuICBjb25zdCBuaWNlTWF4ID0gbmljZUNlaWwobWF4KVxuXG4gIGNvbnN0IHggPSAoaSkgPT4gUEFELmwgKyAobiA9PT0gMSA/IGlubmVyVyAvIDIgOiAoaSAvIChuIC0gMSkpICogaW5uZXJXKVxuICBjb25zdCB5ID0gKHYpID0+IFBBRC50ICsgaW5uZXJIIC0gKHYgLyBuaWNlTWF4KSAqIGlubmVySFxuICBjb25zdCBjb2xXID0gaW5uZXJXIC8gblxuXG4gIC8vIEhvdmVyIHN0YXRlOiBwaXhlbCB4IGZvciB0aGUgdG9vbHRpcCwgdmlld0JveCB4IGZvciB0aGUgY3Vyc29yICsgZG90cy5cbiAgZnVuY3Rpb24gc2hvd1RpcExpbmUoZSwgcm93KSB7XG4gICAgY29uc3QgcmVjdCA9IGNoYXJ0UmVmLmN1cnJlbnQgPyBjaGFydFJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbFxuICAgIGlmICghcmVjdCB8fCByZWN0LndpZHRoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCBlbFJlY3QgPSBlLmN1cnJlbnRUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCB4UHggPSBlbFJlY3QubGVmdCArIGVsUmVjdC53aWR0aCAvIDIgLSByZWN0LmxlZnRcbiAgICBjb25zdCBzdmdYID0gKHhQeCAvIHJlY3Qud2lkdGgpICogV1xuICAgIGNvbnN0IHggPSBNYXRoLm1pbihNYXRoLm1heCh4UHgsIDcyKSwgcmVjdC53aWR0aCAtIDcyKVxuICAgIHNldFRpcCh7IHJvdywgeCwgc3ZnWCB9KVxuICB9XG4gIGNvbnN0IHRyb3cgPSB0aXAgPyB0aXAucm93IDogbnVsbFxuICBjb25zdCBjdXJzb3IgPSB0aXBcbiAgICA/IGgoJ2xpbmUnLCB7XG4gICAgICAgIGtleTogJ2N1cnNvcicsXG4gICAgICAgIGNsYXNzTmFtZTogJ3RzZC1saW5lLWN1cnNvcicsXG4gICAgICAgIHgxOiB0aXAuc3ZnWCwgeTE6IFBBRC50LCB4MjogdGlwLnN2Z1gsIHkyOiBIIC0gUEFELmIsXG4gICAgICB9KVxuICAgIDogbnVsbFxuICBjb25zdCBkb3RzID0gdGlwXG4gICAgPyBbXG4gICAgICAgIGgoJ2NpcmNsZScsIHsga2V5OiAnaGwtaW4nLCBjbGFzc05hbWU6ICd0c2QtbGluZS1obCB0c2QtbGluZS1obC1pbicsIGN4OiB0aXAuc3ZnWCwgY3k6IHkoaW5PZih0cm93KSksIHI6IDMuNSB9KSxcbiAgICAgICAgaCgnY2lyY2xlJywgeyBrZXk6ICdobC1vdXQnLCBjbGFzc05hbWU6ICd0c2QtbGluZS1obCB0c2QtbGluZS1obC1vdXQnLCBjeDogdGlwLnN2Z1gsIGN5OiB5KG91dE9mKHRyb3cpKSwgcjogMy41IH0pLFxuICAgICAgICBoKCdjaXJjbGUnLCB7IGtleTogJ2hsLXRvdCcsIGNsYXNzTmFtZTogJ3RzZC1saW5lLWhsIHRzZC1saW5lLWhsLXRvdGFsJywgY3g6IHRpcC5zdmdYLCBjeTogeSh0b3RPZih0cm93KSksIHI6IDMuNSB9KSxcbiAgICAgIF1cbiAgICA6IG51bGxcblxuICBjb25zdCBpblB0cyA9IHNtb290aFBhdGgocm93cy5tYXAoKHIsIGkpID0+ICh7IHg6IHgoaSksIHk6IHkoaW5PZihyKSkgfSkpKVxuICBjb25zdCBvdXRQdHMgPSBzbW9vdGhQYXRoKHJvd3MubWFwKChyLCBpKSA9PiAoeyB4OiB4KGkpLCB5OiB5KG91dE9mKHIpKSB9KSkpXG4gIGNvbnN0IHRvdFB0cyA9IHNtb290aFBhdGgocm93cy5tYXAoKHIsIGkpID0+ICh7IHg6IHgoaSksIHk6IHkodG90T2YocikpIH0pKSlcbiAgY29uc3QgZ3JpZEYgPSBbMCwgMC4yNSwgMC41LCAwLjc1LCAxXVxuICBjb25zdCBsYWJlbEV2ZXJ5ID0gcm93cy5sZW5ndGggPiAyOCA/IDQgOiByb3dzLmxlbmd0aCA+IDE0ID8gMiA6IDFcbiAgY29uc3Qgc2hvd0xhYmVsID0gKGkpID0+IGkgJSBsYWJlbEV2ZXJ5ID09PSAwIHx8IGkgPT09IHJvd3MubGVuZ3RoIC0gMVxuXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1saW5lY2hhcnQnLCByZWY6IGNoYXJ0UmVmIH0sXG4gICAgaCgnc3ZnJywgeyB2aWV3Qm94OiAnMCAwICcgKyBXICsgJyAnICsgSCwgcm9sZTogJ2ltZycsICdhcmlhLWxhYmVsJzogdCgnbGluZUNoYXJ0QXJpYScpIH0sXG4gICAgICAvLyBncmlkICsgYXhpc1xuICAgICAgZ3JpZEYubWFwKChmKSA9PlxuICAgICAgICBoKCdsaW5lJywge1xuICAgICAgICAgIGtleTogJ2cnICsgZixcbiAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtbGluZS1ncmlkJyxcbiAgICAgICAgICB4MTogUEFELmwsIHkxOiB5KGYgKiBuaWNlTWF4KSwgeDI6IFcgLSBQQUQuciwgeTI6IHkoZiAqIG5pY2VNYXgpLFxuICAgICAgICB9KSksXG4gICAgICBoKCdsaW5lJywgeyBjbGFzc05hbWU6ICd0c2QtbGluZS1heGlzJywgeDE6IFBBRC5sLCB5MTogUEFELnQsIHgyOiBQQUQubCwgeTI6IEggLSBQQUQuYiB9KSxcbiAgICAgIGgoJ2xpbmUnLCB7IGNsYXNzTmFtZTogJ3RzZC1saW5lLWF4aXMnLCB4MTogUEFELmwsIHkxOiBIIC0gUEFELmIsIHgyOiBXIC0gUEFELnIsIHkyOiBIIC0gUEFELmIgfSksXG4gICAgICAvLyB5IGxhYmVsc1xuICAgICAgZ3JpZEYubWFwKChmKSA9PlxuICAgICAgICBoKCd0ZXh0Jywge1xuICAgICAgICAgIGtleTogJ3l0JyArIGYsXG4gICAgICAgICAgY2xhc3NOYW1lOiAndHNkLWxpbmUtdGV4dCcsXG4gICAgICAgICAgeDogUEFELmwgLSA2LFxuICAgICAgICAgIHk6IHkoZiAqIG5pY2VNYXgpICsgMyxcbiAgICAgICAgICB0ZXh0QW5jaG9yOiAnZW5kJyxcbiAgICAgICAgfSwgZm9ybWF0VG9rZW5zU2hvcnQoZiAqIG5pY2VNYXgpKSksXG4gICAgICAvLyBzZXJpZXMgKHNtb290aCBjdXJ2ZXMpXG4gICAgICBoKCdwYXRoJywgeyBjbGFzc05hbWU6ICd0c2QtbGluZS10b3RhbCcsIGQ6IHRvdFB0cyB9KSxcbiAgICAgIGgoJ3BhdGgnLCB7IGNsYXNzTmFtZTogJ3RzZC1saW5lLWluJywgZDogaW5QdHMgfSksXG4gICAgICBoKCdwYXRoJywgeyBjbGFzc05hbWU6ICd0c2QtbGluZS1vdXQnLCBkOiBvdXRQdHMgfSksXG4gICAgICBjdXJzb3IsXG4gICAgICBkb3RzLFxuICAgICAgLy8geCBsYWJlbHNcbiAgICAgIHJvd3MubWFwKChyLCBpKSA9PlxuICAgICAgICBzaG93TGFiZWwoaSlcbiAgICAgICAgICA/IGgoJ3RleHQnLCB7XG4gICAgICAgICAgICAgIGtleTogJ3hsJyArIGksXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1saW5lLXRleHQnLFxuICAgICAgICAgICAgICB4OiB4KGkpLFxuICAgICAgICAgICAgICB5OiBIIC0gOCxcbiAgICAgICAgICAgICAgdGV4dEFuY2hvcjogaSA9PT0gMCA/ICdzdGFydCcgOiBpID09PSBuIC0gMSA/ICdlbmQnIDogJ21pZGRsZScsXG4gICAgICAgICAgICB9LCB4TGFiZWwoci5rZXksIGdyYW4pKVxuICAgICAgICAgIDogbnVsbCksXG4gICAgICAvLyBob3ZlciB0YXJnZXRzOiBhIGZ1bGwtaGVpZ2h0IGNvbHVtbiBwZXIgYnVja2V0LCBtYXRjaGluZyB0aGUgYmFyIGNoYXJ0IGZlZWxcbiAgICAgIHJvd3MubWFwKChyLCBpKSA9PlxuICAgICAgICBoKCdyZWN0Jywge1xuICAgICAgICAgIGtleTogJ2gnICsgaSxcbiAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtbGluZS1ob3ZlcicsXG4gICAgICAgICAgeDogeChpKSAtIGNvbFcgLyAyLFxuICAgICAgICAgIHk6IFBBRC50LFxuICAgICAgICAgIHdpZHRoOiBjb2xXLFxuICAgICAgICAgIGhlaWdodDogaW5uZXJILFxuICAgICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICAgIG9uTW91c2VFbnRlcjogKGUpID0+IHNob3dUaXBMaW5lKGUsIHIpLFxuICAgICAgICAgIG9uTW91c2VMZWF2ZTogKCkgPT4gc2V0VGlwKG51bGwpLFxuICAgICAgICAgIG9uRm9jdXM6IChlKSA9PiBzaG93VGlwTGluZShlLCByKSxcbiAgICAgICAgICBvbkJsdXI6ICgpID0+IHNldFRpcChudWxsKSxcbiAgICAgICAgfSkpLFxuICAgICAgLy8gdmlzaWJsZSBkb3RzIG9uIHNwYXJzZSBwb2ludHNcbiAgICAgIHJvd3MubWFwKChyLCBpKSA9PlxuICAgICAgICBpICUgbGFiZWxFdmVyeSA9PT0gMCB8fCBpID09PSBuIC0gMVxuICAgICAgICAgID8gaCgnY2lyY2xlJywge1xuICAgICAgICAgICAgICBrZXk6ICdkJyArIGksXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1saW5lLWRvdCcsXG4gICAgICAgICAgICAgIGN4OiB4KGkpLFxuICAgICAgICAgICAgICBjeTogeSh0b3RPZihyKSksXG4gICAgICAgICAgICAgIHI6IDIuNSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBudWxsKSksXG4gICAgdGlwXG4gICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAnLCBzdHlsZTogeyBsZWZ0OiB0aXAueCArICdweCcgfSB9LFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZGF0ZScgfSwgdGlwLnJvdy5rZXkgKyAoc3RlcERheXMgPiAxID8gJyAnICsgdCgnc3RhcnRORGF5cycsIHsgbjogc3RlcERheXMgfSkgOiAnJykgKyAnICcgKyB3ZWVrZGF5TmFtZSh0aXAucm93LmtleSwgdCkpLFxuICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZG90IHRzZC1sZWdlbmQtaW4nIH0pLFxuICAgICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ2xlZ2VuZElucHV0JykpLFxuICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBmb3JtYXRJbnQoaW5PZih0aXAucm93KSkpKSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXJvdycgfSxcbiAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCB0c2QtbGVnZW5kLW91dCcgfSksXG4gICAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbGVnZW5kT3V0cHV0JykpLFxuICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBmb3JtYXRJbnQob3V0T2YodGlwLnJvdykpKSksXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcC10b3RhbCcgfSxcbiAgICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCd0b29sdGlwVG90YWwnKSksXG4gICAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgZm9ybWF0SW50KHRvdE9mKHRpcC5yb3cpKSkpKVxuICAgICAgOiBudWxsKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOW5tOW6pueUqOmHj+eDreWKm+Wbvu+8iEdpdEh1YiDpo47moLzvvIlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIEhlYXRtYXBDYXJkKHByb3BzKSB7XG4gIGNvbnN0IHsgZGF5cyB9ID0gcHJvcHNcbiAgY29uc3QgdCA9IHVzZVQoKVxuICBjb25zdCBbaHRpcCwgc2V0SHRpcF0gPSBSZWFjdC51c2VTdGF0ZShudWxsKSAvLyB7IGNlbGwsIGxlZnQsIHRvcCB9IGluIHZpZXdwb3J0IGNvb3Jkc1xuICBjb25zdCBncmlkID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbGlzdCA9IGRheXMgfHwgW11cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoMSwgLi4ubGlzdC5tYXAoKGQpID0+IGQudG90YWxUb2tlbnMgfHwgMCkpXG4gICAgY29uc3QgZmlyc3QgPSBuZXcgRGF0ZShsaXN0WzBdLmtleSArICdUMDA6MDA6MDAnKVxuICAgIGNvbnN0IG9mZnNldCA9IGZpcnN0LmdldERheSgpIC8vIDAgPSBTdW5kYXlcbiAgICBjb25zdCB3ZWVrcyA9IFtdXG4gICAgbGV0IGN1ciA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvZmZzZXQ7IGkrKykgY3VyLnB1c2gobnVsbClcbiAgICBmb3IgKGNvbnN0IGQgb2YgbGlzdCkge1xuICAgICAgY3VyLnB1c2goZClcbiAgICAgIGlmIChjdXIubGVuZ3RoID09PSA3KSB7XG4gICAgICAgIHdlZWtzLnB1c2goY3VyKVxuICAgICAgICBjdXIgPSBbXVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3VyLmxlbmd0aCA+IDApIHtcbiAgICAgIHdoaWxlIChjdXIubGVuZ3RoIDwgNykgY3VyLnB1c2gobnVsbClcbiAgICAgIHdlZWtzLnB1c2goY3VyKVxuICAgIH1cbiAgICAvLyDmnIjku73moIforrDvvJrmn5DmnIggMSDml6XmiYDlnKjnmoTliJdcbiAgICBjb25zdCBtb250aE1hcmtzID0gW11cbiAgICB3ZWVrcy5mb3JFYWNoKCh3aywgY29sKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2Ygd2spIHtcbiAgICAgICAgaWYgKGMgJiYgYy5rZXkuZW5kc1dpdGgoJy0wMScpKSB7XG4gICAgICAgICAgbW9udGhNYXJrcy5wdXNoKHsgY29sLCBuYW1lOiB0KCdtb250aExhYmVsJywgeyBuOiBOdW1iZXIoYy5rZXkuc2xpY2UoNSwgNykpIH0pIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHsgd2Vla3MsIG1heCwgbW9udGhNYXJrcyB9XG4gIH0sIFtkYXlzXSlcblxuICBpZiAoZ3JpZCA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICBmdW5jdGlvbiBzaG93Q2VsbFRpcChlLCBjKSB7XG4gICAgY29uc3QgZWxSZWN0ID0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgc2V0SHRpcCh7IGNlbGw6IGMsIGxlZnQ6IGVsUmVjdC5sZWZ0ICsgZWxSZWN0LndpZHRoIC8gMiwgdG9wOiBlbFJlY3QudG9wIH0pXG4gIH1cblxuICBjb25zdCBoZWF0VGlwID0gaHRpcFxuICAgID8gaCgnZGl2Jywge1xuICAgICAgICBjbGFzc05hbWU6ICd0c2QtdG9vbHRpcCB0c2QtaGVhdC10aXAnLFxuICAgICAgICBzdHlsZTogeyBwb3NpdGlvbjogJ2ZpeGVkJywgbGVmdDogaHRpcC5sZWZ0ICsgJ3B4JywgdG9wOiBodGlwLnRvcCArICdweCcsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgtNTAlLCAtMTEwJSknIH0sXG4gICAgICB9LFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRhdGUnIH0sIGh0aXAuY2VsbC5rZXkgKyAnICcgKyB3ZWVrZGF5TmFtZShodGlwLmNlbGwua2V5LCB0KSksXG4gICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtcm93JyB9LFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLWRvdCcsIHN0eWxlOiB7IGJhY2tncm91bmQ6ICd2YXIoLS1kc3ctc3RhdGljLWRlZXBzZWVrLTUwMCknIH0gfSksXG4gICAgICAgICAgaCgnc3BhbicsIG51bGwsIHQoJ3RvdGFsVG9rZW5zJykpLFxuICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXZhbCcgfSwgZm9ybWF0SW50KGh0aXAuY2VsbC50b3RhbFRva2VucyB8fCAwKSkpLFxuICAgICAgICBodGlwLmNlbGwuY2FsbHMgPiAwXG4gICAgICAgICAgPyBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC10b29sdGlwLXJvdycgfSxcbiAgICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtZG90Jywgc3R5bGU6IHsgYmFja2dyb3VuZDogJ3ZhcigtLWRzdy1hbGlhcy1sYWJlbC10ZXJ0aWFyeSknIH0gfSksXG4gICAgICAgICAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdjYWxscycpKSxcbiAgICAgICAgICAgICAgaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXRvb2x0aXAtdmFsJyB9LCBmb3JtYXRJbnQoaHRpcC5jZWxsLmNhbGxzKSkpXG4gICAgICAgICAgOiBudWxsKVxuICAgIDogbnVsbFxuXG4gIGNvbnN0IGRheU5hbWVzID0gWycnLCB0KCd3ZWVrZGF5TW9uJyksICcnLCB0KCd3ZWVrZGF5V2VkJyksICcnLCB0KCd3ZWVrZGF5RnJpJyksICcnXVxuICBjb25zdCBsZWdlbmRTdGVwcyA9IFswLCAwLjI1LCAwLjUsIDAuNzUsIDFdXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQgdHNkLWhlYXRtYXAtY2FyZCcgfSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLWhlYWRlcicgfSxcbiAgICAgIGgoJ2gzJywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC10aXRsZScgfSwgdCgneWVhcmx5SGVhdG1hcCcpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRhZycgfSwgdCgneWVhckRhaWx5JywgeyB5ZWFyOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgfSkpKSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwJyB9LFxuICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1pbm5lcicgfSxcbiAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1tb250aHMnIH0sXG4gICAgICAgICAgZ3JpZC5tb250aE1hcmtzLm1hcCgobSkgPT5cbiAgICAgICAgICAgIGgoJ3NwYW4nLCB7XG4gICAgICAgICAgICAgIGtleTogbS5jb2wsXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLW1vbnRoJyxcbiAgICAgICAgICAgICAgc3R5bGU6IHsgbGVmdDogKG0uY29sICogMTIpICsgJ3B4JyB9LFxuICAgICAgICAgICAgfSwgbS5uYW1lKSkpLFxuICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWJvZHknIH0sXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1kYXlzJyB9LFxuICAgICAgICAgICAgZGF5TmFtZXMubWFwKChuLCBpKSA9PlxuICAgICAgICAgICAgICBoKCdzcGFuJywgeyBrZXk6IGksIGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWRheScgfSwgbikpKSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWdyaWQnIH0sXG4gICAgICAgICAgICBncmlkLndlZWtzLm1hcCgod2ssIGNvbCkgPT5cbiAgICAgICAgICAgICAgaCgnZGl2JywgeyBrZXk6IGNvbCwgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtY29sJyB9LFxuICAgICAgICAgICAgICAgIHdrLm1hcCgoYywgcm93KSA9PlxuICAgICAgICAgICAgICAgICAgY1xuICAgICAgICAgICAgICAgICAgICA/IGgoJ3NwYW4nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGMua2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtY2VsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeyBiYWNrZ3JvdW5kOiBoZWF0Q29sb3IoYy50b3RhbFRva2VucyB8fCAwLCBncmlkLm1heCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0KCdobVRpdGxlJywgeyBrZXk6IGMua2V5LCB0b2tlbnM6IGZvcm1hdEludChjLnRvdGFsVG9rZW5zIHx8IDApLCBjYWxsczogYy5jYWxscyA/IHQoJ2htQ2FsbHMnLCB7IGNvdW50OiBmb3JtYXRJbnQoYy5jYWxscykgfSkgOiAnJyB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VFbnRlcjogKGUpID0+IHNob3dDZWxsVGlwKGUsIGMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlOiAoKSA9PiBzZXRIdGlwKG51bGwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25Gb2N1czogKGUpID0+IHNob3dDZWxsVGlwKGUsIGMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25CbHVyOiAoKSA9PiBzZXRIdGlwKG51bGwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgOiBoKCdzcGFuJywgeyBrZXk6ICdlJyArIGNvbCArICctJyArIHJvdywgY2xhc3NOYW1lOiAndHNkLWhlYXRtYXAtY2VsbCcsIHN0eWxlOiB7IHZpc2liaWxpdHk6ICdoaWRkZW4nIH0gfSkpKSkpKSksXG4gICAgaGVhdFRpcCxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1oZWF0bWFwLWxlZ2VuZCcgfSxcbiAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdsZXNzJykpLFxuICAgICAgbGVnZW5kU3RlcHMubWFwKChzKSA9PlxuICAgICAgICBoKCdzcGFuJywge1xuICAgICAgICAgIGtleTogcyxcbiAgICAgICAgICBjbGFzc05hbWU6ICd0c2QtaGVhdG1hcC1jZWxsJyxcbiAgICAgICAgICBzdHlsZTogeyBiYWNrZ3JvdW5kOiBzID09PSAwID8gJ3ZhcigtLWRzdy1hbGlhcy1pbnRlcmFjdGl2ZS1iZy1ob3ZlciknIDogaGVhdENvbG9yKE1hdGgubWF4KDEsIHMgKiAxMDApLCAxMDApIH0sXG4gICAgICAgIH0pKSxcbiAgICAgIGgoJ3NwYW4nLCBudWxsLCB0KCdtb3JlJykpKSkpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5oyJ5qih5Z6L5piO57uG6KGoXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBNb2RlbFRhYmxlKHByb3BzKSB7XG4gIGNvbnN0IHsgcm93cywgY3VycmVuY3kgfSA9IHByb3BzXG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgY29uc3QgYWxsID0gcm93cyB8fCBbXVxuICBjb25zdCBbc29ydEtleSwgc2V0U29ydEtleV0gPSBSZWFjdC51c2VTdGF0ZSgndG90YWwnKVxuICBjb25zdCBbc29ydERpciwgc2V0U29ydERpcl0gPSBSZWFjdC51c2VTdGF0ZSgnZGVzYycpXG5cbiAgY29uc3QgdmlldyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gYWxsLm1hcCgocikgPT4gKHtcbiAgICBrZXk6IHIua2V5LFxuICAgIGNhbGxzOiByLmNhbGxzIHx8IDAsXG4gICAgaW5wdXQ6IChyLmlucHV0VG9rZW5zIHx8IDApICsgKHIuY2FjaGVSZWFkVG9rZW5zIHx8IDApICsgKHIuY2FjaGVXcml0ZVRva2VucyB8fCAwKSxcbiAgICBvdXRwdXQ6IHIub3V0cHV0VG9rZW5zIHx8IDAsXG4gICAgdG90YWw6IHIudG90YWxUb2tlbnMgfHwgMCxcbiAgICBjb3N0OiByLmNvc3QgfHwgMCxcbiAgICB1bnByaWNlZDogKHIudG90YWxUb2tlbnMgfHwgMCkgPiAwICYmICEoci5jb3N0ID4gMCksXG4gIH0pKSwgW2FsbF0pXG5cbiAgY29uc3Qgc3VtVG90YWwgPSBSZWFjdC51c2VNZW1vKCgpID0+IHZpZXcucmVkdWNlKChzLCByKSA9PiBzICsgci50b3RhbCwgMCksIFt2aWV3XSlcblxuICBjb25zdCBzb3J0ZWQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBsaXN0ID0gdmlldy5zbGljZSgpXG4gICAgY29uc3QgZGlyID0gc29ydERpciA9PT0gJ2FzYycgPyAxIDogLTFcbiAgICBsaXN0LnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGF2ID0gYVtzb3J0S2V5XVxuICAgICAgY29uc3QgYnYgPSBiW3NvcnRLZXldXG4gICAgICBpZiAoYXYgPT09IGJ2KSByZXR1cm4gMFxuICAgICAgcmV0dXJuIChhdiA+IGJ2ID8gMSA6IC0xKSAqIGRpclxuICAgIH0pXG4gICAgcmV0dXJuIGxpc3RcbiAgfSwgW3ZpZXcsIHNvcnRLZXksIHNvcnREaXJdKVxuXG4gIGZ1bmN0aW9uIHRvZ2dsZVNvcnQoa2V5KSB7XG4gICAgaWYgKHNvcnRLZXkgPT09IGtleSkgc2V0U29ydERpcigoZCkgPT4gKGQgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYycpKVxuICAgIGVsc2UgeyBzZXRTb3J0S2V5KGtleSk7IHNldFNvcnREaXIoJ2Rlc2MnKSB9XG4gIH1cblxuICBjb25zdCBjb2xzID0gW1xuICAgIHsga2V5OiAnbW9kZWwnLCBsYWJlbDogdCgnY29sTW9kZWwnKSwgc29ydGFibGU6IGZhbHNlIH0sXG4gICAgeyBrZXk6ICdjYWxscycsIGxhYmVsOiB0KCdjb2xDYWxscycpLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgIHsga2V5OiAnaW5wdXQnLCBsYWJlbDogdCgnY29sSW5wdXQnKSwgc29ydGFibGU6IHRydWUgfSxcbiAgICB7IGtleTogJ291dHB1dCcsIGxhYmVsOiB0KCdjb2xPdXRwdXQnKSwgc29ydGFibGU6IHRydWUgfSxcbiAgICB7IGtleTogJ3RvdGFsJywgbGFiZWw6IHQoJ2NvbFRvdGFsJyksIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICdjb3N0JywgbGFiZWw6IHQoJ2NvbENvc3QnKSwgc29ydGFibGU6IHRydWUgfSxcbiAgICB7IGtleTogJ3JhdGlvJywgbGFiZWw6IHQoJ2NvbFNoYXJlJyksIHNvcnRhYmxlOiBmYWxzZSB9LFxuICBdXG5cbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQgdHNkLXRhYmxlLWNhcmQnIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZC1oZWFkZXInIH0sXG4gICAgICBoKCdoMycsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQtdGl0bGUnIH0sIHQoJ2J5TW9kZWxUaXRsZScpKSxcbiAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkLXRhZycgfSxcbiAgICAgICAgdCgnbW9kZWxDb3VudCcsIHsgbjogdmlldy5sZW5ndGggfSkgKyAnIMK3ICcgKyB0KCdjb2xUb3RhbCcpICsgJyAnICsgZm9ybWF0SW50KHN1bVRvdGFsKSkpLFxuICAgIHZpZXcubGVuZ3RoID09PSAwXG4gICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWVtcHR5LWJsb2NrJyB9LCB0KCdub0RhdGEnKSlcbiAgICAgIDogaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtdGFibGUtd3JhcCcgfSxcbiAgICAgICAgICBoKCd0YWJsZScsIHsgY2xhc3NOYW1lOiAndHNkLXRhYmxlJyB9LFxuICAgICAgICAgICAgaCgnY2FwdGlvbicsIHsgY2xhc3NOYW1lOiAndHNkLXZpc3VhbGx5LWhpZGRlbicgfSwgdCgnbW9kZWxUYWJsZUNhcHRpb24nKSksXG4gICAgICAgICAgICBoKCd0aGVhZCcsIG51bGwsXG4gICAgICAgICAgICAgIGgoJ3RyJywgbnVsbCwgY29scy5tYXAoKGMpID0+XG4gICAgICAgICAgICAgICAgaCgndGgnLCB7XG4gICAgICAgICAgICAgICAgICBrZXk6IGMua2V5LFxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndHNkLXRoJyArIChjLmtleSA9PT0gJ21vZGVsJyA/ICcnIDogJyB0c2QtdGgtbnVtJyksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGMuc29ydGFibGVcbiAgICAgICAgICAgICAgICAgICAgPyBoKCdidXR0b24nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RzZC1zb3J0LWJ0bicgKyAoc29ydEtleSA9PT0gYy5rZXkgPyAnIHRzZC1zb3J0LWFjdGl2ZScgOiAnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0b2dnbGVTb3J0KGMua2V5KSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYy5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRLZXkgPT09IGMua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gaCgnc3BhbicsIHsgY2xhc3NOYW1lOiAndHNkLXNvcnQtYXJyb3cnIH0sIHNvcnREaXIgPT09ICdhc2MnID8gJ+KGkScgOiAn4oaTJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKVxuICAgICAgICAgICAgICAgICAgICA6IGMubGFiZWwpKSkpLFxuICAgICAgICAgICAgaCgndGJvZHknLCBudWxsLCBzb3J0ZWQubWFwKChyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJhdGlvID0gc3VtVG90YWwgPiAwID8gci50b3RhbCAvIHN1bVRvdGFsIDogMFxuICAgICAgICAgICAgICByZXR1cm4gaCgndHInLCB7IGtleTogci5rZXksIGNsYXNzTmFtZTogJ3RzZC10cicgfSxcbiAgICAgICAgICAgICAgICBoKCd0ZCcsIHsgY2xhc3NOYW1lOiAndHNkLXRkIHRzZC10ZC1tb2RlbCcgfSxcbiAgICAgICAgICAgICAgICAgIGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC1tb2RlbC1tb25vJywgdGl0bGU6IHIua2V5IH0sIHIua2V5KSksXG4gICAgICAgICAgICAgICAgaCgndGQnLCB7IGNsYXNzTmFtZTogJ3RzZC10ZCB0c2QtbnVtJyB9LCBmb3JtYXRJbnQoci5jYWxscykpLFxuICAgICAgICAgICAgICAgIGgoJ3RkJywgeyBjbGFzc05hbWU6ICd0c2QtdGQgdHNkLW51bScgfSwgZm9ybWF0SW50KHIuaW5wdXQpKSxcbiAgICAgICAgICAgICAgICBoKCd0ZCcsIHsgY2xhc3NOYW1lOiAndHNkLXRkIHRzZC1udW0nIH0sIGZvcm1hdEludChyLm91dHB1dCkpLFxuICAgICAgICAgICAgICAgIGgoJ3RkJywgeyBjbGFzc05hbWU6ICd0c2QtdGQgdHNkLW51bSB0c2QtdG90YWwnIH0sIGZvcm1hdEludChyLnRvdGFsKSksXG4gICAgICAgICAgICAgICAgaCgndGQnLCB7IGNsYXNzTmFtZTogJ3RzZC10ZCB0c2QtbnVtJyB9LFxuICAgICAgICAgICAgICAgICAgci51bnByaWNlZFxuICAgICAgICAgICAgICAgICAgICA/IGgoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3RzZC11bnByaWNlZCcsIHRpdGxlOiB0KCd1bnByaWNlZFJvd0hpbnQnKSB9LCB0KCd1bnByaWNlZCcpKVxuICAgICAgICAgICAgICAgICAgICA6IGZvcm1hdENvc3Qoci5jb3N0LCBjdXJyZW5jeSkpLFxuICAgICAgICAgICAgICAgIGgoJ3RkJywgeyBjbGFzc05hbWU6ICd0c2QtdGQgdHNkLXRkLXJhdGlvJyB9LFxuICAgICAgICAgICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtcmF0aW8nIH0sXG4gICAgICAgICAgICAgICAgICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXJhdGlvLWJhcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1yYXRpby1maWxsJywgc3R5bGU6IHsgd2lkdGg6IHJhdGlvICogMTAwICsgJyUnIH0gfSkpLFxuICAgICAgICAgICAgICAgICAgICBoKCdzcGFuJywgeyBjbGFzc05hbWU6ICd0c2QtcmF0aW8tcGN0JyB9LCBmbXRQY3QocmF0aW8pKSkpKVxuICAgICAgICAgICAgfSkpKSkpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5LiJ5oCB77ya5Yqg6L29IC8g6ZSZ6K+vIC8g56m6XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5mdW5jdGlvbiBMb2FkaW5nU3RhdGUoKSB7XG4gIGNvbnN0IHQgPSB1c2VUKClcbiAgcmV0dXJuIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWxvYWRpbmcnIH0sXG4gICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2QtY2FyZHMnIH0sXG4gICAgICBbMCwgMSwgMiwgMywgNF0ubWFwKChpKSA9PlxuICAgICAgICBoKCdkaXYnLCB7IGtleTogaSwgY2xhc3NOYW1lOiAndHNkLWNhcmQgdHNkLWNhcmQtc2tlbGV0b24nIH0sXG4gICAgICAgICAgaCgnZGl2JywgeyBjbGFzc05hbWU6ICd0c2Qtc2tlbGV0b24nLCBzdHlsZTogeyB3aWR0aDogJzQwJScsIGhlaWdodDogMTIgfSB9KSxcbiAgICAgICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1za2VsZXRvbicsIHN0eWxlOiB7IHdpZHRoOiAnNzAlJywgaGVpZ2h0OiAyMiwgbWFyZ2luVG9wOiAxMCB9IH0pKSkpLFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQnIH0sXG4gICAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1za2VsZXRvbicsIHN0eWxlOiB7IHdpZHRoOiAnMTAwJScsIGhlaWdodDogMzAwIH0gfSkpLFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNhcmQnIH0sXG4gICAgICBbMCwgMSwgMiwgMywgNCwgNV0ubWFwKChpKSA9PlxuICAgICAgICBoKCdkaXYnLCB7IGtleTogaSwgY2xhc3NOYW1lOiAndHNkLXNrZWxldG9uLXJvdycsIHN0eWxlOiB7IHdpZHRoOiA5NiAtIGkgKiA4ICsgJyUnIH0gfSkpKSlcbn1cblxuZnVuY3Rpb24gRXJyb3JTdGF0ZShwcm9wcykge1xuICBjb25zdCB7IGVycm9yLCBvblJldHJ5IH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkIHRzZC1lcnJvcicsIHJvbGU6ICdhbGVydCcgfSxcbiAgICBoKFN2Z0ljb24sIHsgbmFtZTogJ2FsZXJ0Jywgc2l6ZTogMjIsIGNsYXNzTmFtZTogJ3RzZC1lcnJvci1pY29uJyB9KSxcbiAgICBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1lcnJvci10ZXh0JyB9LFxuICAgICAgaCgncCcsIHsgY2xhc3NOYW1lOiAndHNkLWVycm9yLXRpdGxlJyB9LCB0KCdsb2FkRmFpbGVkVGl0bGUnKSksXG4gICAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZXJyb3ItZGV0YWlsJyB9LCBTdHJpbmcoKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHx8IGVycm9yKSkpLFxuICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1idG4gdHNkLWJ0bi1wcmltYXJ5Jywgb25DbGljazogb25SZXRyeSB9LCB0KCdyZXRyeScpKSlcbn1cblxuZnVuY3Rpb24gRW1wdHlTdGF0ZShwcm9wcykge1xuICBjb25zdCB7IGZpbHRlcmVkLCBvblJlc2V0IH0gPSBwcm9wc1xuICBjb25zdCB0ID0gdXNlVCgpXG4gIHJldHVybiBoKCdkaXYnLCB7IGNsYXNzTmFtZTogJ3RzZC1jYXJkIHRzZC1lbXB0eScgfSxcbiAgICBoKFN2Z0ljb24sIHsgbmFtZTogJ2luYm94Jywgc2l6ZTogMjgsIGNsYXNzTmFtZTogJ3RzZC1lbXB0eS1pY29uJyB9KSxcbiAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZW1wdHktdGl0bGUnIH0sIHQoJ25vRGF0YScpKSxcbiAgICBoKCdwJywgeyBjbGFzc05hbWU6ICd0c2QtZW1wdHktZGVzYycgfSxcbiAgICAgIGZpbHRlcmVkID8gdCgnZW1wdHlGaWx0ZXJlZCcpIDogdCgnZW1wdHlEZXNjJykpLFxuICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1idG4gdHNkLWJ0bi1naG9zdCcsIG9uQ2xpY2s6IG9uUmVzZXQgfSwgdCgncmVzZXRGaWx0ZXJzJykpKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOmhtemdoue6p+eKtuaAgeacuiArIOW4g+WxgFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gU3RhdHNEYXNoYm9hcmQocHJvcHMpIHtcbiAgY29uc3QgdCA9IHByb3BzLnQgfHwgZmFsbGJhY2tUXG4gIGNvbnN0IFtyYW5nZSwgc2V0UmFuZ2VdID0gUmVhY3QudXNlU3RhdGUoJ3RvZGF5JykgLy8gdG9kYXkgfCA3ZCB8IDMwZCB8IGN1c3RvbVxuICBjb25zdCBbY3VzdG9tLCBzZXRDdXN0b21dID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdEN1c3RvbSlcbiAgY29uc3QgW21vZGVscywgc2V0TW9kZWxzXSA9IFJlYWN0LnVzZVN0YXRlKFtdKSAvLyBbXSA9IOWFqOmDqOaooeWei1xuICBjb25zdCBbY3VzdG9tT3Blbiwgc2V0Q3VzdG9tT3Blbl0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3JldHJ5LCBzZXRSZXRyeV0gPSBSZWFjdC51c2VTdGF0ZSgwKVxuICBjb25zdCBbc3RhdHVzLCBzZXRTdGF0dXNdID0gUmVhY3QudXNlU3RhdGUoJ2xvYWRpbmcnKSAvLyBsb2FkaW5nIHwgcmVmcmVzaGluZyB8IHJlYWR5IHwgZXJyb3JcbiAgY29uc3QgW2RhdGEsIHNldERhdGFdID0gUmVhY3QudXNlU3RhdGUobnVsbClcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKVxuICBjb25zdCBbcHJpY2VzLCBzZXRQcmljZXNdID0gUmVhY3QudXNlU3RhdGUoeyBwcmljZXM6IHt9LCBjdXJyZW5jeTogJ8KlJyB9KVxuICAvLyBQMS02IGJhY2tmaWxsIOi9ruivoueKtuaAge+8mnF1ZXJ5S2V5IOWPmOWMluaXtumHjee9ru+8jOS7heWvueWQjOS4gOafpeivouS4sui9ruivolxuICBjb25zdCBxdWVyeUtleVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKVxuICBjb25zdCBiYWNrZmlsbFNlZW5SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGZpbmFsUmVmcmVzaFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSlcblxuICBjb25zdCBlZmYgPSBSZWFjdC51c2VNZW1vKCgpID0+IHJhbmdlRm9yKHJhbmdlLCBjdXN0b20pLCBbcmFuZ2UsIGN1c3RvbV0pXG4gIC8vIEZpeGVkIHN0ZXAgcG9saWN5OiB0b2RheSA9IGhvdXJseTsgN2QvMzBkL2N1c3RvbSA9IGRhaWx5LCBjdXN0b20gdXNlcyBhXG4gIC8vIHN0YWJsZSBzdGVwICgxLzMvNS83IGRheXMpIGNob3NlbiBieSB0aGUgcmFuZ2UgbGVuZ3RoLlxuICBjb25zdCBlZmZHcmFuID0gZWZmR3JhbnVsYXJpdHkocmFuZ2UpXG4gIGNvbnN0IHN0ZXBEYXlzID0gcmFuZ2UgPT09ICdjdXN0b20nID8gcGlja1N0ZXBEYXlzKChlZmYudG8gfHwgMCkgLSAoZWZmLmZyb20gfHwgMCkpIDogMVxuICBjb25zdCBncmFuTGFiZWwgPSBzdGVwTGFiZWwodCwgcmFuZ2UsIHN0ZXBEYXlzKVxuXG4gIC8vIOafpeivoue7n+iuoe+8iOmmlui9vemqqOaetu+8m+WIt+aWsOS/neeVmeaXp+aVsOaNrui9rCByZWZyZXNoaW5n77ybZmlsbCAwIOWhq+WFhSArIOW5tOW6pueDreWKm+Wbvu+8iVxuICAvLyBQMS0277yaYmFja2ZpbGwgcnVubmluZyDml7bmr48gM3Mg6Ieq5Yqo6YeN5p+l77ybZG9uZSDlkI7ooaXkuIDmrKHmlLblsL7mn6Xor6LljbPlgZzjgIJcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgY3VycmVudCA9IHRydWVcbiAgICBsZXQgYmFja2ZpbGxUaW1lciA9IG51bGxcbiAgICBjb25zdCBxdWVyeUtleSA9IGVmZi5mcm9tICsgJ3wnICsgZWZmLnRvICsgJ3wnICsgbW9kZWxzLmpvaW4oJywnKSArICd8JyArIGVmZkdyYW4gKyAnfCcgKyBzdGVwRGF5c1xuICAgIGlmIChxdWVyeUtleVJlZi5jdXJyZW50ICE9PSBxdWVyeUtleSkge1xuICAgICAgcXVlcnlLZXlSZWYuY3VycmVudCA9IHF1ZXJ5S2V5XG4gICAgICBiYWNrZmlsbFNlZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBmaW5hbFJlZnJlc2hSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGlzRmluYWxSdW4gPSBmaW5hbFJlZnJlc2hSZWYuY3VycmVudFxuICAgIGZpbmFsUmVmcmVzaFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzZXRTdGF0dXMoKHMpID0+IChzID09PSAncmVhZHknICYmIGRhdGEgIT09IG51bGwgPyAncmVmcmVzaGluZycgOiAnbG9hZGluZycpKVxuICAgIGhvc3RDYWxsKCd1c2FnZS9xdWVyeScsIHtcbiAgICAgIGZyb206IGVmZi5mcm9tLFxuICAgICAgdG86IGVmZi50byxcbiAgICAgIG1vZGVsczogbW9kZWxzLnNsaWNlKCksXG4gICAgICBmaWxsOiB0cnVlLFxuICAgICAgZ3JhbnVsYXJpdHk6IGVmZkdyYW4sXG4gICAgICBzdGVwRGF5cyxcbiAgICAgIGhlYXRtYXA6IHRydWUsXG4gICAgfSlcbiAgICAgIC50aGVuKChyKSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudCkgcmV0dXJuXG4gICAgICAgIHNldERhdGEocilcbiAgICAgICAgc2V0U3RhdHVzKCdyZWFkeScpXG4gICAgICAgIHNldEVycm9yKG51bGwpXG4gICAgICAgIGNvbnN0IGJzID0gciAmJiByLmJhY2tmaWxsID8gci5iYWNrZmlsbC5zdGF0dXMgOiBudWxsXG4gICAgICAgIGlmIChicyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgYmFja2ZpbGxTZWVuUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgLy8g5ZCM5LiAIGVmZmVjdCDoh7PlpJrmjILkuIDkuKrlrprml7blmajvvJvph43mn6XlpI3nlKggcmV0cnkg6K6h5pWw5Zmo6Kem5Y+RIGVmZmVjdCDph43ot5FcbiAgICAgICAgICBiYWNrZmlsbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCkgc2V0UmV0cnkoKHYpID0+IHYgKyAxKVxuICAgICAgICAgIH0sIDMwMDApXG4gICAgICAgIH0gZWxzZSBpZiAoYnMgPT09ICdkb25lJyAmJiBiYWNrZmlsbFNlZW5SZWYuY3VycmVudCAmJiAhaXNGaW5hbFJ1bikge1xuICAgICAgICAgIC8vIOWbnuWhq+aUtuWwvu+8muaBsOWlveWGjeafpeS4gOasoeaLv+WIsOWujOaVtOaVsOaNruWQjuWBnOatolxuICAgICAgICAgIGZpbmFsUmVmcmVzaFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICAgIHNldFJldHJ5KCh2KSA9PiB2ICsgMSlcbiAgICAgICAgfVxuICAgICAgfSwgKGUpID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgICAgc2V0RXJyb3IoZSlcbiAgICAgICAgc2V0U3RhdHVzKCdlcnJvcicpXG4gICAgICB9KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjdXJyZW50ID0gZmFsc2VcbiAgICAgIGlmIChiYWNrZmlsbFRpbWVyICE9PSBudWxsKSBjbGVhclRpbWVvdXQoYmFja2ZpbGxUaW1lcilcbiAgICB9XG4gIH0sIFtlZmYuZnJvbSwgZWZmLnRvLCBtb2RlbHMsIGVmZkdyYW4sIHN0ZXBEYXlzLCByZXRyeV0pXG5cbiAgLy8g5Lu35qC86KGo77ya6L+b5YWl6aG16Z2i5ouJ5LiA5qyhICsg5q+P5qyh5Yi35paw5ZCM5q2l44CCXG4gIC8vIFAwLTHvvJrkvJjlhYjlrpjmlrkgc2V0dGluZ3Mgc2NvcGXvvIh1c2FnZS5wcmljZXMg5ZG95ZCN56m66Ze077yJ77yM5LiN5Y+v55So5pe25Zue6YCAIFJQQ+OAglxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBjdXJyZW50ID0gdHJ1ZVxuICAgIGxldCBzY29wZURpc3Bvc2UgPSBudWxsXG4gICAgY29uc3QgbG9hZFJwYyA9ICgpID0+IHtcbiAgICAgIGhvc3RDYWxsKCd1c2FnZS9wcmljZXMnKS50aGVuKChwKSA9PiB7XG4gICAgICAgIGlmIChjdXJyZW50ICYmIHAgJiYgcC5wcmljZXMpIHNldFByaWNlcyhwKVxuICAgICAgfSwgKCkgPT4ge30pXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzY29wZSA9IGdldFVzYWdlUHJpY2VzU2NvcGUoKVxuICAgICAgaWYgKHNjb3BlICYmIHR5cGVvZiBzY29wZS5nZXRTbmFwc2hvdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2NvcGUuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGxldCBhZG9wdGVkID0gZmFsc2VcbiAgICAgICAgY29uc3QgYWRvcHQgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgICAgICBjb25zdCBzbmFwID0gc2NvcGUuZ2V0U25hcHNob3QoKVxuICAgICAgICAgIGNvbnN0IHYgPSBzbmFwICYmIHNuYXAudmFsdWVcbiAgICAgICAgICBpZiAoc25hcCAmJiBzbmFwLnN0YXR1cyA9PT0gJ3VuYXZhaWxhYmxlJykgcmV0dXJuXG4gICAgICAgICAgaWYgKHYgJiYgKHYucHJpY2VzIHx8IHYuY3VycmVuY3kpKSB7XG4gICAgICAgICAgICBhZG9wdGVkID0gdHJ1ZVxuICAgICAgICAgICAgc2V0UHJpY2VzKHsgcHJpY2VzOiB2LnByaWNlcyB8fCB7fSwgY3VycmVuY3k6IHYuY3VycmVuY3kgfHwgJ8KlJyB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhZG9wdCgpXG4gICAgICAgIHNjb3BlRGlzcG9zZSA9IHNjb3BlLnN1YnNjcmliZShhZG9wdClcbiAgICAgICAgaWYgKCFhZG9wdGVkKSBsb2FkUnBjKCkgLy8gc2NvcGUg5pyq5bCx57uqL+aXoOWAvO+8muWFiOi1sCBSUEPvvIzorqLpmIXlsLHnu6rlkI4gc2NvcGUg5LyY5YWI6KaG55uWXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkUnBjKClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2FkUnBjKCkgLy8g5o6i5rWLL+e7keWumuW8guW4uO+8muWujOaVtOWbnumAgCBSUEPvvIznu53kuI3mipvlh7pcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGN1cnJlbnQgPSBmYWxzZVxuICAgICAgaWYgKHNjb3BlRGlzcG9zZSkge1xuICAgICAgICB0cnkgeyBzY29wZURpc3Bvc2UoKSB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfSwgW3JldHJ5XSlcblxuICBjb25zdCByZWxvYWQgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiBzZXRSZXRyeSgodikgPT4gdiArIDEpLCBbXSlcblxuICBjb25zdCByZXNldEZpbHRlcnMgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0TW9kZWxzKFtdKVxuICAgIHNldEN1c3RvbShkZWZhdWx0Q3VzdG9tKCkpXG4gICAgc2V0UmFuZ2UoJ3RvZGF5JylcbiAgfSwgW10pXG5cbiAgY29uc3QgYnVzeSA9IHN0YXR1cyA9PT0gJ2xvYWRpbmcnIHx8IHN0YXR1cyA9PT0gJ3JlZnJlc2hpbmcnXG4gIGNvbnN0IHJlYWR5ID0gZGF0YSAhPT0gbnVsbFxuICBjb25zdCBpc0Vycm9yID0gc3RhdHVzID09PSAnZXJyb3InXG4gIGNvbnN0IGlzRW1wdHkgPSByZWFkeSAmJiBkYXRhLmRhaWx5Lmxlbmd0aCA9PT0gMCAmJiBkYXRhLmJ5TW9kZWwubGVuZ3RoID09PSAwXG5cbiAgcmV0dXJuIGgoVC5Qcm92aWRlciwgeyB2YWx1ZTogdCB9LFxuICAgIGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLXNlY3Rpb24nLCAnYXJpYS1idXN5JzogYnVzeSB8fCB1bmRlZmluZWQgfSxcbiAgICBoKFN0YXRzSGVhZGVyLCB7IGJ1c3ksIG9uUmVmcmVzaDogcmVsb2FkIH0pLFxuICAgIGgoRmlsdGVyQmFyLCB7XG4gICAgICByYW5nZSxcbiAgICAgIGN1c3RvbSxcbiAgICAgIG1vZGVscyxcbiAgICAgIGN1c3RvbU9wZW4sXG4gICAgICBtb2RlbE9wdGlvbnM6IGRhdGEgPyBkYXRhLm1vZGVscyA6IFtdLFxuICAgICAgb25QcmVzZXQ6IChwKSA9PiB7IHNldFJhbmdlKHApOyBzZXRDdXN0b21PcGVuKGZhbHNlKSB9LFxuICAgICAgb25DdXN0b21PcGVuOiAob3BlbikgPT4geyBzZXRSYW5nZSgnY3VzdG9tJyk7IHNldEN1c3RvbU9wZW4ob3BlbikgfSxcbiAgICAgIG9uQ3VzdG9tQXBwbHk6IChjKSA9PiB7IHNldEN1c3RvbShjKTsgc2V0Q3VzdG9tT3BlbihmYWxzZSkgfSxcbiAgICAgIG9uQ3VzdG9tQ2xvc2U6ICgpID0+IHNldEN1c3RvbU9wZW4oZmFsc2UpLFxuICAgICAgb25Nb2RlbHNDaGFuZ2U6IHNldE1vZGVscyxcbiAgICB9KSxcbiAgICBpc0Vycm9yICYmICFyZWFkeVxuICAgICAgPyBoKEVycm9yU3RhdGUsIHsgZXJyb3IsIG9uUmV0cnk6IHJlbG9hZCB9KVxuICAgICAgOiBudWxsLFxuICAgICFyZWFkeSAmJiAhaXNFcnJvclxuICAgICAgPyBoKExvYWRpbmdTdGF0ZSwgbnVsbClcbiAgICAgIDogbnVsbCxcbiAgICByZWFkeSAmJiBpc0Vycm9yXG4gICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWFsZXJ0LWJhbm5lcicsIHJvbGU6ICdhbGVydCcgfSxcbiAgICAgICAgICBoKCdzcGFuJywgbnVsbCwgdCgnbG9hZEZhaWxlZCcsIHsgbWVzc2FnZTogU3RyaW5nKChlcnJvciAmJiBlcnJvci5tZXNzYWdlKSB8fCBlcnJvcikgfSkpLFxuICAgICAgICAgIGgoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicsIGNsYXNzTmFtZTogJ3RzZC1idG4gdHNkLWJ0bi1naG9zdCcsIG9uQ2xpY2s6IHJlbG9hZCB9LCB0KCdyZXRyeScpKSlcbiAgICAgIDogbnVsbCxcbiAgICByZWFkeSAmJiAhaXNFcnJvciAmJiBpc0VtcHR5XG4gICAgICA/IGgoRW1wdHlTdGF0ZSwgeyBmaWx0ZXJlZDogbW9kZWxzLmxlbmd0aCA+IDAsIG9uUmVzZXQ6IHJlc2V0RmlsdGVycyB9KVxuICAgICAgOiBudWxsLFxuICAgIHJlYWR5ICYmICFpc0Vycm9yICYmICFpc0VtcHR5XG4gICAgICA/IGgoJ2RpdicsIHsgY2xhc3NOYW1lOiAndHNkLWNvbnRlbnQnLCAnZGF0YS1idXN5JzogYnVzeSA/ICd0cnVlJyA6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgIGgoU3VtbWFyeUNhcmRzLCB7XG4gICAgICAgICAgICB0b3RhbDogZGF0YS50b3RhbCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiBwcmljZXMuY3VycmVuY3kgfHwgJ8KlJyxcbiAgICAgICAgICAgIHVucHJpY2VkQ2FsbHM6IGRhdGEudW5wcmljZWRDYWxscyB8fCAwLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGgoRGFpbHlDaGFydCwge1xuICAgICAgICAgICAgZGFpbHk6IGRhdGEuZGFpbHksXG4gICAgICAgICAgICBncmFuOiBlZmZHcmFuLFxuICAgICAgICAgICAgc3RlcERheXMsXG4gICAgICAgICAgICBncmFuTGFiZWwsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaChIZWF0bWFwQ2FyZCwgeyBkYXlzOiBkYXRhLmhlYXRtYXAgfHwgW10gfSksXG4gICAgICAgICAgaChNb2RlbFRhYmxlLCB7IHJvd3M6IGRhdGEuYnlNb2RlbCwgY3VycmVuY3k6IHByaWNlcy5jdXJyZW5jeSB8fCAnwqUnIH0pKVxuICAgICAgOiBudWxsKSlcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDms6jlhozvvJpzZXR0aW5ncy5zZWN0aW9uIOmhtemdolxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gYXBwbHkoY3R4KSB7XG4gIHVzYWdlQ3R4ID0gY3R4XG4gIF91c2FnZVByaWNlc1Njb3BlID0gbnVsbCAvLyDmr4/mrKHmv4DmtLvph43nu5HvvIzpgb/lhY3lpI3nlKjlt7Lph4rmlL7nmoQgc2NvcGVcbiAgY3R4LmVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzdHlsZXMgIT09ICd1bmRlZmluZWQnICYmIHN0eWxlcyAmJiB0eXBlb2Ygc3R5bGVzLmluc2VydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHN0eWxlcy5pbnNlcnQoQ1NTKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpXG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGx1Z2luJywgJ2RzaC1wbHVnaW4tdXNhZ2UnKVxuICAgICAgZWwudGV4dENvbnRlbnQgPSBDU1NcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZWwpXG4gICAgICByZXR1cm4gKCkgPT4geyBlbC5yZW1vdmUoKSB9XG4gICAgfVxuICB9LCAndXNhZ2U6IHN0eWxlcycpXG4gIGN0eC5lZmZlY3QoKCkgPT4gY3R4LmxvY2FsZS5yZWdpc3RlcihOUywgeyB6aDogWkgsIGVuOiBFTiB9KSwgJ3VzYWdlOiBkaWN0aW9uYXJpZXMnKVxuICBjb25zdCB0MCA9IGN0eC5sb2NhbGUgPyBjdHgubG9jYWxlLmJpbmQoTlMpIDogZmFsbGJhY2tUXG4gIC8vIGNvcmRpcyBjdHggaXMgYSBzdHJpY3QgcHJveHk6IERJUkVDVCBwcm9wZXJ0eSBhY2Nlc3Mgb24gYW4gdW4taW5qZWN0ZWRcbiAgLy8gc2VydmljZSB0aHJvd3MgKFwiY2Fubm90IGdldCBwcm9wZXJ0eSBYIHdpdGhvdXQgaW5qZWN0XCIpLCBzbyBhIGJhcmVcbiAgLy8gYGN0eC5zbG90cyA/PyAuLi5gIHdvdWxkIHRocm93IGFuZCBza2lwIHRoZSBmYWxsYmFjay4gUHJvYmUgdmlhIHRoZSBzYWZlXG4gIC8vIGN0eC5nZXQoKSBmaXJzdDsgZmFsbCBiYWNrIHRvIHRoZSBpbmplY3RlZCBwcm9wZXJ0eSAoYXZhaWxhYmxlIG9uY2VcbiAgLy8gJ3Nsb3RzJyBpcyBkZWNsYXJlZCBpbiB0aGUgaW5qZWN0IGxpc3QgYmVsb3cpLlxuICBsZXQgc2xvdHMgPSBudWxsXG4gIHRyeSB7XG4gICAgc2xvdHMgPSB0eXBlb2YgY3R4LmdldCA9PT0gJ2Z1bmN0aW9uJyA/IGN0eC5nZXQoJ3Nsb3RzJykgOiBudWxsXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzbG90cyA9IG51bGxcbiAgfVxuICBpZiAoIXNsb3RzIHx8IHR5cGVvZiBzbG90cy5pbmplY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGN0eC5zbG90cyAmJiB0eXBlb2YgY3R4LnNsb3RzLmluamVjdCA9PT0gJ2Z1bmN0aW9uJykgc2xvdHMgPSBjdHguc2xvdHNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzbG90cyA9IG51bGxcbiAgICB9XG4gIH1cbiAgaWYgKCFzbG90cyB8fCB0eXBlb2Ygc2xvdHMuaW5qZWN0ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBzbG90cy5yZWdpc3RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUud2FybignW3VzYWdlXSBzZXR0aW5ncy5zZWN0aW9uIHNsb3QgdW5hdmFpbGFibGUnKVxuICAgIHJldHVyblxuICB9XG4gIHNsb3RzLmluamVjdCgnc2V0dGluZ3Muc2VjdGlvbicsICgpID0+IHNsb3RzLnJlZ2lzdGVyKFxuICAgIHsgbmFtZTogJ3NldHRpbmdzLnNlY3Rpb24nLCBpZDogJ3Rva2VuLXN0YXRzJywgb3JkZXI6IDIwLCBsYWJlbDogKCkgPT4gdDAoJ25hdicpLCBsb2NhbGU6IE5TIH0sXG4gICAgKHByb3BzKSA9PiBoKFN0YXRzRGFzaGJvYXJkLCBwcm9wcyksXG4gICkpXG59XG5cbnJldHVybiB7IGluamVjdDogWydsb2NhbGUnLCAnc2xvdHMnXSwgYXBwbHkgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==